@wandelbots/nova-js 3.13.0-pr.307.07b1ea2 → 3.13.0-pr.307.2abdb29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/Nova--8gozkLR.d.mts +85 -0
  2. package/dist/Nova--8gozkLR.d.mts.map +1 -0
  3. package/dist/Nova-B1o5iTQ6.d.cts +85 -0
  4. package/dist/Nova-B1o5iTQ6.d.cts.map +1 -0
  5. package/dist/{context-Cu5mXcFZ.cjs → context-BZELA2eh.cjs} +3 -146
  6. package/dist/context-BZELA2eh.cjs.map +1 -0
  7. package/dist/{context-CmXqEEwW.mjs → context-ffr5Q2dc.mjs} +3 -86
  8. package/dist/context-ffr5Q2dc.mjs.map +1 -0
  9. package/dist/converters-DnG1fX23.mjs +87 -0
  10. package/dist/converters-DnG1fX23.mjs.map +1 -0
  11. package/dist/converters-EYS27XJE.cjs +146 -0
  12. package/dist/converters-EYS27XJE.cjs.map +1 -0
  13. package/dist/experimental/nats/index.cjs +37 -4
  14. package/dist/experimental/nats/index.cjs.map +1 -1
  15. package/dist/experimental/nats/index.d.cts +30 -7
  16. package/dist/experimental/nats/index.d.cts.map +1 -1
  17. package/dist/experimental/nats/index.d.mts +30 -7
  18. package/dist/experimental/nats/index.d.mts.map +1 -1
  19. package/dist/experimental/nats/index.mjs +37 -5
  20. package/dist/experimental/nats/index.mjs.map +1 -1
  21. package/dist/index.cjs +13 -12
  22. package/dist/index.mjs +3 -2
  23. package/dist/v1/index.cjs +3 -3
  24. package/dist/v1/index.cjs.map +1 -1
  25. package/dist/v1/index.mjs +2 -2
  26. package/dist/v2/index.cjs +4 -3
  27. package/dist/v2/index.cjs.map +1 -1
  28. package/dist/v2/index.d.cts +5 -83
  29. package/dist/v2/index.d.cts.map +1 -1
  30. package/dist/v2/index.d.mts +4 -82
  31. package/dist/v2/index.d.mts.map +1 -1
  32. package/dist/v2/index.mjs +2 -1
  33. package/dist/v2/index.mjs.map +1 -1
  34. package/dist/{wandelscriptUtils-CKhiZJsB.mjs → wandelscriptUtils-CpUXdLVc.mjs} +3 -2
  35. package/dist/{wandelscriptUtils-CKhiZJsB.mjs.map → wandelscriptUtils-CpUXdLVc.mjs.map} +1 -1
  36. package/dist/{wandelscriptUtils-BdqeVDCY.cjs → wandelscriptUtils-DcY1aLWu.cjs} +13 -12
  37. package/dist/{wandelscriptUtils-BdqeVDCY.cjs.map → wandelscriptUtils-DcY1aLWu.cjs.map} +1 -1
  38. package/package.json +1 -1
  39. package/src/experimental/nats/index.ts +1 -0
  40. package/src/lib/experimental/nats/NovaNatsClient.ts +41 -4
  41. package/src/lib/experimental/nats/buildNatsServerUrl.ts +15 -0
  42. package/src/lib/experimental/nats/buildSubject.ts +2 -1
  43. package/src/lib/experimental/nats/generated/operations.ts +4 -4
  44. package/dist/context-CmXqEEwW.mjs.map +0 -1
  45. package/dist/context-Cu5mXcFZ.cjs.map +0 -1
@@ -1,4 +1,19 @@
1
+ import { a as parseNovaInstanceUrl } from "../../converters-DnG1fX23.mjs";
1
2
  import { wsconnect } from "@nats-io/nats-core";
3
+ //#region src/lib/experimental/nats/buildNatsServerUrl.ts
4
+ /**
5
+ * Builds the WebSocket URL for a NOVA instance's NATS gateway from its
6
+ * instance URL, e.g. `https://foo.instance.wandelbots.io` becomes
7
+ * `wss://foo.instance.wandelbots.io/api/nats`.
8
+ *
9
+ * Pass the result as `servers` in the `NovaNatsClientConfig` passed to
10
+ * `NovaNatsClient`.
11
+ */
12
+ function buildNatsServerUrl(instanceUrl) {
13
+ const url = parseNovaInstanceUrl(instanceUrl);
14
+ return `${url.protocol === "https:" ? "wss:" : "ws:"}//${url.host}/api/nats`;
15
+ }
16
+ //#endregion
2
17
  //#region src/lib/experimental/nats/buildSubject.ts
3
18
  /**
4
19
  * Builds a NATS subject from an AsyncAPI-style channel address template
@@ -7,7 +22,7 @@ import { wsconnect } from "@nats-io/nats-core";
7
22
  */
8
23
  function isValidSubjectChar(char) {
9
24
  const code = char.charCodeAt(0);
10
- return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122 || char === "-" || char === "_";
25
+ return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122 || char === "-" || char === "_" || char === "*";
11
26
  }
