@wandelbots/nova-js
Version:
Official JS client for the Wandelbots API
490 lines (472 loc) • 16.1 kB
JavaScript
;
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