@osdk/client 2.4.0-beta.1 → 2.4.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/build/browser/Client.js +1 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +14 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/intellisense.test.js +1 -1
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +7 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +9 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +240 -0
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +20 -0
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +22 -0
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/Store.js +7 -0
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/ontology/StandardOntologyProvider.js +3 -2
- package/build/browser/ontology/StandardOntologyProvider.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/deepFreeze.js +26 -0
- package/build/browser/util/deepFreeze.js.map +1 -0
- package/build/cjs/{chunk-Z6X7WQDP.cjs → chunk-NOQSRSD6.cjs} +79 -52
- package/build/cjs/chunk-NOQSRSD6.cjs.map +1 -0
- package/build/cjs/{chunk-YGJRXE4F.cjs → chunk-OKQUXVEK.cjs} +24 -2
- package/build/cjs/chunk-OKQUXVEK.cjs.map +1 -0
- package/build/cjs/index.cjs +6 -6
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +23 -15
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +2 -1
- package/build/esm/Client.js +1 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +14 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/intellisense.test.js +1 -1
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +7 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +9 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +240 -0
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +20 -0
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +22 -0
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/Store.js +7 -0
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/ontology/StandardOntologyProvider.js +3 -2
- package/build/esm/ontology/StandardOntologyProvider.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/deepFreeze.js +26 -0
- package/build/esm/util/deepFreeze.js.map +1 -0
- package/build/types/Client.d.ts +1 -1
- package/build/types/observable/ObservableClient.d.ts +2 -1
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +2 -1
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/ontology/StandardOntologyProvider.d.ts.map +1 -1
- package/build/types/util/deepFreeze.d.ts +1 -0
- package/build/types/util/deepFreeze.d.ts.map +1 -0
- package/package.json +8 -8
- package/build/cjs/chunk-YGJRXE4F.cjs.map +0 -1
- package/build/cjs/chunk-Z6X7WQDP.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","LegacyFauxFoundry","msw","startNodeApiServer","ImportedWebSocket","pDefer","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createClient","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","apiServer","testSetup","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","client","listener","oslwInst","updateReceived","listenerPromise","ontologyRid","logger","child","minimumReconnectDelayMs","onChange","fn","o","object","state","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","http","post","HttpResponse","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","__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 {\n Logger,\n ObjectSetSubscription,\n Osdk,\n PropertyKeys,\n} from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n StreamMessage,\n} from \"@osdk/foundry.ontologies\";\nimport {\n LegacyFauxFoundry,\n msw,\n type SetupServer,\n startNodeApiServer,\n} from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createClient } from \"../createClient.js\";\nimport { createMinimalClient } from \"../createMinimalClient.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 let apiServer: SetupServer;\n beforeAll(() => {\n const testSetup = startNodeApiServer(\n new LegacyFauxFoundry(STACK),\n createClient,\n );\n ({ apiServer } = testSetup);\n addLoggerToApiServer(testSetup.apiServer, rootLogger);\n return () => {\n testSetup.apiServer.close();\n };\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: {\n object: Osdk.Instance<Employee>;\n state: \"ADDED_OR_UPDATED\" | \"REMOVED\";\n } | 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 = { object: o.object, state: o.state };\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 msw.http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n msw.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(apiServer: SetupServer, 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;;AAQA,SAASA,YAAY,EAAEC,QAAQ,QAAQ,4BAA4B;AAKnE,SACEC,iBAAiB,EACjBC,GAAG,EAEHC,kBAAkB,QACb,mBAAmB;AAC1B,OAAOC,iBAAiB,MAAM,eAAe;AAE7C,OAAOC,MAAM,MAAM,SAAS;AAE5B,SACEC,SAAS,EACTC,SAAS,EACTC,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,EAAE,EACFC,EAAE,QACG,QAAQ;AACf,SAASC,CAAC,QAAQ,KAAK;AACvB,SAASC,YAAY,QAAQ,oBAAoB;AACjD,SAASC,mBAAmB,QAAQ,2BAA2B;AAE/D,SACEC,qBAAqB,EACrBC,0BAA0B,QACrB,iCAAiC;;AAExC;AACA;AACA,MAAMC,UAAU,GAAG,MAAMN,EAAE,CAACO,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,GAAGpC,iBAA+C;AAEvE,MAAMqC,KAAK,GAAG,uDAAuD;AAErE7B,EAAE,CAAC8B,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;AAE7BvC,QAAQ,CAAC,4BAA4B,EAAE,YAAY;EACjD,IAAIwC,SAAsB;EAC1B1C,SAAS,CAAC,MAAM;IACd,MAAM2C,SAAS,GAAG/C,kBAAkB,CAClC,IAAIF,iBAAiB,CAACwC,KAAK,CAAC,EAC5B3B,YACF,CAAC;IACD,CAAC;MAAEmC;IAAU,CAAC,GAAGC,SAAS;IAC1BC,oBAAoB,CAACD,SAAS,CAACD,SAAS,EAAE/B,UAAU,CAAC;IACrD,OAAO,MAAM;MACXgC,SAAS,CAACD,SAAS,CAACG,KAAK,CAAC,CAAC;IAC7B,CAAC;EACH,CAAC,CAAC;EAEF3C,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC5B,IAAI4C,aAA4B;IAEhC,MAAMC,uBAAuB,GAAG,KAAK;IAGrC,IAAIC,MAAkC;IACtC,IAAIC,QAIH;IACD,IAAIC,QAAQ,GAAG,CAAC;IAEhB,IAAIC,cAGS,GAAG7B,SAAS;IAEzB,IAAI8B,eAAsC;IAE1CnD,UAAU,CAAC,MAAM;MACf6C,aAAa,GAAGtC,mBAAmB,CACjC;QAAE6C,WAAW,EAAE7D;MAAa,CAAC,EAC7B0C,KAAK,EACL,YAAY,eAAe,EAC3B;QAAEoB,MAAM,EAAE3C;MAAW,CACvB,CAAC;MACDqC,MAAM,GAAG,IAAItC,0BAA0B,CAAC;QACtC,GAAGoC,aAAa;QAChBQ,MAAM,EAAE3C,UAAU,CAAC4C,KAAK,CAAC;UAAEL,QAAQ,EAAEA,QAAQ;QAAG,CAAC;MACnD,CAAC,EAAE;QACDM,uBAAuB,EAAET;MAC3B,CAAC,CAAC;MAEFK,eAAe,GAAGtD,MAAM,CAAC,CAAC;MAE1BmD,QAAQ,GAAG;QACTQ,QAAQ,EAAEpD,EAAE,CAACqD,EAAE,CAAEC,CAAC,IAAK;UACrBR,cAAc,GAAG;YAAES,MAAM,EAAED,CAAC,CAACC,MAAM;YAAEC,KAAK,EAAEF,CAAC,CAACE;UAAM,CAAC;UACrDT,eAAe,CAACnC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF6C,OAAO,EAAEzD,EAAE,CAACqD,EAAE,CAAC,CAAC;QAChBK,WAAW,EAAE1D,EAAE,CAACqD,EAAE,CAAC,CAAC;QACpBM,wBAAwB,EAAE3D,EAAE,CAACqD,EAAE,CAAC;MAClC,CAAC;MAED,IAAIO,mBAAmB,GAAG,CAAC;MAC3BvB,SAAS,CAACwB,GAAG,CACXvE,GAAG,CAACwE,IAAI,CAACC,IAAI,CACX,GAAGlC,KAAK,2CAA2C1C,YAAY,sBAAsB,EACrF,MACEG,GAAG,CAAC0E,YAAY,CAACC,IAAI,CAAC;QACpBC,YAAY,EAAE,UAAUN,mBAAmB,EAAE;MAC/C,CAAC,CACL,CACF,CAAC;MAED5D,EAAE,CAACmE,aAAa,CAAC,CAAC;IACpB,CAAC,CAAC;IAEFzE,SAAS,CAAC,MAAM;MACdM,EAAE,CAACoE,eAAe,CAAC,CAAC;MACpB/B,SAAS,CAACgC,aAAa,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEFtE,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACtED,MAAM,CAAC8B,eAAe,CAAC,CAAC0C,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAC9CzE,MAAM,CAAC8C,QAAQ,CAACc,WAAW,CAAC,CAACY,GAAG,CAACC,gBAAgB,CAAC,CAAC;MACnDzE,MAAM,CAAC8C,QAAQ,CAACQ,QAAQ,CAAC,CAACkB,GAAG,CAACC,gBAAgB,CAAC,CAAC;MAChDzE,MAAM,CAAC8C,QAAQ,CAACa,OAAO,CAAC,CAACa,GAAG,CAACC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF1E,QAAQ,CAAC,uBAAuB,EAAE,MAAM;MACtC,IAAI2E,EAAmB;MACvB,IAAIC,WAAuB;MAC3B,IAAIC,OAAyC;MAE7C9E,UAAU,CAAC,YAAY;QACrB,CAAC4E,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAME,2BAA2B,CACnDhC,MAAM,EACNC,QACF,CAAC;QAED8B,OAAO,GAAG,MAAME,uBAAuB,CAACJ,EAAE,EAAE,CAAC,CAAC;MAChD,CAAC,CAAC;MAEF9E,SAAS,CAAC,MAAM;QACd;QACAI,MAAM,CAAC8B,eAAe,CAAC,CAAC0C,GAAG,CAACC,gBAAgB,CAAC,CAAC;;QAE9C;QACAE,WAAW,CAAC,CAAC;;QAEb;QACAI,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;QAE9BxE,EAAE,CAAC8E,WAAW,CAAC,CAAC;;QAEhB;QACAC,gCAAgC,CAACP,EAAE,CAAC;MACtC,CAAC,CAAC;MAEFzE,EAAE,CAAC,6BAA6B,EAAE,YAAY;QAC5CiF,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACtC;QACAD,WAAW,CAAC,CAAC;QACb3E,MAAM,CAAC0E,EAAE,CAACS,IAAI,CAAC,CAACC,qBAAqB,CAAC,CAAC,CAAC;MAC1C,CAAC,CAAC;MAEFnF,EAAE,CAAC,8CAA8C,EAAE,MAAM;QACvDD,MAAM,CAAC4E,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;MAEFtF,EAAE,CAAC,gDAAgD,EAAE,MAAM;QACzDD,MAAM,CAAC4E,OAAO,CAACS,QAAQ,CAAC,CAAC,CAAC,CAACG,YAAY,CAAC,CAACD,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC;MACxE,CAAC,CAAC;MAEFxF,QAAQ,CAAC,6CAA6C,EAAE,MAAM;QAC5DD,UAAU,CAAC,MAAM;UACfiF,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;UAC9BO,gCAAgC,CAACP,EAAE,CAAC;QACtC,CAAC,CAAC;QAEF3E,QAAQ,CAAC,WAAW,EAAE,YAAY;UAChCD,UAAU,CAAC,YAAY;YACrB,CAAC4E,EAAE,CAAC,GAAG,MAAM7D,OAAO,CAAC4E,GAAG,CAAC,CACvBC,0BAA0B,CAAC,CAAC;YAC5B;YACAxF,EAAE,CAACyF,wBAAwB,CAAC/C,uBAAuB,CAAC,CACrD,CAAC;YACFmC,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;UAC/B,CAAC,CAAC;UAEF3E,QAAQ,CAAC,uBAAuB,EAAE,MAAM;YACtCD,UAAU,CAAC,YAAY;cACrB,MAAM8F,OAAO,GAAG,MAAMd,uBAAuB,CAACJ,EAAE,CAAC;cACjDQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;YACxC,CAAC,CAAC;YAEF3F,EAAE,CAAC,6BAA6B,EAAE,MAAM;cACtCD,MAAM,CAAC8C,QAAQ,CAACc,WAAW,CAAC,CAACY,GAAG,CAACC,gBAAgB,CAAC,CAAC;YACrD,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF1E,QAAQ,CAAC,0CAA0C,EAAE,MAAM;QACzDD,UAAU,CAAC,MAAM;UACfgD,QAAQ,CAACe,wBAAwB,CAACgC,sBAAsB,CAAC,MAAM;YAC7D,MAAM,IAAIC,KAAK,CAAC,eAAe,CAAC;UAClC,CAAC,CAAC;UACFZ,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACxC,CAAC,CAAC;QACFhF,SAAS,CAAC,MAAM;UACdkD,QAAQ,CAACe,wBAAwB,CAACkC,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF9F,EAAE,CAAC,qBAAqB,EAAE,YAAY;UACpCD,MAAM,CAAC8C,QAAQ,CAACa,OAAO,CAAC,CAACc,gBAAgB,CAAC,CAAC;UAC3CzE,MAAM,CAAC8C,QAAQ,CAACa,OAAO,CAAC3B,IAAI,CAACgE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,kBAAkB,CAAC,CAACC,IAAI,CAC/D,KACF,CAAC;QACH,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFnG,QAAQ,CAAC,yBAAyB,EAAE,MAAM;QACxCD,UAAU,CAAC,MAAM;UACfoF,yBAAyB,CAACR,EAAE,EAAEE,OAAO,CAAC;QACxC,CAAC,CAAC;QAEF3E,EAAE,CAAC,sCAAsC,EAAE,MAAM;UAC/CD,MAAM,CAAC8C,QAAQ,CAACe,wBAAwB,CAAC,CAACY,gBAAgB,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEFxE,EAAE,CAAC,yCAAyC,EAAE,YAAY;UACxD,MAAMkG,MAAM,GAAG7D,qBAAqB;UAEpC8D,wBAAwB,CAAC1B,EAAE,EAAE,GAAGyB,MAAM,EAAE,CAAC;UACzC,MAAMlD,eAAe,CAACoD,OAAO;UAC7BrG,MAAM,CAAC8C,QAAQ,CAACQ,QAAQ,CAAC,CAACmB,gBAAgB,CAAC,CAAC;UAC5CzE,MAAM,CAACgD,cAAc,CAAC,CAACsD,qBAAqB,CAAC;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,CAAC;QACJ,CAAC,CAAC;QAEFrG,EAAE,CAAC,0CAA0C,EAAE,YAAY;UACzD,MAAMkG,MAAM,GAAG7D,qBAAqB;UAEpCiE,4BAA4B,CAAC7B,EAAE,EAAE,GAAGyB,MAAM,EAAE,CAAC;UAC7C,MAAMlD,eAAe,CAACoD,OAAO;UAC7BrG,MAAM,CAAC8C,QAAQ,CAACQ,QAAQ,CAAC,CAACmB,gBAAgB,CAAC,CAAC;UAC5CzE,MAAM,CAACgD,cAAc,CAAC,CAACsD,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;QAEFvG,QAAQ,CAAC,yBAAyB,EAAE,YAAY;UAC9C,IAAIyG,YAAwB;UAC5B,IAAIZ,OAAyC;UAC7C9F,UAAU,CAAC,YAAY;YACrB0G,YAAY,GAAG,MAAM3D,MAAM,CAAC4D,SAAS,CACnC;cACEC,IAAI,EAAE,QAAQ;cACdC,OAAO,EAAE;YACX,CAAC,EACD;cACED,IAAI,EAAE,MAAM;cACZE,UAAU,EAAEtH,QAAQ,CAACqH;YACvB,CAAC,EACD7D,QAAQ,EACR,CAAC,YAAY,CACf,CAAC;YAED8C,OAAO,GAAG,MAAMd,uBAAuB,CAACJ,EAAE,CAAC;YAE3CQ,yBAAyB,CAACR,EAAE,EAAEkB,OAAO,CAAC;UACxC,CAAC,CAAC;UAEFhG,SAAS,CAAC,MAAM;YACd4G,YAAY,CAAC,CAAC;UAChB,CAAC,CAAC;UAEFvG,EAAE,CAAC,oCAAoC,EAAE,MAAM;YAC7CD,MAAM,CAAC4F,OAAO,CAACP,QAAQ,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAACC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/DvF,MAAM,CAAC4F,OAAO,CAACP,QAAQ,CAAC,CAAC,CAAC,CAACG,YAAY,CAAC,CAACD,OAAO,CAAC,EAAE,CAAC;UACtD,CAAC,CAAC;UAEFtF,EAAE,CAAC,kCAAkC,EAAE,MAAM;YAC3CD,MAAM,CAAC8C,QAAQ,CAACc,WAAW,CAAC,CAACY,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACrD,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF1E,QAAQ,CAAC,wBAAwB,EAAE,MAAM;UACvCD,UAAU,CAAC,MAAM;YACfiF,iBAAiB,CAACL,EAAE,EAAE,OAAO,CAAC;YAC9BO,gCAAgC,CAACP,EAAE,CAAC;UACtC,CAAC,CAAC;UAEF3E,QAAQ,CAAC,qCAAqC,EAAE,YAAY;YAC1DD,UAAU,CAAC,YAAY;cACrB,CAAC4E,EAAE,CAAC,GAAG,MAAM7D,OAAO,CAAC4E,GAAG,CAAC,CACvBC,0BAA0B,CAAC,CAAC;cAC5B;cACAxF,EAAE,CAACyF,wBAAwB,CAAC/C,uBAAuB,CAAC,CACrD,CAAC;cACFmC,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;YAEF3F,EAAE,CAAC,yBAAyB,EAAE,MAAM;cAClCD,MAAM,CAAC8C,QAAQ,CAACc,WAAW,CAAC,CAACwB,qBAAqB,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;QAEFnF,EAAE,CAAC,4CAA4C,EAAE,MAAM;UACrDD,MAAM,CAAC8B,eAAe,CAAC,CAAC0C,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAC9CzE,MAAM,CAAC8C,QAAQ,CAACc,WAAW,CAAC,CAACY,GAAG,CAACC,gBAAgB,CAAC,CAAC;UACnDzE,MAAM,CAAC8C,QAAQ,CAACQ,QAAQ,CAAC,CAACkB,GAAG,CAACC,gBAAgB,CAAC,CAAC;UAChDzE,MAAM,CAAC8C,QAAQ,CAACa,OAAO,CAAC,CAACa,GAAG,CAACC,gBAAgB,CAAC,CAAC;QACjD,CAAC,CAAC;QAEFxE,EAAE,CAAC,6BAA6B,EAAE,MAAM;UACtCD,MAAM,CAACM,qBAAqB,CAACyB,KAAK,EAAE,cAAc,CAAC,CAAC8E,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,EAAEzE,qBAAqB;IAChC,CAAC;EACH,CACF,CAAC;AACH;AAEA,SAAS8D,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;MACdhD,KAAK,EAAE,kBAAkB;MACzBD,MAAM,EAAE;QACN0D,SAAS,EAAE,UAAU;QACrBC,UAAU,EAAE;MACd;IACF,CAAC;EACH,CAKA,CAAC;AACH;AAEA,SAASb,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;EAC7D1E,MAAM,CAAC0E,EAAE,CAAC2C,mBAAmB,CAAC,CAACjC,qBAAqB,CAClDV,EAAE,CAAC4C,gBAAgB,CAACtF,IAAI,CAACgE,KAAK,CAACuB,MACjC,CAAC;AACH;AAEA,eAAezC,uBAAuBA,CACpCJ,EAAmB,EACnB8C,KAAa,GAAG,CAAC,EAC0B;EAC3C,OAAO,MAAMtH,EAAE,CAACuH,OAAO,CAAC,MAAM;IAC5BzH,MAAM,CAAC0E,EAAE,CAACS,IAAI,CAAC,CAACuC,eAAe,CAACF,KAAK,CAAC;IACtC,MAAMG,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACnD,EAAE,CAACS,IAAI,CAACnD,IAAI,CAAC8F,QAAQ,CAAE,CAAC,CAAC,CAACjB,QAAQ,CAAC,CAAC,CAAC;IAC/DnC,EAAE,CAACS,IAAI,CAAC4C,SAAS,CAAC,CAAC;IACnB,OAAOJ,MAAM;EACf,CAAC,CAAC;AACJ;AAEA,eAAe9C,2BAA2BA,CACxChC,MAAkC,EAClCC,QAAwB,EACyB;EACjD,MAAM,CAAC4B,EAAE,EAAEC,WAAW,CAAC,GAAG,MAAM9D,OAAO,CAAC4E,GAAG,CAAC,CAC1CC,0BAA0B,CAAC,CAAC,EAC5B7C,MAAM,CAAC4D,SAAS,CACd;IACEE,OAAO,EAAE,UAAU;IACnBD,IAAI,EAAE;EACR,CAAC,EACD;IACEA,IAAI,EAAE,MAAM;IACZE,UAAU,EAAEtH,QAAQ,CAACqH;EACvB,CAAC,EACD7D,QACF,CAAC,CACF,CAAC;;EAEF;EACAiC,iBAAiB,CAACL,EAAE,EAAE,MAAM,CAAC;EAE7B,OAAO,CAACA,EAAE,EAAEC,WAAW,CAAC;AAC1B;AAEA,eAAee,0BAA0BA,CAAA,EAA6B;EACpE1F,MAAM,CAAC8B,eAAe,CAAC,CAACsD,qBAAqB,CAAC,CAAC,CAAC;EAEhD,MAAMV,EAAE,GAAG,MAAMxE,EAAE,CAACuH,OAAO,CAAC,MAAM;IAChCzH,MAAM,CAAC8B,eAAe,CAAC,CAAC2C,gBAAgB,CAAC,CAAC;IAC1CzE,MAAM,CAAC8B,eAAe,CAACE,IAAI,CAACgG,OAAO,CAAC,CAAC,CAAC,CAACtB,IAAI,KAAK,QAAQ,CAAC;IACzD,OAAO5E,eAAe,CAACE,IAAI,CAACgG,OAAO,CAAC,CAAC,CAAC,CAACC,KAAK;EAC9C,CAAC,CAAC;EAEFjI,MAAM,CAAC8B,eAAe,CAAC,CAACsD,qBAAqB,CAAC,CAAC,CAAC;EAChDtD,eAAe,CAACiG,SAAS,CAAC,CAAC;EAC3B/H,MAAM,CAAC8B,eAAe,CAAC,CAACsD,qBAAqB,CAAC,CAAC,CAAC;EAEhD,OAAOV,EAAE;AACX;AAEA,SAAStC,8BAA8BA,CACrC8F,iBAA4B,EAC5B/E,MAAc,EACG;EACjB,IAAIgF,CAAC,GAAG,CAAC;EACT,MAAMC,GAAG,GAAGlI,EAAE,CAACqD,EAAE,CAAC,UAAS,GAAG8E,KAAY,EAAmB;IAC3D,MAAMC,aAAa,GAAGH,CAAC,EAAE;IACzBhF,MAAM,CAACoF,KAAK,CAAC,8BAA8B,CAAC;IAC5C,MAAMC,YAAY,GAAG,IAAIC,WAAW,CAAC,CAAC;IAEtC,OAAO;MACLnB,gBAAgB,EAAEpH,EAAE,CAACqD,EAAE,CACrBiF,YAAY,CAAClB,gBAAgB,CAACoB,IAAI,CAACF,YAAY,CACjD,CAAQ;MACRnB,mBAAmB,EAAEnH,EAAE,CAACqD,EAAE,CACxBiF,YAAY,CAACnB,mBAAmB,CAACqB,IAAI,CAACF,YAAY,CACpD,CAAQ;MAERrD,IAAI,EAAEjF,EAAE,CAACqD,EAAE,CAAE9B,CAAC,IAAc;QAC1B0B,MAAM,CAACoF,KAAK,CACV;UAAEI,OAAO,EAAEf,IAAI,CAACC,KAAK,CAACpG,CAAC,CAACoF,QAAQ,CAAC,CAAC,CAAC;UAAEyB;QAAc,CAAC,EACpD,eACF,CAAC;MACH,CAAC,CAAC;MACF5F,KAAK,EAAExC,EAAE,CAACqD,EAAE,CAAC,CAAC;MACdqF,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,SAASrD,iBAAiBA,CAACL,EAAmB,EAAEmE,UAA4B,EAAE;EAC5E,MAAMO,QAAQ,GAAGP,UAAU,KAAK,MAAM,GAClCnJ,iBAAiB,CAACuJ,IAAI,GACtBvJ,iBAAiB,CAACwJ,MAAM;EAE5B,IAAIE,QAAQ,KAAK1E,EAAE,CAACmE,UAAU,EAAE;EAEhCnE,EAAE,CAACmE,UAAU,GAAGO,QAAQ;EACxB1E,EAAE,CAACkE,aAAa,CAACS,aAAa,CAAC,IAAIC,KAAK,CAACT,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D;AAEA,SAASpG,oBAAoBA,CAACF,SAAsB,EAAEY,MAAc,EAAE;EACpE,MAAMhD,CAAC,GAAGA,CACRoJ,IAAY,EACZ;IAAEC,SAAS;IAAEC;EAAiD,CAAC,KAC5DtG,MAAM,CAACuG,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;IAC1BrH,SAAS,CAACuH,MAAM,CAACC,EAAE,CAACF,CAAC,EAA+B1J,CAAC,CAACuI,IAAI,CAACvH,SAAS,EAAE0I,CAAC,CAAC,CAAC;EAC3E;AACF;AAEA,MAAMG,gBAAgB,GAAG7J,CAAC,CAACsD,MAAM,CAAC;EAChCsD,EAAE,EAAE5G,CAAC,CAAC8J,MAAM,CAAC,CAAC;EACd5E,QAAQ,EAAElF,CAAC,CAAC+J,KAAK,CAAC/J,CAAC,CAACsD,MAAM,CAAC;IACzB0G,SAAS,EAAEhK,CAAC,CAACsD,MAAM,CAAC;MAAEsD,EAAE,EAAE5G,CAAC,CAAC8J,MAAM,CAAC;IAAE,CAAC,CAAC;IACvC3E,WAAW,EAAEnF,CAAC,CAAC+J,KAAK,CAAC/J,CAAC,CAAC8J,MAAM,CAAC,CAAC,CAAC;IAChCzE,YAAY,EAAErF,CAAC,CAAC+J,KAAK,CAAC/J,CAAC,CAAC8J,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,SAASxD,YAAYA,CAAIpC,EAAmB,EAAE8F,CAAI,EAAE;EAClD9F,EAAE,CAACkE,aAAa,CAACS,aAAa,CAAC,IAAIe,YAAY,CAACI,CAAC,CAAC,CAAC;AACrD","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","LegacyFauxFoundry","msw","startNodeApiServer","ImportedWebSocket","pDefer","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createClient","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","apiServer","testSetup","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","client","listener","oslwInst","updateReceived","listenerPromise","ontologyRid","logger","child","minimumReconnectDelayMs","onChange","fn","o","object","state","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","http","post","HttpResponse","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","__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 {\n Logger,\n ObjectSetSubscription,\n Osdk,\n PropertyKeys,\n} from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n StreamMessage,\n} from \"@osdk/foundry.ontologies\";\nimport {\n LegacyFauxFoundry,\n msw,\n type SetupServer,\n startNodeApiServer,\n} from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createClient } from \"../createClient.js\";\nimport { createMinimalClient } from \"../createMinimalClient.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 let apiServer: SetupServer;\n beforeAll(() => {\n const testSetup = startNodeApiServer(\n new LegacyFauxFoundry(STACK),\n createClient,\n );\n ({ apiServer } = testSetup);\n addLoggerToApiServer(testSetup.apiServer, rootLogger);\n return () => {\n testSetup.apiServer.close();\n };\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: {\n object: Osdk.Instance<Employee>;\n state: \"ADDED_OR_UPDATED\" | \"REMOVED\";\n } | 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 = { object: o.object, state: o.state };\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 msw.http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n msw.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 \"skillSet\",\n \"skillSetEmbedding\",\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(apiServer: SetupServer, 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":[]}
|
|
@@ -78,6 +78,25 @@ export function createObjectSet(objectType, clientCtx, objectSet = resolveBaseOb
|
|
|
78
78
|
objectSets: [objectSet, ...objectSets.map(os => objectSetDefinitions.get(os))]
|
|
79
79
|
});
|
|
80
80
|
},
|
|
81
|
+
nearestNeighbors: (query, numNeighbors, property) => {
|
|
82
|
+
const nearestNeighborsQuery = isTextQuery(query) ? {
|
|
83
|
+
"type": "text",
|
|
84
|
+
"value": query
|
|
85
|
+
} : {
|
|
86
|
+
"type": "vector",
|
|
87
|
+
"value": query
|
|
88
|
+
};
|
|
89
|
+
return clientCtx.objectSetFactory(objectType, clientCtx, {
|
|
90
|
+
type: "nearestNeighbors",
|
|
91
|
+
objectSet,
|
|
92
|
+
propertyIdentifier: {
|
|
93
|
+
type: "property",
|
|
94
|
+
apiName: property
|
|
95
|
+
},
|
|
96
|
+
numNeighbors,
|
|
97
|
+
query: nearestNeighborsQuery
|
|
98
|
+
});
|
|
99
|
+
},
|
|
81
100
|
asyncIter: async function* (args) {
|
|
82
101
|
let $nextPageToken = undefined;
|
|
83
102
|
do {
|
|
@@ -157,4 +176,7 @@ async function createWithPk(clientCtx, objectType, objectSet, primaryKey) {
|
|
|
157
176
|
};
|
|
158
177
|
return withPk;
|
|
159
178
|
}
|
|
179
|
+
function isTextQuery(query) {
|
|
180
|
+
return typeof query === "string";
|
|
181
|
+
}
|
|
160
182
|
//# sourceMappingURL=createObjectSet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createObjectSet.js","names":["createWithPropertiesObjectSet","modernToLegacyWhereClause","aggregate","fetchPageInternal","fetchPageWithErrorsInternal","fetchSingle","fetchSingleWithErrors","augmentRequestContext","resolveBaseObjectSetType","isWireObjectSet","ObjectSetListenerWebsocket","isObjectTypeDefinition","def","type","isObjectSet","o","objectSetDefinitions","get","getWireObjectSet","objectSet","WeakMap","createObjectSet","objectType","clientCtx","base","bind","globalThis","finalMethodCall","fetchPage","fetchPageWithErrors","where","clause","objectSetFactory","pivotTo","createSearchAround","union","objectSets","map","os","intersect","subtract","asyncIter","args","$nextPageToken","undefined","result","$pageSize","nextPageToken","obj","data","fetchOne","primaryKey","options","createWithPk","fetchOneWithErrors","subscribe","listener","opts","pendingSubscribe","getInstance","properties","unsubscribe","withProperties","definitionMap","Map","derivedProperties","key","Object","keys","derivedPropertyDefinition","$objectSetInternals","link","set","objDef","ontologyProvider","getObjectDefinition","apiName","withPk","field","primaryKeyApiName","value"],"sources":["createObjectSet.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AsyncIterArgs,\n Augments,\n FetchPageResult,\n LinkedType,\n LinkNames,\n NullabilityAdherence,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n Result,\n SelectArg,\n SingleOsdkResult,\n} from \"@osdk/api\";\nimport type { MinimalObjectSet } from \"@osdk/api/unstable\";\nimport type {\n DerivedPropertyDefinition,\n ObjectSet as WireObjectSet,\n} from \"@osdk/foundry.ontologies\";\nimport { createWithPropertiesObjectSet } from \"../derivedProperties/createWithPropertiesObjectSet.js\";\nimport { modernToLegacyWhereClause } from \"../internal/conversions/modernToLegacyWhereClause.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport { aggregate } from \"../object/aggregate.js\";\nimport {\n fetchPageInternal,\n fetchPageWithErrorsInternal,\n} from \"../object/fetchPage.js\";\nimport { fetchSingle, fetchSingleWithErrors } from \"../object/fetchSingle.js\";\nimport { augmentRequestContext } from \"../util/augmentRequestContext.js\";\nimport { resolveBaseObjectSetType } from \"../util/objectSetUtils.js\";\nimport { isWireObjectSet } from \"../util/WireObjectSet.js\";\nimport { ObjectSetListenerWebsocket } from \"./ObjectSetListenerWebsocket.js\";\n\nfunction isObjectTypeDefinition(\n def: ObjectOrInterfaceDefinition,\n): def is ObjectTypeDefinition {\n return def.type === \"object\";\n}\n\n/* @internal */\nexport function isObjectSet(o: any): o is ObjectSet<any> {\n return o != null && typeof o === \"object\"\n && isWireObjectSet(objectSetDefinitions.get(o));\n}\n\n/** @internal */\nexport function getWireObjectSet(\n objectSet: ObjectSet<any> | MinimalObjectSet<any>,\n): WireObjectSet {\n return objectSetDefinitions.get(objectSet)!;\n}\n\nconst objectSetDefinitions = new WeakMap<\n any,\n WireObjectSet\n>();\n\n/** @internal */\nexport function createObjectSet<Q extends ObjectOrInterfaceDefinition>(\n objectType: Q,\n clientCtx: MinimalClient,\n objectSet: WireObjectSet = resolveBaseObjectSetType(objectType),\n): ObjectSet<Q> {\n const base: ObjectSet<Q> = {\n aggregate: (aggregate<Q, any>).bind(\n globalThis,\n augmentRequestContext(clientCtx, _ => ({ finalMethodCall: \"aggregate\" })),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"aggregate\"],\n\n fetchPage: fetchPageInternal.bind(\n globalThis,\n augmentRequestContext(clientCtx, _ => ({ finalMethodCall: \"fetchPage\" })),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"fetchPage\"],\n\n fetchPageWithErrors: fetchPageWithErrorsInternal.bind(\n globalThis,\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchPageWithErrors\" }),\n ),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"fetchPageWithErrors\"],\n\n where: (clause) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"filter\",\n objectSet: objectSet,\n where: modernToLegacyWhereClause(clause, objectType),\n });\n },\n\n pivotTo: function<L extends LinkNames<Q>>(\n type: L,\n ): ObjectSet<LinkedType<Q, L>> {\n return createSearchAround(type)();\n },\n\n union: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"union\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n intersect: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"intersect\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n subtract: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"subtract\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n asyncIter: async function*<\n L extends PropertyKeys<Q>,\n R extends boolean,\n const A extends Augments,\n S extends NullabilityAdherence = NullabilityAdherence.Default,\n T extends boolean = false,\n >(\n args?: AsyncIterArgs<Q, L, R, A, S, T>,\n ): AsyncIterableIterator<SingleOsdkResult<Q, L, R, S, {}, T>> {\n let $nextPageToken: string | undefined = undefined;\n do {\n const result: FetchPageResult<\n Q,\n L,\n R,\n S,\n T\n > = await fetchPageInternal(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"asyncIter\" }),\n ),\n objectType,\n objectSet,\n { ...args, $pageSize: 10000, $nextPageToken },\n true,\n );\n $nextPageToken = result.nextPageToken;\n\n for (const obj of result.data) {\n yield obj as SingleOsdkResult<Q, L, R, S, {}, T>;\n }\n } while ($nextPageToken != null);\n },\n\n fetchOne: (isObjectTypeDefinition(objectType)\n ? async <A extends SelectArg<Q>>(\n primaryKey: PrimaryKeyType<Q>,\n options: A,\n ) => {\n return await fetchSingle(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchOne\" }),\n ),\n objectType,\n options,\n await createWithPk(\n clientCtx,\n objectType,\n objectSet,\n primaryKey,\n ),\n ) as Osdk<Q>;\n }\n : undefined) as ObjectSet<Q>[\"fetchOne\"],\n\n fetchOneWithErrors: (isObjectTypeDefinition(objectType)\n ? async <A extends SelectArg<Q>>(\n primaryKey: Q extends ObjectTypeDefinition ? PrimaryKeyType<Q>\n : never,\n options: A,\n ) => {\n return await fetchSingleWithErrors(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchOneWithErrors\" }),\n ),\n objectType,\n options,\n await createWithPk(\n clientCtx,\n objectType,\n objectSet,\n primaryKey,\n ),\n ) as Result<Osdk<Q>>;\n }\n : undefined) as ObjectSet<Q>[\"fetchOneWithErrors\"],\n\n subscribe: (\n listener,\n opts,\n ) => {\n const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(\n clientCtx,\n ).subscribe(\n objectType,\n objectSet,\n listener,\n opts?.properties,\n );\n\n return { unsubscribe: async () => (await pendingSubscribe)() };\n },\n\n withProperties: (clause) => {\n const definitionMap = new Map<any, DerivedPropertyDefinition>();\n\n const derivedProperties: Record<string, DerivedPropertyDefinition> = {};\n for (const key of Object.keys(clause)) {\n const derivedPropertyDefinition = clause\n [key](createWithPropertiesObjectSet(\n objectType,\n { type: \"methodInput\" },\n definitionMap,\n true,\n ));\n derivedProperties[key] = definitionMap.get(\n derivedPropertyDefinition,\n )!;\n }\n\n return clientCtx.objectSetFactory(\n objectType,\n clientCtx,\n {\n type: \"withProperties\",\n derivedProperties: derivedProperties,\n objectSet: objectSet,\n },\n );\n },\n\n $objectSetInternals: {\n def: objectType,\n },\n };\n\n function createSearchAround<L extends LinkNames<Q>>(link: L) {\n return () => {\n return clientCtx.objectSetFactory(\n objectType,\n clientCtx,\n {\n type: \"searchAround\",\n objectSet,\n link,\n },\n );\n };\n }\n\n objectSetDefinitions.set(base, objectSet);\n\n // we are using a type assertion because the marker symbol defined in BaseObjectSet isn't actually used\n // at runtime.\n return base as ObjectSet<Q>;\n}\n\nasync function createWithPk(\n clientCtx: MinimalClient,\n objectType: ObjectTypeDefinition,\n objectSet: WireObjectSet,\n primaryKey: PrimaryKeyType<ObjectTypeDefinition>,\n) {\n const objDef = await clientCtx.ontologyProvider.getObjectDefinition(\n objectType.apiName,\n );\n\n const withPk: WireObjectSet = {\n type: \"filter\",\n objectSet: objectSet,\n where: {\n type: \"eq\",\n field: objDef.primaryKeyApiName,\n value: primaryKey,\n },\n };\n return withPk;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAwBA,SAASA,6BAA6B,QAAQ,uDAAuD;AACrG,SAASC,yBAAyB,QAAQ,sDAAsD;AAEhG,SAASC,SAAS,QAAQ,wBAAwB;AAClD,SACEC,iBAAiB,EACjBC,2BAA2B,QACtB,wBAAwB;AAC/B,SAASC,WAAW,EAAEC,qBAAqB,QAAQ,0BAA0B;AAC7E,SAASC,qBAAqB,QAAQ,kCAAkC;AACxE,SAASC,wBAAwB,QAAQ,2BAA2B;AACpE,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,0BAA0B,QAAQ,iCAAiC;AAE5E,SAASC,sBAAsBA,CAC7BC,GAAgC,EACH;EAC7B,OAAOA,GAAG,CAACC,IAAI,KAAK,QAAQ;AAC9B;;AAEA;AACA,OAAO,SAASC,WAAWA,CAACC,CAAM,EAAuB;EACvD,OAAOA,CAAC,IAAI,IAAI,IAAI,OAAOA,CAAC,KAAK,QAAQ,IACpCN,eAAe,CAACO,oBAAoB,CAACC,GAAG,CAACF,CAAC,CAAC,CAAC;AACnD;;AAEA;AACA,OAAO,SAASG,gBAAgBA,CAC9BC,SAAiD,EAClC;EACf,OAAOH,oBAAoB,CAACC,GAAG,CAACE,SAAS,CAAC;AAC5C;AAEA,MAAMH,oBAAoB,GAAG,IAAII,OAAO,CAGtC,CAAC;;AAEH;AACA,OAAO,SAASC,eAAeA,CAC7BC,UAAa,EACbC,SAAwB,EACxBJ,SAAwB,GAAGX,wBAAwB,CAACc,UAAU,CAAC,EACjD;EACd,MAAME,IAAkB,GAAG;IACzBtB,SAAS,EAAGA,SAAS,CAAUuB,IAAI,CACjCC,UAAU,EACVnB,qBAAqB,CAACgB,SAAS,EAAE,OAAM;MAAEI,eAAe,EAAE;IAAY,CAAC,CAAC,CAAC,EACzEL,UAAU,EACVH,SACF,CAA8B;IAE9BS,SAAS,EAAEzB,iBAAiB,CAACsB,IAAI,CAC/BC,UAAU,EACVnB,qBAAqB,CAACgB,SAAS,EAAE,OAAM;MAAEI,eAAe,EAAE;IAAY,CAAC,CAAC,CAAC,EACzEL,UAAU,EACVH,SACF,CAA8B;IAE9BU,mBAAmB,EAAEzB,2BAA2B,CAACqB,IAAI,CACnDC,UAAU,EACVnB,qBAAqB,CACnBgB,SAAS,EACT,OAAM;MAAEI,eAAe,EAAE;IAAsB,CAAC,CAClD,CAAC,EACDL,UAAU,EACVH,SACF,CAAwC;IAExCW,KAAK,EAAGC,MAAM,IAAK;MACjB,OAAOR,SAAS,CAACS,gBAAgB,CAACV,UAAU,EAAEC,SAAS,EAAE;QACvDV,IAAI,EAAE,QAAQ;QACdM,SAAS,EAAEA,SAAS;QACpBW,KAAK,EAAE7B,yBAAyB,CAAC8B,MAAM,EAAET,UAAU;MACrD,CAAC,CAAC;IACJ,CAAC;IAEDW,OAAO,EAAE,SAAAA,CACPpB,IAAO,EACsB;MAC7B,OAAOqB,kBAAkB,CAACrB,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAEDsB,KAAK,EAAEA,CAAC,GAAGC,UAAU,KAAK;MACxB,OAAOb,SAAS,CAACS,gBAAgB,CAACV,UAAU,EAAEC,SAAS,EAAE;QACvDV,IAAI,EAAE,OAAO;QACbuB,UAAU,EAAE,CACVjB,SAAS,EACT,GAAGiB,UAAU,CAACC,GAAG,CAACC,EAAE,IAAItB,oBAAoB,CAACC,GAAG,CAACqB,EAAE,CAAE,CAAC;MAE1D,CAAC,CAAC;IACJ,CAAC;IAEDC,SAAS,EAAEA,CAAC,GAAGH,UAAU,KAAK;MAC5B,OAAOb,SAAS,CAACS,gBAAgB,CAACV,UAAU,EAAEC,SAAS,EAAE;QACvDV,IAAI,EAAE,WAAW;QACjBuB,UAAU,EAAE,CACVjB,SAAS,EACT,GAAGiB,UAAU,CAACC,GAAG,CAACC,EAAE,IAAItB,oBAAoB,CAACC,GAAG,CAACqB,EAAE,CAAE,CAAC;MAE1D,CAAC,CAAC;IACJ,CAAC;IAEDE,QAAQ,EAAEA,CAAC,GAAGJ,UAAU,KAAK;MAC3B,OAAOb,SAAS,CAACS,gBAAgB,CAACV,UAAU,EAAEC,SAAS,EAAE;QACvDV,IAAI,EAAE,UAAU;QAChBuB,UAAU,EAAE,CACVjB,SAAS,EACT,GAAGiB,UAAU,CAACC,GAAG,CAACC,EAAE,IAAItB,oBAAoB,CAACC,GAAG,CAACqB,EAAE,CAAE,CAAC;MAE1D,CAAC,CAAC;IACJ,CAAC;IAEDG,SAAS,EAAE,gBAAAA,CAOTC,IAAsC,EACsB;MAC5D,IAAIC,cAAkC,GAAGC,SAAS;MAClD,GAAG;QACD,MAAMC,MAML,GAAG,MAAM1C,iBAAiB,CACzBI,qBAAqB,CACnBgB,SAAS,EACT,OAAM;UAAEI,eAAe,EAAE;QAAY,CAAC,CACxC,CAAC,EACDL,UAAU,EACVH,SAAS,EACT;UAAE,GAAGuB,IAAI;UAAEI,SAAS,EAAE,KAAK;UAAEH;QAAe,CAAC,EAC7C,IACF,CAAC;QACDA,cAAc,GAAGE,MAAM,CAACE,aAAa;QAErC,KAAK,MAAMC,GAAG,IAAIH,MAAM,CAACI,IAAI,EAAE;UAC7B,MAAMD,GAA0C;QAClD;MACF,CAAC,QAAQL,cAAc,IAAI,IAAI;IACjC,CAAC;IAEDO,QAAQ,EAAGvC,sBAAsB,CAACW,UAAU,CAAC,GACzC,OACA6B,UAA6B,EAC7BC,OAAU,KACP;MACH,OAAO,MAAM/C,WAAW,CACtBE,qBAAqB,CACnBgB,SAAS,EACT,OAAM;QAAEI,eAAe,EAAE;MAAW,CAAC,CACvC,CAAC,EACDL,UAAU,EACV8B,OAAO,EACP,MAAMC,YAAY,CAChB9B,SAAS,EACTD,UAAU,EACVH,SAAS,EACTgC,UACF,CACF,CAAC;IACH,CAAC,GACCP,SAAsC;IAE1CU,kBAAkB,EAAG3C,sBAAsB,CAACW,UAAU,CAAC,GACnD,OACA6B,UACS,EACTC,OAAU,KACP;MACH,OAAO,MAAM9C,qBAAqB,CAChCC,qBAAqB,CACnBgB,SAAS,EACT,OAAM;QAAEI,eAAe,EAAE;MAAqB,CAAC,CACjD,CAAC,EACDL,UAAU,EACV8B,OAAO,EACP,MAAMC,YAAY,CAChB9B,SAAS,EACTD,UAAU,EACVH,SAAS,EACTgC,UACF,CACF,CAAC;IACH,CAAC,GACCP,SAAgD;IAEpDW,SAAS,EAAEA,CACTC,QAAQ,EACRC,IAAI,KACD;MACH,MAAMC,gBAAgB,GAAGhD,0BAA0B,CAACiD,WAAW,CAC7DpC,SACF,CAAC,CAACgC,SAAS,CACTjC,UAAU,EACVH,SAAS,EACTqC,QAAQ,EACRC,IAAI,EAAEG,UACR,CAAC;MAED,OAAO;QAAEC,WAAW,EAAE,MAAAA,CAAA,KAAY,CAAC,MAAMH,gBAAgB,EAAE;MAAE,CAAC;IAChE,CAAC;IAEDI,cAAc,EAAG/B,MAAM,IAAK;MAC1B,MAAMgC,aAAa,GAAG,IAAIC,GAAG,CAAiC,CAAC;MAE/D,MAAMC,iBAA4D,GAAG,CAAC,CAAC;MACvE,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACrC,MAAM,CAAC,EAAE;QACrC,MAAMsC,yBAAyB,GAAGtC,MAAM,CACrCmC,GAAG,CAAC,CAAClE,6BAA6B,CACjCsB,UAAU,EACV;UAAET,IAAI,EAAE;QAAc,CAAC,EACvBkD,aAAa,EACb,IACF,CAAC,CAAC;QACJE,iBAAiB,CAACC,GAAG,CAAC,GAAGH,aAAa,CAAC9C,GAAG,CACxCoD,yBACF,CAAE;MACJ;MAEA,OAAO9C,SAAS,CAACS,gBAAgB,CAC/BV,UAAU,EACVC,SAAS,EACT;QACEV,IAAI,EAAE,gBAAgB;QACtBoD,iBAAiB,EAAEA,iBAAiB;QACpC9C,SAAS,EAAEA;MACb,CACF,CAAC;IACH,CAAC;IAEDmD,mBAAmB,EAAE;MACnB1D,GAAG,EAAEU;IACP;EACF,CAAC;EAED,SAASY,kBAAkBA,CAAyBqC,IAAO,EAAE;IAC3D,OAAO,MAAM;MACX,OAAOhD,SAAS,CAACS,gBAAgB,CAC/BV,UAAU,EACVC,SAAS,EACT;QACEV,IAAI,EAAE,cAAc;QACpBM,SAAS;QACToD;MACF,CACF,CAAC;IACH,CAAC;EACH;EAEAvD,oBAAoB,CAACwD,GAAG,CAAChD,IAAI,EAAEL,SAAS,CAAC;;EAEzC;EACA;EACA,OAAOK,IAAI;AACb;AAEA,eAAe6B,YAAYA,CACzB9B,SAAwB,EACxBD,UAAgC,EAChCH,SAAwB,EACxBgC,UAAgD,EAChD;EACA,MAAMsB,MAAM,GAAG,MAAMlD,SAAS,CAACmD,gBAAgB,CAACC,mBAAmB,CACjErD,UAAU,CAACsD,OACb,CAAC;EAED,MAAMC,MAAqB,GAAG;IAC5BhE,IAAI,EAAE,QAAQ;IACdM,SAAS,EAAEA,SAAS;IACpBW,KAAK,EAAE;MACLjB,IAAI,EAAE,IAAI;MACViE,KAAK,EAAEL,MAAM,CAACM,iBAAiB;MAC/BC,KAAK,EAAE7B;IACT;EACF,CAAC;EACD,OAAO0B,MAAM;AACf","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createObjectSet.js","names":["createWithPropertiesObjectSet","modernToLegacyWhereClause","aggregate","fetchPageInternal","fetchPageWithErrorsInternal","fetchSingle","fetchSingleWithErrors","augmentRequestContext","resolveBaseObjectSetType","isWireObjectSet","ObjectSetListenerWebsocket","isObjectTypeDefinition","def","type","isObjectSet","o","objectSetDefinitions","get","getWireObjectSet","objectSet","WeakMap","createObjectSet","objectType","clientCtx","base","bind","globalThis","finalMethodCall","fetchPage","fetchPageWithErrors","where","clause","objectSetFactory","pivotTo","createSearchAround","union","objectSets","map","os","intersect","subtract","nearestNeighbors","query","numNeighbors","property","nearestNeighborsQuery","isTextQuery","propertyIdentifier","apiName","asyncIter","args","$nextPageToken","undefined","result","$pageSize","nextPageToken","obj","data","fetchOne","primaryKey","options","createWithPk","fetchOneWithErrors","subscribe","listener","opts","pendingSubscribe","getInstance","properties","unsubscribe","withProperties","definitionMap","Map","derivedProperties","key","Object","keys","derivedPropertyDefinition","$objectSetInternals","link","set","objDef","ontologyProvider","getObjectDefinition","withPk","field","primaryKeyApiName","value"],"sources":["createObjectSet.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AsyncIterArgs,\n Augments,\n FetchPageResult,\n LinkedType,\n LinkNames,\n NullabilityAdherence,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n Result,\n SelectArg,\n SingleOsdkResult,\n} from \"@osdk/api\";\nimport type { MinimalObjectSet } from \"@osdk/api/unstable\";\nimport type {\n DerivedPropertyDefinition,\n ObjectSet as WireObjectSet,\n PropertyApiName,\n} from \"@osdk/foundry.ontologies\";\nimport { createWithPropertiesObjectSet } from \"../derivedProperties/createWithPropertiesObjectSet.js\";\nimport { modernToLegacyWhereClause } from \"../internal/conversions/modernToLegacyWhereClause.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport { aggregate } from \"../object/aggregate.js\";\nimport {\n fetchPageInternal,\n fetchPageWithErrorsInternal,\n} from \"../object/fetchPage.js\";\nimport { fetchSingle, fetchSingleWithErrors } from \"../object/fetchSingle.js\";\nimport { augmentRequestContext } from \"../util/augmentRequestContext.js\";\nimport { resolveBaseObjectSetType } from \"../util/objectSetUtils.js\";\nimport { isWireObjectSet } from \"../util/WireObjectSet.js\";\nimport { ObjectSetListenerWebsocket } from \"./ObjectSetListenerWebsocket.js\";\n\nfunction isObjectTypeDefinition(\n def: ObjectOrInterfaceDefinition,\n): def is ObjectTypeDefinition {\n return def.type === \"object\";\n}\n\n/* @internal */\nexport function isObjectSet(o: any): o is ObjectSet<any> {\n return o != null && typeof o === \"object\"\n && isWireObjectSet(objectSetDefinitions.get(o));\n}\n\n/** @internal */\nexport function getWireObjectSet(\n objectSet: ObjectSet<any> | MinimalObjectSet<any>,\n): WireObjectSet {\n return objectSetDefinitions.get(objectSet)!;\n}\n\nconst objectSetDefinitions = new WeakMap<\n any,\n WireObjectSet\n>();\n\n/** @internal */\nexport function createObjectSet<Q extends ObjectOrInterfaceDefinition>(\n objectType: Q,\n clientCtx: MinimalClient,\n objectSet: WireObjectSet = resolveBaseObjectSetType(objectType),\n): ObjectSet<Q> {\n const base: ObjectSet<Q> = {\n aggregate: (aggregate<Q, any>).bind(\n globalThis,\n augmentRequestContext(clientCtx, _ => ({ finalMethodCall: \"aggregate\" })),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"aggregate\"],\n\n fetchPage: fetchPageInternal.bind(\n globalThis,\n augmentRequestContext(clientCtx, _ => ({ finalMethodCall: \"fetchPage\" })),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"fetchPage\"],\n\n fetchPageWithErrors: fetchPageWithErrorsInternal.bind(\n globalThis,\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchPageWithErrors\" }),\n ),\n objectType,\n objectSet,\n ) as ObjectSet<Q>[\"fetchPageWithErrors\"],\n\n where: (clause) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"filter\",\n objectSet: objectSet,\n where: modernToLegacyWhereClause(clause, objectType),\n });\n },\n\n pivotTo: function<L extends LinkNames<Q>>(\n type: L,\n ): ObjectSet<LinkedType<Q, L>> {\n return createSearchAround(type)();\n },\n\n union: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"union\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n intersect: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"intersect\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n subtract: (...objectSets) => {\n return clientCtx.objectSetFactory(objectType, clientCtx, {\n type: \"subtract\",\n objectSets: [\n objectSet,\n ...objectSets.map(os => objectSetDefinitions.get(os)!),\n ],\n });\n },\n\n nearestNeighbors: (query, numNeighbors, property) => {\n const nearestNeighborsQuery = isTextQuery(query)\n ? { \"type\": \"text\" as const, \"value\": query }\n : { \"type\": \"vector\" as const, \"value\": query };\n return clientCtx.objectSetFactory(\n objectType,\n clientCtx,\n {\n type: \"nearestNeighbors\",\n objectSet,\n propertyIdentifier: {\n type: \"property\",\n apiName: property as PropertyApiName,\n },\n numNeighbors,\n query: nearestNeighborsQuery,\n },\n ) as ObjectSet<Q>;\n },\n\n asyncIter: async function*<\n L extends PropertyKeys<Q>,\n R extends boolean,\n const A extends Augments,\n S extends NullabilityAdherence = NullabilityAdherence.Default,\n T extends boolean = false,\n >(\n args?: AsyncIterArgs<Q, L, R, A, S, T>,\n ): AsyncIterableIterator<SingleOsdkResult<Q, L, R, S, {}, T>> {\n let $nextPageToken: string | undefined = undefined;\n do {\n const result: FetchPageResult<\n Q,\n L,\n R,\n S,\n T\n > = await fetchPageInternal(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"asyncIter\" }),\n ),\n objectType,\n objectSet,\n { ...args, $pageSize: 10000, $nextPageToken },\n true,\n );\n $nextPageToken = result.nextPageToken;\n\n for (const obj of result.data) {\n yield obj as SingleOsdkResult<Q, L, R, S, {}, T>;\n }\n } while ($nextPageToken != null);\n },\n\n fetchOne: (isObjectTypeDefinition(objectType)\n ? async <A extends SelectArg<Q>>(\n primaryKey: PrimaryKeyType<Q>,\n options: A,\n ) => {\n return await fetchSingle(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchOne\" }),\n ),\n objectType,\n options,\n await createWithPk(\n clientCtx,\n objectType,\n objectSet,\n primaryKey,\n ),\n ) as Osdk<Q>;\n }\n : undefined) as ObjectSet<Q>[\"fetchOne\"],\n\n fetchOneWithErrors: (isObjectTypeDefinition(objectType)\n ? async <A extends SelectArg<Q>>(\n primaryKey: Q extends ObjectTypeDefinition ? PrimaryKeyType<Q>\n : never,\n options: A,\n ) => {\n return await fetchSingleWithErrors(\n augmentRequestContext(\n clientCtx,\n _ => ({ finalMethodCall: \"fetchOneWithErrors\" }),\n ),\n objectType,\n options,\n await createWithPk(\n clientCtx,\n objectType,\n objectSet,\n primaryKey,\n ),\n ) as Result<Osdk<Q>>;\n }\n : undefined) as ObjectSet<Q>[\"fetchOneWithErrors\"],\n\n subscribe: (\n listener,\n opts,\n ) => {\n const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(\n clientCtx,\n ).subscribe(\n objectType,\n objectSet,\n listener,\n opts?.properties,\n );\n\n return { unsubscribe: async () => (await pendingSubscribe)() };\n },\n\n withProperties: (clause) => {\n const definitionMap = new Map<any, DerivedPropertyDefinition>();\n\n const derivedProperties: Record<string, DerivedPropertyDefinition> = {};\n for (const key of Object.keys(clause)) {\n const derivedPropertyDefinition = clause\n [key](createWithPropertiesObjectSet(\n objectType,\n { type: \"methodInput\" },\n definitionMap,\n true,\n ));\n derivedProperties[key] = definitionMap.get(\n derivedPropertyDefinition,\n )!;\n }\n\n return clientCtx.objectSetFactory(\n objectType,\n clientCtx,\n {\n type: \"withProperties\",\n derivedProperties: derivedProperties,\n objectSet: objectSet,\n },\n );\n },\n\n $objectSetInternals: {\n def: objectType,\n },\n };\n\n function createSearchAround<L extends LinkNames<Q>>(link: L) {\n return () => {\n return clientCtx.objectSetFactory(\n objectType,\n clientCtx,\n {\n type: \"searchAround\",\n objectSet,\n link,\n },\n );\n };\n }\n\n objectSetDefinitions.set(base, objectSet);\n\n // we are using a type assertion because the marker symbol defined in BaseObjectSet isn't actually used\n // at runtime.\n return base as ObjectSet<Q>;\n}\n\nasync function createWithPk(\n clientCtx: MinimalClient,\n objectType: ObjectTypeDefinition,\n objectSet: WireObjectSet,\n primaryKey: PrimaryKeyType<ObjectTypeDefinition>,\n) {\n const objDef = await clientCtx.ontologyProvider.getObjectDefinition(\n objectType.apiName,\n );\n\n const withPk: WireObjectSet = {\n type: \"filter\",\n objectSet: objectSet,\n where: {\n type: \"eq\",\n field: objDef.primaryKeyApiName,\n value: primaryKey,\n },\n };\n return withPk;\n}\n\nfunction isTextQuery(query: string | number[]): query is string {\n return typeof query === \"string\";\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableClient.js","names":["createFetchHeaderMutator","additionalContext","createClientFromContext","OBSERVABLE_USER_AGENT","ObservableClientImpl","Store","ObservableClient","createObservableClient","client","tweakedClient","fetch","headers","set","get","filter","x","length","join"],"sources":["ObservableClient.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 InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport { createFetchHeaderMutator } from \"@osdk/shared.net.fetch\";\nimport type { ActionSignatureFromDef } from \"../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../Client.js\";\nimport { createClientFromContext } from \"../createClient.js\";\nimport { OBSERVABLE_USER_AGENT } from \"../util/UserAgent.js\";\nimport type { Canonical } from \"./internal/Canonical.js\";\nimport { ObservableClientImpl } from \"./internal/ObservableClientImpl.js\";\nimport { Store } from \"./internal/Store.js\";\nimport type { OptimisticBuilder } from \"./OptimisticBuilder.js\";\n\nexport type Status = \"init\" | \"loading\" | \"loaded\" | \"error\";\n\nexport interface Observer<T> {\n next: (value: T) => void;\n error: (err: any) => void;\n complete: () => void;\n}\n\nexport namespace ObservableClient {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nexport interface CommonObserveOptions {\n dedupeInterval?: number;\n}\n\nexport interface ObserveOptions {\n mode?: \"offline\" | \"force\";\n}\n\nexport interface ObserveObjectOptions<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n> extends ObserveOptions {\n select?: PropertyKeys<T>[];\n}\n\nexport type OrderBy<Q extends ObjectTypeDefinition | InterfaceDefinition> = {\n [K in PropertyKeys<Q>]?: \"asc\" | \"desc\" | undefined;\n};\n\nexport interface ObserveListOptions<\n Q extends ObjectTypeDefinition | InterfaceDefinition,\n> extends CommonObserveOptions, ObserveOptions {\n type: Pick<Q, \"apiName\" | \"type\">;\n where?: WhereClause<Q>;\n pageSize?: number;\n orderBy?: OrderBy<Q>;\n invalidationMode?: \"in-place\" | \"wait\" | \"reset\";\n expectedLength?: number;\n streamUpdates?: boolean;\n}\n\nexport interface ObserveObjectArgs<T extends ObjectTypeDefinition> {\n object: Osdk.Instance<T> | undefined;\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n}\n\nexport interface ObserveObjectsArgs<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n> {\n resolvedList: Array<Osdk.Instance<T>>;\n isOptimistic: boolean;\n lastUpdated: number;\n fetchMore: () => Promise<unknown>;\n hasMore: boolean;\n status: Status;\n}\n\nexport interface ObservableClient {\n observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveOptions,\n subFn: Observer<ObserveObjectArgs<T>>,\n ): Unsubscribable;\n\n observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\n ): Unsubscribable;\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<unknown>;\n\n canonicalizeWhereClause: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ) => Canonical<WhereClause<T>>;\n}\n\nexport function createObservableClient(client: Client): ObservableClient {\n // First we need a modified client that adds an extra header so we know its\n // an observable client\n const tweakedClient = createClientFromContext({\n ...client[additionalContext],\n\n fetch: createFetchHeaderMutator(\n client[additionalContext].fetch,\n (headers) => {\n headers.set(\n \"Fetch-User-Agent\",\n [\n headers.get(\"Fetch-User-Agent\"),\n OBSERVABLE_USER_AGENT,\n ].filter(x => x && x?.length > 0).join(\" \"),\n );\n return headers;\n },\n ),\n });\n\n // Then we use that client instead. Because the `client` does not hold\n // any real state, this whole thing works.\n return new ObservableClientImpl(new Store(tweakedClient));\n}\n\nexport interface Unsubscribable {\n unsubscribe: () => void;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"file":"ObservableClient.js","names":["createFetchHeaderMutator","additionalContext","createClientFromContext","OBSERVABLE_USER_AGENT","ObservableClientImpl","Store","ObservableClient","createObservableClient","client","tweakedClient","fetch","headers","set","get","filter","x","length","join"],"sources":["ObservableClient.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 ActionValidationResponse,\n InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n WhereClause,\n} from \"@osdk/api\";\nimport { createFetchHeaderMutator } from \"@osdk/shared.net.fetch\";\nimport type { ActionSignatureFromDef } from \"../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../Client.js\";\nimport { createClientFromContext } from \"../createClient.js\";\nimport { OBSERVABLE_USER_AGENT } from \"../util/UserAgent.js\";\nimport type { Canonical } from \"./internal/Canonical.js\";\nimport { ObservableClientImpl } from \"./internal/ObservableClientImpl.js\";\nimport { Store } from \"./internal/Store.js\";\nimport type { OptimisticBuilder } from \"./OptimisticBuilder.js\";\n\nexport type Status = \"init\" | \"loading\" | \"loaded\" | \"error\";\n\nexport interface Observer<T> {\n next: (value: T) => void;\n error: (err: any) => void;\n complete: () => void;\n}\n\nexport namespace ObservableClient {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nexport interface CommonObserveOptions {\n dedupeInterval?: number;\n}\n\nexport interface ObserveOptions {\n mode?: \"offline\" | \"force\";\n}\n\nexport interface ObserveObjectOptions<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n> extends ObserveOptions {\n select?: PropertyKeys<T>[];\n}\n\nexport type OrderBy<Q extends ObjectTypeDefinition | InterfaceDefinition> = {\n [K in PropertyKeys<Q>]?: \"asc\" | \"desc\" | undefined;\n};\n\nexport interface ObserveListOptions<\n Q extends ObjectTypeDefinition | InterfaceDefinition,\n> extends CommonObserveOptions, ObserveOptions {\n type: Pick<Q, \"apiName\" | \"type\">;\n where?: WhereClause<Q>;\n pageSize?: number;\n orderBy?: OrderBy<Q>;\n invalidationMode?: \"in-place\" | \"wait\" | \"reset\";\n expectedLength?: number;\n streamUpdates?: boolean;\n}\n\nexport interface ObserveObjectArgs<T extends ObjectTypeDefinition> {\n object: Osdk.Instance<T> | undefined;\n isOptimistic: boolean;\n status: Status;\n lastUpdated: number;\n}\n\nexport interface ObserveObjectsArgs<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n> {\n resolvedList: Array<Osdk.Instance<T>>;\n isOptimistic: boolean;\n lastUpdated: number;\n fetchMore: () => Promise<unknown>;\n hasMore: boolean;\n status: Status;\n}\n\nexport interface ObservableClient {\n observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveOptions,\n subFn: Observer<ObserveObjectArgs<T>>,\n ): Unsubscribable;\n\n observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\n ): Unsubscribable;\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<unknown>;\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n canonicalizeWhereClause: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ) => Canonical<WhereClause<T>>;\n}\n\nexport function createObservableClient(client: Client): ObservableClient {\n // First we need a modified client that adds an extra header so we know its\n // an observable client\n const tweakedClient = createClientFromContext({\n ...client[additionalContext],\n\n fetch: createFetchHeaderMutator(\n client[additionalContext].fetch,\n (headers) => {\n headers.set(\n \"Fetch-User-Agent\",\n [\n headers.get(\"Fetch-User-Agent\"),\n OBSERVABLE_USER_AGENT,\n ].filter(x => x && x?.length > 0).join(\" \"),\n );\n return headers;\n },\n ),\n });\n\n // Then we use that client instead. Because the `client` does not hold\n // any real state, this whole thing works.\n return new ObservableClientImpl(new Store(tweakedClient));\n}\n\nexport interface Unsubscribable {\n unsubscribe: () => void;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,SAASA,wBAAwB,QAAQ,wBAAwB;AAEjE,SAASC,iBAAiB,QAAqB,cAAc;AAC7D,SAASC,uBAAuB,QAAQ,oBAAoB;AAC5D,SAASC,qBAAqB,QAAQ,sBAAsB;AAE5D,SAASC,oBAAoB,QAAQ,oCAAoC;AACzE,SAASC,KAAK,QAAQ,qBAAqB;AAAC,WAW3BC,gBAAgB;AAuFjC,OAAO,SAASC,sBAAsBA,CAACC,MAAc,EAAoB;EACvE;EACA;EACA,MAAMC,aAAa,GAAGP,uBAAuB,CAAC;IAC5C,GAAGM,MAAM,CAACP,iBAAiB,CAAC;IAE5BS,KAAK,EAAEV,wBAAwB,CAC7BQ,MAAM,CAACP,iBAAiB,CAAC,CAACS,KAAK,EAC9BC,OAAO,IAAK;MACXA,OAAO,CAACC,GAAG,CACT,kBAAkB,EAClB,CACED,OAAO,CAACE,GAAG,CAAC,kBAAkB,CAAC,EAC/BV,qBAAqB,CACtB,CAACW,MAAM,CAACC,CAAC,IAAIA,CAAC,IAAIA,CAAC,EAAEC,MAAM,GAAG,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAC5C,CAAC;MACD,OAAON,OAAO;IAChB,CACF;EACF,CAAC,CAAC;;EAEF;EACA;EACA,OAAO,IAAIP,oBAAoB,CAAC,IAAIC,KAAK,CAACI,aAAa,CAAC,CAAC;AAC3D","ignoreList":[]}
|
|
@@ -23,6 +23,7 @@ export class ObservableClientImpl {
|
|
|
23
23
|
this.observeObject = store.observeObject.bind(store);
|
|
24
24
|
this.observeList = store.observeList.bind(store);
|
|
25
25
|
this.applyAction = store.applyAction.bind(store);
|
|
26
|
+
this.validateAction = store.validateAction.bind(store);
|
|
26
27
|
this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(store);
|
|
27
28
|
}
|
|
28
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableClientImpl.js","names":["ObservableClientImpl","constructor","store","__experimentalStore","observeObject","bind","observeList","applyAction","canonicalizeWhereClause"],"sources":["ObservableClientImpl.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 InterfaceDefinition,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type {\n ObservableClient,\n ObserveListOptions,\n ObserveObjectArgs,\n ObserveObjectOptions,\n ObserveObjectsArgs,\n Observer,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { Store } from \"./Store.js\";\n\n/**\n * @internal\n */\nexport class ObservableClientImpl implements ObservableClient {\n __experimentalStore: Store;\n\n constructor(store: Store) {\n this.__experimentalStore = store;\n\n this.observeObject = store.observeObject.bind(\n store,\n ) as typeof this.observeObject;\n this.observeList = store.observeList.bind(store) as typeof this.observeList;\n this.applyAction = store.applyAction.bind(store);\n this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(\n store,\n ) as typeof this.canonicalizeWhereClause;\n }\n\n public observeObject: <T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObserveObjectArgs<T>>,\n ) => Unsubscribable;\n\n public observeList: <T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\n ) => Unsubscribable;\n\n public applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<unknown>;\n\n public canonicalizeWhereClause: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ) => Canonical<WhereClause<T>>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"file":"ObservableClientImpl.js","names":["ObservableClientImpl","constructor","store","__experimentalStore","observeObject","bind","observeList","applyAction","validateAction","canonicalizeWhereClause"],"sources":["ObservableClientImpl.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 ActionValidationResponse,\n InterfaceDefinition,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type {\n ObservableClient,\n ObserveListOptions,\n ObserveObjectArgs,\n ObserveObjectOptions,\n ObserveObjectsArgs,\n Observer,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { Store } from \"./Store.js\";\n\n/**\n * @internal\n */\nexport class ObservableClientImpl implements ObservableClient {\n __experimentalStore: Store;\n\n constructor(store: Store) {\n this.__experimentalStore = store;\n\n this.observeObject = store.observeObject.bind(\n store,\n ) as typeof this.observeObject;\n this.observeList = store.observeList.bind(store) as typeof this.observeList;\n this.applyAction = store.applyAction.bind(store);\n this.validateAction = store.validateAction.bind(store);\n this.canonicalizeWhereClause = store.canonicalizeWhereClause.bind(\n store,\n ) as typeof this.canonicalizeWhereClause;\n }\n\n public observeObject: <T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObserveObjectArgs<T>>,\n ) => Unsubscribable;\n\n public observeList: <T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\n ) => Unsubscribable;\n\n public applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<unknown>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public canonicalizeWhereClause: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ) => Canonical<WhereClause<T>>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAuBA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,CAA6B;EAG5DC,WAAWA,CAACC,KAAY,EAAE;IACxB,IAAI,CAACC,mBAAmB,GAAGD,KAAK;IAEhC,IAAI,CAACE,aAAa,GAAGF,KAAK,CAACE,aAAa,CAACC,IAAI,CAC3CH,KACF,CAA8B;IAC9B,IAAI,CAACI,WAAW,GAAGJ,KAAK,CAACI,WAAW,CAACD,IAAI,CAACH,KAAK,CAA4B;IAC3E,IAAI,CAACK,WAAW,GAAGL,KAAK,CAACK,WAAW,CAACF,IAAI,CAACH,KAAK,CAAC;IAChD,IAAI,CAACM,cAAc,GAAGN,KAAK,CAACM,cAAc,CAACH,IAAI,CAACH,KAAK,CAAC;IACtD,IAAI,CAACO,uBAAuB,GAAGP,KAAK,CAACO,uBAAuB,CAACJ,IAAI,CAC/DH,KACF,CAAwC;EAC1C;AA8BF","ignoreList":[]}
|
|
@@ -137,6 +137,13 @@ export class Store {
|
|
|
137
137
|
applyAction = async (action, args, opts) => {
|
|
138
138
|
return await new ActionApplication(this).applyAction(action, args, opts);
|
|
139
139
|
};
|
|
140
|
+
validateAction = async (action, args) => {
|
|
141
|
+
const result = await this.client(action).applyAction(args, {
|
|
142
|
+
$validateOnly: true,
|
|
143
|
+
$returnEdits: false
|
|
144
|
+
});
|
|
145
|
+
return result;
|
|
146
|
+
};
|
|
140
147
|
removeLayer(layerId) {
|
|
141
148
|
!(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "undefined is the reserved layerId for the truth layer") : invariant(false) : void 0;
|
|
142
149
|
// 1. collect all cache keys for a given layerId
|
|
@@ -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","OrderByCanonicalizer","RefCounts","tombstone","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","Map","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","get","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","orderBy","x","streamUpdates","registerStreamUpdates","peekQuery","getQuery","#getQuery","createQuery","def","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","batchResult","invalidateObject","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","add","then","invalidateList","store"],"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 ActionEditResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Observer } from \"rxjs\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.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 { 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 \"./Changes.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 { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport { tombstone } from \"./tombstone.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 delete: <K extends CacheKey<string, any, any>>(\n k: K,\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\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 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 // we can use a regular Map here because the refCounting will\n // handle cleanup.\n #queries: Map<\n CacheKey,\n Query<any, any, any>\n > = new Map();\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 // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\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:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await 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 canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ): Canonical<SimpleWhereClause> {\n return this.whereCanonicalizer.canonicalize(where);\n }\n\n public observeObject<T extends ObjectTypeDefinition | InterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n subFn.error(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(subFn);\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.type,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\").catch((x: unknown) => {\n subFn.error(x);\n });\n }\n const sub = query.subscribe(subFn);\n\n if (options.streamUpdates) {\n query.registerStreamUpdates(sub);\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n peekQuery<K extends CacheKey>(\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 | InterfaceDefinition>(\n def: Pick<T, \"type\" | \"apiName\">,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n const { apiName, type } = def;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n type,\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 getValue<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#topLayer.get(cacheKey);\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 changes: Changes;\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 delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\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 this.maybeRevalidateQueries(changes, optimisticId).catch(e => {\n // we don't want batch() 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 batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\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 return this.getObjectQuery(apiName, pk)\n .revalidate(/* force */ true);\n }\n\n async maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"No changes, aborting\",\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.#queries.keys()) {\n const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\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<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.#truthLayer.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes || !changes.modified.has(cacheKey)) {\n const promise = this.peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modified.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises).then(() => void 0);\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\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.getCacheKey<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.peekQuery(cacheKey)?.revalidate(true);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,SAASA,eAAe,QAAQ,MAAM;AACtC,OAAOC,SAAS,MAAM,gBAAgB;AAEtC,SAASC,iBAAiB,QAAqB,iBAAiB;AAChE,SAASC,eAAe,QAAQ,kBAAkB;AAUlD,SAASC,iBAAiB,QAAQ,wBAAwB;AAE1D,SAASC,SAAS,QAAQ,gBAAgB;AAE1C,SAEEC,oBAAoB,EACpBC,2BAA2B,QACtB,cAAc;AACrB,SAASC,KAAK,EAAEC,KAAK,QAAQ,YAAY;AAEzC,SAASC,cAAc,EAAEC,SAAS,QAAQ,gBAAgB;AAE1D,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,SAASC,oBAAoB,QAAQ,2BAA2B;AAEhE,SAASC,SAAS,QAAQ,gBAAgB;AAE1C,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,wBAAwB,QAAQ,+BAA+B;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqCA,SAASC,eAAeA,CAACC,QAAkB,EAAc;EACvD,OAAO;IACLA,QAAQ;IACRC,MAAM,EAAE,MAAM;IACdC,KAAK,EAAEC,SAAS;IAChBC,WAAW,EAAE;EACf,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMC,KAAK,CAAC;EACjBC,kBAAkB,GAA6B,IAAIR,wBAAwB,CAAC,CAAC;EAC7ES,oBAAoB,GAAyB,IAAIZ,oBAAoB,CAAC,CAAC;EACvE,CAACa,UAAU,GAAU,IAAIjB,KAAK,CAACY,SAAS,EAAEA,SAAS,CAAC;EACpD,CAACM,QAAQ;;EAGT;;EAGA;EACA;EACA,CAACC,OAAO,GAGJ,IAAIC,GAAG,CAAC,CAAC;EAEb,CAACC,iBAAiB,GAAG,IAAIC,OAAO,CAG9B,CAAC;EACH,CAACC,SAAS;EAEV,CAACC,SAAS,GAAG,IAAInB,SAAS,CACxBX,eAAe,GAAG,MAAM,GAAG,MAAM,EAChC+B,CAAC,IAAK,IAAI,CAAC,CAACC,eAAe,CAACD,CAAC,CAChC,CAAC;;EAED;EACA;EACA,CAACE,oBAAoB;EAErBC,WAAWA,CAACC,MAAc,EAAE;IAC1B,IAAI,CAACA,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACpC,iBAAiB,CAAC,CAACqC,MAAM,EAAEC,KAAK,CAAC,CAAC,CAAC,EAAE;MACxDC,SAAS,EAAE;IACb,CAAC,CAAC;IACF,IAAI,CAAC,CAACd,QAAQ,GAAG,IAAI,CAAC,CAACD,UAAU;IACjC,IAAI,CAAC,CAACM,SAAS,GAAG,IAAI3B,SAAS,CAC7B,IAAI,CAACmB,kBAAkB,EACvB,IAAI,CAACC,oBAAoB,EACxBS,CAAC,IAAK;MACL,IAAI/B,eAAe,EAAE;QACnB,MAAMuC,YAAY,GAAGR,CAAC,CAACS,IAAI;QAC3B,MAAMC,SAAS,GAAGV,CAAC,CAACU,SAAS;QAC7B;QACAC,OAAO,CAACC,GAAG,CACT,sBAAsBJ,YAAY,KAAKK,IAAI,CAACC,SAAS,CAACJ,SAAS,CAAC,GAClE,CAAC;QAED,IAAI,CAAC,CAACR,oBAAoB,CAACa,QAAQ,CAACf,CAAC,EAAE,MAAM;UAC3C;UACAW,OAAO,CAACC,GAAG,CACT,yBAAyBJ,YAAY,KACnCK,IAAI,CAACC,SAAS,CAACJ,SAAS,CAAC,GAE7B,CAAC;QACH,CAAC,CAAC;MACJ;MAEA,IAAI,CAAC,CAACX,SAAS,CAACgB,QAAQ,CAACf,CAAC,CAAC;IAC7B,CACF,CAAC;IAEDgB,WAAW,CAAC,MAAM;MAChB,IAAI,CAAC,CAACjB,SAAS,CAACkB,EAAE,CAAC,CAAC;IACtB,CAAC,EAAE,IAAI,CAAC;IAER,IAAI,CAAC,CAACf,oBAAoB,GAAG,IAAIgB,oBAAoB,CAClDC,eAAe,IAAK;MACnB,IAAI;QACFA,eAAe,CAAC,CAAC;MACnB,CAAC,CAAC,OAAOC,CAAC,EAAE;QACV;QACAT,OAAO,CAACU,KAAK,CACX,uDAAuD,EACvDD,CACF,CAAC;MACH;IACF,CACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACE,CAACnB,eAAe,GAAIqB,GAA+B,IAAK;IACtD,MAAMC,OAAO,GAAG,IAAI,CAACC,WAAW,CAACF,GAAG,CAAC;IAErC,IAAIrD,eAAe,EAAE;MACnB;MACA0C,OAAO,CAACC,GAAG,CACT,yBACEC,IAAI,CAACC,SAAS,CAAC;QACbW,MAAM,EAAEF,OAAO,EAAEE,MAAM;QACvBC,QAAQ,EAAEH,OAAO,EAAEG;MACrB,CAAC,CAAC,GACD,EACHb,IAAI,CAACC,SAAS,CAAC,CAACQ,GAAG,CAACb,IAAI,EAAE,GAAGa,GAAG,CAACZ,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CACtD,CAAC;IACH;IACA,IAAI,CAAC,CAACZ,SAAS,CAAC6B,MAAM,CAACL,GAAG,CAAC;IAC3B,IAAIM,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,CAAUP,OAAO,GAAAK,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAjB/D,SAAS,UAATA,SAAS;IACX;IAEA,IAAIwD,OAAO,EAAE;MACXA,OAAO,CAACQ,QAAQ,CAAC,CAAC;MAClB,IAAI,CAAC,CAACnC,iBAAiB,CAACoC,MAAM,CAACV,GAAG,CAAC;IACrC;IAEA,IAAI,CAAC,CAAC5B,OAAO,CAACuC,GAAG,CAACX,GAAG,CAAC,EAAEY,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,CAACxC,OAAO,CAACsC,MAAM,CAACV,GAAG,CAAC;EAC3B,CAAC;EAEDa,WAAW,GAMwB,MAAAA,CAAOC,MAAM,EAAEC,IAAI,EAAEC,IAAI,KAAK;IAC/D,OAAO,MAAM,IAAIpE,iBAAiB,CAAC,IAAI,CAAC,CAACiE,WAAW,CAACC,MAAM,EAAEC,IAAI,EAAEC,IAAI,CAAC;EAC1E,CAAC;EAEDC,WAAWA,CAACC,OAAqB,EAAQ;IACvC,EACEA,OAAO,IAAI,IAAI,IAAAZ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADjB/D,SAAS,QAEP,uDAAuD,IAFzDA,SAAS;IAIT;IACA,IAAI0E,YAA+B,GAAG,IAAI,CAAC,CAAChD,QAAQ;IACpD,MAAMK,SAAS,GAAG,IAAIH,GAAG,CAAyC,CAAC;IACnE,OAAO8C,YAAY,IAAI,IAAI,IAAIA,YAAY,CAACC,WAAW,IAAI,IAAI,EAAE;MAC/D,IAAID,YAAY,CAACD,OAAO,KAAKA,OAAO,EAAE;QACpC,KAAK,MAAM,CAACxC,CAAC,EAAE2C,CAAC,CAAC,IAAIF,YAAY,CAACG,OAAO,CAAC,CAAC,EAAE;UAC3C,IAAI9C,SAAS,CAAC+C,GAAG,CAAC7C,CAAC,CAAC,EAAE;UACtBF,SAAS,CAACgD,GAAG,CAAC9C,CAAC,EAAE2C,CAAC,CAAC;QACrB;MACF;MAEAF,YAAY,GAAGA,YAAY,CAACC,WAAW;IACzC;;IAEA;IACA,IAAI,CAAC,CAACjD,QAAQ,GAAG,IAAI,CAAC,CAACA,QAAQ,CAAC8C,WAAW,CAACC,OAAO,CAAC;;IAEpD;IACA,KAAK,MAAM,CAACxC,CAAC,EAAE+C,QAAQ,CAAC,IAAIjD,SAAS,EAAE;MACrC,MAAMkD,YAAY,GAAG,IAAI,CAAC,CAACvD,QAAQ,CAACwC,GAAG,CAACjC,CAAC,CAAC;;MAE1C;MACA,IAAI+C,QAAQ,KAAKC,YAAY,EAAE;QACnBA,YAAY,IAAIjE,eAAe,CAACiB,CAAC,CAAC,EAC5C;QACA;QACA;QACA,IAAI,CAACwB,WAAW,CAACxB,CAAC,CAAC,EAAEiD,IAAI,CACvB;UACE;UACA,IAAID,YAAY,IAAIjE,eAAe,CAACiB,CAAC,CAAC,CAAC;UACvCkD,YAAY,EACVF,YAAY,EAAE9D,KAAK,KAAK,IAAI,CAAC,CAACM,UAAU,CAACyC,GAAG,CAACjC,CAAC,CAAC,EAAEd;QACrD,CACF,CAAC;MACH;IACF;EACF;EAEAiE,WAAWA,CACT1C,IAAe,EACf,GAAG4B,IAA6B,EAC7B;IACH,OAAO,IAAI,CAAC,CAACtC,SAAS,CAACgB,QAAQ,CAAC,IAAI,CAAC,CAACjB,SAAS,CAACmC,GAAG,CAACxB,IAAI,EAAE,GAAG4B,IAAI,CAAC,CAAC;EACrE;EAEAb,WAAW,GACTxC,QAAa,IAIf;IACE,OAAO,IAAI,CAAC,CAACY,iBAAiB,CAACqC,GAAG,CAACjD,QAAQ,CAAC;EAC9C,CAAC;EAEDoE,UAAU,GACRpE,QAAa,IAC4B;IACzC,IAAIuC,OAAO,GAAG,IAAI,CAAC,CAAC3B,iBAAiB,CAACqC,GAAG,CAACjD,QAAQ,CAAC;IACnD,IAAI,CAACuC,OAAO,EAAE;MACZ,MAAM8B,YAAwB,GAAG,IAAI,CAAC,CAAC5D,QAAQ,CAACwC,GAAG,CAACjD,QAAQ,CAAC,IACxDD,eAAe,CAACC,QAAQ,CAAC;MAE9BuC,OAAO,GAAG,IAAIzD,eAAe,CAAC;QAC5B;QACA,GAAGuF,YAAY;QACfH,YAAY,EACVG,YAAY,CAACnE,KAAK,KAAK,IAAI,CAAC,CAACM,UAAU,CAACyC,GAAG,CAACjD,QAAQ,CAAC,EAAEE;MAC3D,CAAC,CAAC;MACF,IAAI,CAAC,CAACU,iBAAiB,CAACkD,GAAG,CAAC9D,QAAQ,EAAEuC,OAAO,CAAC;IAChD;IAEA,OAAOA,OAAO;EAChB,CAAC;EAEM+B,uBAAuBA,CAG5BC,KAAqB,EACS;IAC9B,OAAO,IAAI,CAACjE,kBAAkB,CAACkE,YAAY,CAACD,KAAK,CAAC;EACpD;EAEOE,aAAaA,CAClBC,OAAyB,EACzBC,EAAqB,EACrBC,OAAgC,EAChCC,KAA8B,EACd;IAChB,IAAI,OAAOH,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAO,GAAGA,OAAO,CAACA,OAAO;IAC3B;IAEA,MAAMI,KAAK,GAAG,IAAI,CAACC,cAAc,CAACL,OAAO,EAAEC,EAAE,CAAC;IAC9C,IAAI,CAACK,MAAM,CAACF,KAAK,CAAC9E,QAAQ,CAAC;IAE3B,IAAI4E,OAAO,CAACK,IAAI,KAAK,SAAS,EAAE;MAC9BH,KAAK,CAACI,UAAU,CAACN,OAAO,CAACK,IAAI,KAAK,OAAO,CAAC,CACvCE,KAAK,CAAC/C,CAAC,IAAI;QACVyC,KAAK,CAACxC,KAAK,CAACD,CAAC,CAAC;QACd;QACA;QACA;QACA,IAAI,IAAI,CAACf,MAAM,EAAE;UACf,IAAI,CAACA,MAAM,CAACgB,KAAK,CAAC,kCAAkC,EAAED,CAAC,CAAC;QAC1D,CAAC,MAAM;UACL,MAAMA,CAAC;QACT;MACF,CAAC,CAAC;IACN;IACA,MAAMgD,GAAG,GAAGN,KAAK,CAACO,SAAS,CAACR,KAAK,CAAC;IAElC,OAAO;MACLS,WAAW,EAAEA,CAAA,KAAM;QACjBF,GAAG,CAACE,WAAW,CAAC,CAAC;QACjB,IAAI,CAACC,OAAO,CAACT,KAAK,CAAC9E,QAAQ,CAAC;MAC9B;IACF,CAAC;EACH;EAEOwF,WAAWA,CAChBZ,OAA8B,EAC9BC,KAA4B,EACZ;IAChB;IACA,MAAMC,KAAK,GAAG,IAAI,CAACW,YAAY,CAC7Bb,OAAO,CAACnD,IAAI,EACZmD,OAAO,CAACL,KAAK,IAAI,CAAC,CAAC,EACnBK,OAAO,CAACc,OAAO,IAAI,CAAC,CAAC,EACrBd,OACF,CAAC;IACD,IAAI,CAACI,MAAM,CAACF,KAAK,CAAC9E,QAAQ,CAAC;IAE3B,IAAI4E,OAAO,CAACK,IAAI,KAAK,SAAS,EAAE;MAC9BH,KAAK,CAACI,UAAU,CAACN,OAAO,CAACK,IAAI,KAAK,OAAO,CAAC,CAACE,KAAK,CAAEQ,CAAU,IAAK;QAC/Dd,KAAK,CAACxC,KAAK,CAACsD,CAAC,CAAC;MAChB,CAAC,CAAC;IACJ;IACA,MAAMP,GAAG,GAAGN,KAAK,CAACO,SAAS,CAACR,KAAK,CAAC;IAElC,IAAID,OAAO,CAACgB,aAAa,EAAE;MACzBd,KAAK,CAACe,qBAAqB,CAACT,GAAG,CAAC;IAClC;IAEA,OAAO;MACLE,WAAW,EAAEA,CAAA,KAAM;QACjBF,GAAG,CAACE,WAAW,CAAC,CAAC;QACjB,IAAI,CAACC,OAAO,CAACT,KAAK,CAAC9E,QAAQ,CAAC;MAC9B;IACF,CAAC;EACH;EAEA8F,SAASA,CACP9F,QAAW,EAC2B;IACtC,OAAO,IAAI,CAAC,CAACU,OAAO,CAACuC,GAAG,CAACjD,QAAQ,CAAC;EACpC;EAEA,CAAC+F,QAAQC,CACPhG,QAAW,EACXiG,WAA2C,EACjB;IAC1B,IAAInB,KAAK,GAAG,IAAI,CAACgB,SAAS,CAAC9F,QAAQ,CAAC;IACpC,IAAI,CAAC8E,KAAK,EAAE;MACVA,KAAK,GAAGmB,WAAW,CAAC,CAAC;MACrB,IAAI,CAAC,CAACvF,OAAO,CAACoD,GAAG,CAAC9D,QAAQ,EAAE8E,KAAK,CAAC;IACpC;IACA,OAAOA,KAAK;EACd;EAEOW,YAAYA,CACjBS,GAAgC,EAChC3B,KAAqB,EACrBmB,OAAmD,EACnDpC,IAAsB,EACX;IACX,MAAM;MAAEoB,OAAO;MAAEjD;IAAK,CAAC,GAAGyE,GAAG;IAE7B,MAAMC,UAAU,GAAG,IAAI,CAAC7F,kBAAkB,CAACkE,YAAY,CAACD,KAAK,CAAC;IAC9D,MAAM6B,YAAY,GAAG,IAAI,CAAC7F,oBAAoB,CAACiE,YAAY,CAACkB,OAAO,CAAC;IACpE,MAAMW,YAAY,GAAG,IAAI,CAAClC,WAAW,CACnC,MAAM,EACN1C,IAAI,EACJiD,OAAO,EACPyB,UAAU,EACVC,YACF,CAAC;IAED,OAAO,IAAI,CAAC,CAACL,QAAQ,CAACM,YAAY,EAAE,MAAM;MACxC,OAAO,IAAI5G,SAAS,CAClB,IAAI,EACJ,IAAI,CAAC2E,UAAU,CAACiC,YAAY,CAAC,EAC7B5E,IAAI,EACJiD,OAAO,EACPyB,UAAU,EACVC,YAAY,EACZC,YAAY,EACZ/C,IACF,CAAC;IACH,CAAC,CAAC;EACJ;EAEOyB,cAAcA,CACnBL,OAAyB,EACzBC,EAAqB,EACR;IACb,IAAI,OAAOD,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAO,GAAGA,OAAO,CAACA,OAAO;IAC3B;IAEA,MAAM4B,cAAc,GAAG,IAAI,CAACnC,WAAW,CACrC,QAAQ,EACRO,OAAO,EACPC,EACF,CAAC;IAED,OAAO,IAAI,CAAC,CAACoB,QAAQ,CAACO,cAAc,EAAE,MACpC,IAAI5G,WAAW,CACb,IAAI,EACJ,IAAI,CAAC0E,UAAU,CAACkC,cAAc,CAAC,EAC/B5B,OAAO,EACPC,EAAE,EACF2B,cAAc,EACd;MAAEC,cAAc,EAAE;IAAE,CACtB,CAAC,CAAC;EACN;EAEOC,QAAQA,CACbxG,QAAW,EACW;IACtB,OAAO,IAAI,CAAC,CAACS,QAAQ,CAACwC,GAAG,CAACjD,QAAQ,CAAC;EACrC;EAEAyG,KAAK,GAAGA,CACN;IAAEC,YAAY;IAAEC,OAAO,GAAGvH,oBAAoB,CAAC;EAG/C,CAAC,EACDwH,OAA0C,KAKvC;IACH,EACEF,YAAY,KAAKvG,SAAS,IAAI,CAAC,CAACuG,YAAY,IAAA9D,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAD9C/D,SAAS,QAEP,2CAA2C,IAF7CA,SAAS;IAKT,IAAI8H,UAAU,GAAGH,YAAY,KAAKvG,SAAS;IAC3C,MAAM2G,YAA0B,GAAG;MACjCH,OAAO;MACPI,mBAAmB,EAAEA,CAAA,KAAM;QACzB,IAAIF,UAAU,EAAE;UACd,IAAI,CAAC,CAACpG,QAAQ,GAAG,IAAI,CAAC,CAACA,QAAQ,CAACuG,QAAQ,CAACN,YAAY,CAAC;UACtDG,UAAU,GAAG,KAAK;QACpB;MACF,CAAC;MACDI,eAAe,EAAE,CAAC,CAACP,YAAY;MAC/BQ,KAAK,EAAEA,CAAClH,QAAQ,EAAEE,KAAK,EAAED,MAAM,KAAK;QAClC,MAAMkH,WAAW,GAAG,IAAI,CAAC,CAAC1G,QAAQ,CAACwC,GAAG,CAACjD,QAAQ,CAAC;QAEhD,IAAI0G,YAAY,EAAEI,YAAY,CAACC,mBAAmB,CAAC,CAAC;QAEpD,MAAMK,UAAU,GAAGV,YAAY,GAC3B,IAAI,CAAC,CAACjG,QAAQ,GACd,IAAI,CAAC,CAACD,UAAU;QACpB,MAAM6G,QAAQ,GAAG,IAAI/H,KAAK,CACxBU,QAAQ,EACRE,KAAK,EACLoH,IAAI,CAACC,GAAG,CAAC,CAAC,EACVtH,MACF,CAAC;QAEDmH,UAAU,CAACtD,GAAG,CAAC9D,QAAQ,EAAEqH,QAAQ,CAAC;QAElC,MAAMG,WAAW,GAAG,IAAI,CAAC,CAAC/G,QAAQ,CAACwC,GAAG,CAACjD,QAAQ,CAAC;QAEhD,IAAImH,WAAW,KAAKK,WAAW,EAAE;UAC/B,IAAI,CAAC,CAAC5G,iBAAiB,CAACqC,GAAG,CAACjD,QAAQ,CAAC,EAAEiE,IAAI,CAAC;YAC1C;YACA,GAAGoD,QAAQ;YACXnD,YAAY,EACVsD,WAAW,EAAEtH,KAAK,KAAK,IAAI,CAAC,CAACM,UAAU,CAACyC,GAAG,CAACjD,QAAQ,CAAC,EAAEE;UAC3D,CAAC,CAAC;QACJ;QAEA,OAAOmH,QAAQ;MACjB,CAAC;MACDrE,MAAM,EAAEA,CAAChD,QAAQ,EAAEC,MAAM,KAAK;QAC5B,OAAO6G,YAAY,CAACI,KAAK,CAAClH,QAAQ,EAAEH,SAAS,EAAEI,MAAM,CAAC;MACxD,CAAC;MACDwH,IAAI,EAAGzH,QAAQ,IAAK;QAClB,OAAO0G,YAAY,GACf,IAAI,CAAC,CAACjG,QAAQ,CAACwC,GAAG,CAACjD,QAAQ,CAAC,GAC5B,IAAI,CAAC,CAACQ,UAAU,CAACyC,GAAG,CAACjD,QAAQ,CAAC;MACpC;IACF,CAAC;IAED,MAAM0H,MAAM,GAAGd,OAAO,CAACE,YAAY,CAAC;IACpC,IAAI,CAACa,sBAAsB,CAAChB,OAAO,EAAED,YAAY,CAAC,CAACvB,KAAK,CAAC/C,CAAC,IAAI;MAC5D;MACA;MACA;MACA,IAAI,IAAI,CAACf,MAAM,EAAE;QACf,IAAI,CAACA,MAAM,CAACgB,KAAK,CAAC,0BAA0B,EAAED,CAAC,CAAC;MAClD,CAAC,MAAM;QACL;QACAT,OAAO,CAACU,KAAK,CAAC,0BAA0B,EAAED,CAAC,CAAC;QAC5C,MAAMA,CAAC;MACT;IACF,CAAC,CAAC;IAEF,OAAO;MACLwF,WAAW,EAAEd,YAAY;MACzBY,MAAM,EAAEA,MAAM;MACdf,OAAO,EAAEG,YAAY,CAACH;IACxB,CAAC;EACH,CAAC;EAEMkB,gBAAgBA,CACrBnD,OAAyB,EACzBC,EAAqB,EACH;IAClB,IAAI,OAAOD,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAO,GAAGA,OAAO,CAACA,OAAO;IAC3B;IAEA,OAAO,IAAI,CAACK,cAAc,CAACL,OAAO,EAAEC,EAAE,CAAC,CACpCO,UAAU,CAAC,WAAY,IAAI,CAAC;EACjC;EAEA,MAAMyC,sBAAsBA,CAC1BhB,OAAgB,EAChBD,YAAuC,EACxB;IACf,IAAIC,OAAO,CAACmB,OAAO,CAAC,CAAC,EAAE;MACrB,IAAIlF,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACA,IAAI,CAACzB,MAAM,EAAEC,KAAK,CAAC;UAAEyG,UAAU,EAAE;QAAyB,CAAC,CAAC,CAACC,KAAK,CAChE,sBACF,CAAC;MACH;MACA;IACF;IAEA,IAAIpF,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC;MACA,IAAI,CAACzB,MAAM,EAAEC,KAAK,CAAC;QAAEyG,UAAU,EAAE;MAAyB,CAAC,CAAC,CAACC,KAAK,CAChE3I,2BAA2B,CAACsH,OAAO,CAAC,EACpC;QAAED;MAAa,CACjB,CAAC;IACH;IAEA,IAAI;MACF,MAAMuB,QAAiC,GAAG,EAAE;MAC5C,KAAK,MAAMjI,QAAQ,IAAI,IAAI,CAAC,CAACU,OAAO,CAACwH,IAAI,CAAC,CAAC,EAAE;QAC3C,MAAMC,OAAO,GAAG,IAAI,CAACrC,SAAS,CAAC9F,QAAQ,CAAC,EAAEoI,wBAAwB,GAChEzB,OAAO,EACPD,YACF,CAAC;QACD,IAAIyB,OAAO,EAAEF,QAAQ,CAACI,IAAI,CAACF,OAAO,CAAC;MACrC;MACA,MAAMG,OAAO,CAACC,GAAG,CAACN,QAAQ,CAAC;IAC7B,CAAC,SAAS;MACR,IAAIrF,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC;QACA,IAAI,CAACzB,MAAM,EAAEC,KAAK,CAAC;UAAEyG,UAAU,EAAE;QAAyB,CAAC,CAAC,CAACC,KAAK,CAChE,YAAY,EACZ3I,2BAA2B,CAACsH,OAAO,CACrC,CAAC;MACH;IACF;EACF;;EAEA;AACF;AACA;AACA;AACA;EACS6B,oBAAoBA,CACzB9D,OAAyB,EACzBiC,OAA4B,EACb;IACf,IAAI,OAAOjC,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAO,GAAGA,OAAO,CAACA,OAAO;IAC3B;IACA,IAAI9B,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAACzB,MAAM,EAAEC,KAAK,CAAC;QAAEyG,UAAU,EAAE;MAAuB,CAAC,CAAC,CAACU,IAAI,CAC7D9B,OAAO,GAAGtH,2BAA2B,CAACsH,OAAO,CAAC,GAAG,KAAK,CACxD,CAAC;IACH;IAEA,MAAMsB,QAA8B,GAAG,EAAE;IAEzC,KAAK,MAAMjI,QAAQ,IAAI,IAAI,CAAC,CAACQ,UAAU,CAAC0H,IAAI,CAAC,CAAC,EAAE;MAC9C,IAAI1I,cAAc,CAACQ,QAAQ,CAAC,EAAE;QAC5B,IAAI,CAAC2G,OAAO,IAAI,CAACA,OAAO,CAAC+B,QAAQ,CAAC7E,GAAG,CAAC7D,QAAQ,CAAC,EAAE;UAC/C,MAAMmI,OAAO,GAAG,IAAI,CAACrC,SAAS,CAAC9F,QAAQ,CAAC,EAAEkF,UAAU,CAAC,IAAI,CAAC;UAE1D,IAAIiD,OAAO,EAAE;YACXF,QAAQ,CAACI,IAAI,CAACF,OAAO,CAAC;YACtBxB,OAAO,EAAE+B,QAAQ,CAACC,GAAG,CAAC3I,QAAQ,CAAC;UACjC;QACF;MACF;IACF;IAEA,OAAOsI,OAAO,CAACC,GAAG,CAACN,QAAQ,CAAC,CAACW,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;EACjD;EAEA5D,MAAMA,CAAChF,QAAoC,EAAQ;IACjD,IAAI,CAAC,CAACe,SAAS,CAACiE,MAAM,CAAChF,QAAQ,CAAC;EAClC;EAEAuF,OAAOA,CAACvF,QAAoC,EAAQ;IAClD,IAAI,CAAC,CAACe,SAAS,CAACwE,OAAO,CAACvF,QAAQ,CAAC;EACnC;AACF;AAEA,OAAO,eAAe6I,cAAcA,CAClCC,KAAY,EACZzF,IAIC,EACc;EACf,MAAMkB,KAAK,GAAGuE,KAAK,CAACxI,kBAAkB,CAACkE,YAAY,CAACnB,IAAI,CAACkB,KAAK,IAAI,CAAC,CAAC,CAAC;EACrE,MAAMmB,OAAO,GAAGoD,KAAK,CAACvI,oBAAoB,CAACiE,YAAY,CAACnB,IAAI,CAACqC,OAAO,IAAI,CAAC,CAAC,CAAC;EAE3E,MAAM1F,QAAQ,GAAG8I,KAAK,CAAC3E,WAAW,CAChC,MAAM,EACNd,IAAI,CAAC5B,IAAI,CAACA,IAAI,EACd4B,IAAI,CAAC5B,IAAI,CAACiD,OAAO,EACjBH,KAAK,EACLmB,OACF,CAAC;EAED,MAAMoD,KAAK,CAAChD,SAAS,CAAC9F,QAAQ,CAAC,EAAEkF,UAAU,CAAC,IAAI,CAAC;AACnD","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","OrderByCanonicalizer","RefCounts","tombstone","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","Map","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","get","dispose","applyAction","action","args","opts","validateAction","result","$validateOnly","$returnEdits","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","orderBy","x","streamUpdates","registerStreamUpdates","peekQuery","getQuery","#getQuery","createQuery","def","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","batchResult","invalidateObject","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","add","then","invalidateList","store"],"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 ActionEditResponse,\n ActionValidationResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Observer } from \"rxjs\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.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 { 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 \"./Changes.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 { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport { tombstone } from \"./tombstone.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 delete: <K extends CacheKey<string, any, any>>(\n k: K,\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\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 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 // we can use a regular Map here because the refCounting will\n // handle cleanup.\n #queries: Map<\n CacheKey,\n Query<any, any, any>\n > = new Map();\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 // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\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:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\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 canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ): Canonical<SimpleWhereClause> {\n return this.whereCanonicalizer.canonicalize(where);\n }\n\n public observeObject<T extends ObjectTypeDefinition | InterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n subFn.error(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(subFn);\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.type,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\").catch((x: unknown) => {\n subFn.error(x);\n });\n }\n const sub = query.subscribe(subFn);\n\n if (options.streamUpdates) {\n query.registerStreamUpdates(sub);\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n peekQuery<K extends CacheKey>(\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 | InterfaceDefinition>(\n def: Pick<T, \"type\" | \"apiName\">,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n const { apiName, type } = def;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n type,\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 getValue<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#topLayer.get(cacheKey);\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 changes: Changes;\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 delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\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 this.maybeRevalidateQueries(changes, optimisticId).catch(e => {\n // we don't want batch() 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 batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\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 return this.getObjectQuery(apiName, pk)\n .revalidate(/* force */ true);\n }\n\n async maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"No changes, aborting\",\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.#queries.keys()) {\n const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\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<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.#truthLayer.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes || !changes.modified.has(cacheKey)) {\n const promise = this.peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modified.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises).then(() => void 0);\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\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.getCacheKey<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.peekQuery(cacheKey)?.revalidate(true);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { createAsyncClientCache } from "../object/Cache.js";
|
|
18
|
+
import { deepFreeze } from "../util/deepFreeze.js";
|
|
18
19
|
import { loadActionMetadata } from "./loadActionMetadata.js";
|
|
19
20
|
import { loadFullObjectMetadata } from "./loadFullObjectMetadata.js";
|
|
20
21
|
import { loadInterfaceMetadata } from "./loadInterfaceMetadata.js";
|
|
@@ -41,10 +42,10 @@ export const createStandardOntologyProviderFactory = () => {
|
|
|
41
42
|
...objectDef,
|
|
42
43
|
[InterfaceDefinitions]: interfaceDefs
|
|
43
44
|
};
|
|
44
|
-
return fullObjectDef;
|
|
45
|
+
return deepFreeze(fullObjectDef);
|
|
45
46
|
}),
|
|
46
47
|
getInterfaceDefinition: makeGetter(async function (client, key) {
|
|
47
|
-
return loadInterfaceMetadata(client, key);
|
|
48
|
+
return deepFreeze(await loadInterfaceMetadata(client, key));
|
|
48
49
|
}),
|
|
49
50
|
getActionDefinition: makeGetter(async function (client, key) {
|
|
50
51
|
const r = await loadActionMetadata(client, key);
|