12
27
  function isValidSubjectValue(value) {
13
28
  if (value.length === 0) return false;
@@ -49,8 +64,11 @@ function buildSubject(template, params) {
49
64
  var NovaNatsClient = class {
50
65
  config;
51
66
  connectionPromise = null;
52
- constructor(config) {
53
- this.config = config;
67
+ constructor(nova, config = {}) {
68
+ this.config = {
69
+ servers: buildNatsServerUrl(nova.instanceUrl.href),
70
+ ...config
71
+ };
54
72
  }
55
73
  /**
56
74
  * Connects to NATS if not already connected or connecting, and returns the
@@ -83,7 +101,8 @@ var NovaNatsClient = class {
83
101
  *
84
102
  * Returns a function that unsubscribes when called.
85
103
  */
86
- async subscribe(subject, params, handler) {
104
+ async subscribe(subject, ...args) {
105
+ const [params, handler] = args.length === 1 ? [{}, args[0]] : [args[0], args[1]];
87
106
  const nc = await this.connect();
88
107
  const resolvedSubject = buildSubject(subject, params);
89
108
  const sub = nc.subscribe(resolvedSubject);
@@ -107,8 +126,21 @@ var NovaNatsClient = class {
107
126
  const resolvedSubject = buildSubject(subject, params);
108
127
  return (await nc.request(resolvedSubject, JSON.stringify(payload), { timeout: opts.timeout ?? 5e3 })).json();
109
128
  }
129
+ /**
130
+ * Publishes a JSON payload to a NATS subject the server receives, without
131
+ * waiting for a reply.
132
+ *
133
+ * `subject` is the subject template as it appears on the wire, e.g.
134
+ * `"nova.v2.cells.{cell}.bus-ios.ios.set"`, with `{param}` placeholders
135
+ * filled in from `params`.
136
+ */
137
+ async publish(subject, params, payload) {
138
+ const nc = await this.connect();
139
+ const resolvedSubject = buildSubject(subject, params);
140
+ nc.publish(resolvedSubject, JSON.stringify(payload));
141
+ }
110
142
  };
111
143
  //#endregion
112
- export { NovaNatsClient };
144
+ export { NovaNatsClient, buildNatsServerUrl };
113
145
 
114
146
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/experimental/nats/buildSubject.ts","../../../src/lib/experimental/nats/NovaNatsClient.ts"],"sourcesContent":["/**\n * Builds a NATS subject from an AsyncAPI-style channel address template\n * (e.g. `\"{instance}.v2.cells.{cell}\"`) by substituting each `{param}`\n * placeholder with the corresponding value from `params`.\n */\n\nfunction isValidSubjectChar(char: string): boolean {\n const code = char.charCodeAt(0)\n return (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n char === \"-\" ||\n char === \"_\"\n )\n}\n\nfunction isValidSubjectValue(value: string): boolean {\n if (value.length === 0) return false\n for (const char of value) {\n if (!isValidSubjectChar(char)) return false\n }\n return true\n}\n\nexport function buildSubject(\n template: string,\n params: Record<string, string>,\n): string {\n // Scanned manually (rather than with a regex like /\\{([^}]+)\\}/g) to avoid\n // a polynomial-time backtracking blowup on pathological input, e.g. a\n // template consisting of many \"{\" characters with no closing \"}\".\n let result = \"\"\n let cursor = 0\n\n while (cursor < template.length) {\n const openIndex = template.indexOf(\"{\", cursor)\n if (openIndex === -1) {\n result += template.slice(cursor)\n break\n }\n\n const closeIndex = template.indexOf(\"}\", openIndex + 1)\n if (closeIndex === -1) {\n result += template.slice(cursor)\n break\n }\n\n result += template.slice(cursor, openIndex)\n const paramName = template.slice(openIndex + 1, closeIndex)\n const value = params[paramName]\n if (value === undefined) {\n throw new Error(\n `Missing value for subject parameter \"${paramName}\" in template \"${template}\"`,\n )\n }\n if (!isValidSubjectValue(value)) {\n throw new Error(\n `Invalid value for subject parameter \"${paramName}\": \"${value}\" (must be non-empty and contain only letters, digits, \"-\", and \"_\")`,\n )\n }\n result += value\n\n cursor = closeIndex + 1\n }\n\n return result\n}\n","import {\n type ConnectionOptions,\n type Msg,\n type NatsConnection,\n wsconnect,\n} from \"@nats-io/nats-core\"\nimport { buildSubject } from \"./buildSubject.ts\"\nimport type {\n NatsOperationParams,\n NatsReplyPayloads,\n NatsRequestPayloads,\n NatsRequestSubject,\n NatsSubscribePayloads,\n NatsSubscribeSubject,\n} from \"./generated/operations.ts\"\n\nexport type NovaNatsClientConfig = ConnectionOptions\n\n/**\n * Typed NATS client for the Wandelbots NOVA messaging API, generated from\n * src/asyncapi.yaml (see scripts/generate-nats-client.ts).\n *\n * Connects over WebSocket via `@nats-io/nats-core`'s `wsconnect`.\n */\nexport class NovaNatsClient {\n readonly config: NovaNatsClientConfig\n private connectionPromise: Promise<NatsConnection> | null = null\n\n constructor(config: NovaNatsClientConfig) {\n this.config = config\n }\n\n /**\n * Connects to NATS if not already connected or connecting, and returns the\n * connection. Safe to call concurrently: all callers share the same\n * in-flight connection attempt instead of each starting their own.\n */\n connect(): Promise<NatsConnection> {\n if (!this.connectionPromise) {\n this.connectionPromise = wsconnect(this.config).catch((err: unknown) => {\n // Allow a subsequent connect() call to retry after a failed attempt.\n this.connectionPromise = null\n throw err\n })\n }\n return this.connectionPromise\n }\n\n /** Closes the underlying NATS connection, if open or connecting. */\n async close(): Promise<void> {\n const connectionPromise = this.connectionPromise\n this.connectionPromise = null\n if (!connectionPromise) return\n try {\n const nc = await connectionPromise\n await nc.close()\n } catch {\n // Connection never succeeded; nothing to close.\n }\n }\n\n /**\n * Subscribes to a NATS subject published by the server, invoking `handler`\n * with the JSON-decoded payload of every message received.\n *\n * `subject` is the subject template as it appears on the wire, e.g.\n * `\"nova.v2.cells.{cell}\"`, with `{param}` placeholders filled in from\n * `params`.\n *\n * Returns a function that unsubscribes when called.\n */\n async subscribe<K extends NatsSubscribeSubject>(\n subject: K,\n params: NatsOperationParams[K],\n handler: (payload: NatsSubscribePayloads[K], msg: Msg) => void,\n ): Promise<() => void> {\n const nc = await this.connect()\n const resolvedSubject = buildSubject(subject, params)\n const sub = nc.subscribe(resolvedSubject)\n\n ;(async () => {\n for await (const msg of sub) {\n handler(msg.json<NatsSubscribePayloads[K]>(), msg)\n }\n })().catch((err: unknown) => {\n console.error(\n `Error handling NATS subscription for \"${resolvedSubject}\"`,\n err,\n )\n })\n\n return () => sub.unsubscribe()\n }\n\n /**\n * Sends a request payload for a NATS subject the server receives, and\n * waits for the JSON-decoded reply.\n *\n * `subject` is the subject template as it appears on the wire, e.g.\n * `\"nova.v2.cells.{cell}.bus-ios.ios.set\"`, with `{param}` placeholders\n * filled in from `params`.\n */\n async request<K extends NatsRequestSubject>(\n subject: K,\n params: NatsOperationParams[K],\n payload: NatsRequestPayloads[K],\n opts: { timeout?: number } = {},\n ): Promise<NatsReplyPayloads[K]> {\n const nc = await this.connect()\n const resolvedSubject = buildSubject(subject, params)\n const msg = await nc.request(resolvedSubject, JSON.stringify(payload), {\n timeout: opts.timeout ?? 5000,\n })\n return msg.json<NatsReplyPayloads[K]>()\n }\n}\n"],"mappings":";;;;;;;AAMA,SAAS,mBAAmB,MAAuB;CACjD,MAAM,OAAO,KAAK,WAAW,CAAC;CAC9B,OACG,QAAQ,MAAM,QAAQ,MACtB,QAAQ,MAAM,QAAQ,MACtB,QAAQ,MAAM,QAAQ,OACvB,SAAS,OACT,SAAS;AAEb;AAEA,SAAS,oBAAoB,OAAwB;CACnD,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,KAAK,MAAM,QAAQ,OACjB,IAAI,CAAC,mBAAmB,IAAI,GAAG,OAAO;CAExC,OAAO;AACT;AAEA,SAAgB,aACd,UACA,QACQ;CAIR,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,OAAO,SAAS,SAAS,QAAQ;EAC/B,MAAM,YAAY,SAAS,QAAQ,KAAK,MAAM;EAC9C,IAAI,cAAc,IAAI;GACpB,UAAU,SAAS,MAAM,MAAM;GAC/B;EACF;EAEA,MAAM,aAAa,SAAS,QAAQ,KAAK,YAAY,CAAC;EACtD,IAAI,eAAe,IAAI;GACrB,UAAU,SAAS,MAAM,MAAM;GAC/B;EACF;EAEA,UAAU,SAAS,MAAM,QAAQ,SAAS;EAC1C,MAAM,YAAY,SAAS,MAAM,YAAY,GAAG,UAAU;EAC1D,MAAM,QAAQ,OAAO;EACrB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MACR,wCAAwC,UAAU,iBAAiB,SAAS,EAC9E;EAEF,IAAI,CAAC,oBAAoB,KAAK,GAC5B,MAAM,IAAI,MACR,wCAAwC,UAAU,MAAM,MAAM,qEAChE;EAEF,UAAU;EAEV,SAAS,aAAa;CACxB;CAEA,OAAO;AACT;;;;;;;;;AC3CA,IAAa,iBAAb,MAA4B;CAC1B;CACA,oBAA4D;CAE5D,YAAY,QAA8B;EACxC,KAAK,SAAS;CAChB;;;;;;CAOA,UAAmC;EACjC,IAAI,CAAC,KAAK,mBACR,KAAK,oBAAoB,UAAU,KAAK,MAAM,EAAE,OAAO,QAAiB;GAEtE,KAAK,oBAAoB;GACzB,MAAM;EACR,CAAC;EAEH,OAAO,KAAK;CACd;;CAGA,MAAM,QAAuB;EAC3B,MAAM,oBAAoB,KAAK;EAC/B,KAAK,oBAAoB;EACzB,IAAI,CAAC,mBAAmB;EACxB,IAAI;GAEF,OAAM,MADW,mBACR,MAAM;EACjB,QAAQ,CAER;CACF;;;;;;;;;;;CAYA,MAAM,UACJ,SACA,QACA,SACqB;EACrB,MAAM,KAAK,MAAM,KAAK,QAAQ;EAC9B,MAAM,kBAAkB,aAAa,SAAS,MAAM;EACpD,MAAM,MAAM,GAAG,UAAU,eAAe;EAEvC,CAAC,YAAY;GACZ,WAAW,MAAM,OAAO,KACtB,QAAQ,IAAI,KAA+B,GAAG,GAAG;EAErD,GAAG,EAAE,OAAO,QAAiB;GAC3B,QAAQ,MACN,yCAAyC,gBAAgB,IACzD,GACF;EACF,CAAC;EAED,aAAa,IAAI,YAAY;CAC/B;;;;;;;;;CAUA,MAAM,QACJ,SACA,QACA,SACA,OAA6B,CAAC,GACC;EAC/B,MAAM,KAAK,MAAM,KAAK,QAAQ;EAC9B,MAAM,kBAAkB,aAAa,SAAS,MAAM;EAIpD,QAAO,MAHW,GAAG,QAAQ,iBAAiB,KAAK,UAAU,OAAO,GAAG,EACrE,SAAS,KAAK,WAAW,IAC3B,CAAC,GACU,KAA2B;CACxC;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/experimental/nats/buildNatsServerUrl.ts","../../../src/lib/experimental/nats/buildSubject.ts","../../../src/lib/experimental/nats/NovaNatsClient.ts"],"sourcesContent":["import { parseNovaInstanceUrl } from \"../../converters.ts\"\n\n/**\n * Builds the WebSocket URL for a NOVA instance's NATS gateway from its\n * instance URL, e.g. `https://foo.instance.wandelbots.io` becomes\n * `wss://foo.instance.wandelbots.io/api/nats`.\n *\n * Pass the result as `servers` in the `NovaNatsClientConfig` passed to\n * `NovaNatsClient`.\n */\nexport function buildNatsServerUrl(instanceUrl: string): string {\n const url = parseNovaInstanceUrl(instanceUrl)\n const protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n return `${protocol}//${url.host}/api/nats`\n}\n","/**\n * Builds a NATS subject from an AsyncAPI-style channel address template\n * (e.g. `\"{instance}.v2.cells.{cell}\"`) by substituting each `{param}`\n * placeholder with the corresponding value from `params`.\n */\n\nfunction isValidSubjectChar(char: string): boolean {\n const code = char.charCodeAt(0)\n return (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n char === \"-\" ||\n char === \"_\" ||\n char === \"*\"\n )\n}\n\nfunction isValidSubjectValue(value: string): boolean {\n if (value.length === 0) return false\n for (const char of value) {\n if (!isValidSubjectChar(char)) return false\n }\n return true\n}\n\nexport function buildSubject(\n template: string,\n params: Record<string, string>,\n): string {\n // Scanned manually (rather than with a regex like /\\{([^}]+)\\}/g) to avoid\n // a polynomial-time backtracking blowup on pathological input, e.g. a\n // template consisting of many \"{\" characters with no closing \"}\".\n let result = \"\"\n let cursor = 0\n\n while (cursor < template.length) {\n const openIndex = template.indexOf(\"{\", cursor)\n if (openIndex === -1) {\n result += template.slice(cursor)\n break\n }\n\n const closeIndex = template.indexOf(\"}\", openIndex + 1)\n if (closeIndex === -1) {\n result += template.slice(cursor)\n break\n }\n\n result += template.slice(cursor, openIndex)\n const paramName = template.slice(openIndex + 1, closeIndex)\n const value = params[paramName]\n if (value === undefined) {\n throw new Error(\n `Missing value for subject parameter \"${paramName}\" in template \"${template}\"`,\n )\n }\n if (!isValidSubjectValue(value)) {\n throw new Error(\n `Invalid value for subject parameter \"${paramName}\": \"${value}\" (must be non-empty and contain only letters, digits, \"-\", and \"_\")`,\n )\n }\n result += value\n\n cursor = closeIndex + 1\n }\n\n return result\n}\n","import {\n type ConnectionOptions,\n type Msg,\n type NatsConnection,\n wsconnect,\n} from \"@nats-io/nats-core\"\nimport type { Nova } from \"../../Nova.ts\"\nimport { buildNatsServerUrl } from \"./buildNatsServerUrl.ts\"\nimport { buildSubject } from \"./buildSubject.ts\"\nimport type {\n NatsOperationParams,\n NatsReplyPayloads,\n NatsRequestPayloads,\n NatsRequestSubject,\n NatsSubscribePayloads,\n NatsSubscribeSubject,\n} from \"./generated/operations.ts\"\n\nexport type NovaNatsClientConfig = ConnectionOptions\n\ntype NatsMessageHandler<K extends NatsSubscribeSubject> = (\n payload: NatsSubscribePayloads[K],\n msg: Msg,\n) => void\n\ntype SubscribeArgs<K extends NatsSubscribeSubject> =\n keyof NatsOperationParams[K] extends never\n ? [handler: NatsMessageHandler<K>]\n : [params: NatsOperationParams[K], handler: NatsMessageHandler<K>]\n\n/**\n * Typed NATS client for the Wandelbots NOVA messaging API, generated from\n * src/asyncapi.yaml (see scripts/generate-nats-client.ts).\n *\n * Connects over WebSocket via `@nats-io/nats-core`'s `wsconnect`.\n */\nexport class NovaNatsClient {\n readonly config: NovaNatsClientConfig\n private connectionPromise: Promise<NatsConnection> | null = null\n\n constructor(nova: Nova, config: NovaNatsClientConfig = {}) {\n this.config = {\n servers: buildNatsServerUrl(nova.instanceUrl.href),\n ...config,\n }\n }\n\n /**\n * Connects to NATS if not already connected or connecting, and returns the\n * connection. Safe to call concurrently: all callers share the same\n * in-flight connection attempt instead of each starting their own.\n */\n connect(): Promise<NatsConnection> {\n if (!this.connectionPromise) {\n this.connectionPromise = wsconnect(this.config).catch((err: unknown) => {\n // Allow a subsequent connect() call to retry after a failed attempt.\n this.connectionPromise = null\n throw err\n })\n }\n return this.connectionPromise\n }\n\n /** Closes the underlying NATS connection, if open or connecting. */\n async close(): Promise<void> {\n const connectionPromise = this.connectionPromise\n this.connectionPromise = null\n if (!connectionPromise) return\n try {\n const nc = await connectionPromise\n await nc.close()\n } catch {\n // Connection never succeeded; nothing to close.\n }\n }\n\n /**\n * Subscribes to a NATS subject published by the server, invoking `handler`\n * with the JSON-decoded payload of every message received.\n *\n * `subject` is the subject template as it appears on the wire, e.g.\n * `\"nova.v2.cells.{cell}\"`, with `{param}` placeholders filled in from\n * `params`.\n *\n * Returns a function that unsubscribes when called.\n */\n async subscribe<K extends NatsSubscribeSubject>(\n subject: K,\n ...args: SubscribeArgs<K>\n ): Promise<() => void> {\n const [params, handler] =\n args.length === 1\n ? ([{}, args[0]] as const)\n : ([args[0], args[1]] as const)\n\n const nc = await this.connect()\n const resolvedSubject = buildSubject(subject, params)\n const sub = nc.subscribe(resolvedSubject)\n\n ;(async () => {\n for await (const msg of sub) {\n handler(msg.json<NatsSubscribePayloads[K]>(), msg)\n }\n })().catch((err: unknown) => {\n console.error(\n `Error handling NATS subscription for \"${resolvedSubject}\"`,\n err,\n )\n })\n\n return () => sub.unsubscribe()\n }\n\n /**\n * Sends a request payload for a NATS subject the server receives, and\n * waits for the JSON-decoded reply.\n *\n * `subject` is the subject template as it appears on the wire, e.g.\n * `\"nova.v2.cells.{cell}.bus-ios.ios.set\"`, with `{param}` placeholders\n * filled in from `params`.\n */\n async request<K extends NatsRequestSubject>(\n subject: K,\n params: NatsOperationParams[K],\n payload: NatsRequestPayloads[K],\n opts: { timeout?: number } = {},\n ): Promise<NatsReplyPayloads[K]> {\n const nc = await this.connect()\n const resolvedSubject = buildSubject(subject, params)\n const msg = await nc.request(resolvedSubject, JSON.stringify(payload), {\n timeout: opts.timeout ?? 5000,\n })\n return msg.json<NatsReplyPayloads[K]>()\n }\n\n /**\n * Publishes a JSON payload to a NATS subject the server receives, without\n * waiting for a reply.\n *\n * `subject` is the subject template as it appears on the wire, e.g.\n * `\"nova.v2.cells.{cell}.bus-ios.ios.set\"`, with `{param}` placeholders\n * filled in from `params`.\n */\n async publish<K extends NatsRequestSubject>(\n subject: K,\n params: NatsOperationParams[K],\n payload: NatsRequestPayloads[K],\n ): Promise<void> {\n const nc = await this.connect()\n const resolvedSubject = buildSubject(subject, params)\n nc.publish(resolvedSubject, JSON.stringify(payload))\n }\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,23 +1,24 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_context = require("./context-Cu5mXcFZ.cjs");
3
- const require_wandelscriptUtils = require("./wandelscriptUtils-BdqeVDCY.cjs");
2
+ const require_context = require("./context-BZELA2eh.cjs");
3
+ const require_converters = require("./converters-EYS27XJE.cjs");
4
+ const require_wandelscriptUtils = require("./wandelscriptUtils-DcY1aLWu.cjs");
4
5
  exports.AutoReconnectingWebsocket = require_context.AutoReconnectingWebsocket;
5
6
  exports.NovaClient = require_wandelscriptUtils.NovaClient;
6
- exports.XYZ_TO_VECTOR = require_context.XYZ_TO_VECTOR;
7
+ exports.XYZ_TO_VECTOR = require_converters.XYZ_TO_VECTOR;
7
8
  exports.availableStorage = require_context.availableStorage;
8
- exports.degreesToRadians = require_context.degreesToRadians;
9
+ exports.degreesToRadians = require_converters.degreesToRadians;
9
10
  exports.delay = require_context.delay;
10
11
  exports.getAuth0Config = require_context.getAuth0Config;
11
12
  exports.guardedPageReload = require_context.guardedPageReload;
12
- exports.isSameCoordinateSystem = require_context.isSameCoordinateSystem;
13
+ exports.isSameCoordinateSystem = require_converters.isSameCoordinateSystem;
13
14
  exports.loginWithAuth0 = require_context.loginWithAuth0;
14
15
  exports.makeErrorMessage = require_context.makeErrorMessage;
15
16
  exports.makeShortErrorMessage = require_context.makeShortErrorMessage;
16
- exports.makeUrlQueryString = require_context.makeUrlQueryString;
17
- exports.parseNovaInstanceUrl = require_context.parseNovaInstanceUrl;
18
- exports.parseUrl = require_context.parseUrl;
17
+ exports.makeUrlQueryString = require_converters.makeUrlQueryString;
18
+ exports.parseNovaInstanceUrl = require_converters.parseNovaInstanceUrl;
19
+ exports.parseUrl = require_converters.parseUrl;
19
20
  exports.poseToWandelscriptString = require_wandelscriptUtils.poseToWandelscriptString;
20
- exports.radiansToDegrees = require_context.radiansToDegrees;
21
- exports.tryParseJson = require_context.tryParseJson;
22
- exports.tryParseUrl = require_context.tryParseUrl;
23
- exports.tryStringifyJson = require_context.tryStringifyJson;
21
+ exports.radiansToDegrees = require_converters.radiansToDegrees;
22
+ exports.tryParseJson = require_converters.tryParseJson;
23
+ exports.tryParseUrl = require_converters.tryParseUrl;
24
+ exports.tryStringifyJson = require_converters.tryStringifyJson;
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
- import { _ as tryParseUrl, a as delay, b as AutoReconnectingWebsocket, c as makeShortErrorMessage, d as isSameCoordinateSystem, f as makeUrlQueryString, g as tryParseJson, h as radiansToDegrees, i as loginWithAuth0, l as XYZ_TO_VECTOR, m as parseUrl, o as guardedPageReload, p as parseNovaInstanceUrl, r as getAuth0Config, s as makeErrorMessage, u as degreesToRadians, v as tryStringifyJson, y as availableStorage } from "./context-CmXqEEwW.mjs";
2
- import { n as NovaClient, t as poseToWandelscriptString } from "./wandelscriptUtils-CKhiZJsB.mjs";
1
+ import { a as delay, c as makeShortErrorMessage, i as loginWithAuth0, l as availableStorage, o as guardedPageReload, r as getAuth0Config, s as makeErrorMessage, u as AutoReconnectingWebsocket } from "./context-ffr5Q2dc.mjs";
2
+ import { a as parseNovaInstanceUrl, c as tryParseJson, i as makeUrlQueryString, l as tryParseUrl, n as degreesToRadians, o as parseUrl, r as isSameCoordinateSystem, s as radiansToDegrees, t as XYZ_TO_VECTOR, u as tryStringifyJson } from "./converters-DnG1fX23.mjs";
3
+ import { n as NovaClient, t as poseToWandelscriptString } from "./wandelscriptUtils-CpUXdLVc.mjs";
3
4
  export { AutoReconnectingWebsocket, NovaClient, XYZ_TO_VECTOR, availableStorage, degreesToRadians, delay, getAuth0Config, guardedPageReload, isSameCoordinateSystem, loginWithAuth0, makeErrorMessage, makeShortErrorMessage, makeUrlQueryString, parseNovaInstanceUrl, parseUrl, poseToWandelscriptString, radiansToDegrees, tryParseJson, tryParseUrl, tryStringifyJson };
package/dist/v1/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_context = require("../context-Cu5mXcFZ.cjs");
3
- const require_wandelscriptUtils = require("../wandelscriptUtils-BdqeVDCY.cjs");
2
+ const require_converters = require("../converters-EYS27XJE.cjs");
3
+ const require_wandelscriptUtils = require("../wandelscriptUtils-DcY1aLWu.cjs");
4
4
  let axios = require("axios");
5
5
  let mobx = require("mobx");
6
6
  //#region src/lib/deprecated/v1/getLatestTrajectories.ts
@@ -50,7 +50,7 @@ var ProgramStateConnection = class {
50
50
  (0, mobx.makeAutoObservable)(this, {}, { autoBind: true });
51
51
  this.programStateSocket = nova.openReconnectingWebsocket(`/programs/state`);
52
52
  this.programStateSocket.addEventListener("message", (ev) => {
53
- const msg = require_context.tryParseJson(ev.data);
53
+ const msg = require_converters.tryParseJson(ev.data);
54
54
  if (!msg) {
55
55
  console.error("Failed to parse program state message", ev.data);
56
56
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["tryParseJson","AxiosError"],"sources":["../../src/lib/deprecated/v1/getLatestTrajectories.ts","../../src/lib/deprecated/v1/ProgramStateConnection.ts"],"sourcesContent":["import type { GetTrajectoryResponse } from \"@wandelbots/nova-api/v1\"\nimport type { NovaCellAPIClient } from \"./NovaCellAPIClient.ts\"\n\nlet lastMotionIds: Set<string> = new Set()\n\n/** @deprecated */\nexport async function getLatestTrajectories(\n apiClient: NovaCellAPIClient,\n sampleTime: number = 50,\n responsesCoordinateSystem?: string,\n): Promise<GetTrajectoryResponse[]> {\n const newTrajectories: GetTrajectoryResponse[] = []\n\n try {\n const motions = await apiClient.motion.listMotions()\n const currentMotionIds = new Set(motions.motions)\n\n const newMotionIds = Array.from(currentMotionIds).filter(\n (id) => !lastMotionIds.has(id),\n )\n\n for (const motionId of newMotionIds) {\n const trajectory = await apiClient.motion.getMotionTrajectory(\n motionId,\n sampleTime,\n responsesCoordinateSystem,\n )\n newTrajectories.push(trajectory)\n }\n\n lastMotionIds = currentMotionIds\n } catch (error) {\n console.error(\"Failed to get latest trajectories:\", error)\n }\n\n return newTrajectories\n}\n","/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type { CollectionValue } from \"@wandelbots/nova-api/v1\"\nimport { AxiosError } from \"axios\"\nimport { makeAutoObservable, runInAction } from \"mobx\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket.ts\"\nimport { tryParseJson } from \"../../converters.ts\"\nimport type { MotionStreamConnection } from \"./MotionStreamConnection.ts\"\nimport type { NovaClient } from \"./NovaClient.ts\"\n\n/** @deprecated */\nexport type ProgramRunnerLogEntry = {\n timestamp: number\n message: string\n level?: \"warn\" | \"error\"\n}\n\n/** @deprecated */\nexport enum ProgramState {\n NotStarted = \"not started\",\n Running = \"running\",\n Stopped = \"stopped\",\n Failed = \"failed\",\n Completed = \"completed\",\n}\n\n/** @deprecated */\nexport type CurrentProgram = {\n id?: string\n wandelscript?: string\n state?: ProgramState\n}\n\ntype ProgramStateMessage = {\n type: string\n runner: {\n id: string\n state: ProgramState\n start_time?: number | null\n execution_time?: number | null\n }\n}\n\n/**\n * Interface for running Wandelscript programs on the Nova instance and\n * tracking their progress and output\n * @deprecated\n */\nexport class ProgramStateConnection {\n currentProgram: CurrentProgram = {}\n logs: ProgramRunnerLogEntry[] = []\n\n executionState = \"idle\" as \"idle\" | \"starting\" | \"executing\" | \"stopping\"\n currentlyExecutingProgramRunnerId = null as string | null\n\n programStateSocket: AutoReconnectingWebsocket\n\n readonly nova: NovaClient\n\n constructor(nova: NovaClient) {\n this.nova = nova\n makeAutoObservable(this, {}, { autoBind: true })\n\n this.programStateSocket = nova.openReconnectingWebsocket(`/programs/state`)\n\n this.programStateSocket.addEventListener(\"message\", (ev) => {\n const msg = tryParseJson(ev.data)\n\n if (!msg) {\n console.error(\"Failed to parse program state message\", ev.data)\n return\n }\n if (msg.type === \"update\") {\n this.handleProgramStateMessage(msg)\n }\n })\n }\n\n /** Handle a program state update from the backend */\n async handleProgramStateMessage(msg: ProgramStateMessage) {\n const { runner } = msg\n\n // Ignoring other programs for now\n // TODO - show if execution state is busy from another source\n if (runner.id !== this.currentlyExecutingProgramRunnerId) return\n\n if (runner.state === ProgramState.Failed) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n // TODO - wandelengine should send print statements in real time over\n // websocket as well, rather than at the end\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n this.logError(\n `Program runner ${runner.id} failed with error: ${runnerState.error}\\n${runnerState.traceback}`,\n )\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.currentProgram.state = ProgramState.Failed\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Stopped) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n\n this.currentProgram.state = ProgramState.Stopped\n this.log(`Program runner ${runner.id} stopped`)\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Completed) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n this.log(\n `Program runner ${runner.id} finished successfully in ${runner.execution_time?.toFixed(2)} seconds`,\n )\n\n this.currentProgram.state = ProgramState.Completed\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Running) {\n this.currentProgram.state = ProgramState.Running\n this.log(`Program runner ${runner.id} now running`)\n } else if (runner.state !== ProgramState.NotStarted) {\n console.error(runner)\n this.logError(\n `Program runner ${runner.id} entered unexpected state: ${runner.state}`,\n )\n this.currentProgram.state = ProgramState.NotStarted\n this.gotoIdleState()\n }\n }\n\n /** Call when a program is no longer executing */\n gotoIdleState() {\n runInAction(() => {\n this.executionState = \"idle\"\n })\n this.currentlyExecutingProgramRunnerId = null\n }\n\n async executeProgram(\n wandelscript: string,\n initial_state?: { [key: string]: CollectionValue },\n activeRobot?: MotionStreamConnection,\n ) {\n this.currentProgram = {\n wandelscript: wandelscript,\n state: ProgramState.NotStarted,\n }\n\n const { currentProgram: openProgram } = this\n if (!openProgram) return\n runInAction(() => {\n this.executionState = \"starting\"\n })\n\n // Jogging can cause program execution to fail for some time after\n // So we need to explicitly stop jogging before running a program\n if (activeRobot) {\n try {\n await this.nova.api.motionGroupJogging.stopJogging(\n activeRobot.motionGroupId,\n )\n } catch (err) {\n console.error(err)\n }\n }\n\n // WOS-1539: Wandelengine parser currently breaks if there are empty lines with indentation\n const trimmedCode = openProgram.wandelscript!.replaceAll(/^\\s*$/gm, \"\")\n\n try {\n const programRunnerRef = await this.nova.api.program.createProgramRunner(\n {\n code: trimmedCode,\n initial_state: initial_state,\n // @ts-expect-error legacy code - check if param still used\n default_robot: activeRobot?.wandelscriptIdentifier,\n },\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n )\n\n this.log(`Created program runner ${programRunnerRef.id}\"`)\n runInAction(() => {\n this.executionState = \"executing\"\n })\n this.currentlyExecutingProgramRunnerId = programRunnerRef.id\n } catch (error) {\n if (error instanceof AxiosError && error.response && error.request) {\n this.logError(\n `${error.response.status} ${error.response.statusText} from ${error.response.config.url} ${JSON.stringify(error.response.data)}`,\n )\n } else {\n this.logError(JSON.stringify(error))\n }\n runInAction(() => {\n this.executionState = \"idle\"\n })\n }\n }\n\n async stopProgram() {\n if (!this.currentlyExecutingProgramRunnerId) return\n runInAction(() => {\n this.executionState = \"stopping\"\n })\n\n try {\n await this.nova.api.program.stopProgramRunner(\n this.currentlyExecutingProgramRunnerId,\n )\n } catch (err) {\n // Reactivate the stop button so user can try again\n runInAction(() => {\n this.executionState = \"executing\"\n })\n throw err\n }\n }\n\n reset() {\n this.currentProgram = {}\n }\n\n log(message: string) {\n console.log(message)\n this.logs.push({\n timestamp: Date.now(),\n message,\n })\n }\n\n logError(message: string) {\n console.log(message)\n this.logs.push({\n timestamp: Date.now(),\n message,\n level: \"error\",\n })\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["tryParseJson","AxiosError"],"sources":["../../src/lib/deprecated/v1/getLatestTrajectories.ts","../../src/lib/deprecated/v1/ProgramStateConnection.ts"],"sourcesContent":["import type { GetTrajectoryResponse } from \"@wandelbots/nova-api/v1\"\nimport type { NovaCellAPIClient } from \"./NovaCellAPIClient.ts\"\n\nlet lastMotionIds: Set<string> = new Set()\n\n/** @deprecated */\nexport async function getLatestTrajectories(\n apiClient: NovaCellAPIClient,\n sampleTime: number = 50,\n responsesCoordinateSystem?: string,\n): Promise<GetTrajectoryResponse[]> {\n const newTrajectories: GetTrajectoryResponse[] = []\n\n try {\n const motions = await apiClient.motion.listMotions()\n const currentMotionIds = new Set(motions.motions)\n\n const newMotionIds = Array.from(currentMotionIds).filter(\n (id) => !lastMotionIds.has(id),\n )\n\n for (const motionId of newMotionIds) {\n const trajectory = await apiClient.motion.getMotionTrajectory(\n motionId,\n sampleTime,\n responsesCoordinateSystem,\n )\n newTrajectories.push(trajectory)\n }\n\n lastMotionIds = currentMotionIds\n } catch (error) {\n console.error(\"Failed to get latest trajectories:\", error)\n }\n\n return newTrajectories\n}\n","/** biome-ignore-all lint/style/noNonNullAssertion: legacy code */\nimport type { CollectionValue } from \"@wandelbots/nova-api/v1\"\nimport { AxiosError } from \"axios\"\nimport { makeAutoObservable, runInAction } from \"mobx\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket.ts\"\nimport { tryParseJson } from \"../../converters.ts\"\nimport type { MotionStreamConnection } from \"./MotionStreamConnection.ts\"\nimport type { NovaClient } from \"./NovaClient.ts\"\n\n/** @deprecated */\nexport type ProgramRunnerLogEntry = {\n timestamp: number\n message: string\n level?: \"warn\" | \"error\"\n}\n\n/** @deprecated */\nexport enum ProgramState {\n NotStarted = \"not started\",\n Running = \"running\",\n Stopped = \"stopped\",\n Failed = \"failed\",\n Completed = \"completed\",\n}\n\n/** @deprecated */\nexport type CurrentProgram = {\n id?: string\n wandelscript?: string\n state?: ProgramState\n}\n\ntype ProgramStateMessage = {\n type: string\n runner: {\n id: string\n state: ProgramState\n start_time?: number | null\n execution_time?: number | null\n }\n}\n\n/**\n * Interface for running Wandelscript programs on the Nova instance and\n * tracking their progress and output\n * @deprecated\n */\nexport class ProgramStateConnection {\n currentProgram: CurrentProgram = {}\n logs: ProgramRunnerLogEntry[] = []\n\n executionState = \"idle\" as \"idle\" | \"starting\" | \"executing\" | \"stopping\"\n currentlyExecutingProgramRunnerId = null as string | null\n\n programStateSocket: AutoReconnectingWebsocket\n\n readonly nova: NovaClient\n\n constructor(nova: NovaClient) {\n this.nova = nova\n makeAutoObservable(this, {}, { autoBind: true })\n\n this.programStateSocket = nova.openReconnectingWebsocket(`/programs/state`)\n\n this.programStateSocket.addEventListener(\"message\", (ev) => {\n const msg = tryParseJson(ev.data)\n\n if (!msg) {\n console.error(\"Failed to parse program state message\", ev.data)\n return\n }\n if (msg.type === \"update\") {\n this.handleProgramStateMessage(msg)\n }\n })\n }\n\n /** Handle a program state update from the backend */\n async handleProgramStateMessage(msg: ProgramStateMessage) {\n const { runner } = msg\n\n // Ignoring other programs for now\n // TODO - show if execution state is busy from another source\n if (runner.id !== this.currentlyExecutingProgramRunnerId) return\n\n if (runner.state === ProgramState.Failed) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n // TODO - wandelengine should send print statements in real time over\n // websocket as well, rather than at the end\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n this.logError(\n `Program runner ${runner.id} failed with error: ${runnerState.error}\\n${runnerState.traceback}`,\n )\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.currentProgram.state = ProgramState.Failed\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Stopped) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n\n this.currentProgram.state = ProgramState.Stopped\n this.log(`Program runner ${runner.id} stopped`)\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Completed) {\n try {\n const runnerState = await this.nova.api.program.getProgramRunner(\n runner.id,\n )\n\n const stdout = runnerState.stdout\n if (stdout) {\n this.log(stdout)\n }\n this.log(\n `Program runner ${runner.id} finished successfully in ${runner.execution_time?.toFixed(2)} seconds`,\n )\n\n this.currentProgram.state = ProgramState.Completed\n } catch (err) {\n this.logError(\n `Failed to retrieve results for program ${runner.id}: ${err}`,\n )\n }\n\n this.gotoIdleState()\n } else if (runner.state === ProgramState.Running) {\n this.currentProgram.state = ProgramState.Running\n this.log(`Program runner ${runner.id} now running`)\n } else if (runner.state !== ProgramState.NotStarted) {\n console.error(runner)\n this.logError(\n `Program runner ${runner.id} entered unexpected state: ${runner.state}`,\n )\n this.currentProgram.state = ProgramState.NotStarted\n this.gotoIdleState()\n }\n }\n\n /** Call when a program is no longer executing */\n gotoIdleState() {\n runInAction(() => {\n this.executionState = \"idle\"\n })\n this.currentlyExecutingProgramRunnerId = null\n }\n\n async executeProgram(\n wandelscript: string,\n initial_state?: { [key: string]: CollectionValue },\n activeRobot?: MotionStreamConnection,\n ) {\n this.currentProgram = {\n wandelscript: wandelscript,\n state: ProgramState.NotStarted,\n }\n\n const { currentProgram: openProgram } = this\n if (!openProgram) return\n runInAction(() => {\n this.executionState = \"starting\"\n })\n\n // Jogging can cause program execution to fail for some time after\n // So we need to explicitly stop jogging before running a program\n if (activeRobot) {\n try {\n await this.nova.api.motionGroupJogging.stopJogging(\n activeRobot.motionGroupId,\n )\n } catch (err) {\n console.error(err)\n }\n }\n\n // WOS-1539: Wandelengine parser currently breaks if there are empty lines with indentation\n const trimmedCode = openProgram.wandelscript!.replaceAll(/^\\s*$/gm, \"\")\n\n try {\n const programRunnerRef = await this.nova.api.program.createProgramRunner(\n {\n code: trimmedCode,\n initial_state: initial_state,\n // @ts-expect-error legacy code - check if param still used\n default_robot: activeRobot?.wandelscriptIdentifier,\n },\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n )\n\n this.log(`Created program runner ${programRunnerRef.id}\"`)\n runInAction(() => {\n this.executionState = \"executing\"\n })\n this.currentlyExecutingProgramRunnerId = programRunnerRef.id\n } catch (error) {\n if (error instanceof AxiosError && error.response && error.request) {\n this.logError(\n `${error.response.status} ${error.response.statusText} from ${error.response.config.url} ${JSON.stringify(error.response.data)}`,\n )\n } else {\n this.logError(JSON.stringify(error))\n }\n runInAction(() => {\n this.executionState = \"idle\"\n })\n }\n }\n\n async stopProgram() {\n if (!this.currentlyExecutingProgramRunnerId) return\n runInAction(() => {\n this.executionState = \"stopping\"\n })\n\n try {\n await this.nova.api.program.stopProgramRunner(\n this.currentlyExecutingProgramRunnerId,\n )\n } catch (err) {\n // Reactivate the stop button so user can try again\n runInAction(() => {\n this.executionState = \"executing\"\n })\n throw err\n }\n }\n\n reset() {\n this.currentProgram = {}\n }\n\n log(message: string) {\n console.log(message)\n this.logs.push({\n timestamp: Date.now(),\n message,\n })\n }\n\n logError(message: string) {\n console.log(message)\n this.logs.push({\n timestamp: Date.now(),\n message,\n level: \"error\",\n })\n }\n}\n"],"mappings":"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"}
package/dist/v1/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { g as tryParseJson } from "../context-CmXqEEwW.mjs";
2
- import { a as JoggerConnection, i as MotionStreamConnection, n as NovaClient, o as ConnectedMotionGroup, r as NovaCellAPIClient, t as poseToWandelscriptString } from "../wandelscriptUtils-CKhiZJsB.mjs";
1
+ import { c as tryParseJson } from "../converters-DnG1fX23.mjs";
2
+ import { a as JoggerConnection, i as MotionStreamConnection, n as NovaClient, o as ConnectedMotionGroup, r as NovaCellAPIClient, t as poseToWandelscriptString } from "../wandelscriptUtils-CpUXdLVc.mjs";
3
3
  import { AxiosError } from "axios";
4
4
  import { makeAutoObservable, runInAction } from "mobx";
5
5
  export * from "@wandelbots/nova-api/v1";
package/dist/v2/index.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_context = require("../context-Cu5mXcFZ.cjs");
2
+ const require_context = require("../context-BZELA2eh.cjs");
3
+ const require_converters = require("../converters-EYS27XJE.cjs");
3
4
  let axios = require("axios");
4
5
  axios = require_context.__toESM(axios, 1);
5
6
  let path_to_regexp = require("path-to-regexp");
@@ -737,7 +738,7 @@ var NovaClient = class {
737
738
  };
738
739
  this.accessToken = config.accessToken || require_context.availableStorage.getString("wbjs.access_token") || null;
739
740
  if (this.config.instanceUrl === "https://mock.example.com") this.mock = new MockNovaInstance();
740
- this.instanceUrl = require_context.parseNovaInstanceUrl(this.config.instanceUrl);
741
+ this.instanceUrl = require_converters.parseNovaInstanceUrl(this.config.instanceUrl);
741
742
  const axiosInstance = axios.default.create({
742
743
  baseURL: new URL("/api/v2", this.instanceUrl).href,
743
744
  headers: require_context.isLocalhostDev ? {} : { "X-Wandelbots-Client": "Wandelbots-Nova-JS-SDK" }
@@ -930,7 +931,7 @@ var Nova = class {
930
931
  this.config = config;
931
932
  this.accessToken = config.accessToken || require_context.availableStorage.getString("wbjs.access_token") || null;
932
933
  if (this.config.instanceUrl === "https://mock.example.com") this.mock = new MockNovaInstance();
933
- this.instanceUrl = require_context.parseNovaInstanceUrl(this.config.instanceUrl);
934
+ this.instanceUrl = require_converters.parseNovaInstanceUrl(this.config.instanceUrl);
934
935
  const axiosInstance = axios.default.create({
935
936
  baseURL: new URL("/api/v2", this.instanceUrl).href,
936
937
  headers: require_context.isLocalhostDev ? {} : { "X-Wandelbots-Client": "Wandelbots-Nova-JS-SDK" }