@osdk/client 2.2.0-beta.6 → 2.2.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/build/browser/Client.js.map +1 -1
  3. package/build/browser/actions/actions.test.js +52 -4
  4. package/build/browser/actions/actions.test.js.map +1 -1
  5. package/build/browser/actions/applyAction.js +21 -15
  6. package/build/browser/actions/applyAction.js.map +1 -1
  7. package/build/browser/createClient.js +11 -4
  8. package/build/browser/createClient.js.map +1 -1
  9. package/build/browser/index.js +1 -0
  10. package/build/browser/index.js.map +1 -1
  11. package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
  12. package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  13. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  14. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  15. package/build/browser/object/convertWireToOsdkObjects.js +8 -1
  16. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  17. package/build/browser/object/convertWireToOsdkObjects.test.js +7 -3
  18. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  19. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  20. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  21. package/build/browser/object/object.test.js +109 -0
  22. package/build/browser/object/object.test.js.map +1 -1
  23. package/build/browser/objectSet/ObjectSet.test.js +15 -1
  24. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  25. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  26. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  27. package/build/browser/observable/internal/Store.js +1 -1
  28. package/build/browser/observable/internal/Store.js.map +1 -1
  29. package/build/browser/observable/internal/testUtils.js +2 -0
  30. package/build/browser/observable/internal/testUtils.js.map +1 -1
  31. package/build/browser/queries/applyQuery.js +33 -1
  32. package/build/browser/queries/applyQuery.js.map +1 -1
  33. package/build/browser/queries/queries.test.js +26 -5
  34. package/build/browser/queries/queries.test.js.map +1 -1
  35. package/build/browser/util/UserAgent.js +1 -1
  36. package/build/browser/util/toDataValueQueries.js +17 -0
  37. package/build/browser/util/toDataValueQueries.js.map +1 -1
  38. package/build/cjs/{Client-C8K3E1vH.d.cts → Client-DBTcM9gB.d.cts} +1 -1
  39. package/build/cjs/{chunk-2FVV5A63.cjs → chunk-IU47QMYO.cjs} +48 -48
  40. package/build/cjs/chunk-IU47QMYO.cjs.map +1 -0
  41. package/build/cjs/{chunk-X7WGNFZ4.cjs → chunk-JPENHIJB.cjs} +19 -19
  42. package/build/cjs/chunk-JPENHIJB.cjs.map +1 -0
  43. package/build/cjs/{graphql-JJX5MZPQ.cjs → graphql-RGM5SRWV.cjs} +306 -265
  44. package/build/cjs/graphql-RGM5SRWV.cjs.map +1 -0
  45. package/build/cjs/index.cjs +192 -102
  46. package/build/cjs/index.cjs.map +1 -1
  47. package/build/cjs/index.d.cts +6 -4
  48. package/build/cjs/public/internal.cjs +6 -6
  49. package/build/cjs/public/internal.cjs.map +1 -1
  50. package/build/cjs/public/internal.d.cts +1 -1
  51. package/build/cjs/public/unstable-do-not-use.cjs +41 -70
  52. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  53. package/build/cjs/public/unstable-do-not-use.d.cts +1 -1
  54. package/build/esm/Client.js.map +1 -1
  55. package/build/esm/actions/actions.test.js +52 -4
  56. package/build/esm/actions/actions.test.js.map +1 -1
  57. package/build/esm/actions/applyAction.js +21 -15
  58. package/build/esm/actions/applyAction.js.map +1 -1
  59. package/build/esm/createClient.js +11 -4
  60. package/build/esm/createClient.js.map +1 -1
  61. package/build/esm/index.js +1 -0
  62. package/build/esm/index.js.map +1 -1
  63. package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
  64. package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  65. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  66. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  67. package/build/esm/object/convertWireToOsdkObjects.js +8 -1
  68. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  69. package/build/esm/object/convertWireToOsdkObjects.test.js +7 -3
  70. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  71. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  72. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  73. package/build/esm/object/object.test.js +109 -0
  74. package/build/esm/object/object.test.js.map +1 -1
  75. package/build/esm/objectSet/ObjectSet.test.js +15 -1
  76. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  77. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  78. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  79. package/build/esm/observable/internal/Store.js +1 -1
  80. package/build/esm/observable/internal/Store.js.map +1 -1
  81. package/build/esm/observable/internal/testUtils.js +2 -0
  82. package/build/esm/observable/internal/testUtils.js.map +1 -1
  83. package/build/esm/queries/applyQuery.js +33 -1
  84. package/build/esm/queries/applyQuery.js.map +1 -1
  85. package/build/esm/queries/queries.test.js +26 -5
  86. package/build/esm/queries/queries.test.js.map +1 -1
  87. package/build/esm/util/UserAgent.js +1 -1
  88. package/build/esm/util/toDataValueQueries.js +17 -0
  89. package/build/esm/util/toDataValueQueries.js.map +1 -1
  90. package/build/types/Client.d.ts +1 -1
  91. package/build/types/Client.d.ts.map +1 -1
  92. package/build/types/actions/applyAction.d.ts.map +1 -1
  93. package/build/types/createClient.d.ts.map +1 -1
  94. package/build/types/index.d.ts +2 -1
  95. package/build/types/index.d.ts.map +1 -1
  96. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts +2 -0
  97. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts.map +1 -0
  98. package/build/types/object/object.test.d.ts.map +1 -1
  99. package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
  100. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  101. package/build/types/queries/applyQuery.d.ts.map +1 -1
  102. package/package.json +12 -12
  103. package/build/cjs/chunk-2FVV5A63.cjs.map +0 -1
  104. package/build/cjs/chunk-X7WGNFZ4.cjs.map +0 -1
  105. package/build/cjs/graphql-JJX5MZPQ.cjs.map +0 -1
