@osdk/client 2.1.0-beta.3 → 2.1.0-beta.4
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 +18 -0
- package/build/browser/Client.d.ts +3 -19
- package/build/browser/Client.d.ts.map +1 -1
- package/build/browser/__unstable/ConjureSupport.js +4 -4
- package/build/browser/__unstable/ConjureSupport.js.map +1 -1
- package/build/browser/__unstable/createBulkLinksAsyncIterFactory.d.ts +1 -6
- package/build/browser/__unstable/createBulkLinksAsyncIterFactory.d.ts.map +1 -1
- package/build/browser/__unstable/createBulkLinksAsyncIterFactory.js +1 -1
- package/build/browser/__unstable/createBulkLinksAsyncIterFactory.js.map +1 -1
- package/build/browser/actions/applyAction.js +1 -1
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.d.ts.map +1 -1
- package/build/browser/createClient.js +33 -19
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +1 -1
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/index.d.ts +0 -1
- package/build/browser/index.d.ts.map +1 -1
- package/build/browser/index.js +0 -1
- package/build/browser/index.js.map +1 -1
- package/build/browser/intellisense.test.js +1 -1
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/internal/conversions/legacyToModernSingleAggregationResult.js +1 -1
- package/build/browser/internal/conversions/legacyToModernSingleAggregationResult.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +3 -3
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/object/aggregate.js +1 -1
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.d.ts +1 -10
- package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.d.ts.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.d.ts +0 -7
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.d.ts.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js +6 -0
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +2 -2
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/fetchPage.js +1 -1
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +43 -47
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +22 -45
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +8 -5
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +2 -5
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/tsserver.js +1 -1
- package/build/browser/tsserver.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/esm/Client.d.ts +3 -19
- package/build/esm/Client.d.ts.map +1 -1
- package/build/esm/__unstable/ConjureSupport.js +4 -4
- package/build/esm/__unstable/ConjureSupport.js.map +1 -1
- package/build/esm/__unstable/createBulkLinksAsyncIterFactory.d.ts +1 -6
- package/build/esm/__unstable/createBulkLinksAsyncIterFactory.d.ts.map +1 -1
- package/build/esm/__unstable/createBulkLinksAsyncIterFactory.js +1 -1
- package/build/esm/__unstable/createBulkLinksAsyncIterFactory.js.map +1 -1
- package/build/esm/actions/applyAction.js +1 -1
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.d.ts.map +1 -1
- package/build/esm/createClient.js +33 -19
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +1 -1
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index.js +0 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/intellisense.test.js +1 -1
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/internal/conversions/legacyToModernSingleAggregationResult.js +1 -1
- package/build/esm/internal/conversions/legacyToModernSingleAggregationResult.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +3 -3
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/object/aggregate.js +1 -1
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.d.ts +1 -10
- package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.d.ts.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.d.ts +0 -7
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.d.ts.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js +6 -0
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +2 -2
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/fetchPage.js +1 -1
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +43 -47
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +22 -45
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +8 -5
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +2 -5
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/tsserver.js +1 -1
- package/build/esm/tsserver.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSet.test.js","names":["isOk","$ontologyRid","Employee","FooInterface","Office","apiServer","stubData","afterAll","beforeAll","describe","expect","expectTypeOf","it","createClient","client","listen","close","employeeObjectSet","officeObjectSet","union","subtract","intersect","objectSet","unionedObjectSet","iter","data","employees","fetchPage","emp","employeeId","toEqual","objectSet2","where","subtractedObjectSet","intersectedObjectSet","$orderBy","toMatchObject","$apiName","$objectType","$primaryKey","class","employeeStatus","anything","fullName","office","startDate","employeeLocation","$title","employee","fetchOne","employee1","toMatchTypeOf","toBe","employeeResult","fetchOneWithErrors","value","$select","branded","toEqualTypeOf","rejects","toThrow","employee2","pivotTo","result","fetchPageWithErrors","each","k","opts","$__EXPERIMENTAL_strictNonNull","$includeRid","toHaveLength","includeRid","toThrowErrorMatchingInlineSnapshot","not","toBeUndefined","empNotStrict","cheesedFooNotStrict","$as","fooSpt"],"sources":["ObjectSet.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isOk } from \"@osdk/api\";\nimport { $ontologyRid, Employee, FooInterface, Office, } from \"@osdk/client.test.ontology\";\nimport { apiServer, stubData } from \"@osdk/shared.test\";\nimport { afterAll, beforeAll, describe, expect, expectTypeOf, it, } from \"vitest\";\nimport { createClient } from \"../createClient.js\";\ndescribe(\"ObjectSet\", () => {\n let client;\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\"https://stack.palantir.com\", $ontologyRid, async () => \"myAccessToken\");\n });\n afterAll(() => {\n apiServer.close();\n });\n it(\"does not allow intersect/union/subtract with different object types\", () => {\n const employeeObjectSet = client(Employee);\n const officeObjectSet = client(Office);\n // @ts-expect-error\n employeeObjectSet.union(officeObjectSet);\n // @ts-expect-error\n employeeObjectSet.subtract(officeObjectSet);\n // @ts-expect-error\n employeeObjectSet.intersect(officeObjectSet);\n });\n it(\"can be cast bidirectionally\", () => {\n function takesOldStyleObjectSet(os) {\n return os;\n }\n function takesNewStyleObjectSet(os) {\n return os;\n }\n function maybe() {\n const newStyleObjectSet = client(Employee);\n const oldStyleObjectSet = newStyleObjectSet;\n takesOldStyleObjectSet(newStyleObjectSet);\n takesNewStyleObjectSet(newStyleObjectSet);\n takesOldStyleObjectSet(oldStyleObjectSet);\n takesNewStyleObjectSet(oldStyleObjectSet);\n }\n if (false) {\n // here for a simple type check\n maybe();\n }\n });\n it(\"objects set union\", async () => {\n const objectSet = client(Employee);\n const unionedObjectSet = objectSet.union(objectSet);\n let iter = 0;\n const { data: employees } = await unionedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50030 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n });\n it(\"objects set subtract\", async () => {\n const objectSet = client(Employee);\n const objectSet2 = client(Employee).where({\n employeeId: 50030,\n });\n const subtractedObjectSet = objectSet.subtract(objectSet2);\n let iter = 0;\n const { data: employees } = await subtractedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50031 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n });\n it(\"objects set intersect\", async () => {\n const objectSet = client(Employee);\n const intersectedObjectSet = objectSet.intersect(objectSet);\n let iter = 0;\n const { data: employees } = await intersectedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50032);\n iter += 1;\n }\n expect(iter).toEqual(1);\n });\n it(\"orders objects in ascending order without a filter, and returns all results\", async () => {\n const { data: employees } = await client(Employee)\n .fetchPage({\n $orderBy: { \"employeeId\": \"asc\" },\n });\n expect(employees).toMatchObject([\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50030,\n class: \"Red\",\n employeeId: 50030,\n employeeStatus: expect.anything(),\n fullName: \"John Doe\",\n office: \"NYC\",\n startDate: \"2019-01-01\",\n employeeLocation: expect.anything(),\n },\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50031,\n $title: \"Jane Doe\",\n class: \"Blue\",\n employeeId: 50031,\n employeeStatus: expect.anything(),\n fullName: \"Jane Doe\",\n office: \"SEA\",\n startDate: \"2012-02-12\",\n employeeLocation: expect.anything(),\n },\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50032,\n $title: \"Jack Smith\",\n class: \"Red\",\n employeeId: 50032,\n employeeStatus: expect.anything(),\n fullName: \"Jack Smith\",\n office: \"LON\",\n startDate: \"2015-05-15\",\n employeeLocation: expect.anything(),\n },\n ]);\n });\n it(\"allows fetching by PK from a base object set - fetchOne\", async () => {\n const employee = await client(Employee).fetchOne(stubData.employee1.employeeId);\n expectTypeOf().toMatchTypeOf;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a base object set - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(stubData.employee1.employeeId);\n expectTypeOf().toMatchTypeOf;\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\"allows fetching by PK from a base object set with selected properties - fetchOne\", async () => {\n const employee = await client(Employee).fetchOne(stubData.employee1.employeeId, { $select: [\"fullName\"] });\n expectTypeOf().branded.toEqualTypeOf;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a base object set with selected properties - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(stubData.employee1.employeeId, { $select: [\"fullName\"] });\n expectTypeOf().branded.toEqualTypeOf;\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\"throws when fetching by PK with an object that does not exist - fetchOne\", async () => {\n await expect(client(Employee).fetchOne(-1)).rejects\n .toThrow();\n });\n it(\"throws when fetching by PK with an object that does not exist - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(-1);\n expectTypeOf().branded.toEqualTypeOf;\n expect(\"error\" in employeeResult);\n });\n it(\"allows fetching by PK from a pivoted object set - fetchOne\", async () => {\n const employee = await client(Employee).where({\n employeeId: stubData.employee2.employeeId,\n })\n .pivotTo(\"peeps\").fetchOne(stubData.employee1.employeeId);\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a pivoted object set - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee).where({\n employeeId: stubData.employee2.employeeId,\n })\n .pivotTo(\"peeps\").fetchOneWithErrors(stubData.employee1.employeeId);\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\" object set union works with fetchPageWithErrors\", async () => {\n const objectSet = client(Employee);\n const unionedObjectSet = objectSet.union(objectSet);\n let iter = 0;\n const result = await unionedObjectSet.fetchPageWithErrors();\n if (isOk(result)) {\n const employees = result.value.data;\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50030 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n }\n });\n describe.each([\"fetchPage\", \"fetchPageWithErrors\"])(\"%s\", (k) => {\n describe(\"strictNonNull: \\\"drop\\\"\", () => {\n describe(\"includeRid: true\", () => {\n it(\"drops bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: \"drop\",\n $includeRid: true,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(3);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n describe(\"includeRid: false\", () => {\n it(\"drops bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: \"drop\",\n $includeRid: false,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(3);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n });\n describe(\"strictNonNull: false\", () => {\n describe(\"includeRid: true\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n $includeRid: true,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(4);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n describe(\"includeRid: false\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n includeRid: false,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(4);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n });\n });\n describe(\"strictNonNull: \\\"throw\\\"\", () => {\n it(\"throws when getting bad data\", () => {\n expect(() => client(Employee).fetchPage({\n $__EXPERIMENTAL_strictNonNull: \"throw\",\n })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Unable to safely convert objects as some non nullable properties are null]`);\n });\n });\n describe.each([\"fetchOne\", \"fetchOneWithErrors\"])(\"%s\", (k) => {\n describe(\"strictNonNull: false\", () => {\n describe(\"includeRid: true\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n $includeRid: true,\n };\n const result = k === \"fetchOne\"\n ? await client(Employee).fetchOne(50033, opts)\n : (await client(Employee).fetchOneWithErrors(50033, opts)).value;\n expect(result).not.toBeUndefined();\n expectTypeOf(result).branded.toEqualTypeOf();\n });\n });\n describe(\"includeRid: false\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n includeRid: false,\n };\n const result = k === \"fetchOne\"\n ? await client(Employee).fetchOne(50033, opts)\n : (await client(Employee).fetchOneWithErrors(50033, opts)).value;\n expect(result).not.toBeUndefined();\n expectTypeOf(result).branded.toEqualTypeOf();\n });\n });\n });\n });\n describe(\"strictNonNull: \\\"throw\\\"\", () => {\n it(\"throws when getting bad data\", () => {\n expect(() => client(Employee).fetchPage({\n $__EXPERIMENTAL_strictNonNull: \"throw\",\n })).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: Unable to safely convert objects as some non nullable properties are null]`);\n });\n });\n describe(\"conversions\", () => {\n describe(\"strictNonNull: false\", () => {\n it(\"returns bad data\", async () => {\n const result = await client(Employee).fetchPage({\n $__EXPERIMENTAL_strictNonNull: false,\n });\n const empNotStrict = result.data[0];\n const empNotStrict2 = empNotStrict;\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict.employeeId).toEqualTypeOf();\n expectTypeOf(empNotStrict2.employeeId).toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n const CheesedFoo = FooInterface;\n const cheesedFooNotStrict = result.data[0].$as(CheesedFoo);\n expectTypeOf(cheesedFooNotStrict).branded.toEqualTypeOf();\n cheesedFooNotStrict.fooSpt;\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSet.test.js","names":["isOk","$ontologyRid","Employee","FooInterface","Office","apiServer","stubData","afterAll","beforeAll","describe","expect","expectTypeOf","it","createClient","client","listen","close","employeeObjectSet","officeObjectSet","union","subtract","intersect","objectSet","unionedObjectSet","iter","data","employees","fetchPage","emp","employeeId","toEqual","objectSet2","where","subtractedObjectSet","intersectedObjectSet","$orderBy","toMatchObject","$apiName","$objectType","$primaryKey","class","employeeStatus","anything","fullName","office","startDate","employeeLocation","$title","employee","fetchOne","employee1","toMatchTypeOf","toBe","employeeResult","fetchOneWithErrors","value","$select","branded","toEqualTypeOf","rejects","toThrow","employee2","pivotTo","result","fetchPageWithErrors","each","k","opts","$__EXPERIMENTAL_strictNonNull","$includeRid","toHaveLength","not","toBeUndefined","empNotStrict","cheesedFooNotStrict","$as","fooSpt"],"sources":["ObjectSet.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isOk } from \"@osdk/api\";\nimport { $ontologyRid, Employee, FooInterface, Office, } from \"@osdk/client.test.ontology\";\nimport { apiServer, stubData } from \"@osdk/shared.test\";\nimport { afterAll, beforeAll, describe, expect, expectTypeOf, it, } from \"vitest\";\nimport { createClient } from \"../createClient.js\";\ndescribe(\"ObjectSet\", () => {\n let client;\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\"https://stack.palantir.com\", $ontologyRid, async () => \"myAccessToken\");\n });\n afterAll(() => {\n apiServer.close();\n });\n it(\"does not allow intersect/union/subtract with different object types\", () => {\n const employeeObjectSet = client(Employee);\n const officeObjectSet = client(Office);\n // @ts-expect-error\n employeeObjectSet.union(officeObjectSet);\n // @ts-expect-error\n employeeObjectSet.subtract(officeObjectSet);\n // @ts-expect-error\n employeeObjectSet.intersect(officeObjectSet);\n });\n it(\"can be cast bidirectionally\", () => {\n function takesOldStyleObjectSet(os) {\n return os;\n }\n function takesNewStyleObjectSet(os) {\n return os;\n }\n function maybe() {\n const newStyleObjectSet = client(Employee);\n const oldStyleObjectSet = newStyleObjectSet;\n takesOldStyleObjectSet(newStyleObjectSet);\n takesNewStyleObjectSet(newStyleObjectSet);\n takesOldStyleObjectSet(oldStyleObjectSet);\n takesNewStyleObjectSet(oldStyleObjectSet);\n }\n if (false) {\n // here for a simple type check\n maybe();\n }\n });\n it(\"objects set union\", async () => {\n const objectSet = client(Employee);\n const unionedObjectSet = objectSet.union(objectSet);\n let iter = 0;\n const { data: employees } = await unionedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50030 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n });\n it(\"objects set subtract\", async () => {\n const objectSet = client(Employee);\n const objectSet2 = client(Employee).where({\n employeeId: 50030,\n });\n const subtractedObjectSet = objectSet.subtract(objectSet2);\n let iter = 0;\n const { data: employees } = await subtractedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50031 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n });\n it(\"objects set intersect\", async () => {\n const objectSet = client(Employee);\n const intersectedObjectSet = objectSet.intersect(objectSet);\n let iter = 0;\n const { data: employees } = await intersectedObjectSet.fetchPage();\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50032);\n iter += 1;\n }\n expect(iter).toEqual(1);\n });\n it(\"orders objects in ascending order without a filter, and returns all results\", async () => {\n const { data: employees } = await client(Employee)\n .fetchPage({\n $orderBy: { \"employeeId\": \"asc\" },\n });\n expect(employees).toMatchObject([\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50030,\n class: \"Red\",\n employeeId: 50030,\n employeeStatus: expect.anything(),\n fullName: \"John Doe\",\n office: \"NYC\",\n startDate: \"2019-01-01\",\n employeeLocation: expect.anything(),\n },\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50031,\n $title: \"Jane Doe\",\n class: \"Blue\",\n employeeId: 50031,\n employeeStatus: expect.anything(),\n fullName: \"Jane Doe\",\n office: \"SEA\",\n startDate: \"2012-02-12\",\n employeeLocation: expect.anything(),\n },\n {\n $apiName: \"Employee\",\n $objectType: \"Employee\",\n $primaryKey: 50032,\n $title: \"Jack Smith\",\n class: \"Red\",\n employeeId: 50032,\n employeeStatus: expect.anything(),\n fullName: \"Jack Smith\",\n office: \"LON\",\n startDate: \"2015-05-15\",\n employeeLocation: expect.anything(),\n },\n ]);\n });\n it(\"allows fetching by PK from a base object set - fetchOne\", async () => {\n const employee = await client(Employee).fetchOne(stubData.employee1.employeeId);\n expectTypeOf().toMatchTypeOf;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a base object set - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(stubData.employee1.employeeId);\n expectTypeOf().toMatchTypeOf;\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\"allows fetching by PK from a base object set with selected properties - fetchOne\", async () => {\n const employee = await client(Employee).fetchOne(stubData.employee1.employeeId, { $select: [\"fullName\"] });\n expectTypeOf().branded.toEqualTypeOf;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a base object set with selected properties - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(stubData.employee1.employeeId, { $select: [\"fullName\"] });\n expectTypeOf().branded.toEqualTypeOf;\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\"throws when fetching by PK with an object that does not exist - fetchOne\", async () => {\n await expect(client(Employee).fetchOne(-1)).rejects\n .toThrow();\n });\n it(\"throws when fetching by PK with an object that does not exist - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee)\n .fetchOneWithErrors(-1);\n expectTypeOf().branded.toEqualTypeOf;\n expect(\"error\" in employeeResult);\n });\n it(\"allows fetching by PK from a pivoted object set - fetchOne\", async () => {\n const employee = await client(Employee).where({\n employeeId: stubData.employee2.employeeId,\n })\n .pivotTo(\"peeps\").fetchOne(stubData.employee1.employeeId);\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n });\n it(\"allows fetching by PK from a pivoted object set - fetchOneWithErrors\", async () => {\n const employeeResult = await client(Employee).where({\n employeeId: stubData.employee2.employeeId,\n })\n .pivotTo(\"peeps\").fetchOneWithErrors(stubData.employee1.employeeId);\n if (isOk(employeeResult)) {\n const employee = employeeResult.value;\n expect(employee.$primaryKey).toBe(stubData.employee1.employeeId);\n }\n });\n it(\" object set union works with fetchPageWithErrors\", async () => {\n const objectSet = client(Employee);\n const unionedObjectSet = objectSet.union(objectSet);\n let iter = 0;\n const result = await unionedObjectSet.fetchPageWithErrors();\n if (isOk(result)) {\n const employees = result.value.data;\n for (const emp of employees) {\n expect(emp.employeeId).toEqual(50030 + iter);\n iter += 1;\n }\n expect(iter).toEqual(2);\n }\n });\n describe.each([\"fetchPage\", \"fetchPageWithErrors\"])(\"%s\", (k) => {\n // describe(\"strictNonNull: \\\"drop\\\"\", () => {\n // describe(\"includeRid: true\", () => {\n // it(\"drops bad data\", async () => {\n // const opts = {\n // $__EXPERIMENTAL_strictNonNull: \"drop\",\n // $includeRid: true,\n // } as const;\n // const result = k === \"fetchPage\"\n // ? await client(Employee).fetchPage(opts)\n // : (await client(Employee).fetchPageWithErrors(opts)).value!;\n // expect(result.data).toHaveLength(3);\n // expectTypeOf(result.data[0]).branded.toEqualTypeOf<\n // Osdk<Employee, \"$rid\" | \"$all\">\n // >();\n // expectTypeOf(result.data[0]).branded.toEqualTypeOf<\n // Employee.OsdkObject<\"$rid\">\n // >();\n // });\n // });\n // describe(\"includeRid: false\", () => {\n // it(\"drops bad data\", async () => {\n // const opts = {\n // $__EXPERIMENTAL_strictNonNull: \"drop\",\n // $includeRid: false,\n // } as const;\n // const result = k === \"fetchPage\"\n // ? await client(Employee).fetchPage(opts)\n // : (await client(Employee).fetchPageWithErrors(opts)).value!;\n // expect(result.data).toHaveLength(3);\n // expectTypeOf(result.data[0]).branded.toEqualTypeOf<Osdk<Employee>>();\n // expectTypeOf(result.data[0]).branded.toEqualTypeOf<\n // Employee.OsdkObject\n // >();\n // expectTypeOf(result.data[0]).branded.toEqualTypeOf<\n // Employee.OsdkObject<never>\n // >();\n // });\n // });\n // });\n describe(\"strictNonNull: false\", () => {\n describe(\"includeRid: true\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n $includeRid: true,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(4);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n describe(\"includeRid: false\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $includeRid: false,\n };\n const result = k === \"fetchPage\"\n ? await client(Employee).fetchPage(opts)\n : (await client(Employee).fetchPageWithErrors(opts)).value;\n expect(result.data).toHaveLength(4);\n expectTypeOf(result.data[0]).branded.toEqualTypeOf();\n });\n });\n });\n });\n describe.each([\"fetchOne\", \"fetchOneWithErrors\"])(\"%s\", (k) => {\n describe(\"strictNonNull: false\", () => {\n describe(\"includeRid: true\", () => {\n it(\"returns bad data\", async () => {\n // Look at this\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n $includeRid: true,\n };\n const result = k === \"fetchOne\"\n ? await client(Employee).fetchOne(50033, opts)\n : (await client(Employee).fetchOneWithErrors(50033, opts)).value;\n expect(result).not.toBeUndefined();\n expectTypeOf(result).branded.toEqualTypeOf();\n });\n });\n describe(\"includeRid: false\", () => {\n it(\"returns bad data\", async () => {\n const opts = {\n $__EXPERIMENTAL_strictNonNull: false,\n $includeRid: false,\n };\n const result = k === \"fetchOne\"\n ? await client(Employee).fetchOne(50033, opts)\n : (await client(Employee).fetchOneWithErrors(50033, opts)).value;\n expect(result).not.toBeUndefined();\n expectTypeOf(result).branded.toEqualTypeOf();\n });\n });\n });\n });\n describe(\"conversions\", () => {\n describe(\"strictNonNull: false\", () => {\n it(\"returns bad data\", async () => {\n const result = await client(Employee).fetchPage({});\n const empNotStrict = result.data[0];\n const empNotStrict2 = empNotStrict;\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict).branded.toEqualTypeOf();\n expectTypeOf(empNotStrict.employeeId).toEqualTypeOf();\n expectTypeOf(empNotStrict2.employeeId).toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n expectTypeOf()\n .toEqualTypeOf();\n const CheesedFoo = FooInterface;\n const cheesedFooNotStrict = result.data[0].$as(CheesedFoo);\n expectTypeOf(cheesedFooNotStrict).branded.toEqualTypeOf();\n cheesedFooNotStrict.fooSpt;\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
import WebSocket from "isomorphic-ws";
|
|
17
17
|
import invariant from "tiny-invariant";
|
|
18
18
|
import { convertWireToOsdkObjects } from "../object/convertWireToOsdkObjects.js";
|
|
19
|
-
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
20
19
|
const MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;
|
|
21
20
|
/** Noop function to reduce conditional checks */
|
|
22
21
|
function doNothing() {}
|
|
@@ -26,12 +25,14 @@ function doNothing() {}
|
|
|
26
25
|
function fillOutListener({
|
|
27
26
|
onChange = doNothing,
|
|
28
27
|
onError = doNothing,
|
|
29
|
-
onOutOfDate = doNothing
|
|
28
|
+
onOutOfDate = doNothing,
|
|
29
|
+
onSuccessfulSubscription = doNothing
|
|
30
30
|
}) {
|
|
31
31
|
return {
|
|
32
32
|
onChange,
|
|
33
33
|
onError,
|
|
34
|
-
onOutOfDate
|
|
34
|
+
onOutOfDate,
|
|
35
|
+
onSuccessfulSubscription
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
function isReady(sub) {
|
|
@@ -43,7 +44,6 @@ function subscriptionIsDone(sub) {
|
|
|
43
44
|
/** @internal */
|
|
44
45
|
export class ObjectSetListenerWebsocket {
|
|
45
46
|
static #instances = new WeakMap();
|
|
46
|
-
OBJECT_SET_EXPIRY_MS;
|
|
47
47
|
MINIMUM_RECONNECT_DELAY_MS;
|
|
48
48
|
// FIXME
|
|
49
49
|
static getInstance(client) {
|
|
@@ -70,16 +70,14 @@ export class ObjectSetListenerWebsocket {
|
|
|
70
70
|
#maybeDisconnectTimeout;
|
|
71
71
|
// DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM
|
|
72
72
|
constructor(client, {
|
|
73
|
-
objectSetExpiryMs = ONE_DAY_MS,
|
|
74
73
|
minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS
|
|
75
74
|
} = {}) {
|
|
76
|
-
this.OBJECT_SET_EXPIRY_MS = objectSetExpiryMs;
|
|
77
75
|
this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;
|
|
78
76
|
this.#client = client;
|
|
79
77
|
this.#logger = client.logger?.child({}, {
|
|
80
78
|
msgPrefix: "<OSW> "
|
|
81
79
|
});
|
|
82
|
-
!(client.baseUrl.startsWith("https://") || client.baseUrl.startsWith("http://")) ? invariant(false, "Stack must be a URL") : void 0;
|
|
80
|
+
!(client.baseUrl.startsWith("https://") || client.baseUrl.startsWith("http://")) ? process.env.NODE_ENV !== "production" ? invariant(false, "Stack must be a URL") : invariant(false) : void 0;
|
|
83
81
|
}
|
|
84
82
|
async subscribe(objectType, objectSet, listener, properties) {
|
|
85
83
|
const objDef = await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName);
|
|
@@ -114,16 +112,9 @@ export class ObjectSetListenerWebsocket {
|
|
|
114
112
|
* @returns
|
|
115
113
|
*/
|
|
116
114
|
async #initiateSubscribe(sub) {
|
|
117
|
-
if (process
|
|
115
|
+
if (process.env.NODE_ENV !== "production") {
|
|
118
116
|
this.#logger?.trace("#initiateSubscribe()");
|
|
119
117
|
}
|
|
120
|
-
if (sub.expiry) {
|
|
121
|
-
clearTimeout(sub.expiry);
|
|
122
|
-
}
|
|
123
|
-
// expiry is tied to the temporary object set, which is set to `timeToLive: "ONE_DAY"`
|
|
124
|
-
// in `#createTemporaryObjectSet`. They should be in sync
|
|
125
|
-
sub.expiry = setTimeout(() => this.#expire(sub), this.OBJECT_SET_EXPIRY_MS);
|
|
126
|
-
await this.#client.ontologyRid;
|
|
127
118
|
try {
|
|
128
119
|
await this.#ensureWebsocket();
|
|
129
120
|
// the consumer may have already unsubscribed before we are ready to request a subscription
|
|
@@ -142,7 +133,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
142
133
|
}
|
|
143
134
|
}
|
|
144
135
|
#sendSubscribeMessage() {
|
|
145
|
-
if (process
|
|
136
|
+
if (process.env.NODE_ENV !== "production") {
|
|
146
137
|
this.#logger?.trace("#sendSubscribeMessage()");
|
|
147
138
|
}
|
|
148
139
|
// If two calls to `.subscribe()` happen at once (or if the connection is reset),
|
|
@@ -150,7 +141,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
150
141
|
// so we filter those out.
|
|
151
142
|
const readySubs = [...this.#subscriptions.values()].filter(isReady);
|
|
152
143
|
if (readySubs.length === 0) {
|
|
153
|
-
if (process
|
|
144
|
+
if (process.env.NODE_ENV !== "production") {
|
|
154
145
|
this.#logger?.trace("#sendSubscribeMessage(): aborting due to no ready subscriptions");
|
|
155
146
|
}
|
|
156
147
|
return;
|
|
@@ -175,24 +166,13 @@ export class ObjectSetListenerWebsocket {
|
|
|
175
166
|
};
|
|
176
167
|
})
|
|
177
168
|
};
|
|
178
|
-
if (process
|
|
169
|
+
if (process.env.NODE_ENV !== "production") {
|
|
179
170
|
this.#logger?.trace({
|
|
180
171
|
payload: subscribe
|
|
181
172
|
}, "sending subscribe message");
|
|
182
173
|
}
|
|
183
174
|
this.#ws?.send(JSON.stringify(subscribe));
|
|
184
175
|
}
|
|
185
|
-
#expire(sub) {
|
|
186
|
-
if (process?.env?.NODE_ENV !== "production") {
|
|
187
|
-
this.#logger?.trace({
|
|
188
|
-
subscription: sub
|
|
189
|
-
}, "#expire()");
|
|
190
|
-
}
|
|
191
|
-
// the temporary ObjectSet has expired, we should re-subscribe which will cause the
|
|
192
|
-
// listener to get an onOutOfDate message when it becomes subscribed again
|
|
193
|
-
sub.status = "expired";
|
|
194
|
-
this.#initiateSubscribe(sub);
|
|
195
|
-
}
|
|
196
176
|
#unsubscribe(sub, newStatus = "done") {
|
|
197
177
|
if (subscriptionIsDone(sub)) {
|
|
198
178
|
// if we are already done, we don't need to do anything
|
|
@@ -201,11 +181,8 @@ export class ObjectSetListenerWebsocket {
|
|
|
201
181
|
sub.status = newStatus;
|
|
202
182
|
// make sure listeners do nothing now
|
|
203
183
|
sub.listener = fillOutListener({});
|
|
204
|
-
if (sub.expiry) {
|
|
205
|
-
clearTimeout(sub.expiry);
|
|
206
|
-
sub.expiry = undefined;
|
|
207
|
-
}
|
|
208
184
|
this.#subscriptions.delete(sub.subscriptionId);
|
|
185
|
+
this.#sendSubscribeMessage();
|
|
209
186
|
// If we have no more subscriptions, we can disconnect the websocket
|
|
210
187
|
// however we should wait a bit to see if we get any more subscriptions.
|
|
211
188
|
// For example, when switching between react views, you may unsubscribe
|
|
@@ -252,7 +229,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
252
229
|
this.#lastWsConnect = Date.now();
|
|
253
230
|
// we again may have lost the race after our minimum backoff time
|
|
254
231
|
if (this.#ws == null) {
|
|
255
|
-
if (process
|
|
232
|
+
if (process.env.NODE_ENV !== "production") {
|
|
256
233
|
this.#logger?.trace("Creating websocket");
|
|
257
234
|
}
|
|
258
235
|
this.#ws = new WebSocket(url, [`Bearer-${token}`]);
|
|
@@ -292,7 +269,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
292
269
|
};
|
|
293
270
|
#onMessage = async message => {
|
|
294
271
|
const data = JSON.parse(message.data.toString());
|
|
295
|
-
if (process
|
|
272
|
+
if (process.env.NODE_ENV !== "production") {
|
|
296
273
|
this.#logger?.trace({
|
|
297
274
|
payload: data
|
|
298
275
|
}, "received message from ws");
|
|
@@ -309,12 +286,12 @@ export class ObjectSetListenerWebsocket {
|
|
|
309
286
|
return this.#handleMessage_subscriptionClosed(data);
|
|
310
287
|
}
|
|
311
288
|
default:
|
|
312
|
-
invariant(false, "Unexpected message type");
|
|
289
|
+
process.env.NODE_ENV !== "production" ? invariant(false, "Unexpected message type") : invariant(false);
|
|
313
290
|
}
|
|
314
291
|
};
|
|
315
292
|
#handleMessage_objectSetChanged = async payload => {
|
|
316
293
|
const sub = this.#subscriptions.get(payload.id);
|
|
317
|
-
|
|
294
|
+
if (sub == null) return;
|
|
318
295
|
const objectUpdates = payload.updates.filter(update => update.type === "object");
|
|
319
296
|
const referenceUpdates = payload.updates.filter(update => update.type === "reference");
|
|
320
297
|
const osdkObjectsWithReferenceUpdates = await Promise.all(referenceUpdates.map(async o => {
|
|
@@ -355,7 +332,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
355
332
|
};
|
|
356
333
|
#handleMessage_refreshObjectSet = payload => {
|
|
357
334
|
const sub = this.#subscriptions.get(payload.id);
|
|
358
|
-
!sub ? invariant(false, `Expected subscription id ${payload.id}`) : void 0;
|
|
335
|
+
!sub ? process.env.NODE_ENV !== "production" ? invariant(false, `Expected subscription id ${payload.id}`) : invariant(false) : void 0;
|
|
359
336
|
sub.listener.onOutOfDate();
|
|
360
337
|
};
|
|
361
338
|
#handleMessage_subscribeResponses = payload => {
|
|
@@ -364,7 +341,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
364
341
|
responses
|
|
365
342
|
} = payload;
|
|
366
343
|
const subs = this.#pendingSubscriptions.get(id);
|
|
367
|
-
!subs ? invariant(false, `should have a pending subscription for ${id}`) : void 0;
|
|
344
|
+
!subs ? process.env.NODE_ENV !== "production" ? invariant(false, `should have a pending subscription for ${id}`) : invariant(false) : void 0;
|
|
368
345
|
this.#pendingSubscriptions.delete(id);
|
|
369
346
|
for (let i = 0; i < responses.length; i++) {
|
|
370
347
|
const sub = subs[i];
|
|
@@ -381,7 +358,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
381
358
|
case "success":
|
|
382
359
|
// `"preparing"` should only be the status on an initial subscribe.
|
|
383
360
|
const shouldFireOutOfDate = sub.status === "expired" || sub.status === "reconnecting";
|
|
384
|
-
if (process
|
|
361
|
+
if (process.env.NODE_ENV !== "production") {
|
|
385
362
|
this.#logger?.trace({
|
|
386
363
|
shouldFireOutOfDate
|
|
387
364
|
}, "success");
|
|
@@ -393,7 +370,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
393
370
|
sub.subscriptionId = response.id;
|
|
394
371
|
this.#subscriptions.set(sub.subscriptionId, sub); // future messages come by this subId
|
|
395
372
|
}
|
|
396
|
-
if (shouldFireOutOfDate) sub.listener.onOutOfDate();
|
|
373
|
+
if (shouldFireOutOfDate) sub.listener.onOutOfDate();else sub.listener.onSuccessfulSubscription();
|
|
397
374
|
break;
|
|
398
375
|
default:
|
|
399
376
|
sub.listener.onError(response);
|
|
@@ -402,12 +379,12 @@ export class ObjectSetListenerWebsocket {
|
|
|
402
379
|
};
|
|
403
380
|
#handleMessage_subscriptionClosed(payload) {
|
|
404
381
|
const sub = this.#subscriptions.get(payload.id);
|
|
405
|
-
!sub ? invariant(false, `Expected subscription id ${payload.id}`) : void 0;
|
|
382
|
+
!sub ? process.env.NODE_ENV !== "production" ? invariant(false, `Expected subscription id ${payload.id}`) : invariant(false) : void 0;
|
|
406
383
|
sub.listener.onError([payload.cause]);
|
|
407
384
|
this.#unsubscribe(sub, "error");
|
|
408
385
|
}
|
|
409
386
|
#onClose = event => {
|
|
410
|
-
if (process
|
|
387
|
+
if (process.env.NODE_ENV !== "production") {
|
|
411
388
|
this.#logger?.trace({
|
|
412
389
|
event
|
|
413
390
|
}, "Received close event from ws", event);
|
|
@@ -427,9 +404,9 @@ export class ObjectSetListenerWebsocket {
|
|
|
427
404
|
}
|
|
428
405
|
// if we have any listeners that are still depending on us, go ahead and reopen the websocket
|
|
429
406
|
if (this.#subscriptions.size > 0) {
|
|
430
|
-
if (process
|
|
407
|
+
if (process.env.NODE_ENV !== "production") {
|
|
431
408
|
for (const s of this.#subscriptions.values()) {
|
|
432
|
-
!(s.status !== "done" && s.status !== "error") ? invariant(false, "should not have done/error subscriptions still") : void 0;
|
|
409
|
+
!(s.status !== "done" && s.status !== "error") ? process.env.NODE_ENV !== "production" ? invariant(false, "should not have done/error subscriptions still") : invariant(false) : void 0;
|
|
433
410
|
}
|
|
434
411
|
}
|
|
435
412
|
for (const s of this.#subscriptions.values()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","convertWireToOsdkObjects","ONE_DAY_MS","MINIMUM_RECONNECT_DELAY_MS","doNothing","fillOutListener","onChange","onError","onOutOfDate","isReady","sub","subscriptionIsDone","status","ObjectSetListenerWebsocket","instances","WeakMap","OBJECT_SET_EXPIRY_MS","getInstance","client","instance","get","clientCacheKey","set","ws","lastWsConnect","logger","pendingSubscriptions","Map","subscriptions","maybeDisconnectTimeout","constructor","objectSetExpiryMs","minimumReconnectDelayMs","child","msgPrefix","baseUrl","startsWith","subscribe","objectType","objectSet","listener","properties","objDef","ontologyProvider","getObjectDefinition","apiName","objectProperties","filter","p","type","referenceProperties","primaryKeyPropertyName","primaryKeyApiName","requestedProperties","requestedReferenceProperties","subscriptionId","crypto","randomUUID","initiateSubscribe","unsubscribe","#initiateSubscribe","process","env","NODE_ENV","trace","expiry","clearTimeout","setTimeout","expire","ontologyRid","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","#sendSubscribeMessage","readySubs","values","length","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#expire","subscription","#unsubscribe","newStatus","undefined","delete","size","cycleWebsocket","#ensureWebsocket","tokenProvider","base","URL","url","host","token","nextConnectTime","Date","now","Promise","resolve","addEventListener","onClose","onMessage","onOpen","CONNECTING","reject","cleanup","removeEventListener","open","evt","#onOpen","message","data","parse","toString","handleMessage_objectSetChanged","handleMessage_refreshObjectSet","handleMessage_subscribeResponses","handleMessage_subscriptionClosed","objectUpdates","updates","update","referenceUpdates","osdkObjectsWithReferenceUpdates","all","o","osdkObjectArray","__apiName","__primaryKey","primaryKey","property","value","singleOsdkObject","object","state","osdkObject","osdkObjects","keysToDelete","Object","keys","key","includes","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","cause","event","#cycleWebsocket","CLOSING","CLOSED","close","s"],"sources":["ObjectSetListenerWebsocket.js"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport { convertWireToOsdkObjects } from \"../object/convertWireToOsdkObjects.js\";\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\n/** Noop function to reduce conditional checks */\nfunction doNothing() { }\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener({ onChange = doNothing, onError = doNothing, onOutOfDate = doNothing, }) {\n return { onChange, onError, onOutOfDate };\n}\nfunction isReady(sub) {\n return sub.isReady != null;\n}\nfunction subscriptionIsDone(sub) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap();\n OBJECT_SET_EXPIRY_MS;\n MINIMUM_RECONNECT_DELAY_MS;\n // FIXME\n static getInstance(client) {\n let instance = ObjectSetListenerWebsocket.#instances.get(client.clientCacheKey);\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(client.clientCacheKey, instance);\n }\n return instance;\n }\n #ws;\n #lastWsConnect = 0;\n #client;\n #logger;\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map();\n /**\n * Map of subscriptionId to Subscription. Note: the subscriptionId may be\n * temporary and not the actual subscriptionId from the server.\n */\n #subscriptions = new Map();\n #maybeDisconnectTimeout;\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(client, { objectSetExpiryMs = ONE_DAY_MS, minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS, } = {}) {\n this.OBJECT_SET_EXPIRY_MS = objectSetExpiryMs;\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"), \"Stack must be a URL\");\n }\n async subscribe(objectType, objectSet, listener, properties) {\n if (process.env.TARGET !== \"browser\") {\n // Node 18 does not expose 'crypto' on globalThis, so we need to do it ourselves. This\n // will not be needed after our minimum version is 19 or greater.\n globalThis.crypto ??= (await import(\"node:crypto\")).webcrypto;\n }\n const objDef = await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName);\n const objectProperties = properties.filter((p) => objDef.properties[p].type !== \"geotimeSeriesReference\");\n const referenceProperties = properties.filter((p) => objDef.properties[p].type === \"geotimeSeriesReference\");\n const sub = {\n listener: fillOutListener(listener),\n objectSet,\n primaryKeyPropertyName: objDef.primaryKeyApiName,\n requestedProperties: objectProperties,\n requestedReferenceProperties: referenceProperties,\n status: \"preparing\",\n // Since we don't have a real subscription id yet but we need to keep\n // track of this reference, we can just use a random uuid.\n subscriptionId: `TMP-${crypto.randomUUID()}`,\n };\n this.#subscriptions.set(sub.subscriptionId, sub);\n // actually prepares the subscription, ensures the ws is ready, and sends\n // a subscribe message. We don't want to block on this.\n this.#initiateSubscribe(sub);\n return () => {\n this.#unsubscribe(sub);\n };\n }\n /**\n * Called at least once for every subscription.\n *\n * - Resets pending expiry\n * - Recreates temporary object set\n * - Triggers a full subscribe message\n *\n * @returns\n */\n async #initiateSubscribe(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#initiateSubscribe()\");\n }\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n }\n // expiry is tied to the temporary object set, which is set to `timeToLive: \"ONE_DAY\"`\n // in `#createTemporaryObjectSet`. They should be in sync\n sub.expiry = setTimeout(() => this.#expire(sub), this.OBJECT_SET_EXPIRY_MS);\n const ontologyRid = await this.#client.ontologyRid;\n try {\n await this.#ensureWebsocket();\n // the consumer may have already unsubscribed before we are ready to request a subscription\n // so we have to acquire the pendingSubscription after the await.\n if (subscriptionIsDone(sub)) {\n return;\n }\n sub.isReady = true;\n // if we aren't open, then this happens after we #onConnect\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#sendSubscribeMessage();\n }\n }\n catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n sub.listener.onError([error]);\n }\n }\n #sendSubscribeMessage() {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage()\");\n }\n // If two calls to `.subscribe()` happen at once (or if the connection is reset),\n // we may have multiple subscriptions that don't have a subscriptionId yet,\n // so we filter those out.\n const readySubs = [...this.#subscriptions.values()].filter(isReady);\n if (readySubs.length === 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage(): aborting due to no ready subscriptions\");\n }\n return;\n }\n // Assumes the node 18 crypto fallback to globalThis in `subscribe` has happened.\n const id = crypto.randomUUID();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n // every subscribe message \"overwrites\" the previous ones that are not\n // re-included, so we have to reconstitute the entire list of subscriptions\n const subscribe = {\n id,\n requests: readySubs.map(({ objectSet, requestedProperties, requestedReferenceProperties }) => {\n return {\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: requestedReferenceProperties,\n };\n }),\n };\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: subscribe }, \"sending subscribe message\");\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n #expire(sub) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ subscription: sub }, \"#expire()\");\n }\n // the temporary ObjectSet has expired, we should re-subscribe which will cause the\n // listener to get an onOutOfDate message when it becomes subscribed again\n sub.status = \"expired\";\n this.#initiateSubscribe(sub);\n }\n #unsubscribe(sub, newStatus = \"done\") {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n sub.status = newStatus;\n // make sure listeners do nothing now\n sub.listener = fillOutListener({});\n if (sub.expiry) {\n clearTimeout(sub.expiry);\n sub.expiry = undefined;\n }\n this.#subscriptions.delete(sub.subscriptionId);\n // If we have no more subscriptions, we can disconnect the websocket\n // however we should wait a bit to see if we get any more subscriptions.\n // For example, when switching between react views, you may unsubscribe\n // in the old view and subscribe in the new view. We don't need to re-establish\n // the websocket connection in that case.\n if (this.#maybeDisconnectTimeout) {\n // We reset the timeout on every unsubscribe so its always at least 15s from\n // the last time we are empty. E.g.:\n // - 0s: Subscribe(A)\n // - 10s: Unsubscribe(A)\n // - 11s: Subscribe(B)\n // - 20s: Unsubscribe(B)\n // If we do not clear out the timeout we would disconnect at 25s but that would only be\n // 5s after the last subscription was removed instead of at 35s for the desired 15s.\n clearTimeout(this.#maybeDisconnectTimeout);\n }\n this.#maybeDisconnectTimeout = setTimeout(() => {\n this.#maybeDisconnectTimeout = undefined;\n if (this.#subscriptions.size === 0) {\n this.#cycleWebsocket();\n }\n }, 15_000 /* ms */);\n }\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const base = new URL(baseUrl);\n const url = `wss://${base.host}/api/v2/ontologySubscriptions/ontologies/${this.#client.ontologyRid}/streamSubscriptions`;\n const token = await tokenProvider();\n // tokenProvider is async, there could potentially be a race to create the websocket.\n // Only the first call to reach here will find a null this.#ws, the rest will bail out\n if (this.#ws == null) {\n // TODO this can probably be exponential backoff with jitter\n // don't reconnect more quickly than MINIMUM_RECONNECT_DELAY\n const nextConnectTime = (this.#lastWsConnect ?? 0)\n + this.MINIMUM_RECONNECT_DELAY_MS;\n if (nextConnectTime > Date.now()) {\n await new Promise((resolve) => {\n setTimeout(resolve, nextConnectTime - Date.now());\n });\n }\n this.#lastWsConnect = Date.now();\n // we again may have lost the race after our minimum backoff time\n if (this.#ws == null) {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"Creating websocket\");\n }\n this.#ws = new WebSocket(url, [`Bearer-${token}`]);\n this.#ws.addEventListener(\"close\", this.#onClose);\n this.#ws.addEventListener(\"message\", this.#onMessage);\n this.#ws.addEventListener(\"open\", this.#onOpen);\n }\n }\n // Allow await-ing the websocket open event if it isn't open already.\n // This needs to happen even for callers that didn't just create this.#ws\n if (this.#ws.readyState === WebSocket.CONNECTING) {\n const ws = this.#ws;\n return new Promise((resolve, reject) => {\n function cleanup() {\n ws.removeEventListener(\"open\", open);\n ws.removeEventListener(\"error\", error);\n ws.removeEventListener(\"close\", cleanup);\n }\n function open() {\n cleanup();\n resolve();\n }\n function error(evt) {\n cleanup();\n reject(evt);\n }\n ws.addEventListener(\"open\", open);\n ws.addEventListener(\"error\", error);\n ws.addEventListener(\"close\", cleanup);\n });\n }\n }\n }\n #onOpen = () => {\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n #onMessage = async (message) => {\n const data = JSON.parse(message.data.toString());\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n return this.#handleMessage_objectSetChanged(data);\n case \"refreshObjectSet\":\n return this.#handleMessage_refreshObjectSet(data);\n case \"subscribeResponses\":\n return this.#handleMessage_subscribeResponses(data);\n case \"subscriptionClosed\": {\n return this.#handleMessage_subscriptionClosed(data);\n }\n default:\n const _ = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n #handleMessage_objectSetChanged = async (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n const objectUpdates = payload.updates.filter((update) => update.type === \"object\");\n const referenceUpdates = payload.updates.filter((update) => update.type === \"reference\");\n const osdkObjectsWithReferenceUpdates = await Promise.all(referenceUpdates.map(async (o) => {\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [{\n __apiName: o.objectType,\n __primaryKey: o.primaryKey[sub.primaryKeyPropertyName],\n ...o.primaryKey,\n [o.property]: o.value,\n }], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: \"ADDED_OR_UPDATED\",\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjectsWithReferenceUpdates) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const keysToDelete = Object.keys(o.object).filter((key) => sub.requestedReferenceProperties.includes(key));\n for (const key of keysToDelete) {\n delete o.object[key];\n }\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [o.object], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n };\n #handleMessage_refreshObjectSet = (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onOutOfDate();\n };\n #handleMessage_subscribeResponses = (payload) => {\n const { id, responses } = payload;\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n switch (response.type) {\n case \"error\":\n sub.listener.onError(response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n case \"qos\":\n // the server has requested that we tear down our websocket and reconnect to help load balance\n this.#cycleWebsocket();\n break;\n case \"success\":\n // `\"preparing\"` should only be the status on an initial subscribe.\n const shouldFireOutOfDate = sub.status === \"expired\"\n || sub.status === \"reconnecting\";\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ shouldFireOutOfDate }, \"success\");\n }\n sub.status = \"subscribed\";\n if (sub.subscriptionId !== response.id) {\n // might be the temporary one\n this.#subscriptions.delete(sub.subscriptionId);\n sub.subscriptionId = response.id;\n this.#subscriptions.set(sub.subscriptionId, sub); // future messages come by this subId\n }\n if (shouldFireOutOfDate)\n sub.listener.onOutOfDate();\n break;\n default:\n const _ = response;\n sub.listener.onError(response);\n }\n }\n };\n #handleMessage_subscriptionClosed(payload) {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onError([payload.cause]);\n this.#unsubscribe(sub, \"error\");\n }\n #onClose = (event) => {\n if (process?.env?.NODE_ENV !== \"production\") {\n this.#logger?.trace({ event }, \"Received close event from ws\", event);\n }\n // TODO we should probably throttle this so we don't abuse the backend\n this.#cycleWebsocket();\n };\n #cycleWebsocket = () => {\n if (this.#ws) {\n this.#ws.removeEventListener(\"open\", this.#onOpen);\n this.#ws.removeEventListener(\"message\", this.#onMessage);\n this.#ws.removeEventListener(\"close\", this.#onClose);\n if (this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\n // if we have any listeners that are still depending on us, go ahead and reopen the websocket\n if (this.#subscriptions.size > 0) {\n if (process?.env?.NODE_ENV !== \"production\") {\n for (const s of this.#subscriptions.values()) {\n invariant(s.status !== \"done\" && s.status !== \"error\", \"should not have done/error subscriptions still\");\n }\n }\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\")\n s.status = \"reconnecting\";\n }\n this.#ensureWebsocket();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","convertWireToOsdkObjects","MINIMUM_RECONNECT_DELAY_MS","doNothing","fillOutListener","onChange","onError","onOutOfDate","onSuccessfulSubscription","isReady","sub","subscriptionIsDone","status","ObjectSetListenerWebsocket","instances","WeakMap","getInstance","client","instance","get","clientCacheKey","set","ws","lastWsConnect","logger","pendingSubscriptions","Map","subscriptions","maybeDisconnectTimeout","constructor","minimumReconnectDelayMs","child","msgPrefix","baseUrl","startsWith","process","env","NODE_ENV","subscribe","objectType","objectSet","listener","properties","objDef","ontologyProvider","getObjectDefinition","apiName","objectProperties","filter","p","type","referenceProperties","primaryKeyPropertyName","primaryKeyApiName","requestedProperties","requestedReferenceProperties","subscriptionId","crypto","randomUUID","initiateSubscribe","unsubscribe","#initiateSubscribe","trace","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","#sendSubscribeMessage","readySubs","values","length","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#unsubscribe","newStatus","delete","clearTimeout","setTimeout","undefined","size","cycleWebsocket","#ensureWebsocket","tokenProvider","base","URL","url","host","ontologyRid","token","nextConnectTime","Date","now","Promise","resolve","addEventListener","onClose","onMessage","onOpen","CONNECTING","reject","cleanup","removeEventListener","open","evt","#onOpen","message","data","parse","toString","handleMessage_objectSetChanged","handleMessage_refreshObjectSet","handleMessage_subscribeResponses","handleMessage_subscriptionClosed","objectUpdates","updates","update","referenceUpdates","osdkObjectsWithReferenceUpdates","all","o","osdkObjectArray","__apiName","__primaryKey","primaryKey","property","value","singleOsdkObject","object","state","osdkObject","osdkObjects","keysToDelete","Object","keys","key","includes","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","cause","event","#cycleWebsocket","CLOSING","CLOSED","close","s"],"sources":["ObjectSetListenerWebsocket.js"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport { convertWireToOsdkObjects } from \"../object/convertWireToOsdkObjects.js\";\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\n/** Noop function to reduce conditional checks */\nfunction doNothing() { }\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener({ onChange = doNothing, onError = doNothing, onOutOfDate = doNothing, onSuccessfulSubscription = doNothing, }) {\n return { onChange, onError, onOutOfDate, onSuccessfulSubscription };\n}\nfunction isReady(sub) {\n return sub.isReady != null;\n}\nfunction subscriptionIsDone(sub) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap();\n MINIMUM_RECONNECT_DELAY_MS;\n // FIXME\n static getInstance(client) {\n let instance = ObjectSetListenerWebsocket.#instances.get(client.clientCacheKey);\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(client.clientCacheKey, instance);\n }\n return instance;\n }\n #ws;\n #lastWsConnect = 0;\n #client;\n #logger;\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map();\n /**\n * Map of subscriptionId to Subscription. Note: the subscriptionId may be\n * temporary and not the actual subscriptionId from the server.\n */\n #subscriptions = new Map();\n #maybeDisconnectTimeout;\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(client, { minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS, } = {}) {\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"), \"Stack must be a URL\");\n }\n async subscribe(objectType, objectSet, listener, properties) {\n if (process.env.TARGET !== \"browser\") {\n // Node 18 does not expose 'crypto' on globalThis, so we need to do it ourselves. This\n // will not be needed after our minimum version is 19 or greater.\n globalThis.crypto ??= (await import(\"node:crypto\")).webcrypto;\n }\n const objDef = await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName);\n const objectProperties = properties.filter((p) => objDef.properties[p].type !== \"geotimeSeriesReference\");\n const referenceProperties = properties.filter((p) => objDef.properties[p].type === \"geotimeSeriesReference\");\n const sub = {\n listener: fillOutListener(listener),\n objectSet,\n primaryKeyPropertyName: objDef.primaryKeyApiName,\n requestedProperties: objectProperties,\n requestedReferenceProperties: referenceProperties,\n status: \"preparing\",\n // Since we don't have a real subscription id yet but we need to keep\n // track of this reference, we can just use a random uuid.\n subscriptionId: `TMP-${crypto.randomUUID()}`,\n };\n this.#subscriptions.set(sub.subscriptionId, sub);\n // actually prepares the subscription, ensures the ws is ready, and sends\n // a subscribe message. We don't want to block on this.\n this.#initiateSubscribe(sub);\n return () => {\n this.#unsubscribe(sub);\n };\n }\n /**\n * Called at least once for every subscription.\n *\n * - Resets pending expiry\n * - Recreates temporary object set\n * - Triggers a full subscribe message\n *\n * @returns\n */\n async #initiateSubscribe(sub) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#initiateSubscribe()\");\n }\n try {\n await this.#ensureWebsocket();\n // the consumer may have already unsubscribed before we are ready to request a subscription\n // so we have to acquire the pendingSubscription after the await.\n if (subscriptionIsDone(sub)) {\n return;\n }\n sub.isReady = true;\n // if we aren't open, then this happens after we #onConnect\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#sendSubscribeMessage();\n }\n }\n catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n sub.listener.onError([error]);\n }\n }\n #sendSubscribeMessage() {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage()\");\n }\n // If two calls to `.subscribe()` happen at once (or if the connection is reset),\n // we may have multiple subscriptions that don't have a subscriptionId yet,\n // so we filter those out.\n const readySubs = [...this.#subscriptions.values()].filter(isReady);\n if (readySubs.length === 0) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"#sendSubscribeMessage(): aborting due to no ready subscriptions\");\n }\n return;\n }\n // Assumes the node 18 crypto fallback to globalThis in `subscribe` has happened.\n const id = crypto.randomUUID();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n // every subscribe message \"overwrites\" the previous ones that are not\n // re-included, so we have to reconstitute the entire list of subscriptions\n const subscribe = {\n id,\n requests: readySubs.map(({ objectSet, requestedProperties, requestedReferenceProperties }) => {\n return {\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: requestedReferenceProperties,\n };\n }),\n };\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: subscribe }, \"sending subscribe message\");\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n #unsubscribe(sub, newStatus = \"done\") {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n sub.status = newStatus;\n // make sure listeners do nothing now\n sub.listener = fillOutListener({});\n this.#subscriptions.delete(sub.subscriptionId);\n this.#sendSubscribeMessage();\n // If we have no more subscriptions, we can disconnect the websocket\n // however we should wait a bit to see if we get any more subscriptions.\n // For example, when switching between react views, you may unsubscribe\n // in the old view and subscribe in the new view. We don't need to re-establish\n // the websocket connection in that case.\n if (this.#maybeDisconnectTimeout) {\n // We reset the timeout on every unsubscribe so its always at least 15s from\n // the last time we are empty. E.g.:\n // - 0s: Subscribe(A)\n // - 10s: Unsubscribe(A)\n // - 11s: Subscribe(B)\n // - 20s: Unsubscribe(B)\n // If we do not clear out the timeout we would disconnect at 25s but that would only be\n // 5s after the last subscription was removed instead of at 35s for the desired 15s.\n clearTimeout(this.#maybeDisconnectTimeout);\n }\n this.#maybeDisconnectTimeout = setTimeout(() => {\n this.#maybeDisconnectTimeout = undefined;\n if (this.#subscriptions.size === 0) {\n this.#cycleWebsocket();\n }\n }, 15_000 /* ms */);\n }\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const base = new URL(baseUrl);\n const url = `wss://${base.host}/api/v2/ontologySubscriptions/ontologies/${this.#client.ontologyRid}/streamSubscriptions`;\n const token = await tokenProvider();\n // tokenProvider is async, there could potentially be a race to create the websocket.\n // Only the first call to reach here will find a null this.#ws, the rest will bail out\n if (this.#ws == null) {\n // TODO this can probably be exponential backoff with jitter\n // don't reconnect more quickly than MINIMUM_RECONNECT_DELAY\n const nextConnectTime = (this.#lastWsConnect ?? 0)\n + this.MINIMUM_RECONNECT_DELAY_MS;\n if (nextConnectTime > Date.now()) {\n await new Promise((resolve) => {\n setTimeout(resolve, nextConnectTime - Date.now());\n });\n }\n this.#lastWsConnect = Date.now();\n // we again may have lost the race after our minimum backoff time\n if (this.#ws == null) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace(\"Creating websocket\");\n }\n this.#ws = new WebSocket(url, [`Bearer-${token}`]);\n this.#ws.addEventListener(\"close\", this.#onClose);\n this.#ws.addEventListener(\"message\", this.#onMessage);\n this.#ws.addEventListener(\"open\", this.#onOpen);\n }\n }\n // Allow await-ing the websocket open event if it isn't open already.\n // This needs to happen even for callers that didn't just create this.#ws\n if (this.#ws.readyState === WebSocket.CONNECTING) {\n const ws = this.#ws;\n return new Promise((resolve, reject) => {\n function cleanup() {\n ws.removeEventListener(\"open\", open);\n ws.removeEventListener(\"error\", error);\n ws.removeEventListener(\"close\", cleanup);\n }\n function open() {\n cleanup();\n resolve();\n }\n function error(evt) {\n cleanup();\n reject(evt);\n }\n ws.addEventListener(\"open\", open);\n ws.addEventListener(\"error\", error);\n ws.addEventListener(\"close\", cleanup);\n });\n }\n }\n }\n #onOpen = () => {\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n #onMessage = async (message) => {\n const data = JSON.parse(message.data.toString());\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n return this.#handleMessage_objectSetChanged(data);\n case \"refreshObjectSet\":\n return this.#handleMessage_refreshObjectSet(data);\n case \"subscribeResponses\":\n return this.#handleMessage_subscribeResponses(data);\n case \"subscriptionClosed\": {\n return this.#handleMessage_subscriptionClosed(data);\n }\n default:\n const _ = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n #handleMessage_objectSetChanged = async (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n if (sub == null)\n return;\n const objectUpdates = payload.updates.filter((update) => update.type === \"object\");\n const referenceUpdates = payload.updates.filter((update) => update.type === \"reference\");\n const osdkObjectsWithReferenceUpdates = await Promise.all(referenceUpdates.map(async (o) => {\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [{\n __apiName: o.objectType,\n __primaryKey: o.primaryKey[sub.primaryKeyPropertyName],\n ...o.primaryKey,\n [o.property]: o.value,\n }], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: \"ADDED_OR_UPDATED\",\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjectsWithReferenceUpdates) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const keysToDelete = Object.keys(o.object).filter((key) => sub.requestedReferenceProperties.includes(key));\n for (const key of keysToDelete) {\n delete o.object[key];\n }\n const osdkObjectArray = await convertWireToOsdkObjects(this.#client, [o.object], undefined);\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n sub.listener.onChange?.(osdkObject);\n }\n }\n };\n #handleMessage_refreshObjectSet = (payload) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onOutOfDate();\n };\n #handleMessage_subscribeResponses = (payload) => {\n const { id, responses } = payload;\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n switch (response.type) {\n case \"error\":\n sub.listener.onError(response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n case \"qos\":\n // the server has requested that we tear down our websocket and reconnect to help load balance\n this.#cycleWebsocket();\n break;\n case \"success\":\n // `\"preparing\"` should only be the status on an initial subscribe.\n const shouldFireOutOfDate = sub.status === \"expired\"\n || sub.status === \"reconnecting\";\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace({ shouldFireOutOfDate }, \"success\");\n }\n sub.status = \"subscribed\";\n if (sub.subscriptionId !== response.id) {\n // might be the temporary one\n this.#subscriptions.delete(sub.subscriptionId);\n sub.subscriptionId = response.id;\n this.#subscriptions.set(sub.subscriptionId, sub); // future messages come by this subId\n }\n if (shouldFireOutOfDate)\n sub.listener.onOutOfDate();\n else\n sub.listener.onSuccessfulSubscription();\n break;\n default:\n const _ = response;\n sub.listener.onError(response);\n }\n }\n };\n #handleMessage_subscriptionClosed(payload) {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n sub.listener.onError([payload.cause]);\n this.#unsubscribe(sub, \"error\");\n }\n #onClose = (event) => {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.trace({ event }, \"Received close event from ws\", event);\n }\n // TODO we should probably throttle this so we don't abuse the backend\n this.#cycleWebsocket();\n };\n #cycleWebsocket = () => {\n if (this.#ws) {\n this.#ws.removeEventListener(\"open\", this.#onOpen);\n this.#ws.removeEventListener(\"message\", this.#onMessage);\n this.#ws.removeEventListener(\"close\", this.#onClose);\n if (this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\n // if we have any listeners that are still depending on us, go ahead and reopen the websocket\n if (this.#subscriptions.size > 0) {\n if (process.env.NODE_ENV !== \"production\") {\n for (const s of this.#subscriptions.values()) {\n invariant(s.status !== \"done\" && s.status !== \"error\", \"should not have done/error subscriptions still\");\n }\n }\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\")\n s.status = \"reconnecting\";\n }\n this.#ensureWebsocket();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -88,8 +88,7 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
88
88
|
oslwInst: oslwInst++
|
|
89
89
|
})
|
|
90
90
|
}, {
|
|
91
|
-
minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY
|
|
92
|
-
objectSetExpiryMs: 60_000
|
|
91
|
+
minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY
|
|
93
92
|
});
|
|
94
93
|
listenerPromise = pDefer();
|
|
95
94
|
listener = {
|
|
@@ -98,7 +97,8 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
98
97
|
listenerPromise.resolve();
|
|
99
98
|
}),
|
|
100
99
|
onError: vi.fn(),
|
|
101
|
-
onOutOfDate: vi.fn()
|
|
100
|
+
onOutOfDate: vi.fn(),
|
|
101
|
+
onSuccessfulSubscription: vi.fn()
|
|
102
102
|
};
|
|
103
103
|
let objectSetRidCounter = 0;
|
|
104
104
|
apiServer.use(http.post(`${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`, () => HttpResponse.json({
|
|
@@ -144,7 +144,7 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
144
144
|
it("currently requests regular object properties", () => {
|
|
145
145
|
expect(subReq1.requests[0].propertySet).toEqual(["employeeId"]);
|
|
146
146
|
});
|
|
147
|
-
it
|
|
147
|
+
it("currently requests reference backed properties", () => {
|
|
148
148
|
expect(subReq1.requests[0].referenceSet).toEqual(["employeeLocation"]);
|
|
149
149
|
});
|
|
150
150
|
describe("socket closed before subscription confirmed", () => {
|
|
@@ -174,6 +174,9 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
174
174
|
beforeEach(() => {
|
|
175
175
|
respondSuccessToSubscribe(ws, subReq1);
|
|
176
176
|
});
|
|
177
|
+
it("should call onSuccessfulSubscription", () => {
|
|
178
|
+
expect(listener.onSuccessfulSubscription).toHaveBeenCalled();
|
|
179
|
+
});
|
|
177
180
|
it("should correctly return regular updates", async () => {
|
|
178
181
|
const idNum2 = currentSubscriptionId;
|
|
179
182
|
sendObjectUpdateResponse(ws, `${idNum2}`);
|
|
@@ -327,7 +330,7 @@ async function subscribeAndExpectWebSocket(client, listener) {
|
|
|
327
330
|
}, {
|
|
328
331
|
type: "base",
|
|
329
332
|
objectType: Employee.apiName
|
|
330
|
-
}, listener, ["employeeId"])]);
|
|
333
|
+
}, listener, ["employeeId", "employeeLocation"])]);
|
|
331
334
|
// otherwise the ObjectSetListenerWebSocket is sitting waiting for it to "connect"
|
|
332
335
|
setWebSocketState(ws, "open");
|
|
333
336
|
return [ws, unsubscribe];
|