@osdk/client 2.1.0-beta.2 → 2.1.0-beta.3
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.
- package/CHANGELOG.md +21 -0
- package/build/browser/Client.d.ts +5 -2
- package/build/browser/Client.d.ts.map +1 -1
- package/build/browser/Client.js +2 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/MinimalClientContext.d.ts +1 -1
- package/build/browser/MinimalClientContext.d.ts.map +1 -1
- package/build/browser/createClient.d.ts +1 -1
- package/build/browser/createClient.d.ts.map +1 -1
- package/build/browser/createClient.js +10 -2
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createGeotimeSeriesProperty.d.ts +1 -1
- package/build/browser/createGeotimeSeriesProperty.d.ts.map +1 -1
- package/build/browser/createGeotimeSeriesProperty.js +4 -1
- package/build/browser/createGeotimeSeriesProperty.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -2
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/createPlatformClient.d.ts +1 -1
- package/build/browser/createPlatformClient.d.ts.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +7 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +10 -10
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +40 -12
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +104 -19
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +1 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/ontology/makeConjureContext.d.ts +1 -1
- package/build/browser/ontology/makeConjureContext.d.ts.map +1 -1
- package/build/browser/queries/applyQuery.js +1 -1
- package/build/browser/queries/applyQuery.js.map +1 -1
- package/build/browser/queries/queries.test.js +30 -2
- package/build/browser/queries/queries.test.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/esm/Client.d.ts +5 -2
- package/build/esm/Client.d.ts.map +1 -1
- package/build/esm/Client.js +2 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/MinimalClientContext.d.ts +1 -1
- package/build/esm/MinimalClientContext.d.ts.map +1 -1
- package/build/esm/createClient.d.ts +1 -1
- package/build/esm/createClient.d.ts.map +1 -1
- package/build/esm/createClient.js +10 -2
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createGeotimeSeriesProperty.d.ts +1 -1
- package/build/esm/createGeotimeSeriesProperty.d.ts.map +1 -1
- package/build/esm/createGeotimeSeriesProperty.js +4 -1
- package/build/esm/createGeotimeSeriesProperty.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -2
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/createPlatformClient.d.ts +1 -1
- package/build/esm/createPlatformClient.d.ts.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +7 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +10 -10
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +40 -12
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +104 -19
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +1 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/ontology/makeConjureContext.d.ts +1 -1
- package/build/esm/ontology/makeConjureContext.d.ts.map +1 -1
- package/build/esm/queries/applyQuery.js +1 -1
- package/build/esm/queries/applyQuery.js.map +1 -1
- package/build/esm/queries/queries.test.js +30 -2
- package/build/esm/queries/queries.test.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/package.json +11 -10
|
@@ -81,11 +81,16 @@ export class ObjectSetListenerWebsocket {
|
|
|
81
81
|
});
|
|
82
82
|
!(client.baseUrl.startsWith("https://") || client.baseUrl.startsWith("http://")) ? invariant(false, "Stack must be a URL") : void 0;
|
|
83
83
|
}
|
|
84
|
-
async subscribe(objectSet, listener, properties) {
|
|
84
|
+
async subscribe(objectType, objectSet, listener, properties) {
|
|
85
|
+
const objDef = await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName);
|
|
86
|
+
const objectProperties = properties.filter(p => objDef.properties[p].type !== "geotimeSeriesReference");
|
|
87
|
+
const referenceProperties = properties.filter(p => objDef.properties[p].type === "geotimeSeriesReference");
|
|
85
88
|
const sub = {
|
|
86
89
|
listener: fillOutListener(listener),
|
|
87
90
|
objectSet,
|
|
88
|
-
|
|
91
|
+
primaryKeyPropertyName: objDef.primaryKeyApiName,
|
|
92
|
+
requestedProperties: objectProperties,
|
|
93
|
+
requestedReferenceProperties: referenceProperties,
|
|
89
94
|
status: "preparing",
|
|
90
95
|
// Since we don't have a real subscription id yet but we need to keep
|
|
91
96
|
// track of this reference, we can just use a random uuid.
|
|
@@ -160,12 +165,15 @@ export class ObjectSetListenerWebsocket {
|
|
|
160
165
|
id,
|
|
161
166
|
requests: readySubs.map(({
|
|
162
167
|
objectSet,
|
|
163
|
-
requestedProperties
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
requestedProperties,
|
|
169
|
+
requestedReferenceProperties
|
|
170
|
+
}) => {
|
|
171
|
+
return {
|
|
172
|
+
objectSet: objectSet,
|
|
173
|
+
propertySet: requestedProperties,
|
|
174
|
+
referenceSet: requestedReferenceProperties
|
|
175
|
+
};
|
|
176
|
+
})
|
|
169
177
|
};
|
|
170
178
|
if (process?.env?.NODE_ENV !== "production") {
|
|
171
179
|
this.#logger?.trace({
|
|
@@ -308,8 +316,30 @@ export class ObjectSetListenerWebsocket {
|
|
|
308
316
|
const sub = this.#subscriptions.get(payload.id);
|
|
309
317
|
!sub ? invariant(false, `Expected subscription id ${payload.id}`) : void 0;
|
|
310
318
|
const objectUpdates = payload.updates.filter(update => update.type === "object");
|
|
311
|
-
payload.updates.filter(update => update.type === "reference");
|
|
319
|
+
const referenceUpdates = payload.updates.filter(update => update.type === "reference");
|
|
320
|
+
const osdkObjectsWithReferenceUpdates = await Promise.all(referenceUpdates.map(async o => {
|
|
321
|
+
const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [{
|
|
322
|
+
__apiName: o.objectType,
|
|
323
|
+
__primaryKey: o.primaryKey[sub.primaryKeyPropertyName],
|
|
324
|
+
...o.primaryKey,
|
|
325
|
+
[o.property]: o.value
|
|
326
|
+
}], undefined);
|
|
327
|
+
const singleOsdkObject = osdkObjectArray[0] ?? undefined;
|
|
328
|
+
return singleOsdkObject != null ? {
|
|
329
|
+
object: singleOsdkObject,
|
|
330
|
+
state: "ADDED_OR_UPDATED"
|
|
331
|
+
} : undefined;
|
|
332
|
+
}));
|
|
333
|
+
for (const osdkObject of osdkObjectsWithReferenceUpdates) {
|
|
334
|
+
if (osdkObject != null) {
|
|
335
|
+
sub.listener.onChange?.(osdkObject);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
312
338
|
const osdkObjects = await Promise.all(objectUpdates.map(async o => {
|
|
339
|
+
const keysToDelete = Object.keys(o.object).filter(key => sub.requestedReferenceProperties.includes(key));
|
|
340
|
+
for (const key of keysToDelete) {
|
|
341
|
+
delete o.object[key];
|
|
342
|
+
}
|
|
313
343
|
const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [o.object], undefined);
|
|
314
344
|
const singleOsdkObject = osdkObjectArray[0] ?? undefined;
|
|
315
345
|
return singleOsdkObject != null ? {
|
|
@@ -319,7 +349,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
319
349
|
}));
|
|
320
350
|
for (const osdkObject of osdkObjects) {
|
|
321
351
|
if (osdkObject != null) {
|
|
322
|
-
|
|
352
|
+
sub.listener.onChange?.(osdkObject);
|
|
323
353
|
}
|
|
324
354
|
}
|
|
325
355
|
};
|
|
@@ -385,8 +415,6 @@ export class ObjectSetListenerWebsocket {
|
|
|
385
415
|
// TODO we should probably throttle this so we don't abuse the backend
|
|
386
416
|
this.#cycleWebsocket();
|
|
387
417
|
};
|
|
388
|
-
// TODO: Validate if this is needed
|
|
389
|
-
async #enableObjectSetsWatcher() {}
|
|
390
418
|
#cycleWebsocket = () => {
|
|
391
419
|
if (this.#ws) {
|
|
392
420
|
this.#ws.removeEventListener("open", this.#onOpen);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","convertWireToOsdkObjects","ONE_DAY_MS","MINIMUM_RECONNECT_DELAY_MS","doNothing","fillOutListener","onChange","onError","onOutOfDate","isReady","sub","subscriptionIsDone","status","ObjectSetListenerWebsocket","instances","WeakMap","OBJECT_SET_EXPIRY_MS","getInstance","client","instance","get","clientCacheKey","set","ws","lastWsConnect","logger","pendingSubscriptions","Map","subscriptions","maybeDisconnectTimeout","constructor","objectSetExpiryMs","minimumReconnectDelayMs","child","msgPrefix","baseUrl","startsWith","subscribe","objectSet","listener","properties","requestedProperties","subscriptionId","crypto","randomUUID","initiateSubscribe","unsubscribe","#initiateSubscribe","process","env","NODE_ENV","trace","expiry","clearTimeout","setTimeout","expire","ontologyRid","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","#sendSubscribeMessage","readySubs","values","filter","length","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#expire","subscription","#unsubscribe","newStatus","undefined","delete","size","cycleWebsocket","#ensureWebsocket","tokenProvider","base","URL","url","host","token","nextConnectTime","Date","now","Promise","resolve","addEventListener","onClose","onMessage","onOpen","CONNECTING","reject","cleanup","removeEventListener","open","evt","#onOpen","message","data","parse","toString","type","handleMessage_objectSetChanged","handleMessage_refreshObjectSet","handleMessage_subscribeResponses","handleMessage_subscriptionClosed","objectUpdates","updates","update","osdkObjects","all","o","osdkObjectArray","object","singleOsdkObject","state","osdkObject","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","cause","event","enableObjectSetsWatcher","#enableObjectSetsWatcher","#cycleWebsocket","CLOSING","CLOSED","close","s"],"sources":["ObjectSetListenerWebsocket.js"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport { convertWireToOsdkObjects } from \"../object/convertWireToOsdkObjects.js\";\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\n/** Noop function to reduce conditional checks */\nfunction doNothing() { }\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener({ onChange = doNothing, onError = doNothing, onOutOfDate = doNothing, }) {\n return { onChange, onError, onOutOfDate };\n}\nfunction isReady(sub) {\n return sub.isReady != null;\n}\nfunction subscriptionIsDone(sub) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap();\n OBJECT_SET_EXPIRY_MS;\n MINIMUM_RECONNECT_DELAY_MS;\n // FIXME\n static getInstance(client) {\n let instance = ObjectSetListenerWebsocket.#instances.get(client.clientCacheKey);\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(client.clientCacheKey, instance);\n }\n return instance;\n }\n #ws;\n #lastWsConnect = 0;\n #client;\n #logger;\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map();\n /**\n * Map of subscriptionId to Subscription. Note: the subscriptionId may be\n * temporary and not the actual subscriptionId from the server.\n */\n #subscriptions = new Map();\n #maybeDisconnectTimeout;\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(client, { objectSetExpiryMs = ONE_DAY_MS, minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS, } = {}) {\n this.OBJECT_SET_EXPIRY_MS = objectSetExpiryMs;\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"), \"Stack must be a URL\");\n }\n async subscribe(objectSet, listener, properties) {\n if (process.env.TARGET !== \"browser\") {\n // Node 18 does not expose 'crypto' on globalThis, so we need to do it ourselves. This\n // will not be needed after our minimum version is 19 or greater.\n globalThis.crypto ??= (await import(\"node:crypto\")).webcrypto;\n }\n const sub = {\n listener: fillOutListener(listener),\n objectSet,\n requestedProperties: properties,\n status: \"preparing\",\n // Since we don't have a real subscription id yet but we need to keep\n // track of this reference, we can just use a random uuid.\n subscriptionId: `TMP-${crypto.randomUUID()}`,\n };\n this.#subscriptions.set(sub.subscriptionId, sub);\n // actually prepares the subscription, ensures the ws is ready, and sends\n // a subscribe message. We don't want to block on this.\n this.#initiateSubscribe(sub);\n return () => {\n this.#unsubscribe(sub);\n };\n }\n /**\n * Called at least once for every subscription.\n *\n * - Resets pending expiry\n * - Recreates temporary object set\n * - Triggers a full subscribe message\n *\n * @returns\n */\n async #initiateSubscribe(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#initiateSubscribe()\");\n }\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n }\n // expiry is tied to the temporary object set, which is set to `timeToLive: \"ONE_DAY\"`\n // in `#createTemporaryObjectSet`. They should be in sync\n sub.expiry = setTimeout(() => this.#expire(sub), this.OBJECT_SET_EXPIRY_MS);\n const ontologyRid = await this.#client.ontologyRid;\n try {\n await this.#ensureWebsocket();\n // the consumer may have already unsubscribed before we are ready to request a subscription\n // so we have to acquire the pendingSubscription after the await.\n if (subscriptionIsDone(sub)) {\n return;\n }\n sub.isReady = true;\n // if we aren't open, then this happens after we #onConnect\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#sendSubscribeMessage();\n }\n }\n catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n sub.listener.onError([error]);\n }\n }\n #sendSubscribeMessage() {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage()\");\n }\n // If two calls to `.subscribe()` happen at once (or if the connection is reset),\n // we may have multiple subscriptions that don't have a subscriptionId yet,\n // so we filter those out.\n const readySubs = [...this.#subscriptions.values()].filter(isReady);\n if (readySubs.length === 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage(): aborting due to no ready subscriptions\");\n }\n return;\n }\n // Assumes the node 18 crypto fallback to globalThis in `subscribe` has happened.\n const id = crypto.randomUUID();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n // every subscribe message \"overwrites\" the previous ones that are not\n // re-included, so we have to reconstitute the entire list of subscriptions\n const subscribe = {\n id,\n requests: readySubs.map(({ objectSet, requestedProperties }) => ({\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: [],\n })),\n };\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: subscribe }, \"sending subscribe message\");\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n #expire(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ subscription: sub }, \"#expire()\");\n }\n // the temporary ObjectSet has expired, we should re-subscribe which will cause the\n // listener to get an onOutOfDate message when it becomes subscribed again\n sub.status = \"expired\";\n this.#initiateSubscribe(sub);\n }\n #unsubscribe(sub, newStatus = \"done\") {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n sub.status = newStatus;\n // make sure listeners do nothing now\n sub.listener = fillOutListener({});\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n sub.expiry = undefined;\n }\n this.#subscriptions.delete(sub.subscriptionId);\n // If we have no more subscriptions, we can disconnect the websocket\n // however we should wait a bit to see if we get any more subscriptions.\n // For example, when switching between react views, you may unsubscribe\n // in the old view and subscribe in the new view. We don't need to re-establish\n // the websocket connection in that case.\n if (this.#maybeDisconnectTimeout) {\n // We reset the timeout on every unsubscribe so its always at least 15s from\n // the last time we are empty. E.g.:\n // - 0s: Subscribe(A)\n // - 10s: Unsubscribe(A)\n // - 11s: Subscribe(B)\n // - 20s: Unsubscribe(B)\n // If we do not clear out the timeout we would disconnect at 25s but that would only be\n // 5s after the last subscription was removed instead of at 35s for the desired 15s.\n clearTimeout(this.#maybeDisconnectTimeout);\n }\n this.#maybeDisconnectTimeout = setTimeout(() => {\n this.#maybeDisconnectTimeout = undefined;\n if (this.#subscriptions.size === 0) {\n this.#cycleWebsocket();\n }\n }, 15_000 /* ms */);\n }\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const base = new URL(baseUrl);\n const url = `wss://${base.host}/api/v2/ontologySubscriptions/ontologies/${this.#client.ontologyRid}/streamSubscriptions`;\n const token = await tokenProvider();\n // tokenProvider is async, there could potentially be a race to create the websocket.\n // Only the first call to reach here will find a null this.#ws, the rest will bail out\n if (this.#ws == null) {\n // TODO this can probably be exponential backoff with jitter\n // don't reconnect more quickly than MINIMUM_RECONNECT_DELAY\n const nextConnectTime = (this.#lastWsConnect ?? 0)\n + this.MINIMUM_RECONNECT_DELAY_MS;\n if (nextConnectTime > Date.now()) {\n await new Promise((resolve) => {\n setTimeout(resolve, nextConnectTime - Date.now());\n });\n }\n this.#lastWsConnect = Date.now();\n // we again may have lost the race after our minimum backoff time\n if (this.#ws == null) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"Creating websocket\");\n }\n this.#ws = new WebSocket(url, [`Bearer-${token}`]);\n this.#ws.addEventListener(\"close\", this.#onClose);\n this.#ws.addEventListener(\"message\", this.#onMessage);\n this.#ws.addEventListener(\"open\", this.#onOpen);\n }\n }\n // Allow await-ing the websocket open event if it isn't open already.\n // This needs to happen even for callers that didn't just create this.#ws\n if (this.#ws.readyState === WebSocket.CONNECTING) {\n const ws = this.#ws;\n return new Promise((resolve, reject) => {\n function cleanup() {\n ws.removeEventListener(\"open\", open);\n ws.removeEventListener(\"error\", error);\n ws.removeEventListener(\"close\", cleanup);\n }\n function open() {\n cleanup();\n resolve();\n }\n function error(evt) {\n cleanup();\n reject(evt);\n }\n ws.addEventListener(\"open\", open);\n ws.addEventListener(\"error\", error);\n ws.addEventListener(\"close\", cleanup);\n });\n }\n }\n }\n #onOpen = () => {\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n #onMessage = async (message) => {\n const data = JSON.parse(message.data.toString());\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n return this.#handleMessage_objectSetChanged(data);\n case \"refreshObjectSet\":\n return this.#handleMessage_refreshObjectSet(data);\n case \"subscribeResponses\":\n return this.#handleMessage_subscribeResponses(data);\n case \"subscriptionClosed\": {\n return this.#handleMessage_subscriptionClosed(data);\n }\n default:\n const _ = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n #handleMessage_objectSetChanged = async (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n const objectUpdates = payload.updates.filter((update) => update.type === \"object\");\n const referenceUpdates = payload.updates.filter((update) => update.type === \"reference\");\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [o.object], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n return sub.listener.onChange?.(osdkObject);\n }\n }\n };\n #handleMessage_refreshObjectSet = (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onOutOfDate();\n };\n #handleMessage_subscribeResponses = (payload) => {\n const { id, responses } = payload;\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n switch (response.type) {\n case \"error\":\n sub.listener.onError(response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n case \"qos\":\n // the server has requested that we tear down our websocket and reconnect to help load balance\n this.#cycleWebsocket();\n break;\n case \"success\":\n // `\"preparing\"` should only be the status on an initial subscribe.\n const shouldFireOutOfDate = sub.status === \"expired\"\n || sub.status === \"reconnecting\";\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ shouldFireOutOfDate }, \"success\");\n }\n sub.status = \"subscribed\";\n if (sub.subscriptionId !== response.id) {\n // might be the temporary one\n this.#subscriptions.delete(sub.subscriptionId);\n sub.subscriptionId = response.id;\n this.#subscriptions.set(sub.subscriptionId, sub); // future messages come by this subId\n }\n if (shouldFireOutOfDate)\n sub.listener.onOutOfDate();\n break;\n default:\n const _ = response;\n sub.listener.onError(response);\n }\n }\n };\n #handleMessage_subscriptionClosed(payload) {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onError([payload.cause]);\n this.#unsubscribe(sub, \"error\");\n }\n #onClose = (event) => {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ event }, \"Received close event from ws\", event);\n }\n // TODO we should probably throttle this so we don't abuse the backend\n this.#cycleWebsocket();\n };\n // TODO: Validate if this is needed\n async #enableObjectSetsWatcher(objectTypeRids) {\n // return batchEnableWatcher(this.#oswContext, {\n // requests: objectTypeRids,\n // });\n return;\n }\n #cycleWebsocket = () => {\n if (this.#ws) {\n this.#ws.removeEventListener(\"open\", this.#onOpen);\n this.#ws.removeEventListener(\"message\", this.#onMessage);\n this.#ws.removeEventListener(\"close\", this.#onClose);\n if (this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\n // if we have any listeners that are still depending on us, go ahead and reopen the websocket\n if (this.#subscriptions.size > 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n for (const s of this.#subscriptions.values()) {\n invariant(s.status !== \"done\" && s.status !== \"error\", \"should not have done/error subscriptions still\");\n }\n }\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\")\n s.status = \"reconnecting\";\n }\n this.#ensureWebsocket();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","convertWireToOsdkObjects","ONE_DAY_MS","MINIMUM_RECONNECT_DELAY_MS","doNothing","fillOutListener","onChange","onError","onOutOfDate","isReady","sub","subscriptionIsDone","status","ObjectSetListenerWebsocket","instances","WeakMap","OBJECT_SET_EXPIRY_MS","getInstance","client","instance","get","clientCacheKey","set","ws","lastWsConnect","logger","pendingSubscriptions","Map","subscriptions","maybeDisconnectTimeout","constructor","objectSetExpiryMs","minimumReconnectDelayMs","child","msgPrefix","baseUrl","startsWith","subscribe","objectType","objectSet","listener","properties","objDef","ontologyProvider","getObjectDefinition","apiName","objectProperties","filter","p","type","referenceProperties","primaryKeyPropertyName","primaryKeyApiName","requestedProperties","requestedReferenceProperties","subscriptionId","crypto","randomUUID","initiateSubscribe","unsubscribe","#initiateSubscribe","process","env","NODE_ENV","trace","expiry","clearTimeout","setTimeout","expire","ontologyRid","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","#sendSubscribeMessage","readySubs","values","length","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#expire","subscription","#unsubscribe","newStatus","undefined","delete","size","cycleWebsocket","#ensureWebsocket","tokenProvider","base","URL","url","host","token","nextConnectTime","Date","now","Promise","resolve","addEventListener","onClose","onMessage","onOpen","CONNECTING","reject","cleanup","removeEventListener","open","evt","#onOpen","message","data","parse","toString","handleMessage_objectSetChanged","handleMessage_refreshObjectSet","handleMessage_subscribeResponses","handleMessage_subscriptionClosed","objectUpdates","updates","update","referenceUpdates","osdkObjectsWithReferenceUpdates","all","o","osdkObjectArray","__apiName","__primaryKey","primaryKey","property","value","singleOsdkObject","object","state","osdkObject","osdkObjects","keysToDelete","Object","keys","key","includes","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","cause","event","#cycleWebsocket","CLOSING","CLOSED","close","s"],"sources":["ObjectSetListenerWebsocket.js"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport { convertWireToOsdkObjects } from \"../object/convertWireToOsdkObjects.js\";\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\n/** Noop function to reduce conditional checks */\nfunction doNothing() { }\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener({ onChange = doNothing, onError = doNothing, onOutOfDate = doNothing, }) {\n return { onChange, onError, onOutOfDate };\n}\nfunction isReady(sub) {\n return sub.isReady != null;\n}\nfunction subscriptionIsDone(sub) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap();\n OBJECT_SET_EXPIRY_MS;\n MINIMUM_RECONNECT_DELAY_MS;\n // FIXME\n static getInstance(client) {\n let instance = ObjectSetListenerWebsocket.#instances.get(client.clientCacheKey);\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(client.clientCacheKey, instance);\n }\n return instance;\n }\n #ws;\n #lastWsConnect = 0;\n #client;\n #logger;\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map();\n /**\n * Map of subscriptionId to Subscription. Note: the subscriptionId may be\n * temporary and not the actual subscriptionId from the server.\n */\n #subscriptions = new Map();\n #maybeDisconnectTimeout;\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(client, { objectSetExpiryMs = ONE_DAY_MS, minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS, } = {}) {\n this.OBJECT_SET_EXPIRY_MS = objectSetExpiryMs;\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"), \"Stack must be a URL\");\n }\n async subscribe(objectType, objectSet, listener, properties) {\n if (process.env.TARGET !== \"browser\") {\n // Node 18 does not expose 'crypto' on globalThis, so we need to do it ourselves. This\n // will not be needed after our minimum version is 19 or greater.\n globalThis.crypto ??= (await import(\"node:crypto\")).webcrypto;\n }\n const objDef = await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName);\n const objectProperties = properties.filter((p) => objDef.properties[p].type !== \"geotimeSeriesReference\");\n const referenceProperties = properties.filter((p) => objDef.properties[p].type === \"geotimeSeriesReference\");\n const sub = {\n listener: fillOutListener(listener),\n objectSet,\n primaryKeyPropertyName: objDef.primaryKeyApiName,\n requestedProperties: objectProperties,\n requestedReferenceProperties: referenceProperties,\n status: \"preparing\",\n // Since we don't have a real subscription id yet but we need to keep\n // track of this reference, we can just use a random uuid.\n subscriptionId: `TMP-${crypto.randomUUID()}`,\n };\n this.#subscriptions.set(sub.subscriptionId, sub);\n // actually prepares the subscription, ensures the ws is ready, and sends\n // a subscribe message. We don't want to block on this.\n this.#initiateSubscribe(sub);\n return () => {\n this.#unsubscribe(sub);\n };\n }\n /**\n * Called at least once for every subscription.\n *\n * - Resets pending expiry\n * - Recreates temporary object set\n * - Triggers a full subscribe message\n *\n * @returns\n */\n async #initiateSubscribe(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#initiateSubscribe()\");\n }\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n }\n // expiry is tied to the temporary object set, which is set to `timeToLive: \"ONE_DAY\"`\n // in `#createTemporaryObjectSet`. They should be in sync\n sub.expiry = setTimeout(() => this.#expire(sub), this.OBJECT_SET_EXPIRY_MS);\n const ontologyRid = await this.#client.ontologyRid;\n try {\n await this.#ensureWebsocket();\n // the consumer may have already unsubscribed before we are ready to request a subscription\n // so we have to acquire the pendingSubscription after the await.\n if (subscriptionIsDone(sub)) {\n return;\n }\n sub.isReady = true;\n // if we aren't open, then this happens after we #onConnect\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#sendSubscribeMessage();\n }\n }\n catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n sub.listener.onError([error]);\n }\n }\n #sendSubscribeMessage() {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage()\");\n }\n // If two calls to `.subscribe()` happen at once (or if the connection is reset),\n // we may have multiple subscriptions that don't have a subscriptionId yet,\n // so we filter those out.\n const readySubs = [...this.#subscriptions.values()].filter(isReady);\n if (readySubs.length === 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage(): aborting due to no ready subscriptions\");\n }\n return;\n }\n // Assumes the node 18 crypto fallback to globalThis in `subscribe` has happened.\n const id = crypto.randomUUID();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n // every subscribe message \"overwrites\" the previous ones that are not\n // re-included, so we have to reconstitute the entire list of subscriptions\n const subscribe = {\n id,\n requests: readySubs.map(({ objectSet, requestedProperties, requestedReferenceProperties }) => {\n return {\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: requestedReferenceProperties,\n };\n }),\n };\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: subscribe }, \"sending subscribe message\");\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n #expire(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ subscription: sub }, \"#expire()\");\n }\n // the temporary ObjectSet has expired, we should re-subscribe which will cause the\n // listener to get an onOutOfDate message when it becomes subscribed again\n sub.status = \"expired\";\n this.#initiateSubscribe(sub);\n }\n #unsubscribe(sub, newStatus = \"done\") {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n sub.status = newStatus;\n // make sure listeners do nothing now\n sub.listener = fillOutListener({});\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n sub.expiry = undefined;\n }\n this.#subscriptions.delete(sub.subscriptionId);\n // If we have no more subscriptions, we can disconnect the websocket\n // however we should wait a bit to see if we get any more subscriptions.\n // For example, when switching between react views, you may unsubscribe\n // in the old view and subscribe in the new view. We don't need to re-establish\n // the websocket connection in that case.\n if (this.#maybeDisconnectTimeout) {\n // We reset the timeout on every unsubscribe so its always at least 15s from\n // the last time we are empty. E.g.:\n // - 0s: Subscribe(A)\n // - 10s: Unsubscribe(A)\n // - 11s: Subscribe(B)\n // - 20s: Unsubscribe(B)\n // If we do not clear out the timeout we would disconnect at 25s but that would only be\n // 5s after the last subscription was removed instead of at 35s for the desired 15s.\n clearTimeout(this.#maybeDisconnectTimeout);\n }\n this.#maybeDisconnectTimeout = setTimeout(() => {\n this.#maybeDisconnectTimeout = undefined;\n if (this.#subscriptions.size === 0) {\n this.#cycleWebsocket();\n }\n }, 15_000 /* ms */);\n }\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const base = new URL(baseUrl);\n const url = `wss://${base.host}/api/v2/ontologySubscriptions/ontologies/${this.#client.ontologyRid}/streamSubscriptions`;\n const token = await tokenProvider();\n // tokenProvider is async, there could potentially be a race to create the websocket.\n // Only the first call to reach here will find a null this.#ws, the rest will bail out\n if (this.#ws == null) {\n // TODO this can probably be exponential backoff with jitter\n // don't reconnect more quickly than MINIMUM_RECONNECT_DELAY\n const nextConnectTime = (this.#lastWsConnect ?? 0)\n + this.MINIMUM_RECONNECT_DELAY_MS;\n if (nextConnectTime > Date.now()) {\n await new Promise((resolve) => {\n setTimeout(resolve, nextConnectTime - Date.now());\n });\n }\n this.#lastWsConnect = Date.now();\n // we again may have lost the race after our minimum backoff time\n if (this.#ws == null) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"Creating websocket\");\n }\n this.#ws = new WebSocket(url, [`Bearer-${token}`]);\n this.#ws.addEventListener(\"close\", this.#onClose);\n this.#ws.addEventListener(\"message\", this.#onMessage);\n this.#ws.addEventListener(\"open\", this.#onOpen);\n }\n }\n // Allow await-ing the websocket open event if it isn't open already.\n // This needs to happen even for callers that didn't just create this.#ws\n if (this.#ws.readyState === WebSocket.CONNECTING) {\n const ws = this.#ws;\n return new Promise((resolve, reject) => {\n function cleanup() {\n ws.removeEventListener(\"open\", open);\n ws.removeEventListener(\"error\", error);\n ws.removeEventListener(\"close\", cleanup);\n }\n function open() {\n cleanup();\n resolve();\n }\n function error(evt) {\n cleanup();\n reject(evt);\n }\n ws.addEventListener(\"open\", open);\n ws.addEventListener(\"error\", error);\n ws.addEventListener(\"close\", cleanup);\n });\n }\n }\n }\n #onOpen = () => {\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n #onMessage = async (message) => {\n const data = JSON.parse(message.data.toString());\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n return this.#handleMessage_objectSetChanged(data);\n case \"refreshObjectSet\":\n return this.#handleMessage_refreshObjectSet(data);\n case \"subscribeResponses\":\n return this.#handleMessage_subscribeResponses(data);\n case \"subscriptionClosed\": {\n return this.#handleMessage_subscriptionClosed(data);\n }\n default:\n const _ = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n #handleMessage_objectSetChanged = async (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n const objectUpdates = payload.updates.filter((update) => update.type === \"object\");\n const referenceUpdates = payload.updates.filter((update) => update.type === \"reference\");\n const osdkObjectsWithReferenceUpdates = await Promise.all(referenceUpdates.map(async (o) => {\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [{\n __apiName: o.objectType,\n __primaryKey: o.primaryKey[sub.primaryKeyPropertyName],\n ...o.primaryKey,\n [o.property]: o.value,\n }], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: \"ADDED_OR_UPDATED\",\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjectsWithReferenceUpdates) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const keysToDelete = Object.keys(o.object).filter((key) => sub.requestedReferenceProperties.includes(key));\n for (const key of keysToDelete) {\n delete o.object[key];\n }\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [o.object], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n };\n #handleMessage_refreshObjectSet = (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onOutOfDate();\n };\n #handleMessage_subscribeResponses = (payload) => {\n const { id, responses } = payload;\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n switch (response.type) {\n case \"error\":\n sub.listener.onError(response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n case \"qos\":\n // the server has requested that we tear down our websocket and reconnect to help load balance\n this.#cycleWebsocket();\n break;\n case \"success\":\n // `\"preparing\"` should only be the status on an initial subscribe.\n const shouldFireOutOfDate = sub.status === \"expired\"\n || sub.status === \"reconnecting\";\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ shouldFireOutOfDate }, \"success\");\n }\n sub.status = \"subscribed\";\n if (sub.subscriptionId !== response.id) {\n // might be the temporary one\n this.#subscriptions.delete(sub.subscriptionId);\n sub.subscriptionId = response.id;\n this.#subscriptions.set(sub.subscriptionId, sub); // future messages come by this subId\n }\n if (shouldFireOutOfDate)\n sub.listener.onOutOfDate();\n break;\n default:\n const _ = response;\n sub.listener.onError(response);\n }\n }\n };\n #handleMessage_subscriptionClosed(payload) {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onError([payload.cause]);\n this.#unsubscribe(sub, \"error\");\n }\n #onClose = (event) => {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ event }, \"Received close event from ws\", event);\n }\n // TODO we should probably throttle this so we don't abuse the backend\n this.#cycleWebsocket();\n };\n #cycleWebsocket = () => {\n if (this.#ws) {\n this.#ws.removeEventListener(\"open\", this.#onOpen);\n this.#ws.removeEventListener(\"message\", this.#onMessage);\n this.#ws.removeEventListener(\"close\", this.#onClose);\n if (this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\n // if we have any listeners that are still depending on us, go ahead and reopen the websocket\n if (this.#subscriptions.size > 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n for (const s of this.#subscriptions.values()) {\n invariant(s.status !== \"done\" && s.status !== \"error\", \"should not have done/error subscriptions still\");\n }\n }\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\")\n s.status = \"reconnecting\";\n }\n this.#ensureWebsocket();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { $ontologyRid, Employee
|
|
16
|
+
import { $ontologyRid, Employee } from "@osdk/client.test.ontology";
|
|
17
17
|
import { apiServer } from "@osdk/shared.test";
|
|
18
18
|
import ImportedWebSocket from "isomorphic-ws";
|
|
19
19
|
import { http, HttpResponse } from "msw";
|
|
20
|
+
import pDefer from "p-defer";
|
|
20
21
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
21
22
|
import { z } from "zod";
|
|
22
23
|
import { createMinimalClient } from "../createMinimalClient.js";
|
|
@@ -58,6 +59,7 @@ vi.mock("isomorphic-ws", async importOriginal => {
|
|
|
58
59
|
WebSocket
|
|
59
60
|
};
|
|
60
61
|
});
|
|
62
|
+
let currentSubscriptionId = 0;
|
|
61
63
|
describe("ObjectSetListenerWebsocket", async () => {
|
|
62
64
|
beforeAll(async () => {
|
|
63
65
|
apiServer.listen();
|
|
@@ -69,10 +71,11 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
69
71
|
describe("basic setup", () => {
|
|
70
72
|
let minimalClient;
|
|
71
73
|
const MINIMUM_RECONNECT_DELAY = 2_000;
|
|
72
|
-
const OBJECT_SET_EXPIRY_MS = 60_000;
|
|
73
74
|
let client;
|
|
74
75
|
let listener;
|
|
75
76
|
let oslwInst = 0;
|
|
77
|
+
let updateReceived = undefined;
|
|
78
|
+
let listenerPromise;
|
|
76
79
|
beforeEach(() => {
|
|
77
80
|
minimalClient = createMinimalClient({
|
|
78
81
|
ontologyRid: $ontologyRid
|
|
@@ -86,10 +89,14 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
86
89
|
})
|
|
87
90
|
}, {
|
|
88
91
|
minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,
|
|
89
|
-
objectSetExpiryMs:
|
|
92
|
+
objectSetExpiryMs: 60_000
|
|
90
93
|
});
|
|
94
|
+
listenerPromise = pDefer();
|
|
91
95
|
listener = {
|
|
92
|
-
onChange: vi.fn(
|
|
96
|
+
onChange: vi.fn(o => {
|
|
97
|
+
updateReceived = o;
|
|
98
|
+
listenerPromise.resolve();
|
|
99
|
+
}),
|
|
93
100
|
onError: vi.fn(),
|
|
94
101
|
onOutOfDate: vi.fn()
|
|
95
102
|
};
|
|
@@ -134,6 +141,12 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
134
141
|
unsubscribe();
|
|
135
142
|
expect(ws.send).not.toHaveBeenCalled();
|
|
136
143
|
});
|
|
144
|
+
it("currently requests regular object properties", () => {
|
|
145
|
+
expect(subReq1.requests[0].propertySet).toEqual(["employeeId"]);
|
|
146
|
+
});
|
|
147
|
+
it.fails("currently requests reference backed properties", () => {
|
|
148
|
+
expect(subReq1.requests[0].referenceSet).toEqual(["employeeLocation"]);
|
|
149
|
+
});
|
|
137
150
|
describe("socket closed before subscription confirmed", () => {
|
|
138
151
|
beforeEach(() => {
|
|
139
152
|
setWebSocketState(ws, "close");
|
|
@@ -161,13 +174,61 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
161
174
|
beforeEach(() => {
|
|
162
175
|
respondSuccessToSubscribe(ws, subReq1);
|
|
163
176
|
});
|
|
177
|
+
it("should correctly return regular updates", async () => {
|
|
178
|
+
const idNum2 = currentSubscriptionId;
|
|
179
|
+
sendObjectUpdateResponse(ws, `${idNum2}`);
|
|
180
|
+
await listenerPromise.promise;
|
|
181
|
+
expect(listener.onChange).toHaveBeenCalled();
|
|
182
|
+
expect(updateReceived).toMatchInlineSnapshot(`
|
|
183
|
+
{
|
|
184
|
+
"object": {
|
|
185
|
+
"$apiName": "Employee",
|
|
186
|
+
"$objectType": "Employee",
|
|
187
|
+
"employeeId": 1,
|
|
188
|
+
},
|
|
189
|
+
"state": "ADDED_OR_UPDATED",
|
|
190
|
+
}
|
|
191
|
+
`);
|
|
192
|
+
});
|
|
193
|
+
it("should correctly return reference update", async () => {
|
|
194
|
+
const idNum2 = currentSubscriptionId;
|
|
195
|
+
sendReferenceUpdatesResponse(ws, `${idNum2}`);
|
|
196
|
+
await listenerPromise.promise;
|
|
197
|
+
expect(listener.onChange).toHaveBeenCalled();
|
|
198
|
+
expect(updateReceived).toMatchInlineSnapshot(`
|
|
199
|
+
{
|
|
200
|
+
"object": {
|
|
201
|
+
"$apiName": "Employee",
|
|
202
|
+
"$objectType": "Employee",
|
|
203
|
+
"$primaryKey": "12345",
|
|
204
|
+
"employeeId": "12345",
|
|
205
|
+
"employeeLocation": GeotimeSeriesPropertyImpl {
|
|
206
|
+
"lastFetchedValue": {
|
|
207
|
+
"time": "111",
|
|
208
|
+
"value": {
|
|
209
|
+
"coordinates": [
|
|
210
|
+
100,
|
|
211
|
+
200,
|
|
212
|
+
],
|
|
213
|
+
"type": "Point",
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
"state": "ADDED_OR_UPDATED",
|
|
219
|
+
}
|
|
220
|
+
`);
|
|
221
|
+
});
|
|
164
222
|
describe("additional subscription", async () => {
|
|
165
223
|
let unsubscribe2;
|
|
166
224
|
let subReq2;
|
|
167
225
|
beforeEach(async () => {
|
|
168
226
|
[unsubscribe2, subReq2] = await Promise.all([client.subscribe({
|
|
227
|
+
type: "object",
|
|
228
|
+
apiName: "Employee"
|
|
229
|
+
}, {
|
|
169
230
|
type: "base",
|
|
170
|
-
objectType:
|
|
231
|
+
objectType: Employee.apiName
|
|
171
232
|
}, listener, ["employeeStatus"]), expectSingleSubscribeMessage(ws)]);
|
|
172
233
|
rootLogger.fatal({
|
|
173
234
|
subReq2
|
|
@@ -181,18 +242,6 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
181
242
|
expect(listener.onOutOfDate).not.toHaveBeenCalled();
|
|
182
243
|
});
|
|
183
244
|
});
|
|
184
|
-
describe("temporary object set expires", () => {
|
|
185
|
-
beforeEach(async () => {
|
|
186
|
-
await vi.advanceTimersByTimeAsync(OBJECT_SET_EXPIRY_MS + 1000);
|
|
187
|
-
});
|
|
188
|
-
it("should resubscribe and fire out of date", async () => {
|
|
189
|
-
vi.runAllTicks();
|
|
190
|
-
const subReq2 = await expectSingleSubscribeMessage(ws);
|
|
191
|
-
expect(subReq2.id).not.toEqual(subReq1.id);
|
|
192
|
-
respondSuccessToSubscribe(ws, subReq2);
|
|
193
|
-
expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
245
|
describe("socket closed abruptly", () => {
|
|
197
246
|
beforeEach(() => {
|
|
198
247
|
setWebSocketState(ws, "close");
|
|
@@ -228,7 +277,40 @@ function respondSuccessToSubscribe(ws, subReq2) {
|
|
|
228
277
|
type: "subscribeResponses",
|
|
229
278
|
responses: [{
|
|
230
279
|
type: "success",
|
|
231
|
-
id:
|
|
280
|
+
id: `${++currentSubscriptionId}`
|
|
281
|
+
}]
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
function sendObjectUpdateResponse(ws, subId) {
|
|
285
|
+
sendToClient(ws, {
|
|
286
|
+
type: "objectSetChanged",
|
|
287
|
+
id: subId,
|
|
288
|
+
updates: [{
|
|
289
|
+
type: "object",
|
|
290
|
+
state: "ADDED_OR_UPDATED",
|
|
291
|
+
object: {
|
|
292
|
+
__apiName: "Employee",
|
|
293
|
+
employeeId: 1
|
|
294
|
+
}
|
|
295
|
+
}]
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function sendReferenceUpdatesResponse(ws, subId) {
|
|
299
|
+
sendToClient(ws, {
|
|
300
|
+
type: "objectSetChanged",
|
|
301
|
+
id: subId,
|
|
302
|
+
updates: [{
|
|
303
|
+
"type": "reference",
|
|
304
|
+
"objectType": "Employee",
|
|
305
|
+
"primaryKey": {
|
|
306
|
+
"employeeId": "12345"
|
|
307
|
+
},
|
|
308
|
+
"property": "employeeLocation",
|
|
309
|
+
"value": {
|
|
310
|
+
"timestamp": "111",
|
|
311
|
+
"type": "geotimeSeriesValue",
|
|
312
|
+
"position": [100, 200]
|
|
313
|
+
}
|
|
232
314
|
}]
|
|
233
315
|
});
|
|
234
316
|
}
|
|
@@ -240,9 +322,12 @@ async function expectSingleSubscribeMessage(ws) {
|
|
|
240
322
|
}
|
|
241
323
|
async function subscribeAndExpectWebSocket(client, listener) {
|
|
242
324
|
const [ws, unsubscribe] = await Promise.all([expectWebSocketConstructed(), client.subscribe({
|
|
325
|
+
apiName: "Employee",
|
|
326
|
+
type: "object"
|
|
327
|
+
}, {
|
|
243
328
|
type: "base",
|
|
244
329
|
objectType: Employee.apiName
|
|
245
|
-
}, listener, ["
|
|
330
|
+
}, listener, ["employeeId"])]);
|
|
246
331
|
// otherwise the ObjectSetListenerWebSocket is sitting waiting for it to "connect"
|
|
247
332
|
setWebSocketState(ws, "open");
|
|
248
333
|
return [ws, unsubscribe];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","Office","apiServer","ImportedWebSocket","http","HttpResponse","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createMinimalClient","ObjectSetListenerWebsocket","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","MockedWebSocket","STACK","mock","importOriginal","original","WebSocket","createMockWebSocketConstructor","default","listen","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","OBJECT_SET_EXPIRY_MS","client","listener","oslwInst","ontologyRid","logger","child","minimumReconnectDelayMs","objectSetExpiryMs","onChange","fn","onError","onOutOfDate","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSingleSubscribeMessage","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","unsubscribe2","subscribe","type","objectType","apiName","fatal","id","toEqual","toHaveBeenCalledTimes","sendToClient","responses","removeEventListener","addEventListener","calls","length","consumeSingleSend","waitFor","results","value","mockClear","toBeCalledTimes","result","JSON","parse","lastCall","toString","OriginalWebSocket","i","ret","_args","webSocketInst","debug","eventEmitter","EventTarget","bind","message","_eventEmitter","readyState","CONNECTING","Object","assign","OPEN","CLOSED","CLOSING","newState","dispatchEvent","Event","name","requestId","request","trace","url","eventNames","c","events","on","SubscribeMessage","object","string","requests","array","objectSet","propertySet","referenceSet","MessageEvent","data","constructor","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { $ontologyRid, Employee, Office } from \"@osdk/client.test.ontology\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport { ObjectSetListenerWebsocket } from \"./ObjectSetListenerWebsocket.js\";\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async () => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\")\n a = a.slice(0, -1);\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino({ level: \"info\" }, (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n })));\n});\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket;\nconst STACK = \"https://stack.palantir.com\";\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal();\n const WebSocket = createMockWebSocketConstructor(original.default, rootLogger);\n return { default: WebSocket, WebSocket };\n});\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n afterAll(() => {\n apiServer.close();\n });\n describe(\"basic setup\", () => {\n let minimalClient;\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n let client;\n let listener;\n let oslwInst = 0;\n beforeEach(() => {\n minimalClient = createMinimalClient({ ontologyRid: $ontologyRid }, STACK, async () => \"myAccessToken\", { logger: rootLogger });\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n objectSetExpiryMs: OBJECT_SET_EXPIRY_MS,\n });\n listener = {\n onChange: vi.fn(),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n };\n let objectSetRidCounter = 0;\n apiServer.use(http.post(`${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`, () => HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n })));\n vi.useFakeTimers();\n });\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\n it(\"should not send onOutOfDate since it has not subscribed yet\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n describe(\"requests subscription\", () => {\n let ws;\n let unsubscribe;\n let subReq1;\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(client, listener);\n subReq1 = await expectSingleSubscribeMessage(ws);\n });\n afterEach(() => {\n // just ensure we ended in good states, as we clear these as we consume them\n expect(MockedWebSocket).not.toHaveBeenCalled();\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n vi.runAllTicks();\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\n it(\"only sends a single request\", async () => {\n respondSuccessToSubscribe(ws, subReq1);\n // actually this is broken FIXME\n unsubscribe();\n expect(ws.send).not.toHaveBeenCalled();\n });\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n describe(\"reconnect\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n });\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSingleSubscribeMessage(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n describe(\"additional subscription\", async () => {\n let unsubscribe2;\n let subReq2;\n beforeEach(async () => {\n [unsubscribe2, subReq2] = await Promise.all([\n client.subscribe({\n type: \"base\",\n objectType: Office.apiName,\n }, listener, [\"employeeStatus\"]),\n expectSingleSubscribeMessage(ws),\n ]);\n rootLogger.fatal({ subReq2 });\n respondSuccessToSubscribe(ws, subReq2);\n });\n afterEach(() => {\n unsubscribe2();\n });\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n describe(\"temporary object set expires\", () => {\n beforeEach(async () => {\n await vi.advanceTimersByTimeAsync(OBJECT_SET_EXPIRY_MS + 1000);\n });\n it(\"should resubscribe and fire out of date\", async () => {\n vi.runAllTicks();\n const subReq2 = await expectSingleSubscribeMessage(ws);\n expect(subReq2.id).not.toEqual(subReq1.id);\n respondSuccessToSubscribe(ws, subReq2);\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\n });\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n describe(\"reconnect, resubscribe successfully\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n const subReq2 = await expectSingleSubscribeMessage(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\n });\n });\n it(\"should not send onOutOfDate for first call\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n });\n });\n });\n});\nfunction respondSuccessToSubscribe(ws, subReq2) {\n sendToClient(ws, {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: \"subId\",\n }],\n });\n}\nfunction expectEqualRemoveAndAddListeners(ws) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(ws.addEventListener.mock.calls.length);\n}\nasync function expectSingleSubscribeMessage(ws) {\n return await consumeSingleSend(ws);\n}\nasync function subscribeAndExpectWebSocket(client, listener) {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe({\n type: \"base\",\n objectType: Employee.apiName,\n }, listener, [\"employeeStatus\"]),\n ]);\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n return [ws, unsubscribe];\n}\nasync function expectWebSocketConstructed() {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n const ws = await vi.waitFor(() => {\n expect(MockedWebSocket).toHaveBeenCalled();\n expect(MockedWebSocket.mock.results[0].type === \"return\");\n return MockedWebSocket.mock.results[0].value;\n });\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n return ws;\n}\nasync function consumeSingleSend(ws) {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(1);\n const result = JSON.parse(ws.send.mock.lastCall[0].toString());\n ws.send.mockClear();\n return result;\n });\n}\nfunction createMockWebSocketConstructor(OriginalWebSocket, logger) {\n let i = 0;\n const ret = vi.fn(function (..._args) {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n return {\n addEventListener: vi.fn(eventEmitter.addEventListener.bind(eventEmitter)),\n removeEventListener: vi.fn(eventEmitter.removeEventListener.bind(eventEmitter)),\n send: vi.fn((a, _b) => {\n logger.debug({ message: JSON.parse(a.toString()), webSocketInst }, \"send() called\");\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n };\n // ^ we only implement some things but the type system wants to think its the full deal,\n // thus the satisfies plus the cast\n });\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n return ret;\n}\nfunction setWebSocketState(ws, readyState) {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n if (newState === ws.readyState)\n return;\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\nfunction addLoggerToApiServer(logger) {\n const z = (name, { requestId, request }) => logger.trace({ requestId, url: request.url }, name);\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ];\n for (const c of eventNames) {\n apiServer.events.on(c, z.bind(undefined, c));\n }\n}\nconst SubscribeMessage = z.object({\n id: z.string(),\n requests: z.array(z.object({\n objectSet: z.object({ id: z.string() }),\n propertySet: z.array(z.string()),\n referenceSet: z.array(z.string()),\n })),\n});\nclass MessageEvent extends Event {\n data;\n constructor(data) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\nfunction sendToClient(ws, t) {\n ws._eventEmitter.dispatchEvent(new MessageEvent(t));\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","apiServer","ImportedWebSocket","http","HttpResponse","pDefer","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createMinimalClient","ObjectSetListenerWebsocket","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","MockedWebSocket","STACK","mock","importOriginal","original","WebSocket","createMockWebSocketConstructor","default","currentSubscriptionId","listen","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","client","listener","oslwInst","updateReceived","listenerPromise","ontologyRid","logger","child","minimumReconnectDelayMs","objectSetExpiryMs","onChange","fn","o","onError","onOutOfDate","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSingleSubscribeMessage","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","requests","propertySet","toEqual","fails","referenceSet","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","idNum2","sendObjectUpdateResponse","promise","toMatchInlineSnapshot","sendReferenceUpdatesResponse","unsubscribe2","subscribe","type","apiName","objectType","fatal","toHaveBeenCalledTimes","sendToClient","id","responses","subId","updates","state","object","__apiName","employeeId","removeEventListener","addEventListener","calls","length","consumeSingleSend","waitFor","results","value","mockClear","toBeCalledTimes","result","JSON","parse","lastCall","toString","OriginalWebSocket","i","ret","_args","webSocketInst","debug","eventEmitter","EventTarget","bind","message","_eventEmitter","readyState","CONNECTING","Object","assign","OPEN","CLOSED","CLOSING","newState","dispatchEvent","Event","name","requestId","request","trace","url","eventNames","c","events","on","SubscribeMessage","string","array","objectSet","MessageEvent","data","constructor","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport pDefer from \"p-defer\";\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport { ObjectSetListenerWebsocket } from \"./ObjectSetListenerWebsocket.js\";\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async () => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\")\n a = a.slice(0, -1);\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino({ level: \"info\" }, (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n })));\n});\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket;\nconst STACK = \"https://stack.palantir.com\";\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal();\n const WebSocket = createMockWebSocketConstructor(original.default, rootLogger);\n return { default: WebSocket, WebSocket };\n});\nlet currentSubscriptionId = 0;\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n afterAll(() => {\n apiServer.close();\n });\n describe(\"basic setup\", () => {\n let minimalClient;\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n let client;\n let listener;\n let oslwInst = 0;\n let updateReceived = undefined;\n let listenerPromise;\n beforeEach(() => {\n minimalClient = createMinimalClient({ ontologyRid: $ontologyRid }, STACK, async () => \"myAccessToken\", { logger: rootLogger });\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n objectSetExpiryMs: OBJECT_SET_EXPIRY_MS,\n });\n listenerPromise = pDefer();\n listener = {\n onChange: vi.fn((o) => {\n updateReceived = o;\n listenerPromise.resolve();\n }),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n };\n let objectSetRidCounter = 0;\n apiServer.use(http.post(`${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`, () => HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n })));\n vi.useFakeTimers();\n });\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\n it(\"should not send onOutOfDate since it has not subscribed yet\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n describe(\"requests subscription\", () => {\n let ws;\n let unsubscribe;\n let subReq1;\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(client, listener);\n subReq1 = await expectSingleSubscribeMessage(ws);\n });\n afterEach(() => {\n // just ensure we ended in good states, as we clear these as we consume them\n expect(MockedWebSocket).not.toHaveBeenCalled();\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n vi.runAllTicks();\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\n it(\"only sends a single request\", async () => {\n respondSuccessToSubscribe(ws, subReq1);\n // actually this is broken FIXME\n unsubscribe();\n expect(ws.send).not.toHaveBeenCalled();\n });\n it(\"currently requests regular object properties\", () => {\n expect(subReq1.requests[0].propertySet).toEqual([\n \"employeeId\",\n ]);\n });\n it.fails(\"currently requests reference backed properties\", () => {\n expect(subReq1.requests[0].referenceSet).toEqual([\"employeeLocation\"]);\n });\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n describe(\"reconnect\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n });\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSingleSubscribeMessage(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n it(\"should correctly return regular updates\", async () => {\n const idNum2 = currentSubscriptionId;\n sendObjectUpdateResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"employeeId\": 1,\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n it(\"should correctly return reference update\", async () => {\n const idNum2 = currentSubscriptionId;\n sendReferenceUpdatesResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": \"12345\",\n \"employeeId\": \"12345\",\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": {\n \"time\": \"111\",\n \"value\": {\n \"coordinates\": [\n 100,\n 200,\n ],\n \"type\": \"Point\",\n },\n },\n },\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n describe(\"additional subscription\", async () => {\n let unsubscribe2;\n let subReq2;\n beforeEach(async () => {\n [unsubscribe2, subReq2] = await Promise.all([\n client.subscribe({\n type: \"object\",\n apiName: \"Employee\",\n }, {\n type: \"base\",\n objectType: Employee.apiName,\n }, listener, [\"employeeStatus\"]),\n expectSingleSubscribeMessage(ws),\n ]);\n rootLogger.fatal({ subReq2 });\n respondSuccessToSubscribe(ws, subReq2);\n });\n afterEach(() => {\n unsubscribe2();\n });\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n describe(\"reconnect, resubscribe successfully\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n const subReq2 = await expectSingleSubscribeMessage(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\n });\n });\n it(\"should not send onOutOfDate for first call\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n });\n });\n });\n});\nfunction respondSuccessToSubscribe(ws, subReq2) {\n sendToClient(ws, {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: `${++currentSubscriptionId}`,\n }],\n });\n}\nfunction sendObjectUpdateResponse(ws, subId) {\n const updateMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n type: \"object\",\n state: \"ADDED_OR_UPDATED\",\n object: {\n __apiName: \"Employee\",\n employeeId: 1,\n },\n }],\n };\n sendToClient(ws, updateMessage);\n}\nfunction sendReferenceUpdatesResponse(ws, subId) {\n const referenceUpdateMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n \"type\": \"reference\",\n \"objectType\": \"Employee\",\n \"primaryKey\": { \"employeeId\": \"12345\" },\n \"property\": \"employeeLocation\",\n \"value\": {\n \"timestamp\": \"111\",\n \"type\": \"geotimeSeriesValue\",\n \"position\": [100, 200],\n },\n }],\n };\n sendToClient(ws, referenceUpdateMessage);\n}\nfunction expectEqualRemoveAndAddListeners(ws) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(ws.addEventListener.mock.calls.length);\n}\nasync function expectSingleSubscribeMessage(ws) {\n return await consumeSingleSend(ws);\n}\nasync function subscribeAndExpectWebSocket(client, listener) {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe({\n apiName: \"Employee\",\n type: \"object\",\n }, {\n type: \"base\",\n objectType: Employee.apiName,\n }, listener, [\"employeeId\"]),\n ]);\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n return [ws, unsubscribe];\n}\nasync function expectWebSocketConstructed() {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n const ws = await vi.waitFor(() => {\n expect(MockedWebSocket).toHaveBeenCalled();\n expect(MockedWebSocket.mock.results[0].type === \"return\");\n return MockedWebSocket.mock.results[0].value;\n });\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n return ws;\n}\nasync function consumeSingleSend(ws) {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(1);\n const result = JSON.parse(ws.send.mock.lastCall[0].toString());\n ws.send.mockClear();\n return result;\n });\n}\nfunction createMockWebSocketConstructor(OriginalWebSocket, logger) {\n let i = 0;\n const ret = vi.fn(function (..._args) {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n return {\n addEventListener: vi.fn(eventEmitter.addEventListener.bind(eventEmitter)),\n removeEventListener: vi.fn(eventEmitter.removeEventListener.bind(eventEmitter)),\n send: vi.fn((a, _b) => {\n logger.debug({ message: JSON.parse(a.toString()), webSocketInst }, \"send() called\");\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n };\n // ^ we only implement some things but the type system wants to think its the full deal,\n // thus the satisfies plus the cast\n });\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n return ret;\n}\nfunction setWebSocketState(ws, readyState) {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n if (newState === ws.readyState)\n return;\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\nfunction addLoggerToApiServer(logger) {\n const z = (name, { requestId, request }) => logger.trace({ requestId, url: request.url }, name);\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ];\n for (const c of eventNames) {\n apiServer.events.on(c, z.bind(undefined, c));\n }\n}\nconst SubscribeMessage = z.object({\n id: z.string(),\n requests: z.array(z.object({\n objectSet: z.object({ id: z.string() }),\n propertySet: z.array(z.string()),\n referenceSet: z.array(z.string()),\n })),\n});\nclass MessageEvent extends Event {\n data;\n constructor(data) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\nfunction sendToClient(ws, t) {\n ws._eventEmitter.dispatchEvent(new MessageEvent(t));\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,YAAY,EAAEC,QAAQ,QAAQ,4BAA4B;AACnE,SAASC,SAAS,QAAQ,mBAAmB;AAC7C,OAAOC,iBAAiB,MAAM,eAAe;AAC7C,SAASC,IAAI,EAAEC,YAAY,QAAQ,KAAK;AACxC,OAAOC,MAAM,MAAM,SAAS;AAC5B,SAASC,QAAQ,EAAEC,SAAS,EAAEC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAS,QAAQ;AAC9F,SAASC,CAAC,QAAQ,KAAK;AACvB,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,0BAA0B,QAAQ,iCAAiC;AAC5E;AACA;AACA,MAAMC,UAAU,GAAG,MAAMJ,EAAE,CAACK,OAAO,CAAC,YAAY;EAC5C,MAAMC,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAEA,IAAI;EACxC,MAAMC,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;EAC9C,MAAM;IAAEC;EAAa,CAAC,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;EAUpD,OAAOC,OAAO,CAACC,OAAO,CAACJ,IAAI,CAAC;IAAEK,KAAK,EAAE;EAAO,CAAC,EAAGJ,UAAU,CAACK,KAAK,CAAE;IAC9DC,IAAI,EAAE,IAAI;IACVC,YAAY,EAAEC,SAAS;IACvBC,mBAAmB,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;IAClDC,UAAU,EAAE,wBAAwB;IACpCC,MAAM,EAAE,mBAAmB;IAC3BC,WAAW,EAAE,IAfjB,cAAwCX,YAAY,CAAC;MACjDY,KAAKA,CAACC,CAAC,EAAE;QACL;QACA,IAAIA,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EACjBD,CAAC,GAAGA,CAAC,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB;QACAC,OAAO,CAACC,GAAG,CAACJ,CAAC,CAAC;MAClB;IACJ,CAAC,CAO8C;EAC/C,CAAC,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AACF;AACA,MAAMK,eAAe,GAAGrC,iBAAiB;AACzC,MAAMsC,KAAK,GAAG,4BAA4B;AAC1C3B,EAAE,CAAC4B,IAAI,CAAC,eAAe,EAAE,MAAOC,cAAc,IAAK;EAC/C,MAAMC,QAAQ,GAAG,MAAMD,cAAc,CAAC,CAAC;EACvC,MAAME,SAAS,GAAGC,8BAA8B,CAACF,QAAQ,CAACG,OAAO,EAAE7B,UAAU,CAAC;EAC9E,OAAO;IAAE6B,OAAO,EAAEF,SAAS;IAAEA;EAAU,CAAC;AAC5C,CAAC,CAAC;AACF,IAAIG,qBAAqB,GAAG,CAAC;AAC7BrC,QAAQ,CAAC,4BAA4B,EAAE,YAAY;EAC/CF,SAAS,CAAC,YAAY;IAClBP,SAAS,CAAC+C,MAAM,CAAC,CAAC;IAClBC,oBAAoB,CAAChC,UAAU,CAAC;EACpC,CAAC,CAAC;EACFX,QAAQ,CAAC,MAAM;IACXL,SAAS,CAACiD,KAAK,CAAC,CAAC;EACrB,CAAC,CAAC;EACFxC,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC1B,IAAIyC,aAAa;IACjB,MAAMC,uBAAuB,GAAG,KAAK;IAErC,IAAIC,MAAM;IACV,IAAIC,QAAQ;IACZ,IAAIC,QAAQ,GAAG,CAAC;IAChB,IAAIC,cAAc,GAAG5B,SAAS;IAC9B,IAAI6B,eAAe;IACnBhD,UAAU,CAAC,MAAM;MACb0C,aAAa,GAAGpC,mBAAmB,CAAC;QAAE2C,WAAW,EAAE3D;MAAa,CAAC,EAAEyC,KAAK,EAAE,YAAY,eAAe,EAAE;QAAEmB,MAAM,EAAE1C;MAAW,CAAC,CAAC;MAC9HoC,MAAM,GAAG,IAAIrC,0BAA0B,CAAC;QACpC,GAAGmC,aAAa;QAChBQ,MAAM,EAAE1C,UAAU,CAAC2C,KAAK,CAAC;UAAEL,QAAQ,EAAEA,QAAQ;QAAG,CAAC;MACrD,CAAC,EAAE;QACCM,uBAAuB,EAAET,uBAAuB;QAChDU,iBAAiB,EAbI;MAczB,CAAC,CAAC;MACFL,eAAe,GAAGpD,MAAM,CAAC,CAAC;MAC1BiD,QAAQ,GAAG;QACPS,QAAQ,EAAElD,EAAE,CAACmD,EAAE,CAAEC,CAAC,IAAK;UACnBT,cAAc,GAAGS,CAAC;UAClBR,eAAe,CAAClC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF2C,OAAO,EAAErD,EAAE,CAACmD,EAAE,CAAC,CAAC;QAChBG,WAAW,EAAEtD,EAAE,CAACmD,EAAE,CAAC;MACvB,CAAC;MACD,IAAII,mBAAmB,GAAG,CAAC;MAC3BnE,SAAS,CAACoE,GAAG,CAAClE,IAAI,CAACmE,IAAI,CAAC,GAAG9B,KAAK,2CAA2CzC,YAAY,sBAAsB,EAAE,MAAMK,YAAY,CAACmE,IAAI,CAAC;QACnIC,YAAY,EAAE,UAAUJ,mBAAmB,EAAE;MACjD,CAAC,CAAC,CAAC,CAAC;MACJvD,EAAE,CAAC4D,aAAa,CAAC,CAAC;IACtB,CAAC,CAAC;IACFlE,SAAS,CAAC,MAAM;MACZM,EAAE,CAAC6D,eAAe,CAAC,CAAC;MACpBzE,SAAS,CAAC0E,aAAa,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF/D,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACpED,MAAM,CAAC4B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAC9ClE,MAAM,CAAC2C,QAAQ,CAACa,WAAW,CAAC,CAACS,GAAG,CAACC,gBAAgB,CAAC,CAAC;MACnDlE,MAAM,CAAC2C,QAAQ,CAACS,QAAQ,CAAC,CAACa,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAChDlE,MAAM,CAAC2C,QAAQ,CAACY,OAAO,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;IACnD,CAAC,CAAC;IACFnE,QAAQ,CAAC,uBAAuB,EAAE,MAAM;MACpC,IAAIoE,EAAE;MACN,IAAIC,WAAW;MACf,IAAIC,OAAO;MACXvE,UAAU,CAAC,YAAY;QACnB,CAACqE,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAME,2BAA2B,CAAC5B,MAAM,EAAEC,QAAQ,CAAC;QACvE0B,OAAO,GAAG,MAAME,4BAA4B,CAACJ,EAAE,CAAC;MACpD,CAAC,CAAC;MACFvE,SAAS,CAAC,MAAM;QACZ;QACAI,MAAM,CAAC4B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;QAC9C;QACAE,WAAW,CAAC,CAAC;QACb;QACAI,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;QAC9BjE,EAAE,CAACuE,WAAW,CAAC,CAAC;QAChB;QACAC,gCAAgC,CAACP,EAAE,CAAC;MACxC,CAAC,CAAC;MACFlE,EAAE,CAAC,6BAA6B,EAAE,YAAY;QAC1C0E,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACtC;QACAD,WAAW,CAAC,CAAC;QACbpE,MAAM,CAACmE,EAAE,CAACS,IAAI,CAAC,CAACX,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAC1C,CAAC,CAAC;MACFjE,EAAE,CAAC,8CAA8C,EAAE,MAAM;QACrDD,MAAM,CAACqE,OAAO,CAACQ,QAAQ,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAACC,OAAO,CAAC,CAC5C,YAAY,CACf,CAAC;MACN,CAAC,CAAC;MACF9E,EAAE,CAAC+E,KAAK,CAAC,gDAAgD,EAAE,MAAM;QAC7DhF,MAAM,CAACqE,OAAO,CAACQ,QAAQ,CAAC,CAAC,CAAC,CAACI,YAAY,CAAC,CAACF,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC;MAC1E,CAAC,CAAC;MACFhF,QAAQ,CAAC,6CAA6C,EAAE,MAAM;QAC1DD,UAAU,CAAC,MAAM;UACb0E,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;UAC9BO,gCAAgC,CAACP,EAAE,CAAC;QACxC,CAAC,CAAC;QACFpE,QAAQ,CAAC,WAAW,EAAE,YAAY;UAC9BD,UAAU,CAAC,YAAY;YACnB,CAACqE,EAAE,CAAC,GAAG,MAAMxD,OAAO,CAACuE,GAAG,CAAC,CACrBC,0BAA0B,CAAC,CAAC;YAC5B;YACAjF,EAAE,CAACkF,wBAAwB,CAAC3C,uBAAuB,CAAC,CACvD,CAAC;YACF+B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;UACjC,CAAC,CAAC;UACFpE,QAAQ,CAAC,uBAAuB,EAAE,MAAM;YACpCD,UAAU,CAAC,YAAY;cACnB,MAAMuF,OAAO,GAAG,MAAMd,4BAA4B,CAACJ,EAAE,CAAC;cACtDQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;YAC1C,CAAC,CAAC;YACFpF,EAAE,CAAC,6BAA6B,EAAE,MAAM;cACpCD,MAAM,CAAC2C,QAAQ,CAACa,WAAW,CAAC,CAACS,GAAG,CAACC,gBAAgB,CAAC,CAAC;YACvD,CAAC,CAAC;UACN,CAAC,CAAC;QACN,CAAC,CAAC;MACN,CAAC,CAAC;MACFnE,QAAQ,CAAC,yBAAyB,EAAE,MAAM;QACtCD,UAAU,CAAC,MAAM;UACb6E,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QAC1C,CAAC,CAAC;QACFpE,EAAE,CAAC,yCAAyC,EAAE,YAAY;UACtD,MAAMqF,MAAM,GAAGlD,qBAAqB;UACpCmD,wBAAwB,CAACpB,EAAE,EAAE,GAAGmB,MAAM,EAAE,CAAC;UACzC,MAAMxC,eAAe,CAAC0C,OAAO;UAC7BxF,MAAM,CAAC2C,QAAQ,CAACS,QAAQ,CAAC,CAACc,gBAAgB,CAAC,CAAC;UAC5ClE,MAAM,CAAC6C,cAAc,CAAC,CAAC4C,qBAAqB,CAAC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,CAAC;QACI,CAAC,CAAC;QACFxF,EAAE,CAAC,0CAA0C,EAAE,YAAY;UACvD,MAAMqF,MAAM,GAAGlD,qBAAqB;UACpCsD,4BAA4B,CAACvB,EAAE,EAAE,GAAGmB,MAAM,EAAE,CAAC;UAC7C,MAAMxC,eAAe,CAAC0C,OAAO;UAC7BxF,MAAM,CAAC2C,QAAQ,CAACS,QAAQ,CAAC,CAACc,gBAAgB,CAAC,CAAC;UAC5ClE,MAAM,CAAC6C,cAAc,CAAC,CAAC4C,qBAAqB,CAAC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,CAAC;QACI,CAAC,CAAC;QACF1F,QAAQ,CAAC,yBAAyB,EAAE,YAAY;UAC5C,IAAI4F,YAAY;UAChB,IAAIN,OAAO;UACXvF,UAAU,CAAC,YAAY;YACnB,CAAC6F,YAAY,EAAEN,OAAO,CAAC,GAAG,MAAM1E,OAAO,CAACuE,GAAG,CAAC,CACxCxC,MAAM,CAACkD,SAAS,CAAC;cACbC,IAAI,EAAE,QAAQ;cACdC,OAAO,EAAE;YACb,CAAC,EAAE;cACCD,IAAI,EAAE,MAAM;cACZE,UAAU,EAAE1G,QAAQ,CAACyG;YACzB,CAAC,EAAEnD,QAAQ,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAChC4B,4BAA4B,CAACJ,EAAE,CAAC,CACnC,CAAC;YACF7D,UAAU,CAAC0F,KAAK,CAAC;cAAEX;YAAQ,CAAC,CAAC;YAC7BV,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;UAC1C,CAAC,CAAC;UACFzF,SAAS,CAAC,MAAM;YACZ+F,YAAY,CAAC,CAAC;UAClB,CAAC,CAAC;UACF1F,EAAE,CAAC,kCAAkC,EAAE,MAAM;YACzCD,MAAM,CAAC2C,QAAQ,CAACa,WAAW,CAAC,CAACS,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACvD,CAAC,CAAC;QACN,CAAC,CAAC;QACFnE,QAAQ,CAAC,wBAAwB,EAAE,MAAM;UACrCD,UAAU,CAAC,MAAM;YACb0E,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;YAC9BO,gCAAgC,CAACP,EAAE,CAAC;UACxC,CAAC,CAAC;UACFpE,QAAQ,CAAC,qCAAqC,EAAE,YAAY;YACxDD,UAAU,CAAC,YAAY;cACnB,CAACqE,EAAE,CAAC,GAAG,MAAMxD,OAAO,CAACuE,GAAG,CAAC,CACrBC,0BAA0B,CAAC,CAAC;cAC5B;cACAjF,EAAE,CAACkF,wBAAwB,CAAC3C,uBAAuB,CAAC,CACvD,CAAC;cACF+B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;cAC7B,MAAMkB,OAAO,GAAG,MAAMd,4BAA4B,CAACJ,EAAE,CAAC;cACtDQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;YAC1C,CAAC,CAAC;YACFpF,EAAE,CAAC,yBAAyB,EAAE,MAAM;cAChCD,MAAM,CAAC2C,QAAQ,CAACa,WAAW,CAAC,CAACyC,qBAAqB,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC;UACN,CAAC,CAAC;QACN,CAAC,CAAC;QACFhG,EAAE,CAAC,4CAA4C,EAAE,MAAM;UACnDD,MAAM,CAAC4B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAC9ClE,MAAM,CAAC2C,QAAQ,CAACa,WAAW,CAAC,CAACS,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACnDlE,MAAM,CAAC2C,QAAQ,CAACS,QAAQ,CAAC,CAACa,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAChDlE,MAAM,CAAC2C,QAAQ,CAACY,OAAO,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;QACnD,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC,CAAC;AACF,SAASS,yBAAyBA,CAACR,EAAE,EAAEkB,OAAO,EAAE;EAC5Ca,YAAY,CAAC/B,EAAE,EAAE;IACbgC,EAAE,EAAEd,OAAO,CAACc,EAAE;IACdN,IAAI,EAAE,oBAAoB;IAC1BO,SAAS,EAAE,CAAC;MACJP,IAAI,EAAE,SAAS;MACfM,EAAE,EAAE,GAAG,EAAE/D,qBAAqB;IAClC,CAAC;EACT,CAAC,CAAC;AACN;AACA,SAASmD,wBAAwBA,CAACpB,EAAE,EAAEkC,KAAK,EAAE;EAazCH,YAAY,CAAC/B,EAAE,EAZO;IAClB0B,IAAI,EAAE,kBAAkB;IACxBM,EAAE,EAAEE,KAAK;IACTC,OAAO,EAAE,CAAC;MACFT,IAAI,EAAE,QAAQ;MACdU,KAAK,EAAE,kBAAkB;MACzBC,MAAM,EAAE;QACJC,SAAS,EAAE,UAAU;QACrBC,UAAU,EAAE;MAChB;IACJ,CAAC;EACT,CAC8B,CAAC;AACnC;AACA,SAAShB,4BAA4BA,CAACvB,EAAE,EAAEkC,KAAK,EAAE;EAgB7CH,YAAY,CAAC/B,EAAE,EAfgB;IAC3B0B,IAAI,EAAE,kBAAkB;IACxBM,EAAE,EAAEE,KAAK;IACTC,OAAO,EAAE,CAAC;MACF,MAAM,EAAE,WAAW;MACnB,YAAY,EAAE,UAAU;MACxB,YAAY,EAAE;QAAE,YAAY,EAAE;MAAQ,CAAC;MACvC,UAAU,EAAE,kBAAkB;MAC9B,OAAO,EAAE;QACL,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,oBAAoB;QAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG;MACzB;IACJ,CAAC;EACT,CACuC,CAAC;AAC5C;AACA,SAAS5B,gCAAgCA,CAACP,EAAE,EAAE;EAC1CnE,MAAM,CAACmE,EAAE,CAACwC,mBAAmB,CAAC,CAACV,qBAAqB,CAAC9B,EAAE,CAACyC,gBAAgB,CAAC9E,IAAI,CAAC+E,KAAK,CAACC,MAAM,CAAC;AAC/F;AACA,eAAevC,4BAA4BA,CAACJ,EAAE,EAAE;EAC5C,OAAO,MAAM4C,iBAAiB,CAAC5C,EAAE,CAAC;AACtC;AACA,eAAeG,2BAA2BA,CAAC5B,MAAM,EAAEC,QAAQ,EAAE;EACzD,MAAM,CAACwB,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAMzD,OAAO,CAACuE,GAAG,CAAC,CACxCC,0BAA0B,CAAC,CAAC,EAC5BzC,MAAM,CAACkD,SAAS,CAAC;IACbE,OAAO,EAAE,UAAU;IACnBD,IAAI,EAAE;EACV,CAAC,EAAE;IACCA,IAAI,EAAE,MAAM;IACZE,UAAU,EAAE1G,QAAQ,CAACyG;EACzB,CAAC,EAAEnD,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAC/B,CAAC;EACF;EACA6B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;EAC7B,OAAO,CAACA,EAAE,EAAEC,WAAW,CAAC;AAC5B;AACA,eAAee,0BAA0BA,CAAA,EAAG;EACxCnF,MAAM,CAAC4B,eAAe,CAAC,CAACqE,qBAAqB,CAAC,CAAC,CAAC;EAChD,MAAM9B,EAAE,GAAG,MAAMjE,EAAE,CAAC8G,OAAO,CAAC,MAAM;IAC9BhH,MAAM,CAAC4B,eAAe,CAAC,CAACsC,gBAAgB,CAAC,CAAC;IAC1ClE,MAAM,CAAC4B,eAAe,CAACE,IAAI,CAACmF,OAAO,CAAC,CAAC,CAAC,CAACpB,IAAI,KAAK,QAAQ,CAAC;IACzD,OAAOjE,eAAe,CAACE,IAAI,CAACmF,OAAO,CAAC,CAAC,CAAC,CAACC,KAAK;EAChD,CAAC,CAAC;EACFlH,MAAM,CAAC4B,eAAe,CAAC,CAACqE,qBAAqB,CAAC,CAAC,CAAC;EAChDrE,eAAe,CAACuF,SAAS,CAAC,CAAC;EAC3BnH,MAAM,CAAC4B,eAAe,CAAC,CAACqE,qBAAqB,CAAC,CAAC,CAAC;EAChD,OAAO9B,EAAE;AACb;AACA,eAAe4C,iBAAiBA,CAAC5C,EAAE,EAAE;EACjC,OAAO,MAAMjE,EAAE,CAAC8G,OAAO,CAAC,MAAM;IAC1BhH,MAAM,CAACmE,EAAE,CAACS,IAAI,CAAC,CAACwC,eAAe,CAAC,CAAC,CAAC;IAClC,MAAMC,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACpD,EAAE,CAACS,IAAI,CAAC9C,IAAI,CAAC0F,QAAQ,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAAC;IAC9DtD,EAAE,CAACS,IAAI,CAACuC,SAAS,CAAC,CAAC;IACnB,OAAOE,MAAM;EACjB,CAAC,CAAC;AACN;AACA,SAASnF,8BAA8BA,CAACwF,iBAAiB,EAAE1E,MAAM,EAAE;EAC/D,IAAI2E,CAAC,GAAG,CAAC;EACT,MAAMC,GAAG,GAAG1H,EAAE,CAACmD,EAAE,CAAC,UAAU,GAAGwE,KAAK,EAAE;IAClC,MAAMC,aAAa,GAAGH,CAAC,EAAE;IACzB3E,MAAM,CAAC+E,KAAK,CAAC,8BAA8B,CAAC;IAC5C,MAAMC,YAAY,GAAG,IAAIC,WAAW,CAAC,CAAC;IACtC,OAAO;MACHrB,gBAAgB,EAAE1G,EAAE,CAACmD,EAAE,CAAC2E,YAAY,CAACpB,gBAAgB,CAACsB,IAAI,CAACF,YAAY,CAAC,CAAC;MACzErB,mBAAmB,EAAEzG,EAAE,CAACmD,EAAE,CAAC2E,YAAY,CAACrB,mBAAmB,CAACuB,IAAI,CAACF,YAAY,CAAC,CAAC;MAC/EpD,IAAI,EAAE1E,EAAE,CAACmD,EAAE,CAAE9B,CAAC,IAAS;QACnByB,MAAM,CAAC+E,KAAK,CAAC;UAAEI,OAAO,EAAEb,IAAI,CAACC,KAAK,CAAChG,CAAC,CAACkG,QAAQ,CAAC,CAAC,CAAC;UAAEK;QAAc,CAAC,EAAE,eAAe,CAAC;MACvF,CAAC,CAAC;MACFvF,KAAK,EAAErC,EAAE,CAACmD,EAAE,CAAC,CAAC;MACd+E,aAAa,EAAEJ,YAAY;MAC3BK,UAAU,EAAEX,iBAAiB,CAACY;IAClC,CAAC;IACD;IACA;EACJ,CAAC,CAAC;EACFC,MAAM,CAACC,MAAM,CAACZ,GAAG,EAAE;IACfa,IAAI,EAAEf,iBAAiB,CAACe,IAAI;IAC5BC,MAAM,EAAEhB,iBAAiB,CAACgB,MAAM;IAChCC,OAAO,EAAEjB,iBAAiB,CAACiB,OAAO;IAClCL,UAAU,EAAEZ,iBAAiB,CAACY;EAClC,CAAC,CAAC;EACF,OAAOV,GAAG;AACd;AACA,SAASpD,iBAAiBA,CAACL,EAAE,EAAEkE,UAAU,EAAE;EACvC,MAAMO,QAAQ,GAAGP,UAAU,KAAK,MAAM,GAChC9I,iBAAiB,CAACkJ,IAAI,GACtBlJ,iBAAiB,CAACmJ,MAAM;EAC9B,IAAIE,QAAQ,KAAKzE,EAAE,CAACkE,UAAU,EAC1B;EACJlE,EAAE,CAACkE,UAAU,GAAGO,QAAQ;EACxBzE,EAAE,CAACiE,aAAa,CAACS,aAAa,CAAC,IAAIC,KAAK,CAACT,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D;AACA,SAAS/F,oBAAoBA,CAACU,MAAM,EAAE;EAClC,MAAM7C,CAAC,GAAGA,CAAC4I,IAAI,EAAE;IAAEC,SAAS;IAAEC;EAAQ,CAAC,KAAKjG,MAAM,CAACkG,KAAK,CAAC;IAAEF,SAAS;IAAEG,GAAG,EAAEF,OAAO,CAACE;EAAI,CAAC,EAAEJ,IAAI,CAAC;EAC/F,MAAMK,UAAU,GAAG,CACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,CACpB;EACD,KAAK,MAAMC,CAAC,IAAID,UAAU,EAAE;IACxB9J,SAAS,CAACgK,MAAM,CAACC,EAAE,CAACF,CAAC,EAAElJ,CAAC,CAAC+H,IAAI,CAACjH,SAAS,EAAEoI,CAAC,CAAC,CAAC;EAChD;AACJ;AACA,MAAMG,gBAAgB,GAAGrJ,CAAC,CAACqG,MAAM,CAAC;EAC9BL,EAAE,EAAEhG,CAAC,CAACsJ,MAAM,CAAC,CAAC;EACd5E,QAAQ,EAAE1E,CAAC,CAACuJ,KAAK,CAACvJ,CAAC,CAACqG,MAAM,CAAC;IACvBmD,SAAS,EAAExJ,CAAC,CAACqG,MAAM,CAAC;MAAEL,EAAE,EAAEhG,CAAC,CAACsJ,MAAM,CAAC;IAAE,CAAC,CAAC;IACvC3E,WAAW,EAAE3E,CAAC,CAACuJ,KAAK,CAACvJ,CAAC,CAACsJ,MAAM,CAAC,CAAC,CAAC;IAChCxE,YAAY,EAAE9E,CAAC,CAACuJ,KAAK,CAACvJ,CAAC,CAACsJ,MAAM,CAAC,CAAC;EACpC,CAAC,CAAC;AACN,CAAC,CAAC;AACF,MAAMG,YAAY,SAASd,KAAK,CAAC;EAC7Be,IAAI;EACJC,WAAWA,CAACD,IAAI,EAAE;IACd,KAAK,CAAC,SAAS,CAAC;IAChB,IAAI,CAACA,IAAI,GAAGvC,IAAI,CAACyC,SAAS,CAACF,IAAI,CAAC;EACpC;AACJ;AACA,SAAS3D,YAAYA,CAAC/B,EAAE,EAAE6F,CAAC,EAAE;EACzB7F,EAAE,CAACiE,aAAa,CAACS,aAAa,CAAC,IAAIe,YAAY,CAACI,CAAC,CAAC,CAAC;AACvD","ignoreList":[]}
|
|
@@ -102,7 +102,7 @@ export function createObjectSet(objectType, clientCtx, objectSet = {
|
|
|
102
102
|
})), objectType, options, await createWithPk(clientCtx, objectType, objectSet, primaryKey));
|
|
103
103
|
} : undefined,
|
|
104
104
|
[__EXPERIMENTAL__NOT_SUPPORTED_YET_subscribe]: (properties, listener) => {
|
|
105
|
-
const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(clientCtx).subscribe(objectSet, listener, properties);
|
|
105
|
+
const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(clientCtx).subscribe(objectType, objectSet, listener, properties);
|
|
106
106
|
return async () => (await pendingSubscribe)();
|
|
107
107
|
}
|
|
108
108
|
};
|