@@ -208,6 +208,7 @@ describe("ObjectSetListenerWebsocket", async () => {
208
208
  {
209
209
  "object": {
210
210
  "$apiName": "Employee",
211
+ "$objectSpecifier": "Employee:undefined",
211
212
  "$objectType": "Employee",
212
213
  "$primaryKey": undefined,
213
214
  "$title": undefined,
@@ -226,6 +227,7 @@ describe("ObjectSetListenerWebsocket", async () => {
226
227
  {
227
228
  "object": {
228
229
  "$apiName": "Employee",
230
+ "$objectSpecifier": "Employee:12345",
229
231
  "$objectType": "Employee",
230
232
  "$primaryKey": "12345",
231
233
  "$title": undefined,
@@ -1 +1 @@
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","constructWebsocketUrl","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","onChange","fn","o","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSubscribeMessages","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","toHaveBeenCalledTimes","requests","propertySet","toEqual","referenceSet","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","mockImplementationOnce","Error","mockReset","calls","subscriptionClosed","toBe","idNum2","sendObjectUpdateResponse","promise","toMatchInlineSnapshot","sendReferenceUpdatesResponse","unsubscribe2","subscribe","type","apiName","objectType","toString","sendToClient","id","responses","subId","updates","state","object","__apiName","employeeId","removeEventListener","addEventListener","length","times","waitFor","toBeCalledTimes","result","JSON","parse","lastCall","mockClear","results","value","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","constructor","data","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.ts"],"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 */\n\nimport type { ObjectSetSubscription, PropertyKeys } from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n ObjectUpdate,\n StreamMessage,\n} from \"@osdk/foundry.ontologies\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport type { Logger } from \"../Logger.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n constructWebsocketUrl,\n ObjectSetListenerWebsocket,\n} from \"./ObjectSetListenerWebsocket.js\";\n\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 (): Promise<Logger> => {\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: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\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(\n { level: \"info\" },\n (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});\n\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket as unknown as MockedWebSocket;\n\nconst STACK = \"https://stack.palantirCustom.com/foo/first/someStuff/\";\n\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal<\n { default: WebSocket }\n >();\n\n const WebSocket = createMockWebSocketConstructor(\n original.default,\n rootLogger,\n );\n return { default: WebSocket, WebSocket };\n});\n\nlet currentSubscriptionId = 0;\n\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n describe(\"basic setup\", () => {\n let minimalClient: MinimalClient;\n\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n\n let client: ObjectSetListenerWebsocket;\n let listener: MockedObject<\n Required<\n ObjectSetSubscription.Listener<Employee, any>\n >\n >;\n let oslwInst = 0;\n\n let updateReceived: ObjectUpdate | undefined = undefined;\n\n let listenerPromise: DeferredPromise<void>;\n\n beforeEach(() => {\n minimalClient = createMinimalClient(\n { ontologyRid: $ontologyRid },\n STACK,\n async () => \"myAccessToken\",\n { logger: rootLogger },\n );\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n });\n\n listenerPromise = pDefer();\n\n listener = {\n onChange: vi.fn((o) => {\n updateReceived = o;\n listenerPromise.resolve();\n }),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n onSuccessfulSubscription: vi.fn(),\n };\n\n let objectSetRidCounter = 0;\n apiServer.use(\n http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n }),\n ),\n );\n\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\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\n describe(\"requests subscription\", () => {\n let ws: MockedWebSocket;\n let unsubscribe: () => void;\n let subReq1: ObjectSetStreamSubscribeRequests;\n\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(\n client,\n listener,\n );\n\n subReq1 = await expectSubscribeMessages(ws, 2);\n });\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\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n\n vi.runAllTicks();\n\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\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).toHaveBeenCalledTimes(1);\n });\n\n it(\"correctly requests regular object properties\", () => {\n expect(subReq1.requests[0].propertySet).toEqual([\n \"employeeId\",\n \"fullName\",\n \"office\",\n \"class\",\n \"startDate\",\n \"employeeStatus\",\n \"employeeSensor\",\n ]);\n });\n\n it(\"correctly requests reference backed properties\", () => {\n expect(subReq1.requests[0].referenceSet).toEqual([\"employeeLocation\"]);\n });\n\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\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\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n\n describe(\"correctly try catches errors in handlers\", () => {\n beforeEach(() => {\n listener.onSuccessfulSubscription.mockImplementationOnce(() => {\n throw new Error(\"I am an error\");\n });\n respondSuccessToSubscribe(ws, subReq1);\n });\n afterEach(() => {\n listener.onSuccessfulSubscription.mockReset();\n });\n\n it(\"should call onError\", async () => {\n expect(listener.onError).toHaveBeenCalled();\n expect(listener.onError.mock.calls[0][0].subscriptionClosed).toBe(\n false,\n );\n });\n });\n\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n\n it(\"should call onSuccessfulSubscription\", () => {\n expect(listener.onSuccessfulSubscription).toHaveBeenCalled();\n });\n\n it(\"should correctly return regular updates\", async () => {\n const idNum2 = currentSubscriptionId;\n\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 \"$primaryKey\": undefined,\n \"$title\": undefined,\n \"employeeId\": 1,\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n it(\"should correctly return reference update\", async () => {\n const idNum2 = currentSubscriptionId;\n\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 \"$title\": undefined,\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\n describe(\"additional subscription\", async () => {\n let unsubscribe2: () => void;\n let subReq2: ObjectSetStreamSubscribeRequests;\n beforeEach(async () => {\n unsubscribe2 = await client.subscribe(\n {\n type: \"object\",\n apiName: \"Employee\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n [\"employeeId\"],\n );\n\n subReq2 = await expectSubscribeMessages(ws);\n\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n afterEach(() => {\n unsubscribe2();\n });\n\n it(\"only requests requested properties\", () => {\n expect(subReq2.requests[1].propertySet).toEqual([\"employeeId\"]);\n expect(subReq2.requests[1].referenceSet).toEqual([]);\n });\n\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\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\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\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 it(\"should create url correctly\", () => {\n expect(constructWebsocketUrl(STACK, \"ontologyRid1\").toString())\n .toEqual(\n \"wss://stack.palantircustom.com/foo/first/someStuff/api/v2/ontologySubscriptions/ontologies/ontologyRid1/streamSubscriptions\",\n );\n });\n });\n });\n });\n});\n\ninterface RawWebSocketPlus\n extends Pick<ImportedWebSocket, \"addEventListener\" | \"removeEventListener\">\n{\n _eventEmitter: EventTarget;\n readyState: 0 | 1 | 2 | 3;\n send: MockedFunction<ImportedWebSocket[\"send\"]>;\n close: MockedFunction<ImportedWebSocket[\"close\"]>;\n}\n\ninterface MockedWebSocket\n extends MockedClass<typeof ImportedWebSocket>, MockedObject<RawWebSocketPlus>\n{\n}\n\ntype MockedListener = MockedObject<\n Required<\n ObjectSetSubscription.Listener<Employee, PropertyKeys<Employee>>\n >\n>;\n\nfunction respondSuccessToSubscribe(\n ws: MockedWebSocket,\n subReq2: ObjectSetStreamSubscribeRequests,\n) {\n sendToClient<StreamMessage>(\n ws,\n {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: `${++currentSubscriptionId}`,\n }],\n },\n );\n}\n\nfunction sendObjectUpdateResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const updateMessage: StreamMessage = {\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\n sendToClient<StreamMessage>(\n ws,\n updateMessage,\n );\n}\n\nfunction sendReferenceUpdatesResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const referenceUpdateMessage: StreamMessage = {\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\n sendToClient<StreamMessage>(\n ws,\n referenceUpdateMessage,\n );\n}\n\nfunction expectEqualRemoveAndAddListeners(ws: MockedWebSocket) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(\n ws.addEventListener.mock.calls.length,\n );\n}\n\nasync function expectSubscribeMessages(\n ws: MockedWebSocket,\n times: number = 1,\n): Promise<ObjectSetStreamSubscribeRequests> {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(times);\n const result = JSON.parse(ws.send.mock.lastCall![0].toString());\n ws.send.mockClear();\n return result;\n });\n}\n\nasync function subscribeAndExpectWebSocket(\n client: ObjectSetListenerWebsocket,\n listener: MockedListener,\n): Promise<readonly [MockedWebSocket, () => void]> {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe<Employee, PropertyKeys<Employee>>(\n {\n apiName: \"Employee\",\n type: \"object\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n ),\n ]);\n\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n\n return [ws, unsubscribe] as const;\n}\n\nasync function expectWebSocketConstructed(): Promise<MockedWebSocket> {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\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 as MockedWebSocket;\n });\n\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n return ws;\n}\n\nfunction createMockWebSocketConstructor(\n OriginalWebSocket: WebSocket,\n logger: Logger,\n): MockedWebSocket {\n let i = 0;\n const ret = vi.fn(function(..._args: any[]): MockedWebSocket {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n\n return {\n addEventListener: vi.fn(\n eventEmitter.addEventListener.bind(eventEmitter),\n ) as any,\n removeEventListener: vi.fn(\n eventEmitter.removeEventListener.bind(eventEmitter),\n ) as any,\n\n send: vi.fn((a, _b: any) => {\n logger.debug(\n { message: JSON.parse(a.toString()), webSocketInst },\n \"send() called\",\n );\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n } satisfies RawWebSocketPlus as any as MockedWebSocket;\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 }) as any as MockedWebSocket;\n\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n\n return ret;\n}\n\nfunction setWebSocketState(ws: MockedWebSocket, readyState: \"open\" | \"close\") {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n\n if (newState === ws.readyState) return;\n\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\n\nfunction addLoggerToApiServer(logger: Logger) {\n const z = (\n name: string,\n { requestId, request }: { requestId: string; request: Request },\n ) => logger.trace({ requestId, url: request.url }, name);\n\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ] as const;\n\n for (const c of eventNames) {\n apiServer.events.on(c as typeof eventNames[number], z.bind(undefined, c));\n }\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});\n\nclass MessageEvent extends Event {\n data: string;\n constructor(data: any) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\n\nfunction sendToClient<T>(ws: MockedWebSocket, t: 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","constructWebsocketUrl","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","onChange","fn","o","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSubscribeMessages","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","toHaveBeenCalledTimes","requests","propertySet","toEqual","referenceSet","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","mockImplementationOnce","Error","mockReset","calls","subscriptionClosed","toBe","idNum2","sendObjectUpdateResponse","promise","toMatchInlineSnapshot","sendReferenceUpdatesResponse","unsubscribe2","subscribe","type","apiName","objectType","toString","sendToClient","id","responses","subId","updates","state","object","__apiName","employeeId","removeEventListener","addEventListener","length","times","waitFor","toBeCalledTimes","result","JSON","parse","lastCall","mockClear","results","value","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","constructor","data","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.ts"],"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 */\n\nimport type { ObjectSetSubscription, PropertyKeys } from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n ObjectUpdate,\n StreamMessage,\n} from \"@osdk/foundry.ontologies\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport type { Logger } from \"../Logger.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n constructWebsocketUrl,\n ObjectSetListenerWebsocket,\n} from \"./ObjectSetListenerWebsocket.js\";\n\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 (): Promise<Logger> => {\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: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\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(\n { level: \"info\" },\n (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});\n\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket as unknown as MockedWebSocket;\n\nconst STACK = \"https://stack.palantirCustom.com/foo/first/someStuff/\";\n\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal<\n { default: WebSocket }\n >();\n\n const WebSocket = createMockWebSocketConstructor(\n original.default,\n rootLogger,\n );\n return { default: WebSocket, WebSocket };\n});\n\nlet currentSubscriptionId = 0;\n\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n describe(\"basic setup\", () => {\n let minimalClient: MinimalClient;\n\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n\n let client: ObjectSetListenerWebsocket;\n let listener: MockedObject<\n Required<\n ObjectSetSubscription.Listener<Employee, any>\n >\n >;\n let oslwInst = 0;\n\n let updateReceived: ObjectUpdate | undefined = undefined;\n\n let listenerPromise: DeferredPromise<void>;\n\n beforeEach(() => {\n minimalClient = createMinimalClient(\n { ontologyRid: $ontologyRid },\n STACK,\n async () => \"myAccessToken\",\n { logger: rootLogger },\n );\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n });\n\n listenerPromise = pDefer();\n\n listener = {\n onChange: vi.fn((o) => {\n updateReceived = o;\n listenerPromise.resolve();\n }),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n onSuccessfulSubscription: vi.fn(),\n };\n\n let objectSetRidCounter = 0;\n apiServer.use(\n http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n }),\n ),\n );\n\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\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\n describe(\"requests subscription\", () => {\n let ws: MockedWebSocket;\n let unsubscribe: () => void;\n let subReq1: ObjectSetStreamSubscribeRequests;\n\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(\n client,\n listener,\n );\n\n subReq1 = await expectSubscribeMessages(ws, 2);\n });\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\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n\n vi.runAllTicks();\n\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\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).toHaveBeenCalledTimes(1);\n });\n\n it(\"correctly requests regular object properties\", () => {\n expect(subReq1.requests[0].propertySet).toEqual([\n \"employeeId\",\n \"fullName\",\n \"office\",\n \"class\",\n \"startDate\",\n \"employeeStatus\",\n \"employeeSensor\",\n ]);\n });\n\n it(\"correctly requests reference backed properties\", () => {\n expect(subReq1.requests[0].referenceSet).toEqual([\"employeeLocation\"]);\n });\n\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\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\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n\n describe(\"correctly try catches errors in handlers\", () => {\n beforeEach(() => {\n listener.onSuccessfulSubscription.mockImplementationOnce(() => {\n throw new Error(\"I am an error\");\n });\n respondSuccessToSubscribe(ws, subReq1);\n });\n afterEach(() => {\n listener.onSuccessfulSubscription.mockReset();\n });\n\n it(\"should call onError\", async () => {\n expect(listener.onError).toHaveBeenCalled();\n expect(listener.onError.mock.calls[0][0].subscriptionClosed).toBe(\n false,\n );\n });\n });\n\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n\n it(\"should call onSuccessfulSubscription\", () => {\n expect(listener.onSuccessfulSubscription).toHaveBeenCalled();\n });\n\n it(\"should correctly return regular updates\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendObjectUpdateResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectSpecifier\": \"Employee:undefined\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": undefined,\n \"$title\": undefined,\n \"employeeId\": 1,\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n it(\"should correctly return reference update\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendReferenceUpdatesResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectSpecifier\": \"Employee:12345\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": \"12345\",\n \"$title\": undefined,\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\n describe(\"additional subscription\", async () => {\n let unsubscribe2: () => void;\n let subReq2: ObjectSetStreamSubscribeRequests;\n beforeEach(async () => {\n unsubscribe2 = await client.subscribe(\n {\n type: \"object\",\n apiName: \"Employee\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n [\"employeeId\"],\n );\n\n subReq2 = await expectSubscribeMessages(ws);\n\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n afterEach(() => {\n unsubscribe2();\n });\n\n it(\"only requests requested properties\", () => {\n expect(subReq2.requests[1].propertySet).toEqual([\"employeeId\"]);\n expect(subReq2.requests[1].referenceSet).toEqual([]);\n });\n\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\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\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\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 it(\"should create url correctly\", () => {\n expect(constructWebsocketUrl(STACK, \"ontologyRid1\").toString())\n .toEqual(\n \"wss://stack.palantircustom.com/foo/first/someStuff/api/v2/ontologySubscriptions/ontologies/ontologyRid1/streamSubscriptions\",\n );\n });\n });\n });\n });\n});\n\ninterface RawWebSocketPlus\n extends Pick<ImportedWebSocket, \"addEventListener\" | \"removeEventListener\">\n{\n _eventEmitter: EventTarget;\n readyState: 0 | 1 | 2 | 3;\n send: MockedFunction<ImportedWebSocket[\"send\"]>;\n close: MockedFunction<ImportedWebSocket[\"close\"]>;\n}\n\ninterface MockedWebSocket\n extends MockedClass<typeof ImportedWebSocket>, MockedObject<RawWebSocketPlus>\n{\n}\n\ntype MockedListener = MockedObject<\n Required<\n ObjectSetSubscription.Listener<Employee, PropertyKeys<Employee>>\n >\n>;\n\nfunction respondSuccessToSubscribe(\n ws: MockedWebSocket,\n subReq2: ObjectSetStreamSubscribeRequests,\n) {\n sendToClient<StreamMessage>(\n ws,\n {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: `${++currentSubscriptionId}`,\n }],\n },\n );\n}\n\nfunction sendObjectUpdateResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const updateMessage: StreamMessage = {\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\n sendToClient<StreamMessage>(\n ws,\n updateMessage,\n );\n}\n\nfunction sendReferenceUpdatesResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const referenceUpdateMessage: StreamMessage = {\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\n sendToClient<StreamMessage>(\n ws,\n referenceUpdateMessage,\n );\n}\n\nfunction expectEqualRemoveAndAddListeners(ws: MockedWebSocket) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(\n ws.addEventListener.mock.calls.length,\n );\n}\n\nasync function expectSubscribeMessages(\n ws: MockedWebSocket,\n times: number = 1,\n): Promise<ObjectSetStreamSubscribeRequests> {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(times);\n const result = JSON.parse(ws.send.mock.lastCall![0].toString());\n ws.send.mockClear();\n return result;\n });\n}\n\nasync function subscribeAndExpectWebSocket(\n client: ObjectSetListenerWebsocket,\n listener: MockedListener,\n): Promise<readonly [MockedWebSocket, () => void]> {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe<Employee, PropertyKeys<Employee>>(\n {\n apiName: \"Employee\",\n type: \"object\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n ),\n ]);\n\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n\n return [ws, unsubscribe] as const;\n}\n\nasync function expectWebSocketConstructed(): Promise<MockedWebSocket> {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\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 as MockedWebSocket;\n });\n\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n return ws;\n}\n\nfunction createMockWebSocketConstructor(\n OriginalWebSocket: WebSocket,\n logger: Logger,\n): MockedWebSocket {\n let i = 0;\n const ret = vi.fn(function(..._args: any[]): MockedWebSocket {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n\n return {\n addEventListener: vi.fn(\n eventEmitter.addEventListener.bind(eventEmitter),\n ) as any,\n removeEventListener: vi.fn(\n eventEmitter.removeEventListener.bind(eventEmitter),\n ) as any,\n\n send: vi.fn((a, _b: any) => {\n logger.debug(\n { message: JSON.parse(a.toString()), webSocketInst },\n \"send() called\",\n );\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n } satisfies RawWebSocketPlus as any as MockedWebSocket;\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 }) as any as MockedWebSocket;\n\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n\n return ret;\n}\n\nfunction setWebSocketState(ws: MockedWebSocket, readyState: \"open\" | \"close\") {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n\n if (newState === ws.readyState) return;\n\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\n\nfunction addLoggerToApiServer(logger: Logger) {\n const z = (\n name: string,\n { requestId, request }: { requestId: string; request: Request },\n ) => logger.trace({ requestId, url: request.url }, name);\n\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ] as const;\n\n for (const c of eventNames) {\n apiServer.events.on(c as typeof eventNames[number], z.bind(undefined, c));\n }\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});\n\nclass MessageEvent extends Event {\n data: string;\n constructor(data: any) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\n\nfunction sendToClient<T>(ws: MockedWebSocket, t: 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;;AAGA,SAASA,YAAY,EAAEC,QAAQ,QAAQ,4BAA4B;AAMnE,SAASC,SAAS,QAAQ,mBAAmB;AAC7C,OAAOC,iBAAiB,MAAM,eAAe;AAC7C,SAASC,IAAI,EAAEC,YAAY,QAAQ,KAAK;AAExC,OAAOC,MAAM,MAAM,SAAS;AAE5B,SACEC,QAAQ,EACRC,SAAS,EACTC,SAAS,EACTC,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,EAAE,EACFC,EAAE,QACG,QAAQ;AACf,SAASC,CAAC,QAAQ,KAAK;AACvB,SAASC,mBAAmB,QAAQ,2BAA2B;AAG/D,SACEC,qBAAqB,EACrBC,0BAA0B,QACrB,iCAAiC;;AAExC;AACA;AACA,MAAMC,UAAU,GAAG,MAAML,EAAE,CAACM,OAAO,CAAC,YAA6B;EAC/D,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,CACzB;IAAEK,KAAK,EAAE;EAAO,CAAC,EAChBJ,UAAU,CAACK,KAAK,CAAE;IACjBC,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,IAjBjB,cAAwCX,YAAY,CAAC;MACnDY,KAAKA,CAACC,CAAS,EAAE;QACf;QACA,IAAIA,CAAC,CAACC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAED,CAAC,GAAGA,CAAC,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;QAEzC;QACAC,OAAO,CAACC,GAAG,CAACJ,CAAC,CAAC;MAChB;IACF,CAAC,CAS8C;EAC7C,CAAC,CACH,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA,MAAMK,eAAe,GAAGtC,iBAA+C;AAEvE,MAAMuC,KAAK,GAAG,uDAAuD;AAErE5B,EAAE,CAAC6B,IAAI,CAAC,eAAe,EAAE,MAAOC,cAAc,IAAK;EACjD,MAAMC,QAAQ,GAAG,MAAMD,cAAc,CAEnC,CAAC;EAEH,MAAME,SAAS,GAAGC,8BAA8B,CAC9CF,QAAQ,CAACG,OAAO,EAChB7B,UACF,CAAC;EACD,OAAO;IAAE6B,OAAO,EAAEF,SAAS;IAAEA;EAAU,CAAC;AAC1C,CAAC,CAAC;AAEF,IAAIG,qBAAqB,GAAG,CAAC;AAE7BtC,QAAQ,CAAC,4BAA4B,EAAE,YAAY;EACjDF,SAAS,CAAC,YAAY;IACpBP,SAAS,CAACgD,MAAM,CAAC,CAAC;IAClBC,oBAAoB,CAAChC,UAAU,CAAC;EAClC,CAAC,CAAC;EAEFZ,QAAQ,CAAC,MAAM;IACbL,SAAS,CAACkD,KAAK,CAAC,CAAC;EACnB,CAAC,CAAC;EAEFzC,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC5B,IAAI0C,aAA4B;IAEhC,MAAMC,uBAAuB,GAAG,KAAK;IAGrC,IAAIC,MAAkC;IACtC,IAAIC,QAIH;IACD,IAAIC,QAAQ,GAAG,CAAC;IAEhB,IAAIC,cAAwC,GAAG5B,SAAS;IAExD,IAAI6B,eAAsC;IAE1CjD,UAAU,CAAC,MAAM;MACf2C,aAAa,GAAGrC,mBAAmB,CACjC;QAAE4C,WAAW,EAAE5D;MAAa,CAAC,EAC7B0C,KAAK,EACL,YAAY,eAAe,EAC3B;QAAEmB,MAAM,EAAE1C;MAAW,CACvB,CAAC;MACDoC,MAAM,GAAG,IAAIrC,0BAA0B,CAAC;QACtC,GAAGmC,aAAa;QAChBQ,MAAM,EAAE1C,UAAU,CAAC2C,KAAK,CAAC;UAAEL,QAAQ,EAAEA,QAAQ;QAAG,CAAC;MACnD,CAAC,EAAE;QACDM,uBAAuB,EAAET;MAC3B,CAAC,CAAC;MAEFK,eAAe,GAAGrD,MAAM,CAAC,CAAC;MAE1BkD,QAAQ,GAAG;QACTQ,QAAQ,EAAElD,EAAE,CAACmD,EAAE,CAAEC,CAAC,IAAK;UACrBR,cAAc,GAAGQ,CAAC;UAClBP,eAAe,CAAClC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF0C,OAAO,EAAErD,EAAE,CAACmD,EAAE,CAAC,CAAC;QAChBG,WAAW,EAAEtD,EAAE,CAACmD,EAAE,CAAC,CAAC;QACpBI,wBAAwB,EAAEvD,EAAE,CAACmD,EAAE,CAAC;MAClC,CAAC;MAED,IAAIK,mBAAmB,GAAG,CAAC;MAC3BpE,SAAS,CAACqE,GAAG,CACXnE,IAAI,CAACoE,IAAI,CACP,GAAG9B,KAAK,2CAA2C1C,YAAY,sBAAsB,EACrF,MACEK,YAAY,CAACoE,IAAI,CAAC;QAChBC,YAAY,EAAE,UAAUJ,mBAAmB,EAAE;MAC/C,CAAC,CACL,CACF,CAAC;MAEDxD,EAAE,CAAC6D,aAAa,CAAC,CAAC;IACpB,CAAC,CAAC;IAEFnE,SAAS,CAAC,MAAM;MACdM,EAAE,CAAC8D,eAAe,CAAC,CAAC;MACpB1E,SAAS,CAAC2E,aAAa,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEFhE,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACtED,MAAM,CAAC6B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAC9CnE,MAAM,CAAC4C,QAAQ,CAACY,WAAW,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;MACnDnE,MAAM,CAAC4C,QAAQ,CAACQ,QAAQ,CAAC,CAACc,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAChDnE,MAAM,CAAC4C,QAAQ,CAACW,OAAO,CAAC,CAACW,GAAG,CAACC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC;IAEFpE,QAAQ,CAAC,uBAAuB,EAAE,MAAM;MACtC,IAAIqE,EAAmB;MACvB,IAAIC,WAAuB;MAC3B,IAAIC,OAAyC;MAE7CxE,UAAU,CAAC,YAAY;QACrB,CAACsE,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAME,2BAA2B,CACnD5B,MAAM,EACNC,QACF,CAAC;QAED0B,OAAO,GAAG,MAAME,uBAAuB,CAACJ,EAAE,EAAE,CAAC,CAAC;MAChD,CAAC,CAAC;MAEFxE,SAAS,CAAC,MAAM;QACd;QACAI,MAAM,CAAC6B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;;QAE9C;QACAE,WAAW,CAAC,CAAC;;QAEb;QACAI,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;QAE9BlE,EAAE,CAACwE,WAAW,CAAC,CAAC;;QAEhB;QACAC,gCAAgC,CAACP,EAAE,CAAC;MACtC,CAAC,CAAC;MAEFnE,EAAE,CAAC,6BAA6B,EAAE,YAAY;QAC5C2E,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACtC;QACAD,WAAW,CAAC,CAAC;QACbrE,MAAM,CAACoE,EAAE,CAACS,IAAI,CAAC,CAACC,qBAAqB,CAAC,CAAC,CAAC;MAC1C,CAAC,CAAC;MAEF7E,EAAE,CAAC,8CAA8C,EAAE,MAAM;QACvDD,MAAM,CAACsE,OAAO,CAACS,QAAQ,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAACC,OAAO,CAAC,CAC9C,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,gBAAgB,CACjB,CAAC;MACJ,CAAC,CAAC;MAEFhF,EAAE,CAAC,gDAAgD,EAAE,MAAM;QACzDD,MAAM,CAACsE,OAAO,CAACS,QAAQ,CAAC,CAAC,CAAC,CAACG,YAAY,CAAC,CAACD,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC;MACxE,CAAC,CAAC;MAEFlF,QAAQ,CAAC,6CAA6C,EAAE,MAAM;QAC5DD,UAAU,CAAC,MAAM;UACf2E,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;UAC9BO,gCAAgC,CAACP,EAAE,CAAC;QACtC,CAAC,CAAC;QAEFrE,QAAQ,CAAC,WAAW,EAAE,YAAY;UAChCD,UAAU,CAAC,YAAY;YACrB,CAACsE,EAAE,CAAC,GAAG,MAAMxD,OAAO,CAACuE,GAAG,CAAC,CACvBC,0BAA0B,CAAC,CAAC;YAC5B;YACAlF,EAAE,CAACmF,wBAAwB,CAAC3C,uBAAuB,CAAC,CACrD,CAAC;YACF+B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;UAC/B,CAAC,CAAC;UAEFrE,QAAQ,CAAC,uBAAuB,EAAE,MAAM;YACtCD,UAAU,CAAC,YAAY;cACrB,MAAMwF,OAAO,GAAG,MAAMd,uBAAuB,CAACJ,EAAE,CAAC;cACjDQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;YACxC,CAAC,CAAC;YAEFrF,EAAE,CAAC,6BAA6B,EAAE,MAAM;cACtCD,MAAM,CAAC4C,QAAQ,CAACY,WAAW,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;YACrD,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFpE,QAAQ,CAAC,0CAA0C,EAAE,MAAM;QACzDD,UAAU,CAAC,MAAM;UACf8C,QAAQ,CAACa,wBAAwB,CAAC8B,sBAAsB,CAAC,MAAM;YAC7D,MAAM,IAAIC,KAAK,CAAC,eAAe,CAAC;UAClC,CAAC,CAAC;UACFZ,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACxC,CAAC,CAAC;QACF1E,SAAS,CAAC,MAAM;UACdgD,QAAQ,CAACa,wBAAwB,CAACgC,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEFxF,EAAE,CAAC,qBAAqB,EAAE,YAAY;UACpCD,MAAM,CAAC4C,QAAQ,CAACW,OAAO,CAAC,CAACY,gBAAgB,CAAC,CAAC;UAC3CnE,MAAM,CAAC4C,QAAQ,CAACW,OAAO,CAACxB,IAAI,CAAC2D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,kBAAkB,CAAC,CAACC,IAAI,CAC/D,KACF,CAAC;QACH,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF7F,QAAQ,CAAC,yBAAyB,EAAE,MAAM;QACxCD,UAAU,CAAC,MAAM;UACf8E,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACxC,CAAC,CAAC;QAEFrE,EAAE,CAAC,sCAAsC,EAAE,MAAM;UAC/CD,MAAM,CAAC4C,QAAQ,CAACa,wBAAwB,CAAC,CAACU,gBAAgB,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEFlE,EAAE,CAAC,yCAAyC,EAAE,YAAY;UACxD,MAAM4F,MAAM,GAAGxD,qBAAqB;UAEpCyD,wBAAwB,CAAC1B,EAAE,EAAE,GAAGyB,MAAM,EAAE,CAAC;UACzC,MAAM9C,eAAe,CAACgD,OAAO;UAC7B/F,MAAM,CAAC4C,QAAQ,CAACQ,QAAQ,CAAC,CAACe,gBAAgB,CAAC,CAAC;UAC5CnE,MAAM,CAAC8C,cAAc,CAAC,CAACkD,qBAAqB,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,CAAC;QACJ,CAAC,CAAC;QAEF/F,EAAE,CAAC,0CAA0C,EAAE,YAAY;UACzD,MAAM4F,MAAM,GAAGxD,qBAAqB;UAEpC4D,4BAA4B,CAAC7B,EAAE,EAAE,GAAGyB,MAAM,EAAE,CAAC;UAC7C,MAAM9C,eAAe,CAACgD,OAAO;UAC7B/F,MAAM,CAAC4C,QAAQ,CAACQ,QAAQ,CAAC,CAACe,gBAAgB,CAAC,CAAC;UAC5CnE,MAAM,CAAC8C,cAAc,CAAC,CAACkD,qBAAqB,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,CAAC;QACJ,CAAC,CAAC;QAEFjG,QAAQ,CAAC,yBAAyB,EAAE,YAAY;UAC9C,IAAImG,YAAwB;UAC5B,IAAIZ,OAAyC;UAC7CxF,UAAU,CAAC,YAAY;YACrBoG,YAAY,GAAG,MAAMvD,MAAM,CAACwD,SAAS,CACnC;cACEC,IAAI,EAAE,QAAQ;cACdC,OAAO,EAAE;YACX,CAAC,EACD;cACED,IAAI,EAAE,MAAM;cACZE,UAAU,EAAEjH,QAAQ,CAACgH;YACvB,CAAC,EACDzD,QAAQ,EACR,CAAC,YAAY,CACf,CAAC;YAED0C,OAAO,GAAG,MAAMd,uBAAuB,CAACJ,EAAE,CAAC;YAE3CQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;UACxC,CAAC,CAAC;UAEF1F,SAAS,CAAC,MAAM;YACdsG,YAAY,CAAC,CAAC;UAChB,CAAC,CAAC;UAEFjG,EAAE,CAAC,oCAAoC,EAAE,MAAM;YAC7CD,MAAM,CAACsF,OAAO,CAACP,QAAQ,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAACC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/DjF,MAAM,CAACsF,OAAO,CAACP,QAAQ,CAAC,CAAC,CAAC,CAACG,YAAY,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACtD,CAAC,CAAC;UAEFhF,EAAE,CAAC,kCAAkC,EAAE,MAAM;YAC3CD,MAAM,CAAC4C,QAAQ,CAACY,WAAW,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACrD,CAAC,CAAC;QACJ,CAAC,CAAC;QAEFpE,QAAQ,CAAC,wBAAwB,EAAE,MAAM;UACvCD,UAAU,CAAC,MAAM;YACf2E,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;YAC9BO,gCAAgC,CAACP,EAAE,CAAC;UACtC,CAAC,CAAC;UAEFrE,QAAQ,CAAC,qCAAqC,EAAE,YAAY;YAC1DD,UAAU,CAAC,YAAY;cACrB,CAACsE,EAAE,CAAC,GAAG,MAAMxD,OAAO,CAACuE,GAAG,CAAC,CACvBC,0BAA0B,CAAC,CAAC;cAC5B;cACAlF,EAAE,CAACmF,wBAAwB,CAAC3C,uBAAuB,CAAC,CACrD,CAAC;cACF+B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;cAE7B,MAAMkB,OAAO,GAAG,MAAMd,uBAAuB,CAACJ,EAAE,CAAC;cACjDQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;YACxC,CAAC,CAAC;YAEFrF,EAAE,CAAC,yBAAyB,EAAE,MAAM;cAClCD,MAAM,CAAC4C,QAAQ,CAACY,WAAW,CAAC,CAACsB,qBAAqB,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF7E,EAAE,CAAC,4CAA4C,EAAE,MAAM;UACrDD,MAAM,CAAC6B,eAAe,CAAC,CAACqC,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAC9CnE,MAAM,CAAC4C,QAAQ,CAACY,WAAW,CAAC,CAACU,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACnDnE,MAAM,CAAC4C,QAAQ,CAACQ,QAAQ,CAAC,CAACc,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAChDnE,MAAM,CAAC4C,QAAQ,CAACW,OAAO,CAAC,CAACW,GAAG,CAACC,gBAAgB,CAAC,CAAC;QACjD,CAAC,CAAC;QAEFlE,EAAE,CAAC,6BAA6B,EAAE,MAAM;UACtCD,MAAM,CAACK,qBAAqB,CAACyB,KAAK,EAAE,cAAc,CAAC,CAACyE,QAAQ,CAAC,CAAC,CAAC,CAC5DtB,OAAO,CACN,6HACF,CAAC;QACL,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAsBF,SAASL,yBAAyBA,CAChCR,EAAmB,EACnBkB,OAAyC,EACzC;EACAkB,YAAY,CACVpC,EAAE,EACF;IACEqC,EAAE,EAAEnB,OAAO,CAACmB,EAAE;IACdL,IAAI,EAAE,oBAAoB;IAC1BM,SAAS,EAAE,CAAC;MACVN,IAAI,EAAE,SAAS;MACfK,EAAE,EAAE,GAAG,EAAEpE,qBAAqB;IAChC,CAAC;EACH,CACF,CAAC;AACH;AAEA,SAASyD,wBAAwBA,CAC/B1B,EAAmB,EACnBuC,KAAa,EACb;EAcAH,YAAY,CACVpC,EAAE,EAdiC;IACnCgC,IAAI,EAAE,kBAAkB;IACxBK,EAAE,EAAEE,KAAK;IACTC,OAAO,EAAE,CAAC;MACRR,IAAI,EAAE,QAAQ;MACdS,KAAK,EAAE,kBAAkB;MACzBC,MAAM,EAAE;QACNC,SAAS,EAAE,UAAU;QACrBC,UAAU,EAAE;MACd;IACF,CAAC;EACH,CAKA,CAAC;AACH;AAEA,SAASf,4BAA4BA,CACnC7B,EAAmB,EACnBuC,KAAa,EACb;EAiBAH,YAAY,CACVpC,EAAE,EAjB0C;IAC5CgC,IAAI,EAAE,kBAAkB;IACxBK,EAAE,EAAEE,KAAK;IACTC,OAAO,EAAE,CAAC;MACR,MAAM,EAAE,WAAW;MACnB,YAAY,EAAE,UAAU;MACxB,YAAY,EAAE;QAAE,YAAY,EAAE;MAAQ,CAAC;MACvC,UAAU,EAAE,kBAAkB;MAC9B,OAAO,EAAE;QACP,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,oBAAoB;QAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG;MACvB;IACF,CAAC;EACH,CAKA,CAAC;AACH;AAEA,SAASjC,gCAAgCA,CAACP,EAAmB,EAAE;EAC7DpE,MAAM,CAACoE,EAAE,CAAC6C,mBAAmB,CAAC,CAACnC,qBAAqB,CAClDV,EAAE,CAAC8C,gBAAgB,CAACnF,IAAI,CAAC2D,KAAK,CAACyB,MACjC,CAAC;AACH;AAEA,eAAe3C,uBAAuBA,CACpCJ,EAAmB,EACnBgD,KAAa,GAAG,CAAC,EAC0B;EAC3C,OAAO,MAAMlH,EAAE,CAACmH,OAAO,CAAC,MAAM;IAC5BrH,MAAM,CAACoE,EAAE,CAACS,IAAI,CAAC,CAACyC,eAAe,CAACF,KAAK,CAAC;IACtC,MAAMG,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACrD,EAAE,CAACS,IAAI,CAAC9C,IAAI,CAAC2F,QAAQ,CAAE,CAAC,CAAC,CAACnB,QAAQ,CAAC,CAAC,CAAC;IAC/DnC,EAAE,CAACS,IAAI,CAAC8C,SAAS,CAAC,CAAC;IACnB,OAAOJ,MAAM;EACf,CAAC,CAAC;AACJ;AAEA,eAAehD,2BAA2BA,CACxC5B,MAAkC,EAClCC,QAAwB,EACyB;EACjD,MAAM,CAACwB,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAMzD,OAAO,CAACuE,GAAG,CAAC,CAC1CC,0BAA0B,CAAC,CAAC,EAC5BzC,MAAM,CAACwD,SAAS,CACd;IACEE,OAAO,EAAE,UAAU;IACnBD,IAAI,EAAE;EACR,CAAC,EACD;IACEA,IAAI,EAAE,MAAM;IACZE,UAAU,EAAEjH,QAAQ,CAACgH;EACvB,CAAC,EACDzD,QACF,CAAC,CACF,CAAC;;EAEF;EACA6B,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;EAE7B,OAAO,CAACA,EAAE,EAAEC,WAAW,CAAC;AAC1B;AAEA,eAAee,0BAA0BA,CAAA,EAA6B;EACpEpF,MAAM,CAAC6B,eAAe,CAAC,CAACiD,qBAAqB,CAAC,CAAC,CAAC;EAEhD,MAAMV,EAAE,GAAG,MAAMlE,EAAE,CAACmH,OAAO,CAAC,MAAM;IAChCrH,MAAM,CAAC6B,eAAe,CAAC,CAACsC,gBAAgB,CAAC,CAAC;IAC1CnE,MAAM,CAAC6B,eAAe,CAACE,IAAI,CAAC6F,OAAO,CAAC,CAAC,CAAC,CAACxB,IAAI,KAAK,QAAQ,CAAC;IACzD,OAAOvE,eAAe,CAACE,IAAI,CAAC6F,OAAO,CAAC,CAAC,CAAC,CAACC,KAAK;EAC9C,CAAC,CAAC;EAEF7H,MAAM,CAAC6B,eAAe,CAAC,CAACiD,qBAAqB,CAAC,CAAC,CAAC;EAChDjD,eAAe,CAAC8F,SAAS,CAAC,CAAC;EAC3B3H,MAAM,CAAC6B,eAAe,CAAC,CAACiD,qBAAqB,CAAC,CAAC,CAAC;EAEhD,OAAOV,EAAE;AACX;AAEA,SAASjC,8BAA8BA,CACrC2F,iBAA4B,EAC5B7E,MAAc,EACG;EACjB,IAAI8E,CAAC,GAAG,CAAC;EACT,MAAMC,GAAG,GAAG9H,EAAE,CAACmD,EAAE,CAAC,UAAS,GAAG4E,KAAY,EAAmB;IAC3D,MAAMC,aAAa,GAAGH,CAAC,EAAE;IACzB9E,MAAM,CAACkF,KAAK,CAAC,8BAA8B,CAAC;IAC5C,MAAMC,YAAY,GAAG,IAAIC,WAAW,CAAC,CAAC;IAEtC,OAAO;MACLnB,gBAAgB,EAAEhH,EAAE,CAACmD,EAAE,CACrB+E,YAAY,CAAClB,gBAAgB,CAACoB,IAAI,CAACF,YAAY,CACjD,CAAQ;MACRnB,mBAAmB,EAAE/G,EAAE,CAACmD,EAAE,CACxB+E,YAAY,CAACnB,mBAAmB,CAACqB,IAAI,CAACF,YAAY,CACpD,CAAQ;MAERvD,IAAI,EAAE3E,EAAE,CAACmD,EAAE,CAAE7B,CAAC,IAAc;QAC1ByB,MAAM,CAACkF,KAAK,CACV;UAAEI,OAAO,EAAEf,IAAI,CAACC,KAAK,CAACjG,CAAC,CAAC+E,QAAQ,CAAC,CAAC,CAAC;UAAE2B;QAAc,CAAC,EACpD,eACF,CAAC;MACH,CAAC,CAAC;MACF1F,KAAK,EAAEtC,EAAE,CAACmD,EAAE,CAAC,CAAC;MACdmF,aAAa,EAAEJ,YAAY;MAC3BK,UAAU,EAAEX,iBAAiB,CAACY;IAChC,CAAC;IACD;IACA;EACF,CAAC,CAA2B;EAE5BC,MAAM,CAACC,MAAM,CAACZ,GAAG,EAAE;IACjBa,IAAI,EAAEf,iBAAiB,CAACe,IAAI;IAC5BC,MAAM,EAAEhB,iBAAiB,CAACgB,MAAM;IAChCC,OAAO,EAAEjB,iBAAiB,CAACiB,OAAO;IAClCL,UAAU,EAAEZ,iBAAiB,CAACY;EAChC,CAAC,CAAC;EAEF,OAAOV,GAAG;AACZ;AAEA,SAASvD,iBAAiBA,CAACL,EAAmB,EAAEqE,UAA4B,EAAE;EAC5E,MAAMO,QAAQ,GAAGP,UAAU,KAAK,MAAM,GAClClJ,iBAAiB,CAACsJ,IAAI,GACtBtJ,iBAAiB,CAACuJ,MAAM;EAE5B,IAAIE,QAAQ,KAAK5E,EAAE,CAACqE,UAAU,EAAE;EAEhCrE,EAAE,CAACqE,UAAU,GAAGO,QAAQ;EACxB5E,EAAE,CAACoE,aAAa,CAACS,aAAa,CAAC,IAAIC,KAAK,CAACT,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D;AAEA,SAASlG,oBAAoBA,CAACU,MAAc,EAAE;EAC5C,MAAM9C,CAAC,GAAGA,CACRgJ,IAAY,EACZ;IAAEC,SAAS;IAAEC;EAAiD,CAAC,KAC5DpG,MAAM,CAACqG,KAAK,CAAC;IAAEF,SAAS;IAAEG,GAAG,EAAEF,OAAO,CAACE;EAAI,CAAC,EAAEJ,IAAI,CAAC;EAExD,MAAMK,UAAU,GAAG,CACjB,eAAe,EACf,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,CACT;EAEV,KAAK,MAAMC,CAAC,IAAID,UAAU,EAAE;IAC1BlK,SAAS,CAACoK,MAAM,CAACC,EAAE,CAACF,CAAC,EAA+BtJ,CAAC,CAACmI,IAAI,CAACpH,SAAS,EAAEuI,CAAC,CAAC,CAAC;EAC3E;AACF;AAEA,MAAMG,gBAAgB,GAAGzJ,CAAC,CAAC2G,MAAM,CAAC;EAChCL,EAAE,EAAEtG,CAAC,CAAC0J,MAAM,CAAC,CAAC;EACd9E,QAAQ,EAAE5E,CAAC,CAAC2J,KAAK,CAAC3J,CAAC,CAAC2G,MAAM,CAAC;IACzBiD,SAAS,EAAE5J,CAAC,CAAC2G,MAAM,CAAC;MAAEL,EAAE,EAAEtG,CAAC,CAAC0J,MAAM,CAAC;IAAE,CAAC,CAAC;IACvC7E,WAAW,EAAE7E,CAAC,CAAC2J,KAAK,CAAC3J,CAAC,CAAC0J,MAAM,CAAC,CAAC,CAAC;IAChC3E,YAAY,EAAE/E,CAAC,CAAC2J,KAAK,CAAC3J,CAAC,CAAC0J,MAAM,CAAC,CAAC;EAClC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAMG,YAAY,SAASd,KAAK,CAAC;EAE/Be,WAAWA,CAACC,IAAS,EAAE;IACrB,KAAK,CAAC,SAAS,CAAC;IAChB,IAAI,CAACA,IAAI,GAAG1C,IAAI,CAAC2C,SAAS,CAACD,IAAI,CAAC;EAClC;AACF;AAEA,SAAS1D,YAAYA,CAAIpC,EAAmB,EAAEgG,CAAI,EAAE;EAClDhG,EAAE,CAACoE,aAAa,CAACS,aAAa,CAAC,IAAIe,YAAY,CAACI,CAAC,CAAC,CAAC;AACrD","ignoreList":[]}
@@ -295,7 +295,7 @@ export class Store {
295
295
  if (process.env.NODE_ENV !== "production") {
296
296
  store.logger?.info("Removing an object from an object list that is in the middle of being loaded.", existing);
297
297
  }
298
- query.revalidate( /* force */true).catch(e => {
298
+ query.revalidate(/* force */true).catch(e => {
299
299
  if (store.logger) {
300
300
  store.logger?.error("Uncaught error while revalidating list", e);
301
301
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","RefCounts","WeakMapWithEntries","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","OrderByCanonicalizer","map","Map","canonicalize","orderBy","has","JSON","stringify","get","set","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","objectType","where","streamUpdates","miniDef","objectSet","store","websocketSubscription","onChange","object","state","debug","methodName","$objectType","$primaryKey","peekQuery","changes","updateObject","maybeRevalidateLists","err","batch","existing","read","cacheKeyToRemove","newObjects","data","filter","o","length","modifiedLists","add","write","info","onError","errors","onOutOfDate","onSuccessfulSubscription","#peekQuery","getQuery","#getQuery","createQuery","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getObject","objEntry","optimisticId","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","oldTopValue","writeLayer","newValue","Date","now","newTopValue","retVal","maybeUpdateLists","batchResult","invalidateObject","trace","promises","promise","maybeUpdateAndRevalidate","push","Promise","all","addedObjects","size","modifiedObjects","resolve","keys","invalidateObjectType","invalidateList","writeToStore","updateObjects","values","$apiName","updateList","objects","objectCacheKeys"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport type {\n ActionDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport type { Logger } from \"../../Logger.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveListOptions,\n ObserveObjectOptions,\n OrderBy,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport type { SubFn } from \"../types.js\";\nimport { ActionApplication } from \"./ActionApplication.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./ChangedObjects.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [x] websocket subscriptions\n - [ ] links\n - [x] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n changes: Changes;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class OrderByCanonicalizer {\n // crappy version\n #map = new Map<string, Record<string, \"asc\" | \"desc\" | undefined>>();\n\n canonicalize: <T>(\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (orderBy) => {\n if (this.#map.has(JSON.stringify(orderBy))) {\n return this.#map.get(JSON.stringify(orderBy))! as Canonical<\n Record<string, \"asc\" | \"desc\" | undefined>\n >;\n } else {\n this.#map.set(JSON.stringify(orderBy), orderBy);\n return orderBy as Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n }\n };\n}\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n orderByCanonicalizer: OrderByCanonicalizer = new OrderByCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n /** @internal */\n logger?: Logger;\n\n #queries: WeakMapWithEntries<\n CacheKey<string, any, any>,\n Query<any, any, any>\n > = new WeakMapWithEntries();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n },\n );\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<unknown> = (action, args, opts) => {\n return new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: SubFn<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n // we don't want observeObject() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in observeObject\", e);\n } else {\n throw e;\n }\n });\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition>(\n options: ObserveListOptions<T>,\n subFn: SubFn<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.objectType,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n if (options.streamUpdates) {\n const miniDef = {\n type: \"object\",\n apiName: (typeof options.objectType === \"string\"\n ? options.objectType\n : options.objectType.apiName),\n } as T;\n let objectSet: ObjectSet<T> = this.client(miniDef);\n if (options.where) {\n objectSet = objectSet.where(options.where ?? {});\n }\n const store = this;\n const websocketSubscription = objectSet.subscribe({\n onChange({ object, state }) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.debug(\n { methodName: \"onError\" },\n \"updates\",\n state,\n object,\n );\n }\n\n const cacheKey = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n const type = store.#peekQuery(cacheKey) == null\n ? \"addedObjects\"\n : \"modifiedObjects\";\n\n const changes = createChangedObjects();\n changes[type].set(\n object.$objectType,\n object,\n );\n\n if (state === \"ADDED_OR_UPDATED\") {\n // todo, can we do the update without\n // the extra invalidation? maybe a flag to updateObject\n store.updateObject(\n object.$objectType,\n object,\n );\n store.maybeRevalidateLists(changes).catch(err => {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in maybeRevalidateLists\", err);\n });\n } else if (state === \"REMOVED\") {\n const changes = createChangedObjects();\n store.batch({ changes }, (batch) => {\n const existing = batch.read(query.cacheKey);\n const cacheKeyToRemove = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n if (existing?.status === \"loaded\") {\n const newObjects = existing.value?.data.filter(\n (o) => o !== cacheKeyToRemove,\n );\n if (newObjects?.length !== existing.value?.data.length) {\n batch.changes.modifiedLists.add(query.cacheKey);\n batch.write(\n query.cacheKey,\n { data: newObjects ?? [] },\n \"loaded\",\n );\n // Should there be an else for this case? Do we need to invalidate\n // the paging tokens we may have?\n }\n } else {\n // There may be a tiny race here where OSW tells us the object has\n // been removed but an outstanding invalidation of this query is\n // about to return. In this case, its possible that we remove this item\n // from the list and then the returned list load re-adds it.\n // To avoid this, we will just force reload the query to be sure\n // we don't leave things in a bad state.\n\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n \"Removing an object from an object list that is in the middle of being loaded.\",\n existing,\n );\n }\n\n query.revalidate(/* force */ true).catch((e) => {\n if (store.logger) {\n store.logger?.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n } else {\n // eslint-disable-next-line no-console\n console.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n }\n });\n }\n });\n }\n },\n\n onError(errors) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onError\" },\n \"subscription errors\",\n errors,\n );\n }\n },\n\n onOutOfDate() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onOutOfDate\" },\n );\n }\n },\n\n onSuccessfulSubscription() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onSuccessfulSubscription\" },\n );\n }\n },\n });\n\n sub.add(() => {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"observeList\" },\n \"Unsubscribing from websocket\",\n );\n }\n\n websocketSubscription.unsubscribe();\n });\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n #peekQuery<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.#peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n apiName,\n canonWhere,\n canonOrderBy,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: string | number,\n ): Osdk.Instance<T> | undefined {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n const objEntry = this.#topLayer.get(objectCacheKey);\n return objEntry?.value as Osdk.Instance<T> | undefined;\n }\n\n batch = <X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = new Entry(\n cacheKey,\n value,\n Date.now(),\n status,\n );\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n void this.maybeUpdateLists(changes, optimisticId);\n\n return { batchResult: batchContext, retVal: retVal };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n // inevitably we will want an internal version of this and a \"public\" one\n // so we can avoid extra requests\n\n const query = this.getObjectQuery(apiName, pk);\n\n return query.revalidate(true);\n\n // potentially trigger updates of the lists that included this object?\n // TODO\n // could we detect that a list WOULD include it?\n }\n\n public async maybeRevalidateLists(\n changes: Changes,\n ): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n DEBUG_ONLY__changesToString(changes),\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n undefined,\n );\n if (promise) promises.push(promise);\n }\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n public maybeUpdateLists(\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ): Promise<(void | undefined)[]> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.trace(\n { methodName: \"maybeUpdateLists\" },\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n if (changes.addedObjects.size === 0 && changes.modifiedObjects.size === 0) {\n return Promise.resolve([]);\n }\n const promises = [];\n for (const cacheKey of this.#queries.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n }\n }\n\n return Promise.all(promises);\n }\n\n /**\n * @param apiName\n * @param changes The changes we know about / to update\n * @returns\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<unknown[]> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"invalidateObjectType\" },\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<unknown>> = [];\n\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey, apiName)) {\n if (!changes || !changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modifiedLists.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises);\n }\n\n public invalidateList<T extends ObjectTypeDefinition>(\n { objectType, where, orderBy }: {\n objectType: T[\"apiName\"] | T;\n where?: WhereClause<T>;\n orderBy?: OrderBy<T>;\n },\n ): void {\n if (typeof objectType !== \"string\") {\n objectType = objectType.apiName;\n }\n\n where = this.whereCanonicalizer.canonicalize(where ?? {});\n orderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});\n\n const cacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n objectType,\n where as Canonical<WhereClause<T>>,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n\n public updateObject(\n apiName: string | ObjectTypeDefinition,\n value: Osdk.Instance<ObjectTypeDefinition>,\n { optimisticId }: UpdateOptions = {},\n ): Osdk.Instance<ObjectTypeDefinition> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, value.$primaryKey);\n\n return this.batch({ optimisticId }, (batch) => {\n return query.writeToStore(value, \"loaded\", batch);\n }).retVal.value!;\n }\n\n public updateObjects(\n values: Array<Osdk.Instance<ObjectTypeDefinition>>,\n batch: BatchContext,\n ): ObjectCacheKey[] {\n // update the cache for any object that has changed\n // and save the mapped values to return\n return values.map(v => {\n return this.getObjectQuery(\n v.$apiName,\n v.$primaryKey as string | number,\n )\n .writeToStore(v, \"loaded\", batch).cacheKey;\n });\n }\n\n /**\n * Updates the internal state of a list and will create a new internal query if needed.\n *\n * Helper method only for tests right now. May be removed later.\n *\n * @param apiName\n * @param where\n * @param orderBy\n * @param objects\n * @param param4\n * @param opts\n */\n public updateList<T extends ObjectTypeDefinition>(\n {\n objectType: apiName,\n where,\n orderBy,\n }: {\n objectType: T[\"apiName\"] | T;\n where: WhereClause<T>;\n orderBy: OrderBy<T>;\n },\n objects: Osdk.Instance<T>[],\n { optimisticId }: UpdateOptions = {},\n opts: ListQueryOptions = { dedupeInterval: 0 },\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"updateList\" },\n \"\",\n { optimisticId },\n );\n }\n\n const query = this.getListQuery(apiName, where ?? {}, orderBy ?? {}, opts);\n\n this.batch({ optimisticId }, (batch) => {\n const objectCacheKeys = this.updateObjects(objects, batch);\n query.updateList(objectCacheKeys, false, \"loaded\", batch);\n });\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","RefCounts","WeakMapWithEntries","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","OrderByCanonicalizer","map","Map","canonicalize","orderBy","has","JSON","stringify","get","set","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","objectType","where","streamUpdates","miniDef","objectSet","store","websocketSubscription","onChange","object","state","debug","methodName","$objectType","$primaryKey","peekQuery","changes","updateObject","maybeRevalidateLists","err","batch","existing","read","cacheKeyToRemove","newObjects","data","filter","o","length","modifiedLists","add","write","info","onError","errors","onOutOfDate","onSuccessfulSubscription","#peekQuery","getQuery","#getQuery","createQuery","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getObject","objEntry","optimisticId","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","oldTopValue","writeLayer","newValue","Date","now","newTopValue","retVal","maybeUpdateLists","batchResult","invalidateObject","trace","promises","promise","maybeUpdateAndRevalidate","push","Promise","all","addedObjects","size","modifiedObjects","resolve","keys","invalidateObjectType","invalidateList","writeToStore","updateObjects","values","$apiName","updateList","objects","objectCacheKeys"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport type {\n ActionDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport type { Logger } from \"../../Logger.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveListOptions,\n ObserveObjectOptions,\n OrderBy,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport type { SubFn } from \"../types.js\";\nimport { ActionApplication } from \"./ActionApplication.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./ChangedObjects.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [x] websocket subscriptions\n - [ ] links\n - [x] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n changes: Changes;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class OrderByCanonicalizer {\n // crappy version\n #map = new Map<string, Record<string, \"asc\" | \"desc\" | undefined>>();\n\n canonicalize: <T>(\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (orderBy) => {\n if (this.#map.has(JSON.stringify(orderBy))) {\n return this.#map.get(JSON.stringify(orderBy))! as Canonical<\n Record<string, \"asc\" | \"desc\" | undefined>\n >;\n } else {\n this.#map.set(JSON.stringify(orderBy), orderBy);\n return orderBy as Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n }\n };\n}\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n orderByCanonicalizer: OrderByCanonicalizer = new OrderByCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n /** @internal */\n logger?: Logger;\n\n #queries: WeakMapWithEntries<\n CacheKey<string, any, any>,\n Query<any, any, any>\n > = new WeakMapWithEntries();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n },\n );\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<unknown> = (action, args, opts) => {\n return new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: SubFn<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n // we don't want observeObject() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in observeObject\", e);\n } else {\n throw e;\n }\n });\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition>(\n options: ObserveListOptions<T>,\n subFn: SubFn<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.objectType,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n if (options.streamUpdates) {\n const miniDef = {\n type: \"object\",\n apiName: (typeof options.objectType === \"string\"\n ? options.objectType\n : options.objectType.apiName),\n } as T;\n let objectSet: ObjectSet<T> = this.client(miniDef);\n if (options.where) {\n objectSet = objectSet.where(options.where ?? {});\n }\n const store = this;\n const websocketSubscription = objectSet.subscribe({\n onChange({ object, state }) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.debug(\n { methodName: \"onError\" },\n \"updates\",\n state,\n object,\n );\n }\n\n const cacheKey = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n const type = store.#peekQuery(cacheKey) == null\n ? \"addedObjects\"\n : \"modifiedObjects\";\n\n const changes = createChangedObjects();\n changes[type].set(\n object.$objectType,\n object,\n );\n\n if (state === \"ADDED_OR_UPDATED\") {\n // todo, can we do the update without\n // the extra invalidation? maybe a flag to updateObject\n store.updateObject(\n object.$objectType,\n object,\n );\n store.maybeRevalidateLists(changes).catch(err => {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in maybeRevalidateLists\", err);\n });\n } else if (state === \"REMOVED\") {\n const changes = createChangedObjects();\n store.batch({ changes }, (batch) => {\n const existing = batch.read(query.cacheKey);\n const cacheKeyToRemove = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n if (existing?.status === \"loaded\") {\n const newObjects = existing.value?.data.filter(\n (o) => o !== cacheKeyToRemove,\n );\n if (newObjects?.length !== existing.value?.data.length) {\n batch.changes.modifiedLists.add(query.cacheKey);\n batch.write(\n query.cacheKey,\n { data: newObjects ?? [] },\n \"loaded\",\n );\n // Should there be an else for this case? Do we need to invalidate\n // the paging tokens we may have?\n }\n } else {\n // There may be a tiny race here where OSW tells us the object has\n // been removed but an outstanding invalidation of this query is\n // about to return. In this case, its possible that we remove this item\n // from the list and then the returned list load re-adds it.\n // To avoid this, we will just force reload the query to be sure\n // we don't leave things in a bad state.\n\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n \"Removing an object from an object list that is in the middle of being loaded.\",\n existing,\n );\n }\n\n query.revalidate(/* force */ true).catch((e) => {\n if (store.logger) {\n store.logger?.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n } else {\n // eslint-disable-next-line no-console\n console.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n }\n });\n }\n });\n }\n },\n\n onError(errors) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onError\" },\n \"subscription errors\",\n errors,\n );\n }\n },\n\n onOutOfDate() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onOutOfDate\" },\n );\n }\n },\n\n onSuccessfulSubscription() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onSuccessfulSubscription\" },\n );\n }\n },\n });\n\n sub.add(() => {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"observeList\" },\n \"Unsubscribing from websocket\",\n );\n }\n\n websocketSubscription.unsubscribe();\n });\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n #peekQuery<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.#peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n apiName,\n canonWhere,\n canonOrderBy,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: string | number,\n ): Osdk.Instance<T> | undefined {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n const objEntry = this.#topLayer.get(objectCacheKey);\n return objEntry?.value as Osdk.Instance<T> | undefined;\n }\n\n batch = <X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = new Entry(\n cacheKey,\n value,\n Date.now(),\n status,\n );\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n void this.maybeUpdateLists(changes, optimisticId);\n\n return { batchResult: batchContext, retVal: retVal };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n // inevitably we will want an internal version of this and a \"public\" one\n // so we can avoid extra requests\n\n const query = this.getObjectQuery(apiName, pk);\n\n return query.revalidate(true);\n\n // potentially trigger updates of the lists that included this object?\n // TODO\n // could we detect that a list WOULD include it?\n }\n\n public async maybeRevalidateLists(\n changes: Changes,\n ): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n DEBUG_ONLY__changesToString(changes),\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n undefined,\n );\n if (promise) promises.push(promise);\n }\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n public maybeUpdateLists(\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ): Promise<(void | undefined)[]> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.trace(\n { methodName: \"maybeUpdateLists\" },\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n if (changes.addedObjects.size === 0 && changes.modifiedObjects.size === 0) {\n return Promise.resolve([]);\n }\n const promises = [];\n for (const cacheKey of this.#queries.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n }\n }\n\n return Promise.all(promises);\n }\n\n /**\n * @param apiName\n * @param changes The changes we know about / to update\n * @returns\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<unknown[]> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"invalidateObjectType\" },\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<unknown>> = [];\n\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey, apiName)) {\n if (!changes || !changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modifiedLists.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises);\n }\n\n public invalidateList<T extends ObjectTypeDefinition>(\n { objectType, where, orderBy }: {\n objectType: T[\"apiName\"] | T;\n where?: WhereClause<T>;\n orderBy?: OrderBy<T>;\n },\n ): void {\n if (typeof objectType !== \"string\") {\n objectType = objectType.apiName;\n }\n\n where = this.whereCanonicalizer.canonicalize(where ?? {});\n orderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});\n\n const cacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n objectType,\n where as Canonical<WhereClause<T>>,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n\n public updateObject(\n apiName: string | ObjectTypeDefinition,\n value: Osdk.Instance<ObjectTypeDefinition>,\n { optimisticId }: UpdateOptions = {},\n ): Osdk.Instance<ObjectTypeDefinition> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, value.$primaryKey);\n\n return this.batch({ optimisticId }, (batch) => {\n return query.writeToStore(value, \"loaded\", batch);\n }).retVal.value!;\n }\n\n public updateObjects(\n values: Array<Osdk.Instance<ObjectTypeDefinition>>,\n batch: BatchContext,\n ): ObjectCacheKey[] {\n // update the cache for any object that has changed\n // and save the mapped values to return\n return values.map(v => {\n return this.getObjectQuery(\n v.$apiName,\n v.$primaryKey as string | number,\n )\n .writeToStore(v, \"loaded\", batch).cacheKey;\n });\n }\n\n /**\n * Updates the internal state of a list and will create a new internal query if needed.\n *\n * Helper method only for tests right now. May be removed later.\n *\n * @param apiName\n * @param where\n * @param orderBy\n * @param objects\n * @param param4\n * @param opts\n */\n public updateList<T extends ObjectTypeDefinition>(\n {\n objectType: apiName,\n where,\n orderBy,\n }: {\n objectType: T[\"apiName\"] | T;\n where: WhereClause<T>;\n orderBy: OrderBy<T>;\n },\n objects: Osdk.Instance<T>[],\n { optimisticId }: UpdateOptions = {},\n opts: ListQueryOptions = { dedupeInterval: 0 },\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"updateList\" },\n \"\",\n { optimisticId },\n );\n }\n\n const query = this.getListQuery(apiName, where ?? {}, orderBy ?? {}, opts);\n\n this.batch({ optimisticId }, (batch) => {\n const objectCacheKeys = this.updateObjects(objects, batch);\n query.updateList(objectCacheKeys, false, \"loaded\", batch);\n });\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -131,6 +131,8 @@ export function createClientMockHelper() {
131
131
  type: "edits",
132
132
  addedLinks: x.addedLinks ?? [],
133
133
  addedObjects: x.addedObjects ?? [],
134
+ deletedObjects: x.deletedObjects ?? [],
135
+ deletedLinks: x.deletedLinks ?? [],
134
136
  deletedLinksCount: x.deletedLinksCount ?? 0,
135
137
  deletedObjectsCount: x.deletedObjectsCount ?? 0,
136
138
  editedObjectTypes: x.editedObjectTypes ?? [],