UNPKG

@wandelbots/nova-js

Version:

Official JS client for the Wandelbots API

490 lines (472 loc) 16.1 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/index.ts var index_exports = {}; __export(index_exports, { AutoReconnectingWebsocket: () => AutoReconnectingWebsocket, availableStorage: () => availableStorage, degreesToRadians: () => degreesToRadians, delay: () => delay, isSameCoordinateSystem: () => isSameCoordinateSystem, loginWithAuth0: () => loginWithAuth0, makeErrorMessage: () => makeErrorMessage, makeShortErrorMessage: () => makeShortErrorMessage, makeUrlQueryString: () => makeUrlQueryString, poseToWandelscriptString: () => poseToWandelscriptString, radiansToDegrees: () => radiansToDegrees, tryParseJson: () => tryParseJson, tryStringifyJson: () => tryStringifyJson }); module.exports = __toCommonJS(index_exports); // src/lib/AutoReconnectingWebsocket.ts var import_reconnecting_websocket = __toESM(require("reconnecting-websocket"), 1); var AutoReconnectingWebsocket = class extends import_reconnecting_websocket.default { constructor(targetUrl, opts = {}) { console.log("Opening websocket to", targetUrl); super(() => this.targetUrl || targetUrl, void 0, { startClosed: true }); this.opts = opts; this.disposed = false; Object.defineProperty(this, "url", { get() { return this.targetUrl; } }); this.targetUrl = targetUrl; this.addEventListener("open", () => { console.log(`Websocket to ${this.url} opened`); }); this.addEventListener("message", (ev) => { if (!this.receivedFirstMessage) { this.receivedFirstMessage = ev; } }); this.addEventListener("close", () => { console.log(`Websocket to ${this.url} closed`); }); const origReconnect = this.reconnect; this.reconnect = () => { if (this.opts.mock) { this.opts.mock.handleWebsocketConnection(this); } else { origReconnect.apply(this); } }; this.reconnect(); } changeUrl(targetUrl) { this.receivedFirstMessage = void 0; this.targetUrl = targetUrl; this.reconnect(); } sendJson(data) { if (this.opts.mock) { this.opts.mock.handleWebsocketMessage(this, JSON.stringify(data)); } else { this.send(JSON.stringify(data)); } } /** * Permanently close this websocket and indicate that * this object should not be used again. **/ dispose() { this.close(); this.disposed = true; if (this.opts.onDispose) { this.opts.onDispose(); } } /** * Returns a promise that resolves once the websocket * is in the OPEN state. */ opened() { return __async(this, null, function* () { return new Promise((resolve, reject) => { if (this.readyState === WebSocket.OPEN) { resolve(); } else { this.addEventListener("open", () => resolve()); this.addEventListener("error", reject); } }); }); } /** * Returns a promise that resolves once the websocket * is in the CLOSED state. */ closed() { return __async(this, null, function* () { return new Promise((resolve, reject) => { if (this.readyState === WebSocket.CLOSED) { resolve(); } else { this.addEventListener("close", () => resolve()); this.addEventListener("error", reject); } }); }); } /** * Returns a promise that resolves when the first message * is received from the websocket. Resolves immediately if * the first message has already been received. */ firstMessage() { return __async(this, null, function* () { if (this.receivedFirstMessage) { return this.receivedFirstMessage; } return new Promise((resolve, reject) => { const onMessage = (ev) => { this.receivedFirstMessage = ev; this.removeEventListener("message", onMessage); this.removeEventListener("error", onError); resolve(ev); }; const onError = (ev) => { this.removeEventListener("message", onMessage); this.removeEventListener("error", onError); reject(ev); }; this.addEventListener("message", onMessage); this.addEventListener("error", onError); }); }); } /** * Returns a promise that resolves when the next message * is received from the websocket. */ nextMessage() { return __async(this, null, function* () { return new Promise((resolve, reject) => { const onMessage = (ev) => { this.removeEventListener("message", onMessage); this.removeEventListener("error", onError); resolve(ev); }; const onError = (ev) => { this.removeEventListener("message", onMessage); this.removeEventListener("error", onError); reject(ev); }; this.addEventListener("message", onMessage); this.addEventListener("error", onError); }); }); } }; // src/lib/availableStorage.ts var AvailableStorage = class { constructor() { this.available = typeof window !== "undefined" && !!window.localStorage; } getJSON(key) { if (!this.available) return null; const result = window.localStorage.getItem(key); if (result === null) return null; try { return JSON.parse(result); } catch (err) { return null; } } setJSON(key, obj) { if (!this.available) return null; window.localStorage.setItem(key, JSON.stringify(obj)); } delete(key) { if (!this.available) return null; window.localStorage.removeItem(key); } setString(key, value) { if (!this.available) return null; window.localStorage.setItem(key, value); } getString(key) { if (!this.available) return null; return window.localStorage.getItem(key); } }; var availableStorage = new AvailableStorage(); // src/lib/converters.ts function tryParseJson(json) { try { return JSON.parse(json); } catch (e) { return void 0; } } function tryStringifyJson(json) { try { return JSON.stringify(json); } catch (e) { return void 0; } } function makeUrlQueryString(obj) { const str = new URLSearchParams(obj).toString(); return str ? `?${str}` : ""; } function radiansToDegrees(radians) { return radians * (180 / Math.PI); } function degreesToRadians(degrees) { return degrees * (Math.PI / 180); } function poseToWandelscriptString(pose) { var _a, _b, _c, _d, _e, _f; const position = [pose.position.x, pose.position.y, pose.position.z]; const orientation = [ (_b = (_a = pose.orientation) == null ? void 0 : _a.x) != null ? _b : 0, (_d = (_c = pose.orientation) == null ? void 0 : _c.y) != null ? _d : 0, (_f = (_e = pose.orientation) == null ? void 0 : _e.z) != null ? _f : 0 ]; const positionValues = position.map((v) => v.toFixed(1)); const rotationValues = orientation.map((v) => v.toFixed(4)); return `(${positionValues.concat(rotationValues).join(", ")})`; } function isSameCoordinateSystem(firstCoordSystem, secondCoordSystem) { if (!firstCoordSystem) firstCoordSystem = "world"; if (!secondCoordSystem) secondCoordSystem = "world"; return firstCoordSystem === secondCoordSystem; } // src/lib/errorHandling.ts var import_axios = require("axios"); // node_modules/lodash-es/_freeGlobal.js var freeGlobal = typeof global == "object" && global && global.Object === Object && global; var freeGlobal_default = freeGlobal; // node_modules/lodash-es/_root.js var freeSelf = typeof self == "object" && self && self.Object === Object && self; var root = freeGlobal_default || freeSelf || Function("return this")(); var root_default = root; // node_modules/lodash-es/_Symbol.js var Symbol2 = root_default.Symbol; var Symbol_default = Symbol2; // node_modules/lodash-es/_getRawTag.js var objectProto = Object.prototype; var hasOwnProperty = objectProto.hasOwnProperty; var nativeObjectToString = objectProto.toString; var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0; function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = void 0; var unmasked = true; } catch (e) { } var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } var getRawTag_default = getRawTag; // node_modules/lodash-es/_objectToString.js var objectProto2 = Object.prototype; var nativeObjectToString2 = objectProto2.toString; function objectToString(value) { return nativeObjectToString2.call(value); } var objectToString_default = objectToString; // node_modules/lodash-es/_baseGetTag.js var nullTag = "[object Null]"; var undefinedTag = "[object Undefined]"; var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0; function baseGetTag(value) { if (value == null) { return value === void 0 ? undefinedTag : nullTag; } return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value); } var baseGetTag_default = baseGetTag; // node_modules/lodash-es/isObjectLike.js function isObjectLike(value) { return value != null && typeof value == "object"; } var isObjectLike_default = isObjectLike; // node_modules/lodash-es/isArray.js var isArray = Array.isArray; var isArray_default = isArray; // node_modules/lodash-es/isObject.js function isObject(value) { var type = typeof value; return value != null && (type == "object" || type == "function"); } var isObject_default = isObject; // node_modules/lodash-es/isString.js var stringTag = "[object String]"; function isString(value) { return typeof value == "string" || !isArray_default(value) && isObjectLike_default(value) && baseGetTag_default(value) == stringTag; } var isString_default = isString; // src/lib/errorHandling.ts function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function makeShortErrorMessage(err) { return makeErrorMessage(err); } function makeErrorMessage(err) { var _a, _b, _c, _d, _e, _f, _g, _h; if (err instanceof import_axios.AxiosError) { if (err.response) { return `${(_a = err.response) == null ? void 0 : _a.status} ${(_b = err.response) == null ? void 0 : _b.statusText} from ${((_d = (_c = err.response) == null ? void 0 : _c.config.method) == null ? void 0 : _d.toUpperCase()) || "accessing"} ${(_e = err.response) == null ? void 0 : _e.config.url}: ${JSON.stringify((_f = err.response) == null ? void 0 : _f.data)}`; } else if (err.config) { if (err.code === "ERR_NETWORK") { return `${err.message} from ${((_g = err.config.method) == null ? void 0 : _g.toUpperCase()) || "accessing"} ${err.config.url}. This error can happen because of either connection issues or server CORS policy.`; } else { return `${err.message} from ${((_h = err.config.method) == null ? void 0 : _h.toUpperCase()) || "accessing"} ${err.config.url}`; } } } else if (err instanceof Error) { return err.message; } else if (isString_default(err)) { return err; } else if (isObject_default(err)) { return tryStringifyJson(err) || `Unserializable object ${err}`; } return `${err}`; } // src/LoginWithAuth0.ts var DOMAIN_SUFFIX = "wandelbots.io"; var auth0ConfigMap = { dev: { domain: `https://auth.portal.dev.${DOMAIN_SUFFIX}`, clientId: "fLbJD0RLp5r2Dpucm5j8BjwMR6Hunfha" }, stg: { domain: `https://auth.portal.stg.${DOMAIN_SUFFIX}`, clientId: "joVDeD9e786WzFNSGCqoVq7HNkWt5j6s" }, prod: { domain: `https://auth.portal.${DOMAIN_SUFFIX}`, clientId: "J7WJUi38xVQdJAEBNRT9Xw1b0fXDb4J2" } }; var getAuth0Config = (instanceUrl) => { if (instanceUrl.includes(`dev.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.dev; if (instanceUrl.includes(`stg.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.stg; if (instanceUrl.includes(DOMAIN_SUFFIX)) return auth0ConfigMap.prod; throw new Error( "Unsupported instance URL. Cannot determine Auth0 configuration." ); }; var loginWithAuth0 = (instanceUrl) => __async(void 0, null, function* () { var _a; if (typeof window === "undefined") { throw new Error( `Access token must be set to use NovaClient when not in a browser environment.` ); } const auth0Config = getAuth0Config(instanceUrl); if (new URL(instanceUrl).origin === window.location.origin) { window.location.reload(); throw new Error( "Failed to reload page to get auth details, please refresh manually" ); } const { Auth0Client } = yield import("@auth0/auth0-spa-js"); const auth0Client = new Auth0Client({ domain: auth0Config.domain, clientId: (_a = auth0Config.clientId) != null ? _a : "", useRefreshTokens: false, authorizationParams: { audience: "nova-api", redirect_uri: window.location.origin } }); if (window.location.search.includes("code=") && window.location.search.includes("state=")) { const { appState } = yield auth0Client.handleRedirectCallback(); window.history.replaceState( {}, document.title, (appState == null ? void 0 : appState.returnTo) || window.location.pathname ); } else { yield auth0Client.loginWithRedirect(); } const accessToken = yield auth0Client.getTokenSilently(); return accessToken; }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AutoReconnectingWebsocket, availableStorage, degreesToRadians, delay, isSameCoordinateSystem, loginWithAuth0, makeErrorMessage, makeShortErrorMessage, makeUrlQueryString, poseToWandelscriptString, radiansToDegrees, tryParseJson, tryStringifyJson }); /*! Bundled license information: lodash-es/lodash.js: (** * @license * Lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="es" -o ./` * Copyright OpenJS Foundation and other contributors <https://openjsf.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *) */ //# sourceMappingURL=index.cjs.map