@osdk/client 2.5.0-beta.9 → 2.6.0-beta.1
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 +73 -0
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -1
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/definitions/LinkDefinitions.test.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +4 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/index.js +1 -1
- package/build/browser/index.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +5 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +6 -4
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +11 -0
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ObjectSetPayload.js +2 -0
- package/build/browser/observable/ObjectSetPayload.js.map +1 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/computeObjectSetCacheKey.js +64 -0
- package/build/browser/observable/computeObjectSetCacheKey.js.map +1 -0
- package/build/browser/observable/internal/Changes.js +3 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +17 -0
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/Query.js +18 -1
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/Store.invalidation.test.js +165 -0
- package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -1
- package/build/browser/observable/internal/Store.js +23 -0
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js +2 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js +2 -0
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +69 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +151 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQueryOptions.js +2 -0
- package/build/browser/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -0
- package/build/browser/observable/internal/testUtils.js +2 -1
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js +1 -0
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/queries/applyQuery.js +5 -4
- package/build/browser/queries/applyQuery.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/exponentialBackoff.js +51 -0
- package/build/browser/util/exponentialBackoff.js.map +1 -0
- package/build/browser/util/exponentialBackoff.test.js +81 -0
- package/build/browser/util/exponentialBackoff.test.js.map +1 -0
- package/build/browser/util/extractObjectOrInterfaceType.js +5 -1
- package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/browser/util/extractObjectOrInterfaceType.test.js +21 -2
- package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/cjs/{chunk-HCCGD2AP.cjs → chunk-BP7BR5FZ.cjs} +61 -59
- package/build/cjs/chunk-BP7BR5FZ.cjs.map +1 -0
- package/build/cjs/{chunk-MKL3HEQ5.cjs → chunk-DCEFUXFS.cjs} +92 -21
- package/build/cjs/chunk-DCEFUXFS.cjs.map +1 -0
- package/build/cjs/index.cjs +11 -7
- package/build/cjs/index.d.cts +8 -1
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +429 -156
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +78 -6
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -1
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/definitions/LinkDefinitions.test.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +4 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/index.js +1 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +5 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +6 -4
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +11 -0
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ObjectSetPayload.js +2 -0
- package/build/esm/observable/ObjectSetPayload.js.map +1 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/computeObjectSetCacheKey.js +64 -0
- package/build/esm/observable/computeObjectSetCacheKey.js.map +1 -0
- package/build/esm/observable/internal/Changes.js +3 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +17 -0
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/Query.js +18 -1
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/Store.invalidation.test.js +165 -0
- package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -1
- package/build/esm/observable/internal/Store.js +23 -0
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js +2 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js +2 -0
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +69 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +151 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQueryOptions.js +2 -0
- package/build/esm/observable/internal/objectset/ObjectSetQueryOptions.js.map +1 -0
- package/build/esm/observable/internal/testUtils.js +2 -1
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js +1 -0
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/queries/applyQuery.js +5 -4
- package/build/esm/queries/applyQuery.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/exponentialBackoff.js +51 -0
- package/build/esm/util/exponentialBackoff.js.map +1 -0
- package/build/esm/util/exponentialBackoff.test.js +81 -0
- package/build/esm/util/exponentialBackoff.test.js.map +1 -0
- package/build/esm/util/extractObjectOrInterfaceType.js +5 -1
- package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/esm/util/extractObjectOrInterfaceType.test.js +21 -2
- package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/types/MinimalClientContext.d.ts +1 -0
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/observable/ObjectSetPayload.d.ts +5 -0
- package/build/types/observable/ObjectSetPayload.d.ts.map +1 -0
- package/build/types/observable/ObservableClient.d.ts +54 -1
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/computeObjectSetCacheKey.d.ts +16 -0
- package/build/types/observable/computeObjectSetCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/Changes.d.ts +5 -3
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts +2 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +5 -1
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +16 -0
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +19 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +34 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts +18 -0
- package/build/types/observable/internal/objectset/ObjectSetQueryOptions.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +2 -1
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/queries/applyQuery.d.ts.map +1 -1
- package/build/types/util/exponentialBackoff.d.ts +14 -0
- package/build/types/util/exponentialBackoff.d.ts.map +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts.map +1 -0
- package/package.json +11 -11
- package/build/cjs/chunk-HCCGD2AP.cjs.map +0 -1
- package/build/cjs/chunk-MKL3HEQ5.cjs.map +0 -1
|
@@ -106,7 +106,8 @@ async function fetchInterfacePage(client, interfaceType, args, objectSet, useSna
|
|
|
106
106
|
interfaceType.apiName, !args.$includeRid, await extractRdpDefinition(client, objectSet));
|
|
107
107
|
return result;
|
|
108
108
|
}
|
|
109
|
-
const
|
|
109
|
+
const extractedInterfaceTypeApiName = (await extractObjectOrInterfaceType(client, objectSet))?.apiName ?? interfaceType.apiName;
|
|
110
|
+
const resolvedInterfaceObjectSet = resolveInterfaceObjectSet(objectSet, extractedInterfaceTypeApiName, args);
|
|
110
111
|
const requestBody = await buildAndRemapRequestBody(args, {
|
|
111
112
|
objectSet: resolvedInterfaceObjectSet,
|
|
112
113
|
select: args?.$select ? [...args.$select] : [],
|
|
@@ -118,7 +119,7 @@ async function fetchInterfacePage(client, interfaceType, args, objectSet, useSna
|
|
|
118
119
|
branch: client.branch
|
|
119
120
|
});
|
|
120
121
|
return Promise.resolve({
|
|
121
|
-
data: await client.objectFactory2(client, result.data,
|
|
122
|
+
data: await client.objectFactory2(client, result.data, extractedInterfaceTypeApiName, {}, !args.$includeRid, args.$select, false, result.interfaceToObjectTypeMappings),
|
|
122
123
|
nextPageToken: result.nextPageToken,
|
|
123
124
|
totalCount: result.totalCount
|
|
124
125
|
});
|
|
@@ -230,8 +231,9 @@ export async function fetchObjectPage(client, objectType, args, objectSet, useSn
|
|
|
230
231
|
// For simple object fetches, since we know the object type up front
|
|
231
232
|
// we can parallelize network requests for loading metadata and loading the actual objects
|
|
232
233
|
// In our object factory we await and block on loading the metadata, which if this call finishes, should already be cached on the client
|
|
233
|
-
|
|
234
|
-
|
|
234
|
+
// We have an empty catch here so that if this call errors before we await later, we won't have an unhandled promise rejection that would crash the process
|
|
235
|
+
// Swallowing the error is ok because we await the metadata load in the objectFactory later anyways which eventually bubbles up the error to the user
|
|
236
|
+
void client.ontologyProvider.getObjectDefinition(objectType.apiName).catch(() => {});
|
|
235
237
|
const requestBody = await buildAndRemapRequestBody(args, {
|
|
236
238
|
objectSet,
|
|
237
239
|
select: args?.$select ? [...args.$select] : [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchPage.js","names":["OntologiesV2","extractNamespace","addUserAgentAndRequestContextHeaders","extractObjectOrInterfaceType","extractRdpDefinition","resolveBaseObjectSetType","augment","type","properties","apiName","objectSetToSearchJsonV2","objectSet","expectedApiName","existingWhere","undefined","objectType","Error","interfaceType","where","value","resolveInterfaceObjectSet","interfaceTypeApiName","args","$includeAllBaseObjectProperties","objectSets","includeAllBaseObjectProperties","fetchStaticRidPage","client","rids","useSnapshot","requestBody","applyFetchArgs","objects","select","$select","excludeRid","$includeRid","snapshot","result","OntologyObjectSets","loadMultipleObjectTypes","osdkMetadata","ontologyRid","preview","Promise","resolve","data","objectFactory2","interfaceToObjectTypeMappings","nextPageToken","totalCount","fetchInterfacePage","$__UNSTABLE_useOldInterfaceApis","baseRequestBody","augmentedProperties","augmentedSharedPropertyTypes","otherInterfaceTypes","selectedObjectTypes","selectedSharedPropertyTypes","length","remapped","remapPropertyNames","Array","from","OntologyInterfaces","search","objectFactory","resolvedInterfaceObjectSet","buildAndRemapRequestBody","branch","fetchPageInternal","fetchObjectPage","fetchPageWithErrorsInternal","e","error","fetchPage","fetchPageWithErrors","baseBody","objectOrInterface","propertyNames","objApiNamespace","map","name","fieldApiNamespace","fieldShortName","body","_client","$nextPageToken","pageToken","$pageSize","pageSize","orderBy","$orderBy","orderType","fields","orderByEntries","Object","entries","fieldNames","field","remappedFields","direction","index","ontologyProvider","getObjectDefinition","r","load"],"sources":["fetchPage.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 Augment,\n Augments,\n FetchPageArgs,\n FetchPageResult,\n InterfaceDefinition,\n NullabilityAdherence,\n ObjectOrInterfaceDefinition,\n ObjectSetArgs,\n ObjectTypeDefinition,\n PropertyKeys,\n Result,\n} from \"@osdk/api\";\nimport type { PageSize, PageToken } from \"@osdk/foundry.core\";\nimport type {\n LoadObjectSetV2MultipleObjectTypesRequest,\n ObjectSet,\n OntologyObjectV2,\n SearchJsonQueryV2,\n SearchObjectsForInterfaceRequest,\n SearchOrderByV2,\n} from \"@osdk/foundry.ontologies\";\nimport * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport { extractNamespace } from \"../internal/conversions/modernToLegacyWhereClause.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport { addUserAgentAndRequestContextHeaders } from \"../util/addUserAgentAndRequestContextHeaders.js\";\nimport { extractObjectOrInterfaceType } from \"../util/extractObjectOrInterfaceType.js\";\nimport { extractRdpDefinition } from \"../util/extractRdpDefinition.js\";\nimport { resolveBaseObjectSetType } from \"../util/objectSetUtils.js\";\n\nexport function augment<\n Q extends ObjectOrInterfaceDefinition,\n T extends PropertyKeys<Q>,\n>(\n type: Q,\n ...properties: T[]\n): Augment<Q, T> {\n return { [type.apiName]: properties } as any;\n}\n\n/** @internal */\nexport function objectSetToSearchJsonV2(\n objectSet: ObjectSet,\n expectedApiName: string,\n existingWhere: SearchJsonQueryV2 | undefined = undefined,\n): SearchJsonQueryV2 | undefined {\n if (objectSet.type === \"base\" || objectSet.type === \"interfaceBase\") {\n if (objectSet.type === \"base\" && objectSet.objectType !== expectedApiName) {\n throw new Error(\n `Expected objectSet.objectType to be ${expectedApiName}, but got ${objectSet.objectType}`,\n );\n }\n if (\n objectSet.type === \"interfaceBase\"\n && objectSet.interfaceType !== expectedApiName\n ) {\n throw new Error(\n `Expected objectSet.objectType to be ${expectedApiName}, but got ${objectSet.interfaceType}`,\n );\n }\n\n return existingWhere;\n }\n\n if (objectSet.type === \"filter\") {\n return objectSetToSearchJsonV2(\n objectSet.objectSet,\n expectedApiName,\n existingWhere == null ? objectSet.where : {\n type: \"and\",\n value: [existingWhere, objectSet.where],\n },\n );\n }\n\n throw new Error(`Unsupported objectSet type: ${objectSet.type}`);\n}\n\n/** @internal */\nexport function resolveInterfaceObjectSet(\n objectSet: ObjectSet,\n interfaceTypeApiName: string,\n args: FetchPageArgs<any, any, any, any, any, any>,\n): ObjectSet {\n return args?.$includeAllBaseObjectProperties\n ? {\n type: \"intersect\",\n objectSets: [objectSet, {\n type: \"interfaceBase\",\n interfaceType: interfaceTypeApiName,\n includeAllBaseObjectProperties: true,\n }],\n }\n : objectSet;\n}\n\n/** @internal */\nexport async function fetchStaticRidPage<\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n rids: readonly string[],\n args: FetchPageArgs<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n any,\n S,\n T\n >,\n useSnapshot: boolean = false,\n): Promise<\n FetchPageResult<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n S,\n T\n >\n> {\n const requestBody = await applyFetchArgs(\n args,\n {\n objectSet: {\n type: \"static\",\n objects: rids as string[],\n },\n select: ((args?.$select as string[] | undefined) ?? []),\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n } as LoadObjectSetV2MultipleObjectTypesRequest,\n client,\n { type: \"object\", apiName: \"\" },\n );\n\n const result = await OntologiesV2.OntologyObjectSets.loadMultipleObjectTypes(\n addUserAgentAndRequestContextHeaders(client, { osdkMetadata: undefined }),\n await client.ontologyRid,\n requestBody,\n { preview: true },\n );\n\n return Promise.resolve({\n data: await client.objectFactory2(\n client,\n result.data,\n undefined,\n {},\n !args.$includeRid,\n args.$select,\n false,\n result.interfaceToObjectTypeMappings,\n ),\n nextPageToken: result.nextPageToken,\n totalCount: result.totalCount,\n }) as unknown as Promise<\n FetchPageResult<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n S,\n T\n >\n >;\n}\n\nasync function fetchInterfacePage<\n Q extends InterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n interfaceType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet,\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T>> {\n if (args.$__UNSTABLE_useOldInterfaceApis) {\n const baseRequestBody: SearchObjectsForInterfaceRequest = {\n augmentedProperties: {},\n augmentedSharedPropertyTypes: {},\n otherInterfaceTypes: [],\n selectedObjectTypes: [],\n selectedSharedPropertyTypes: args.$select ? [...args.$select] : [],\n where: objectSetToSearchJsonV2(objectSet, interfaceType.apiName),\n };\n\n const requestBody = await applyFetchArgs(\n args,\n baseRequestBody,\n client,\n interfaceType,\n );\n\n if (requestBody.selectedSharedPropertyTypes.length > 0) {\n const remapped = remapPropertyNames(\n interfaceType,\n requestBody.selectedSharedPropertyTypes,\n );\n requestBody.selectedSharedPropertyTypes = Array.from(remapped);\n }\n\n const result = await OntologiesV2.OntologyInterfaces\n .search(\n addUserAgentAndRequestContextHeaders(client, interfaceType),\n await client.ontologyRid,\n interfaceType.apiName,\n requestBody,\n { preview: true },\n );\n\n result.data = await client.objectFactory(\n client,\n result.data as OntologyObjectV2[], // drop readonly\n interfaceType.apiName,\n !args.$includeRid,\n await extractRdpDefinition(client, objectSet),\n );\n return result as any;\n }\n const resolvedInterfaceObjectSet = resolveInterfaceObjectSet(\n objectSet,\n interfaceType.apiName,\n args,\n );\n const requestBody = await buildAndRemapRequestBody(\n args,\n {\n objectSet: resolvedInterfaceObjectSet,\n select: args?.$select ? [...args.$select] : [],\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n },\n client,\n interfaceType,\n );\n\n const result = await OntologiesV2.OntologyObjectSets.loadMultipleObjectTypes(\n addUserAgentAndRequestContextHeaders(client, interfaceType),\n await client.ontologyRid,\n requestBody,\n { preview: true, branch: client.branch },\n );\n\n return Promise.resolve({\n data: await client.objectFactory2(\n client,\n result.data,\n (await extractObjectOrInterfaceType(client, resolvedInterfaceObjectSet))\n ?.apiName\n ?? interfaceType.apiName,\n {},\n !args.$includeRid,\n args.$select,\n false,\n result.interfaceToObjectTypeMappings,\n ),\n nextPageToken: result.nextPageToken,\n totalCount: result.totalCount,\n }) as unknown as Promise<FetchPageResult<Q, L, R, S, T>>;\n}\n\n/** @internal */\nexport async function fetchPageInternal<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n ORDER_BY_OPTIONS extends ObjectSetArgs.OrderByOptions<L>,\n>(\n client: MinimalClient,\n objectType: Q,\n objectSet: ObjectSet,\n args: FetchPageArgs<Q, L, R, A, S, T, never, ORDER_BY_OPTIONS> = {},\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>> {\n if (objectType.type === \"interface\") {\n return await fetchInterfacePage(\n client,\n objectType,\n args as FetchPageArgs<\n InterfaceDefinition,\n L,\n R,\n A,\n S,\n T,\n never,\n ORDER_BY_OPTIONS\n >,\n objectSet,\n useSnapshot,\n ) as any; // fixme\n } else {\n return await fetchObjectPage(\n client,\n objectType,\n args as FetchPageArgs<\n ObjectTypeDefinition,\n L,\n R,\n A,\n S,\n T,\n never,\n ORDER_BY_OPTIONS\n >,\n objectSet,\n useSnapshot,\n ) as any; // fixme\n }\n}\n\n/** @internal */\nexport async function fetchPageWithErrorsInternal<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n objectSet: ObjectSet,\n args: FetchPageArgs<Q, L, R, A, S, T> = {},\n): Promise<Result<FetchPageResult<Q, L, R, S, T>>> {\n try {\n const result = await fetchPageInternal(client, objectType, objectSet, args);\n return { value: result };\n } catch (e) {\n if (e instanceof Error) {\n return { error: e };\n }\n return { error: e as Error };\n }\n}\n\n/**\n * @param client\n * @param objectType\n * @param args\n * @param objectSet\n * @returns\n * @internal\n */\nexport async function fetchPage<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet = resolveBaseObjectSetType(objectType),\n): Promise<FetchPageResult<Q, L, R, S, T>> {\n return fetchPageInternal(client, objectType, objectSet, args);\n}\n\n/** @internal */\nexport async function fetchPageWithErrors<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet = resolveBaseObjectSetType(objectType),\n): Promise<Result<FetchPageResult<Q, L, R, S, T>>> {\n return fetchPageWithErrorsInternal(client, objectType, objectSet, args);\n}\n\n/** @internal */\nasync function buildAndRemapRequestBody<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n RequestBody extends {\n orderBy?: SearchOrderByV2;\n pageToken?: PageToken;\n pageSize?: PageSize;\n select?: readonly string[];\n selectedSharedPropertyTypes?: readonly string[];\n },\n>(\n args: FetchPageArgs<Q, L, R, A, S, T>,\n baseBody: RequestBody,\n client: MinimalClient,\n objectType: Q,\n): Promise<RequestBody> {\n const requestBody = await applyFetchArgs(\n args,\n baseBody,\n client,\n objectType,\n );\n\n if (requestBody.select != null && requestBody.select.length > 0) {\n const remapped = remapPropertyNames(\n objectType,\n requestBody.select,\n );\n return { ...requestBody, select: remapped };\n }\n\n return requestBody;\n}\n\n/** @internal */\nexport function remapPropertyNames(\n objectOrInterface: ObjectOrInterfaceDefinition | undefined,\n propertyNames: readonly string[],\n): readonly string[] {\n if (objectOrInterface == null) {\n return propertyNames;\n }\n\n if (objectOrInterface.type === \"interface\") {\n const [objApiNamespace] = extractNamespace(objectOrInterface.apiName);\n return propertyNames.map(name => {\n const [fieldApiNamespace, fieldShortName] = extractNamespace(name);\n return (fieldApiNamespace == null && objApiNamespace != null)\n ? `${objApiNamespace}.${fieldShortName}`\n : name;\n });\n }\n\n return propertyNames;\n}\n\nasync function applyFetchArgs<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n X extends {\n orderBy?: SearchOrderByV2;\n pageToken?: PageToken;\n pageSize?: PageSize;\n },\n>(\n args: FetchPageArgs<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n ObjectSetArgs.OrderByOptions<any>\n >,\n body: X,\n _client: MinimalClient,\n objectType: Q,\n): Promise<X> {\n if (args?.$nextPageToken) {\n body.pageToken = args.$nextPageToken;\n }\n\n if (args?.$pageSize != null) {\n body.pageSize = args.$pageSize;\n }\n\n const orderBy = args?.$orderBy;\n if (orderBy) {\n if (orderBy === \"relevance\") {\n body.orderBy = { orderType: \"relevance\", fields: [] };\n } else {\n const orderByEntries = Object.entries(orderBy);\n const fieldNames = orderByEntries.map(([field]) => field);\n const remappedFields = remapPropertyNames(\n objectType,\n fieldNames,\n );\n\n body.orderBy = {\n fields: orderByEntries.map(([, direction], index) => ({\n field: remappedFields[index],\n direction,\n })),\n };\n }\n }\n\n return body;\n}\n\n/** @internal */\nexport async function fetchObjectPage<\n Q extends ObjectTypeDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n ORDER_BY_OPTIONS extends ObjectSetArgs.OrderByOptions<L>,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, Augments, S, T, never, ORDER_BY_OPTIONS>,\n objectSet: ObjectSet,\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>> {\n // For simple object fetches, since we know the object type up front\n // we can parallelize network requests for loading metadata and loading the actual objects\n // In our object factory we await and block on loading the metadata, which if this call finishes, should already be cached on the client\n\n void client.ontologyProvider.getObjectDefinition(objectType.apiName);\n\n const requestBody = await buildAndRemapRequestBody(\n args,\n {\n objectSet,\n select: args?.$select ? [...args.$select] : [],\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n },\n client,\n objectType,\n );\n\n const r = await OntologiesV2.OntologyObjectSets.load(\n addUserAgentAndRequestContextHeaders(client, objectType),\n await client.ontologyRid,\n requestBody,\n { branch: client.branch },\n );\n\n return Promise.resolve({\n data: await client.objectFactory(\n client,\n r.data as OntologyObjectV2[],\n undefined,\n undefined,\n await extractRdpDefinition(client, objectSet),\n args.$select,\n false,\n ),\n nextPageToken: r.nextPageToken,\n totalCount: r.totalCount,\n }) as unknown as Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fetchPage.js","names":["OntologiesV2","extractNamespace","addUserAgentAndRequestContextHeaders","extractObjectOrInterfaceType","extractRdpDefinition","resolveBaseObjectSetType","augment","type","properties","apiName","objectSetToSearchJsonV2","objectSet","expectedApiName","existingWhere","undefined","objectType","Error","interfaceType","where","value","resolveInterfaceObjectSet","interfaceTypeApiName","args","$includeAllBaseObjectProperties","objectSets","includeAllBaseObjectProperties","fetchStaticRidPage","client","rids","useSnapshot","requestBody","applyFetchArgs","objects","select","$select","excludeRid","$includeRid","snapshot","result","OntologyObjectSets","loadMultipleObjectTypes","osdkMetadata","ontologyRid","preview","Promise","resolve","data","objectFactory2","interfaceToObjectTypeMappings","nextPageToken","totalCount","fetchInterfacePage","$__UNSTABLE_useOldInterfaceApis","baseRequestBody","augmentedProperties","augmentedSharedPropertyTypes","otherInterfaceTypes","selectedObjectTypes","selectedSharedPropertyTypes","length","remapped","remapPropertyNames","Array","from","OntologyInterfaces","search","objectFactory","extractedInterfaceTypeApiName","resolvedInterfaceObjectSet","buildAndRemapRequestBody","branch","fetchPageInternal","fetchObjectPage","fetchPageWithErrorsInternal","e","error","fetchPage","fetchPageWithErrors","baseBody","objectOrInterface","propertyNames","objApiNamespace","map","name","fieldApiNamespace","fieldShortName","body","_client","$nextPageToken","pageToken","$pageSize","pageSize","orderBy","$orderBy","orderType","fields","orderByEntries","Object","entries","fieldNames","field","remappedFields","direction","index","ontologyProvider","getObjectDefinition","catch","r","load"],"sources":["fetchPage.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 Augment,\n Augments,\n FetchPageArgs,\n FetchPageResult,\n InterfaceDefinition,\n NullabilityAdherence,\n ObjectOrInterfaceDefinition,\n ObjectSetArgs,\n ObjectTypeDefinition,\n PropertyKeys,\n Result,\n} from \"@osdk/api\";\nimport type { PageSize, PageToken } from \"@osdk/foundry.core\";\nimport type {\n LoadObjectSetV2MultipleObjectTypesRequest,\n ObjectSet,\n OntologyObjectV2,\n SearchJsonQueryV2,\n SearchObjectsForInterfaceRequest,\n SearchOrderByV2,\n} from \"@osdk/foundry.ontologies\";\nimport * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport { extractNamespace } from \"../internal/conversions/modernToLegacyWhereClause.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport { addUserAgentAndRequestContextHeaders } from \"../util/addUserAgentAndRequestContextHeaders.js\";\nimport { extractObjectOrInterfaceType } from \"../util/extractObjectOrInterfaceType.js\";\nimport { extractRdpDefinition } from \"../util/extractRdpDefinition.js\";\nimport { resolveBaseObjectSetType } from \"../util/objectSetUtils.js\";\n\nexport function augment<\n Q extends ObjectOrInterfaceDefinition,\n T extends PropertyKeys<Q>,\n>(\n type: Q,\n ...properties: T[]\n): Augment<Q, T> {\n return { [type.apiName]: properties } as any;\n}\n\n/** @internal */\nexport function objectSetToSearchJsonV2(\n objectSet: ObjectSet,\n expectedApiName: string,\n existingWhere: SearchJsonQueryV2 | undefined = undefined,\n): SearchJsonQueryV2 | undefined {\n if (objectSet.type === \"base\" || objectSet.type === \"interfaceBase\") {\n if (objectSet.type === \"base\" && objectSet.objectType !== expectedApiName) {\n throw new Error(\n `Expected objectSet.objectType to be ${expectedApiName}, but got ${objectSet.objectType}`,\n );\n }\n if (\n objectSet.type === \"interfaceBase\"\n && objectSet.interfaceType !== expectedApiName\n ) {\n throw new Error(\n `Expected objectSet.objectType to be ${expectedApiName}, but got ${objectSet.interfaceType}`,\n );\n }\n\n return existingWhere;\n }\n\n if (objectSet.type === \"filter\") {\n return objectSetToSearchJsonV2(\n objectSet.objectSet,\n expectedApiName,\n existingWhere == null ? objectSet.where : {\n type: \"and\",\n value: [existingWhere, objectSet.where],\n },\n );\n }\n\n throw new Error(`Unsupported objectSet type: ${objectSet.type}`);\n}\n\n/** @internal */\nexport function resolveInterfaceObjectSet(\n objectSet: ObjectSet,\n interfaceTypeApiName: string,\n args: FetchPageArgs<any, any, any, any, any, any>,\n): ObjectSet {\n return args?.$includeAllBaseObjectProperties\n ? {\n type: \"intersect\",\n objectSets: [objectSet, {\n type: \"interfaceBase\",\n interfaceType: interfaceTypeApiName,\n includeAllBaseObjectProperties: true,\n }],\n }\n : objectSet;\n}\n\n/** @internal */\nexport async function fetchStaticRidPage<\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n rids: readonly string[],\n args: FetchPageArgs<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n any,\n S,\n T\n >,\n useSnapshot: boolean = false,\n): Promise<\n FetchPageResult<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n S,\n T\n >\n> {\n const requestBody = await applyFetchArgs(\n args,\n {\n objectSet: {\n type: \"static\",\n objects: rids as string[],\n },\n select: ((args?.$select as string[] | undefined) ?? []),\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n } as LoadObjectSetV2MultipleObjectTypesRequest,\n client,\n { type: \"object\", apiName: \"\" },\n );\n\n const result = await OntologiesV2.OntologyObjectSets.loadMultipleObjectTypes(\n addUserAgentAndRequestContextHeaders(client, { osdkMetadata: undefined }),\n await client.ontologyRid,\n requestBody,\n { preview: true },\n );\n\n return Promise.resolve({\n data: await client.objectFactory2(\n client,\n result.data,\n undefined,\n {},\n !args.$includeRid,\n args.$select,\n false,\n result.interfaceToObjectTypeMappings,\n ),\n nextPageToken: result.nextPageToken,\n totalCount: result.totalCount,\n }) as unknown as Promise<\n FetchPageResult<\n ObjectOrInterfaceDefinition,\n PropertyKeys<ObjectOrInterfaceDefinition>,\n R,\n S,\n T\n >\n >;\n}\n\nasync function fetchInterfacePage<\n Q extends InterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n interfaceType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet,\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T>> {\n if (args.$__UNSTABLE_useOldInterfaceApis) {\n const baseRequestBody: SearchObjectsForInterfaceRequest = {\n augmentedProperties: {},\n augmentedSharedPropertyTypes: {},\n otherInterfaceTypes: [],\n selectedObjectTypes: [],\n selectedSharedPropertyTypes: args.$select ? [...args.$select] : [],\n where: objectSetToSearchJsonV2(objectSet, interfaceType.apiName),\n };\n\n const requestBody = await applyFetchArgs(\n args,\n baseRequestBody,\n client,\n interfaceType,\n );\n\n if (requestBody.selectedSharedPropertyTypes.length > 0) {\n const remapped = remapPropertyNames(\n interfaceType,\n requestBody.selectedSharedPropertyTypes,\n );\n requestBody.selectedSharedPropertyTypes = Array.from(remapped);\n }\n\n const result = await OntologiesV2.OntologyInterfaces\n .search(\n addUserAgentAndRequestContextHeaders(client, interfaceType),\n await client.ontologyRid,\n interfaceType.apiName,\n requestBody,\n { preview: true },\n );\n\n result.data = await client.objectFactory(\n client,\n result.data as OntologyObjectV2[], // drop readonly\n interfaceType.apiName,\n !args.$includeRid,\n await extractRdpDefinition(client, objectSet),\n );\n return result as any;\n }\n\n const extractedInterfaceTypeApiName = (await extractObjectOrInterfaceType(\n client,\n objectSet,\n ))?.apiName ?? interfaceType.apiName;\n const resolvedInterfaceObjectSet = resolveInterfaceObjectSet(\n objectSet,\n extractedInterfaceTypeApiName,\n args,\n );\n const requestBody = await buildAndRemapRequestBody(\n args,\n {\n objectSet: resolvedInterfaceObjectSet,\n select: args?.$select ? [...args.$select] : [],\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n },\n client,\n interfaceType,\n );\n\n const result = await OntologiesV2.OntologyObjectSets.loadMultipleObjectTypes(\n addUserAgentAndRequestContextHeaders(client, interfaceType),\n await client.ontologyRid,\n requestBody,\n { preview: true, branch: client.branch },\n );\n\n return Promise.resolve({\n data: await client.objectFactory2(\n client,\n result.data,\n extractedInterfaceTypeApiName,\n {},\n !args.$includeRid,\n args.$select,\n false,\n result.interfaceToObjectTypeMappings,\n ),\n nextPageToken: result.nextPageToken,\n totalCount: result.totalCount,\n }) as unknown as Promise<FetchPageResult<Q, L, R, S, T>>;\n}\n\n/** @internal */\nexport async function fetchPageInternal<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n ORDER_BY_OPTIONS extends ObjectSetArgs.OrderByOptions<L>,\n>(\n client: MinimalClient,\n objectType: Q,\n objectSet: ObjectSet,\n args: FetchPageArgs<Q, L, R, A, S, T, never, ORDER_BY_OPTIONS> = {},\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>> {\n if (objectType.type === \"interface\") {\n return await fetchInterfacePage(\n client,\n objectType,\n args as FetchPageArgs<\n InterfaceDefinition,\n L,\n R,\n A,\n S,\n T,\n never,\n ORDER_BY_OPTIONS\n >,\n objectSet,\n useSnapshot,\n ) as any; // fixme\n } else {\n return await fetchObjectPage(\n client,\n objectType,\n args as FetchPageArgs<\n ObjectTypeDefinition,\n L,\n R,\n A,\n S,\n T,\n never,\n ORDER_BY_OPTIONS\n >,\n objectSet,\n useSnapshot,\n ) as any; // fixme\n }\n}\n\n/** @internal */\nexport async function fetchPageWithErrorsInternal<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n objectSet: ObjectSet,\n args: FetchPageArgs<Q, L, R, A, S, T> = {},\n): Promise<Result<FetchPageResult<Q, L, R, S, T>>> {\n try {\n const result = await fetchPageInternal(client, objectType, objectSet, args);\n return { value: result };\n } catch (e) {\n if (e instanceof Error) {\n return { error: e };\n }\n return { error: e as Error };\n }\n}\n\n/**\n * @param client\n * @param objectType\n * @param args\n * @param objectSet\n * @returns\n * @internal\n */\nexport async function fetchPage<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet = resolveBaseObjectSetType(objectType),\n): Promise<FetchPageResult<Q, L, R, S, T>> {\n return fetchPageInternal(client, objectType, objectSet, args);\n}\n\n/** @internal */\nexport async function fetchPageWithErrors<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, any, S, T>,\n objectSet: ObjectSet = resolveBaseObjectSetType(objectType),\n): Promise<Result<FetchPageResult<Q, L, R, S, T>>> {\n return fetchPageWithErrorsInternal(client, objectType, objectSet, args);\n}\n\n/** @internal */\nasync function buildAndRemapRequestBody<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n RequestBody extends {\n orderBy?: SearchOrderByV2;\n pageToken?: PageToken;\n pageSize?: PageSize;\n select?: readonly string[];\n selectedSharedPropertyTypes?: readonly string[];\n },\n>(\n args: FetchPageArgs<Q, L, R, A, S, T>,\n baseBody: RequestBody,\n client: MinimalClient,\n objectType: Q,\n): Promise<RequestBody> {\n const requestBody = await applyFetchArgs(\n args,\n baseBody,\n client,\n objectType,\n );\n\n if (requestBody.select != null && requestBody.select.length > 0) {\n const remapped = remapPropertyNames(\n objectType,\n requestBody.select,\n );\n return { ...requestBody, select: remapped };\n }\n\n return requestBody;\n}\n\n/** @internal */\nexport function remapPropertyNames(\n objectOrInterface: ObjectOrInterfaceDefinition | undefined,\n propertyNames: readonly string[],\n): readonly string[] {\n if (objectOrInterface == null) {\n return propertyNames;\n }\n\n if (objectOrInterface.type === \"interface\") {\n const [objApiNamespace] = extractNamespace(objectOrInterface.apiName);\n return propertyNames.map(name => {\n const [fieldApiNamespace, fieldShortName] = extractNamespace(name);\n return (fieldApiNamespace == null && objApiNamespace != null)\n ? `${objApiNamespace}.${fieldShortName}`\n : name;\n });\n }\n\n return propertyNames;\n}\n\nasync function applyFetchArgs<\n Q extends ObjectOrInterfaceDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n A extends Augments,\n S extends NullabilityAdherence,\n T extends boolean,\n X extends {\n orderBy?: SearchOrderByV2;\n pageToken?: PageToken;\n pageSize?: PageSize;\n },\n>(\n args: FetchPageArgs<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n ObjectSetArgs.OrderByOptions<any>\n >,\n body: X,\n _client: MinimalClient,\n objectType: Q,\n): Promise<X> {\n if (args?.$nextPageToken) {\n body.pageToken = args.$nextPageToken;\n }\n\n if (args?.$pageSize != null) {\n body.pageSize = args.$pageSize;\n }\n\n const orderBy = args?.$orderBy;\n if (orderBy) {\n if (orderBy === \"relevance\") {\n body.orderBy = { orderType: \"relevance\", fields: [] };\n } else {\n const orderByEntries = Object.entries(orderBy);\n const fieldNames = orderByEntries.map(([field]) => field);\n const remappedFields = remapPropertyNames(\n objectType,\n fieldNames,\n );\n\n body.orderBy = {\n fields: orderByEntries.map(([, direction], index) => ({\n field: remappedFields[index],\n direction,\n })),\n };\n }\n }\n\n return body;\n}\n\n/** @internal */\nexport async function fetchObjectPage<\n Q extends ObjectTypeDefinition,\n L extends PropertyKeys<Q>,\n R extends boolean,\n S extends NullabilityAdherence,\n T extends boolean,\n ORDER_BY_OPTIONS extends ObjectSetArgs.OrderByOptions<L>,\n>(\n client: MinimalClient,\n objectType: Q,\n args: FetchPageArgs<Q, L, R, Augments, S, T, never, ORDER_BY_OPTIONS>,\n objectSet: ObjectSet,\n useSnapshot: boolean = false,\n): Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>> {\n // For simple object fetches, since we know the object type up front\n // we can parallelize network requests for loading metadata and loading the actual objects\n // In our object factory we await and block on loading the metadata, which if this call finishes, should already be cached on the client\n // We have an empty catch here so that if this call errors before we await later, we won't have an unhandled promise rejection that would crash the process\n // Swallowing the error is ok because we await the metadata load in the objectFactory later anyways which eventually bubbles up the error to the user\n void client.ontologyProvider.getObjectDefinition(objectType.apiName).catch(\n () => {},\n );\n\n const requestBody = await buildAndRemapRequestBody(\n args,\n {\n objectSet,\n select: args?.$select ? [...args.$select] : [],\n excludeRid: !args?.$includeRid,\n snapshot: useSnapshot,\n },\n client,\n objectType,\n );\n\n const r = await OntologiesV2.OntologyObjectSets.load(\n addUserAgentAndRequestContextHeaders(client, objectType),\n await client.ontologyRid,\n requestBody,\n { branch: client.branch },\n );\n\n return Promise.resolve({\n data: await client.objectFactory(\n client,\n r.data as OntologyObjectV2[],\n undefined,\n undefined,\n await extractRdpDefinition(client, objectSet),\n args.$select,\n false,\n ),\n nextPageToken: r.nextPageToken,\n totalCount: r.totalCount,\n }) as unknown as Promise<FetchPageResult<Q, L, R, S, T, ORDER_BY_OPTIONS>>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,13 @@
|
|
|
16
16
|
|
|
17
17
|
import WebSocket from "isomorphic-ws";
|
|
18
18
|
import invariant from "tiny-invariant";
|
|
19
|
+
import { ExponentialBackoff } from "../util/exponentialBackoff.js";
|
|
19
20
|
const MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;
|
|
21
|
+
const EXPONENTIAL_BACKOFF_INITIAL_DELAY_MS = 1000;
|
|
22
|
+
const EXPONENTIAL_BACKOFF_MAX_DELAY_MS = 60000;
|
|
23
|
+
const EXPONENTIAL_BACKOFF_MULTIPLIER = 2;
|
|
24
|
+
const EXPONENTIAL_BACKOFF_JITTER_FACTOR = 0.3;
|
|
25
|
+
const WEBSOCKET_IDLE_DISCONNECT_DELAY_MS = 15000;
|
|
20
26
|
|
|
21
27
|
/** Noop function to reduce conditional checks */
|
|
22
28
|
function doNothing() {}
|
|
@@ -59,6 +65,8 @@ export class ObjectSetListenerWebsocket {
|
|
|
59
65
|
#ws;
|
|
60
66
|
#lastWsConnect = 0;
|
|
61
67
|
#client;
|
|
68
|
+
#backoff;
|
|
69
|
+
#isFirstConnection = true;
|
|
62
70
|
#logger;
|
|
63
71
|
|
|
64
72
|
/**
|
|
@@ -80,6 +88,12 @@ export class ObjectSetListenerWebsocket {
|
|
|
80
88
|
} = {}) {
|
|
81
89
|
this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;
|
|
82
90
|
this.#client = client;
|
|
91
|
+
this.#backoff = new ExponentialBackoff({
|
|
92
|
+
initialDelayMs: EXPONENTIAL_BACKOFF_INITIAL_DELAY_MS,
|
|
93
|
+
maxDelayMs: EXPONENTIAL_BACKOFF_MAX_DELAY_MS,
|
|
94
|
+
multiplier: EXPONENTIAL_BACKOFF_MULTIPLIER,
|
|
95
|
+
jitterFactor: EXPONENTIAL_BACKOFF_JITTER_FACTOR
|
|
96
|
+
});
|
|
83
97
|
this.#logger = client.logger?.child({}, {
|
|
84
98
|
msgPrefix: "<OSW> "
|
|
85
99
|
});
|
|
@@ -217,7 +231,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
217
231
|
if (this.#subscriptions.size === 0) {
|
|
218
232
|
this.#cycleWebsocket();
|
|
219
233
|
}
|
|
220
|
-
},
|
|
234
|
+
}, WEBSOCKET_IDLE_DISCONNECT_DELAY_MS);
|
|
221
235
|
}
|
|
222
236
|
async #ensureWebsocket() {
|
|
223
237
|
if (this.#ws == null) {
|
|
@@ -231,12 +245,17 @@ export class ObjectSetListenerWebsocket {
|
|
|
231
245
|
// tokenProvider is async, there could potentially be a race to create the websocket.
|
|
232
246
|
// Only the first call to reach here will find a null this.#ws, the rest will bail out
|
|
233
247
|
if (this.#ws == null) {
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
248
|
+
// Only apply exponential backoff delay on reconnection attempts, not the first connection
|
|
249
|
+
if (!this.#isFirstConnection) {
|
|
250
|
+
const delay = this.#backoff.calculateDelay();
|
|
251
|
+
if (process.env.NODE_ENV !== "production") {
|
|
252
|
+
this.#logger?.debug({
|
|
253
|
+
delay,
|
|
254
|
+
attempt: this.#backoff.getAttempt()
|
|
255
|
+
}, "Waiting before reconnect");
|
|
256
|
+
}
|
|
238
257
|
await new Promise(resolve => {
|
|
239
|
-
setTimeout(resolve,
|
|
258
|
+
setTimeout(resolve, delay);
|
|
240
259
|
});
|
|
241
260
|
}
|
|
242
261
|
this.#lastWsConnect = Date.now();
|
|
@@ -268,7 +287,7 @@ export class ObjectSetListenerWebsocket {
|
|
|
268
287
|
}
|
|
269
288
|
function error(evt) {
|
|
270
289
|
cleanup();
|
|
271
|
-
reject(evt);
|
|
290
|
+
reject(new Error(String(evt)));
|
|
272
291
|
}
|
|
273
292
|
ws.addEventListener("open", open);
|
|
274
293
|
ws.addEventListener("error", error);
|
|
@@ -278,11 +297,15 @@ export class ObjectSetListenerWebsocket {
|
|
|
278
297
|
}
|
|
279
298
|
}
|
|
280
299
|
#onOpen = () => {
|
|
300
|
+
// Mark that we've successfully connected at least once
|
|
301
|
+
this.#isFirstConnection = false;
|
|
302
|
+
// Reset backoff on successful connection
|
|
303
|
+
this.#backoff.reset();
|
|
281
304
|
// resubscribe all of the listeners
|
|
282
305
|
this.#sendSubscribeMessage();
|
|
283
306
|
};
|
|
284
307
|
#onMessage = async message => {
|
|
285
|
-
const data = JSON.parse(message.data
|
|
308
|
+
const data = JSON.parse(String(message.data));
|
|
286
309
|
if (process.env.NODE_ENV !== "production") {
|
|
287
310
|
this.#logger?.debug({
|
|
288
311
|
payload: data
|
|
@@ -437,7 +460,6 @@ export class ObjectSetListenerWebsocket {
|
|
|
437
460
|
event
|
|
438
461
|
}, "Received close event from ws", event);
|
|
439
462
|
}
|
|
440
|
-
// TODO we should probably throttle this so we don't abuse the backend
|
|
441
463
|
this.#cycleWebsocket();
|
|
442
464
|
};
|
|
443
465
|
#cycleWebsocket = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","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","endedSubscriptions","Set","maybeDisconnectTimeout","constructor","minimumReconnectDelayMs","child","msgPrefix","baseUrl","startsWith","process","env","NODE_ENV","subscribe","objectType","objectSet","listener","properties","objOrInterfaceDef","type","ontologyProvider","getObjectDefinition","apiName","getInterfaceDefinition","objectProperties","referenceProperties","length","Object","keys","filter","p","primaryKeyPropertyName","undefined","primaryKeyApiName","requestedProperties","requestedReferenceProperties","subscriptionId","nextUuid","interfaceApiName","initiateSubscribe","unsubscribe","#initiateSubscribe","debug","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","tryCatchOnError","#sendSubscribeMessage","readySubs","values","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#unsubscribe","newStatus","delete","add","clearTimeout","setTimeout","size","cycleWebsocket","#ensureWebsocket","tokenProvider","url","constructWebsocketUrl","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","objectFactory2","__apiName","__primaryKey","primaryKey","property","value","fetchInterfaceMapping","singleOsdkObject","object","state","osdkObjects","keysToDelete","key","includes","osdkObject","#fetchInterfaceMapping","objectTypeApiName","interfaceMap","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","has","cause","event","#cycleWebsocket","CLOSING","CLOSED","close","s","#tryCatchOnError","subscriptionClosed","onErrorError","console","base","URL","protocol","replace","uuidCounter","padStart"],"sources":["ObjectSetListenerWebsocket.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 Logger,\n ObjectOrInterfaceDefinition,\n ObjectSetSubscription,\n Osdk,\n PropertyKeys,\n} from \"@osdk/api\";\nimport type {\n ObjectSet,\n ObjectSetStreamSubscribeRequest,\n ObjectSetStreamSubscribeRequests,\n ObjectSetSubscribeResponses,\n ObjectSetUpdates,\n ObjectState,\n RefreshObjectSet,\n StreamMessage,\n SubscriptionClosed,\n} from \"@osdk/foundry.ontologies\";\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport type { ClientCacheKey, MinimalClient } from \"../MinimalClientContext.js\";\n\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\n\n/** Noop function to reduce conditional checks */\nfunction doNothing() {}\n\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n>(\n {\n onChange = doNothing,\n onError = doNothing,\n onOutOfDate = doNothing,\n onSuccessfulSubscription = doNothing,\n }: ObjectSetSubscription.Listener<Q, P>,\n): Required<ObjectSetSubscription.Listener<Q, P>> {\n return { onChange, onError, onOutOfDate, onSuccessfulSubscription };\n}\n\ninterface Subscription<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n> {\n listener: Required<ObjectSetSubscription.Listener<Q, P>>;\n requestedProperties: Array<P>;\n requestedReferenceProperties: Array<P>;\n objectSet: ObjectSet;\n\n subscriptionId: string;\n isReady?: boolean;\n status:\n | \"preparing\"\n | \"subscribed\"\n | \"done\"\n | \"expired\"\n | \"error\"\n | \"reconnecting\";\n\n interfaceApiName?: string;\n primaryKeyPropertyName?: string;\n}\n\nfunction isReady<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n>(\n sub: Subscription<Q, P>,\n): sub is Subscription<Q, P> & { temporaryObjectSetId: string } {\n return sub.isReady != null;\n}\n\nfunction subscriptionIsDone(sub: Subscription<any, any>) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap<\n ClientCacheKey,\n ObjectSetListenerWebsocket\n >();\n readonly MINIMUM_RECONNECT_DELAY_MS: number;\n\n // FIXME\n static getInstance(client: MinimalClient): ObjectSetListenerWebsocket {\n let instance = ObjectSetListenerWebsocket.#instances.get(\n client.clientCacheKey,\n );\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(\n client.clientCacheKey,\n instance,\n );\n }\n return instance;\n }\n\n #ws: WebSocket | undefined;\n #lastWsConnect = 0;\n #client: MinimalClient;\n\n #logger?: Logger;\n\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map<\n string,\n Subscription<any, any>[]\n >();\n\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 string,\n Subscription<any, any>\n >();\n\n #endedSubscriptions = new Set<\n string\n >();\n\n #maybeDisconnectTimeout: ReturnType<typeof setTimeout> | undefined;\n\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(\n client: MinimalClient,\n {\n minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS,\n } = {},\n ) {\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(\n client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"),\n \"Stack must be a URL\",\n );\n }\n\n async subscribe<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n >(\n objectType: ObjectOrInterfaceDefinition,\n objectSet: ObjectSet,\n listener: ObjectSetSubscription.Listener<Q, P>,\n properties: Array<P> = [],\n ): Promise<() => void> {\n const objOrInterfaceDef = objectType.type === \"object\"\n ? await this.#client.ontologyProvider.getObjectDefinition(\n objectType.apiName,\n )\n : await this.#client.ontologyProvider.getInterfaceDefinition(\n objectType.apiName,\n );\n\n let objectProperties: Array<P> = [];\n let referenceProperties: Array<P> = [];\n\n if (properties.length === 0) {\n properties = Object.keys(objOrInterfaceDef.properties) as Array<P>;\n }\n\n objectProperties = properties.filter((p) =>\n objOrInterfaceDef.properties[p].type !== \"geotimeSeriesReference\"\n );\n\n referenceProperties = properties.filter((p) =>\n objOrInterfaceDef.properties[p].type === \"geotimeSeriesReference\"\n );\n\n const sub: Subscription<Q, P> = {\n listener: fillOutListener<Q, P>(listener),\n objectSet,\n primaryKeyPropertyName: objOrInterfaceDef.type === \"interface\"\n ? undefined\n : objOrInterfaceDef.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-${nextUuid()}}`,\n interfaceApiName: objOrInterfaceDef.type === \"object\"\n ? undefined\n : objOrInterfaceDef.apiName,\n };\n\n this.#subscriptions.set(sub.subscriptionId, sub);\n\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 void this.#initiateSubscribe(sub);\n\n return () => {\n this.#unsubscribe(sub);\n };\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: Subscription<any, any>) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\"#initiateSubscribe()\");\n }\n\n try {\n await this.#ensureWebsocket();\n\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 } catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n this.#tryCatchOnError(sub, true, error);\n }\n }\n\n #sendSubscribeMessage() {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\"#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\n const id = nextUuid();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n\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: ObjectSetStreamSubscribeRequests = {\n id,\n requests: readySubs.map<ObjectSetStreamSubscribeRequest>((\n {\n objectSet,\n requestedProperties,\n requestedReferenceProperties,\n interfaceApiName,\n },\n ) => {\n return {\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: requestedReferenceProperties,\n };\n }),\n };\n\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\n { payload: subscribe },\n \"sending subscribe message\",\n );\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n\n #unsubscribe<Q extends ObjectOrInterfaceDefinition>(\n sub: Subscription<Q, any>,\n newStatus: \"done\" | \"error\" = \"done\",\n ) {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n\n sub.status = newStatus;\n\n // make sure listeners do nothing now\n sub.listener = fillOutListener<Q, any>({});\n\n this.#subscriptions.delete(sub.subscriptionId);\n this.#endedSubscriptions.add(sub.subscriptionId);\n this.#sendSubscribeMessage();\n\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\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const url = constructWebsocketUrl(\n baseUrl,\n await this.#client.ontologyRid,\n );\n\n const token = await tokenProvider();\n\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\n this.#lastWsConnect = Date.now();\n\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?.debug(\"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<void>((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: unknown) {\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\n #onOpen = () => {\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n\n #onMessage = async (message: WebSocket.MessageEvent): Promise<void> => {\n const data = JSON.parse(message.data.toString()) as StreamMessage;\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n await this.#handleMessage_objectSetChanged(data);\n return;\n\n case \"refreshObjectSet\":\n this.#handleMessage_refreshObjectSet(data);\n return;\n\n case \"subscribeResponses\":\n this.#handleMessage_subscribeResponses(data);\n return;\n\n case \"subscriptionClosed\": {\n this.#handleMessage_subscriptionClosed(data);\n return;\n }\n\n default:\n const _: never = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n\n #handleMessage_objectSetChanged = async (\n payload: ObjectSetUpdates,\n ) => {\n const sub = this.#subscriptions.get(payload.id);\n if (sub == null) return;\n\n const objectUpdates = payload.updates.filter((update) =>\n update.type === \"object\"\n );\n const referenceUpdates = payload.updates.filter((update) =>\n update.type === \"reference\"\n );\n const osdkObjectsWithReferenceUpdates = await Promise.all(\n referenceUpdates.map(async (o) => {\n const osdkObjectArray = await this.#client.objectFactory2(\n this.#client,\n [{\n __apiName: o.objectType,\n __primaryKey: sub.primaryKeyPropertyName != null\n ? o.primaryKey[sub.primaryKeyPropertyName]\n : undefined,\n ...o.primaryKey,\n [o.property]: o.value,\n }],\n sub.interfaceApiName,\n {},\n false,\n undefined,\n false,\n await this.#fetchInterfaceMapping(\n o.objectType,\n sub.interfaceApiName,\n ),\n );\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject as Osdk.Instance<any, never, any>,\n state: \"ADDED_OR_UPDATED\" as ObjectState,\n }\n : undefined;\n }),\n );\n\n for (const update of osdkObjectsWithReferenceUpdates) {\n if (update != null) {\n try {\n sub.listener.onChange?.(update);\n } catch (error) {\n this.#logger?.error(error, \"Error in onChange callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n }\n }\n\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const keysToDelete = Object.keys(o.object).filter((key) =>\n sub.requestedReferenceProperties.includes(key)\n );\n for (const key of keysToDelete) {\n delete o.object[key];\n }\n\n const osdkObjectArray = await this.#client.objectFactory2(\n this.#client,\n [o.object],\n sub.interfaceApiName,\n {},\n false,\n undefined,\n false,\n await this.#fetchInterfaceMapping(\n o.object.__apiName,\n sub.interfaceApiName,\n ),\n ) as Array<Osdk.Instance<any>>;\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n try {\n sub.listener.onChange?.(osdkObject);\n } catch (error) {\n this.#logger?.error(error, \"Error in onChange callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n }\n }\n };\n\n async #fetchInterfaceMapping(\n objectTypeApiName: string,\n interfaceApiName: string | undefined,\n ): Promise<Record<string, Record<string, Record<string, string>>>> {\n if (interfaceApiName == null) return {};\n const interfaceMap = (await this.#client.ontologyProvider\n .getObjectDefinition(objectTypeApiName)).interfaceMap;\n return {\n [interfaceApiName]: {\n [objectTypeApiName]: interfaceMap[interfaceApiName],\n },\n };\n }\n\n #handleMessage_refreshObjectSet = (payload: RefreshObjectSet) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n try {\n sub.listener.onOutOfDate();\n } catch (error) {\n this.#logger?.error(error, \"Error in onOutOfDate callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n };\n\n #handleMessage_subscribeResponses = (\n payload: ObjectSetSubscribeResponses,\n ) => {\n const { id, responses } = payload;\n\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n\n switch (response.type) {\n case \"error\":\n this.#tryCatchOnError(sub, true, response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n\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\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\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ 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 try {\n if (shouldFireOutOfDate) sub.listener.onOutOfDate();\n else sub.listener.onSuccessfulSubscription();\n } catch (error) {\n this.#logger?.error(\n error,\n \"Error in onOutOfDate or onSuccessfulSubscription callback\",\n );\n this.#tryCatchOnError(sub, false, error);\n }\n break;\n default:\n this.#tryCatchOnError(sub, true, response);\n }\n }\n };\n\n #handleMessage_subscriptionClosed(payload: SubscriptionClosed) {\n const sub = this.#subscriptions.get(payload.id);\n if (sub == null && this.#endedSubscriptions.has(payload.id)) return;\n invariant(sub, `Expected subscription id ${payload.id}`);\n this.#tryCatchOnError(sub, true, payload.cause);\n this.#unsubscribe(sub, \"error\");\n }\n\n #onClose = (event: WebSocket.CloseEvent) => {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ 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\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\n if (\n this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED\n ) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\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(\n s.status !== \"done\" && s.status !== \"error\",\n \"should not have done/error subscriptions still\",\n );\n }\n }\n\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\") s.status = \"reconnecting\";\n }\n\n // we don't care about the result of this (we want cycleWebsocket to be fire and forget)\n // just that it happens\n void this.#ensureWebsocket();\n }\n };\n\n #tryCatchOnError = (\n sub: Subscription<any, any>,\n subscriptionClosed: boolean,\n error: any,\n ) => {\n try {\n sub.listener.onError({ subscriptionClosed: subscriptionClosed, error });\n } catch (onErrorError) {\n // eslint-disable-next-line no-console\n console.error(\n `Error encountered in an onError callback for an OSDK subscription`,\n onErrorError,\n );\n // eslint-disable-next-line no-console\n console.error(\n `This onError call was triggered by an error in another callback`,\n error,\n );\n // eslint-disable-next-line no-console\n console.error(\n `The subscription has been closed.`,\n error,\n );\n\n if (!subscriptionClosed) {\n this.#logger?.error(error, \"Error in onError callback\");\n this.#unsubscribe(sub, \"error\");\n this.#tryCatchOnError(sub, true, onErrorError);\n }\n }\n };\n}\n\n/** @internal */\nexport function constructWebsocketUrl(\n baseUrl: string,\n ontologyRid: string,\n) {\n const base = new URL(baseUrl);\n const url = new URL(\n `api/v2/ontologySubscriptions/ontologies/${ontologyRid}/streamSubscriptions`,\n base,\n );\n url.protocol = url.protocol.replace(\"https\", \"wss\");\n return url;\n}\n\nlet uuidCounter = 0;\n\nfunction nextUuid() {\n return `00000000-0000-0000-0000-${\n (uuidCounter++).toString().padStart(12, \"0\")\n }`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoBA,OAAOA,SAAS,MAAM,eAAe;AACrC,OAAOC,SAAS,MAAM,gBAAgB;AAGtC,MAAMC,0BAA0B,GAAG,CAAC,GAAG,IAAI;;AAE3C;AACA,SAASC,SAASA,CAAA,EAAG,CAAC;;AAEtB;AACA;AACA;AACA,SAASC,eAAeA,CAItB;EACEC,QAAQ,GAAGF,SAAS;EACpBG,OAAO,GAAGH,SAAS;EACnBI,WAAW,GAAGJ,SAAS;EACvBK,wBAAwB,GAAGL;AACS,CAAC,EACS;EAChD,OAAO;IAAEE,QAAQ;IAAEC,OAAO;IAAEC,WAAW;IAAEC;EAAyB,CAAC;AACrE;AAyBA,SAASC,OAAOA,CAIdC,GAAuB,EACuC;EAC9D,OAAOA,GAAG,CAACD,OAAO,IAAI,IAAI;AAC5B;AAEA,SAASE,kBAAkBA,CAACD,GAA2B,EAAE;EACvD,OAAOA,GAAG,CAACE,MAAM,KAAK,MAAM,IAAIF,GAAG,CAACE,MAAM,KAAK,OAAO;AACxD;;AAEA;AACA,OAAO,MAAMC,0BAA0B,CAAC;EACtC,OAAO,CAACC,SAAS,GAAG,IAAIC,OAAO,CAG7B,CAAC;EAGH;EACA,OAAOC,WAAWA,CAACC,MAAqB,EAA8B;IACpE,IAAIC,QAAQ,GAAGL,0BAA0B,CAAC,CAACC,SAAS,CAACK,GAAG,CACtDF,MAAM,CAACG,cACT,CAAC;IACD,IAAIF,QAAQ,IAAI,IAAI,EAAE;MACpBA,QAAQ,GAAG,IAAIL,0BAA0B,CAACI,MAAM,CAAC;MACjDJ,0BAA0B,CAAC,CAACC,SAAS,CAACO,GAAG,CACvCJ,MAAM,CAACG,cAAc,EACrBF,QACF,CAAC;IACH;IACA,OAAOA,QAAQ;EACjB;EAEA,CAACI,EAAE;EACH,CAACC,aAAa,GAAG,CAAC;EAClB,CAACN,MAAM;EAEP,CAACO,MAAM;;EAEP;AACF;AACA;EACE,CAACC,oBAAoB,GAAG,IAAIC,GAAG,CAG7B,CAAC;;EAEH;AACF;AACA;AACA;EACE,CAACC,aAAa,GAAG,IAAID,GAAG,CAGtB,CAAC;EAEH,CAACE,kBAAkB,GAAG,IAAIC,GAAG,CAE3B,CAAC;EAEH,CAACC,sBAAsB;;EAEvB;EACAC,WAAWA,CACTd,MAAqB,EACrB;IACEe,uBAAuB,GAAG9B;EAC5B,CAAC,GAAG,CAAC,CAAC,EACN;IACA,IAAI,CAACA,0BAA0B,GAAG8B,uBAAuB;IACzD,IAAI,CAAC,CAACf,MAAM,GAAGA,MAAM;IACrB,IAAI,CAAC,CAACO,MAAM,GAAGP,MAAM,CAACO,MAAM,EAAES,KAAK,CAAC,CAAC,CAAC,EAAE;MACtCC,SAAS,EAAE;IACb,CAAC,CAAC;IACF,EACEjB,MAAM,CAACkB,OAAO,CAACC,UAAU,CAAC,UAAU,CAAC,IAChCnB,MAAM,CAACkB,OAAO,CAACC,UAAU,CAAC,SAAS,CAAC,IAAAC,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAF3CtC,SAAS,QAGP,qBAAqB,IAHvBA,SAAS;EAKX;EAEA,MAAMuC,SAASA,CAIbC,UAAuC,EACvCC,SAAoB,EACpBC,QAA8C,EAC9CC,UAAoB,GAAG,EAAE,EACJ;IACrB,MAAMC,iBAAiB,GAAGJ,UAAU,CAACK,IAAI,KAAK,QAAQ,GAClD,MAAM,IAAI,CAAC,CAAC7B,MAAM,CAAC8B,gBAAgB,CAACC,mBAAmB,CACvDP,UAAU,CAACQ,OACb,CAAC,GACC,MAAM,IAAI,CAAC,CAAChC,MAAM,CAAC8B,gBAAgB,CAACG,sBAAsB,CAC1DT,UAAU,CAACQ,OACb,CAAC;IAEH,IAAIE,gBAA0B,GAAG,EAAE;IACnC,IAAIC,mBAA6B,GAAG,EAAE;IAEtC,IAAIR,UAAU,CAACS,MAAM,KAAK,CAAC,EAAE;MAC3BT,UAAU,GAAGU,MAAM,CAACC,IAAI,CAACV,iBAAiB,CAACD,UAAU,CAAa;IACpE;IAEAO,gBAAgB,GAAGP,UAAU,CAACY,MAAM,CAAEC,CAAC,IACrCZ,iBAAiB,CAACD,UAAU,CAACa,CAAC,CAAC,CAACX,IAAI,KAAK,wBAC3C,CAAC;IAEDM,mBAAmB,GAAGR,UAAU,CAACY,MAAM,CAAEC,CAAC,IACxCZ,iBAAiB,CAACD,UAAU,CAACa,CAAC,CAAC,CAACX,IAAI,KAAK,wBAC3C,CAAC;IAED,MAAMpC,GAAuB,GAAG;MAC9BiC,QAAQ,EAAEvC,eAAe,CAAOuC,QAAQ,CAAC;MACzCD,SAAS;MACTgB,sBAAsB,EAAEb,iBAAiB,CAACC,IAAI,KAAK,WAAW,GAC1Da,SAAS,GACTd,iBAAiB,CAACe,iBAAiB;MACvCC,mBAAmB,EAAEV,gBAAgB;MACrCW,4BAA4B,EAAEV,mBAAmB;MACjDxC,MAAM,EAAE,WAAW;MACnB;MACA;MACAmD,cAAc,EAAE,OAAOC,QAAQ,CAAC,CAAC,GAAG;MACpCC,gBAAgB,EAAEpB,iBAAiB,CAACC,IAAI,KAAK,QAAQ,GACjDa,SAAS,GACTd,iBAAiB,CAACI;IACxB,CAAC;IAED,IAAI,CAAC,CAACtB,aAAa,CAACN,GAAG,CAACX,GAAG,CAACqD,cAAc,EAAErD,GAAG,CAAC;;IAEhD;IACA;IACA,KAAK,IAAI,CAAC,CAACwD,iBAAiB,CAACxD,GAAG,CAAC;IAEjC,OAAO,MAAM;MACX,IAAI,CAAC,CAACyD,WAAW,CAACzD,GAAG,CAAC;IACxB,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAM,CAACwD,iBAAiBE,CAAC1D,GAA2B,EAAE;IACpD,IAAI2B,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC,sBAAsB,CAAC;IAC7C;IAEA,IAAI;MACF,MAAM,IAAI,CAAC,CAACC,eAAe,CAAC,CAAC;;MAE7B;MACA;MACA,IAAI3D,kBAAkB,CAACD,GAAG,CAAC,EAAE;QAC3B;MACF;MACAA,GAAG,CAACD,OAAO,GAAG,IAAI;MAClB;MACA,IAAI,IAAI,CAAC,CAACa,EAAE,EAAEiD,UAAU,KAAKvE,SAAS,CAACwE,IAAI,EAAE;QAC3C,IAAI,CAAC,CAACC,oBAAoB,CAAC,CAAC;MAC9B;IACF,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAI,CAAC,CAAClD,MAAM,EAAEkD,KAAK,CAACA,KAAK,EAAE,6BAA6B,CAAC;MACzD,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,IAAI,EAAEgE,KAAK,CAAC;IACzC;EACF;EAEA,CAACD,oBAAoBG,CAAA,EAAG;IACtB,IAAIvC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC,yBAAyB,CAAC;IAChD;IACA;IACA;IACA;IACA,MAAMQ,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAClD,aAAa,CAACmD,MAAM,CAAC,CAAC,CAAC,CAACtB,MAAM,CAAC/C,OAAO,CAAC;IAEnE,MAAMsE,EAAE,GAAGf,QAAQ,CAAC,CAAC;IACrB;IACA,IAAI,CAAC,CAACvC,oBAAoB,CAACJ,GAAG,CAAC0D,EAAE,EAAEF,SAAS,CAAC;;IAE7C;IACA;IACA,MAAMrC,SAA2C,GAAG;MAClDuC,EAAE;MACFC,QAAQ,EAAEH,SAAS,CAACI,GAAG,CAAkC,CACvD;QACEvC,SAAS;QACTmB,mBAAmB;QACnBC,4BAA4B;QAC5BG;MACF,CAAC,KACE;QACH,OAAO;UACLvB,SAAS,EAAEA,SAAS;UACpBwC,WAAW,EAAErB,mBAAmB;UAChCsB,YAAY,EAAErB;QAChB,CAAC;MACH,CAAC;IACH,CAAC;IAED,IAAIzB,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CACjB;QAAEe,OAAO,EAAE5C;MAAU,CAAC,EACtB,2BACF,CAAC;IACH;IACA,IAAI,CAAC,CAAClB,EAAE,EAAE+D,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC/C,SAAS,CAAC,CAAC;EAC3C;EAEA,CAAC2B,WAAWqB,CACV9E,GAAyB,EACzB+E,SAA2B,GAAG,MAAM,EACpC;IACA,IAAI9E,kBAAkB,CAACD,GAAG,CAAC,EAAE;MAC3B;MACA;IACF;IAEAA,GAAG,CAACE,MAAM,GAAG6E,SAAS;;IAEtB;IACA/E,GAAG,CAACiC,QAAQ,GAAGvC,eAAe,CAAS,CAAC,CAAC,CAAC;IAE1C,IAAI,CAAC,CAACuB,aAAa,CAAC+D,MAAM,CAAChF,GAAG,CAACqD,cAAc,CAAC;IAC9C,IAAI,CAAC,CAACnC,kBAAkB,CAAC+D,GAAG,CAACjF,GAAG,CAACqD,cAAc,CAAC;IAChD,IAAI,CAAC,CAACU,oBAAoB,CAAC,CAAC;;IAE5B;IACA;IACA;IACA;IACA;IACA,IAAI,IAAI,CAAC,CAAC3C,sBAAsB,EAAE;MAChC;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA8D,YAAY,CAAC,IAAI,CAAC,CAAC9D,sBAAsB,CAAC;IAC5C;IACA,IAAI,CAAC,CAACA,sBAAsB,GAAG+D,UAAU,CAAC,MAAM;MAC9C,IAAI,CAAC,CAAC/D,sBAAsB,GAAG6B,SAAS;MACxC,IAAI,IAAI,CAAC,CAAChC,aAAa,CAACmE,IAAI,KAAK,CAAC,EAAE;QAClC,IAAI,CAAC,CAACC,cAAc,CAAC,CAAC;MACxB;IACF,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;EACrB;EAEA,MAAM,CAACzB,eAAe0B,CAAA,EAAG;IACvB,IAAI,IAAI,CAAC,CAAC1E,EAAE,IAAI,IAAI,EAAE;MACpB,MAAM;QAAEa,OAAO;QAAE8D;MAAc,CAAC,GAAG,IAAI,CAAC,CAAChF,MAAM;MAC/C,MAAMiF,GAAG,GAAGC,qBAAqB,CAC/BhE,OAAO,EACP,MAAM,IAAI,CAAC,CAAClB,MAAM,CAACmF,WACrB,CAAC;MAED,MAAMC,KAAK,GAAG,MAAMJ,aAAa,CAAC,CAAC;;MAEnC;MACA;MACA,IAAI,IAAI,CAAC,CAAC3E,EAAE,IAAI,IAAI,EAAE;QACpB;QACA;QACA,MAAMgF,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC/E,aAAa,IAAI,CAAC,IAC7C,IAAI,CAACrB,0BAA0B;QACnC,IAAIoG,eAAe,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;UAChC,MAAM,IAAIC,OAAO,CAAEC,OAAO,IAAK;YAC7Bb,UAAU,CAACa,OAAO,EAAEJ,eAAe,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC;UACnD,CAAC,CAAC;QACJ;QAEA,IAAI,CAAC,CAACjF,aAAa,GAAGgF,IAAI,CAACC,GAAG,CAAC,CAAC;;QAEhC;QACA,IAAI,IAAI,CAAC,CAAClF,EAAE,IAAI,IAAI,EAAE;UACpB,IAAIe,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;YACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC,oBAAoB,CAAC;UAC3C;UACA,IAAI,CAAC,CAAC/C,EAAE,GAAG,IAAItB,SAAS,CAACkG,GAAG,EAAE,CAAC,UAAUG,KAAK,EAAE,CAAC,CAAC;UAClD,IAAI,CAAC,CAAC/E,EAAE,CAACqF,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAACC,OAAO,CAAC;UACjD,IAAI,CAAC,CAACtF,EAAE,CAACqF,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAACE,SAAS,CAAC;UACrD,IAAI,CAAC,CAACvF,EAAE,CAACqF,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAACG,MAAM,CAAC;QACjD;MACF;MACA;MACA;MACA,IAAI,IAAI,CAAC,CAACxF,EAAE,CAACiD,UAAU,KAAKvE,SAAS,CAAC+G,UAAU,EAAE;QAChD,MAAMzF,EAAE,GAAG,IAAI,CAAC,CAACA,EAAE;QACnB,OAAO,IAAImF,OAAO,CAAO,CAACC,OAAO,EAAEM,MAAM,KAAK;UAC5C,SAASC,OAAOA,CAAA,EAAG;YACjB3F,EAAE,CAAC4F,mBAAmB,CAAC,MAAM,EAAEC,IAAI,CAAC;YACpC7F,EAAE,CAAC4F,mBAAmB,CAAC,OAAO,EAAExC,KAAK,CAAC;YACtCpD,EAAE,CAAC4F,mBAAmB,CAAC,OAAO,EAAED,OAAO,CAAC;UAC1C;UACA,SAASE,IAAIA,CAAA,EAAG;YACdF,OAAO,CAAC,CAAC;YACTP,OAAO,CAAC,CAAC;UACX;UACA,SAAShC,KAAKA,CAAC0C,GAAY,EAAE;YAC3BH,OAAO,CAAC,CAAC;YACTD,MAAM,CAACI,GAAG,CAAC;UACb;UACA9F,EAAE,CAACqF,gBAAgB,CAAC,MAAM,EAAEQ,IAAI,CAAC;UACjC7F,EAAE,CAACqF,gBAAgB,CAAC,OAAO,EAAEjC,KAAK,CAAC;UACnCpD,EAAE,CAACqF,gBAAgB,CAAC,OAAO,EAAEM,OAAO,CAAC;QACvC,CAAC,CAAC;MACJ;IACF;EACF;EAEA,CAACH,MAAM,GAAGO,CAAA,KAAM;IACd;IACA,IAAI,CAAC,CAAC5C,oBAAoB,CAAC,CAAC;EAC9B,CAAC;EAED,CAACoC,SAAS,GAAG,MAAOS,OAA+B,IAAoB;IACrE,MAAMC,IAAI,GAAGjC,IAAI,CAACkC,KAAK,CAACF,OAAO,CAACC,IAAI,CAACE,QAAQ,CAAC,CAAC,CAAkB;IACjE,IAAIpF,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC;QAAEe,OAAO,EAAEmC;MAAK,CAAC,EAAE,0BAA0B,CAAC;IACpE;IACA,QAAQA,IAAI,CAACzE,IAAI;MACf,KAAK,kBAAkB;QACrB,MAAM,IAAI,CAAC,CAAC4E,8BAA8B,CAACH,IAAI,CAAC;QAChD;MAEF,KAAK,kBAAkB;QACrB,IAAI,CAAC,CAACI,8BAA8B,CAACJ,IAAI,CAAC;QAC1C;MAEF,KAAK,oBAAoB;QACvB,IAAI,CAAC,CAACK,gCAAgC,CAACL,IAAI,CAAC;QAC5C;MAEF,KAAK,oBAAoB;QAAE;UACzB,IAAI,CAAC,CAACM,gCAAgC,CAACN,IAAI,CAAC;UAC5C;QACF;MAEA;QAEElF,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAAtC,SAAS,QAAQ,yBAAyB,IAA1CA,SAAS;IACb;EACF,CAAC;EAED,CAACyH,8BAA8B,GAAG,MAChCtC,OAAyB,IACtB;IACH,MAAM1E,GAAG,GAAG,IAAI,CAAC,CAACiB,aAAa,CAACR,GAAG,CAACiE,OAAO,CAACL,EAAE,CAAC;IAC/C,IAAIrE,GAAG,IAAI,IAAI,EAAE;IAEjB,MAAMoH,aAAa,GAAG1C,OAAO,CAAC2C,OAAO,CAACvE,MAAM,CAAEwE,MAAM,IAClDA,MAAM,CAAClF,IAAI,KAAK,QAClB,CAAC;IACD,MAAMmF,gBAAgB,GAAG7C,OAAO,CAAC2C,OAAO,CAACvE,MAAM,CAAEwE,MAAM,IACrDA,MAAM,CAAClF,IAAI,KAAK,WAClB,CAAC;IACD,MAAMoF,+BAA+B,GAAG,MAAMzB,OAAO,CAAC0B,GAAG,CACvDF,gBAAgB,CAAChD,GAAG,CAAC,MAAOmD,CAAC,IAAK;MAChC,MAAMC,eAAe,GAAG,MAAM,IAAI,CAAC,CAACpH,MAAM,CAACqH,cAAc,CACvD,IAAI,CAAC,CAACrH,MAAM,EACZ,CAAC;QACCsH,SAAS,EAAEH,CAAC,CAAC3F,UAAU;QACvB+F,YAAY,EAAE9H,GAAG,CAACgD,sBAAsB,IAAI,IAAI,GAC5C0E,CAAC,CAACK,UAAU,CAAC/H,GAAG,CAACgD,sBAAsB,CAAC,GACxCC,SAAS;QACb,GAAGyE,CAAC,CAACK,UAAU;QACf,CAACL,CAAC,CAACM,QAAQ,GAAGN,CAAC,CAACO;MAClB,CAAC,CAAC,EACFjI,GAAG,CAACuD,gBAAgB,EACpB,CAAC,CAAC,EACF,KAAK,EACLN,SAAS,EACT,KAAK,EACL,MAAM,IAAI,CAAC,CAACiF,qBAAqB,CAC/BR,CAAC,CAAC3F,UAAU,EACZ/B,GAAG,CAACuD,gBACN,CACF,CAAC;MACD,MAAM4E,gBAAgB,GAAGR,eAAe,CAAC,CAAC,CAAC,IAAI1E,SAAS;MACxD,OAAOkF,gBAAgB,IAAI,IAAI,GAC3B;QACAC,MAAM,EAAED,gBAAkD;QAC1DE,KAAK,EAAE;MACT,CAAC,GACCpF,SAAS;IACf,CAAC,CACH,CAAC;IAED,KAAK,MAAMqE,MAAM,IAAIE,+BAA+B,EAAE;MACpD,IAAIF,MAAM,IAAI,IAAI,EAAE;QAClB,IAAI;UACFtH,GAAG,CAACiC,QAAQ,CAACtC,QAAQ,GAAG2H,MAAM,CAAC;QACjC,CAAC,CAAC,OAAOtD,KAAK,EAAE;UACd,IAAI,CAAC,CAAClD,MAAM,EAAEkD,KAAK,CAACA,KAAK,EAAE,4BAA4B,CAAC;UACxD,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,KAAK,EAAEgE,KAAK,CAAC;QAC1C;MACF;IACF;IAEA,MAAMsE,WAAW,GAAG,MAAMvC,OAAO,CAAC0B,GAAG,CAACL,aAAa,CAAC7C,GAAG,CAAC,MAAOmD,CAAC,IAAK;MACnE,MAAMa,YAAY,GAAG3F,MAAM,CAACC,IAAI,CAAC6E,CAAC,CAACU,MAAM,CAAC,CAACtF,MAAM,CAAE0F,GAAG,IACpDxI,GAAG,CAACoD,4BAA4B,CAACqF,QAAQ,CAACD,GAAG,CAC/C,CAAC;MACD,KAAK,MAAMA,GAAG,IAAID,YAAY,EAAE;QAC9B,OAAOb,CAAC,CAACU,MAAM,CAACI,GAAG,CAAC;MACtB;MAEA,MAAMb,eAAe,GAAG,MAAM,IAAI,CAAC,CAACpH,MAAM,CAACqH,cAAc,CACvD,IAAI,CAAC,CAACrH,MAAM,EACZ,CAACmH,CAAC,CAACU,MAAM,CAAC,EACVpI,GAAG,CAACuD,gBAAgB,EACpB,CAAC,CAAC,EACF,KAAK,EACLN,SAAS,EACT,KAAK,EACL,MAAM,IAAI,CAAC,CAACiF,qBAAqB,CAC/BR,CAAC,CAACU,MAAM,CAACP,SAAS,EAClB7H,GAAG,CAACuD,gBACN,CACF,CAA8B;MAC9B,MAAM4E,gBAAgB,GAAGR,eAAe,CAAC,CAAC,CAAC,IAAI1E,SAAS;MACxD,OAAOkF,gBAAgB,IAAI,IAAI,GAC3B;QACAC,MAAM,EAAED,gBAAgB;QACxBE,KAAK,EAAEX,CAAC,CAACW;MACX,CAAC,GACCpF,SAAS;IACf,CAAC,CAAC,CAAC;IAEH,KAAK,MAAMyF,UAAU,IAAIJ,WAAW,EAAE;MACpC,IAAII,UAAU,IAAI,IAAI,EAAE;QACtB,IAAI;UACF1I,GAAG,CAACiC,QAAQ,CAACtC,QAAQ,GAAG+I,UAAU,CAAC;QACrC,CAAC,CAAC,OAAO1E,KAAK,EAAE;UACd,IAAI,CAAC,CAAClD,MAAM,EAAEkD,KAAK,CAACA,KAAK,EAAE,4BAA4B,CAAC;UACxD,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,KAAK,EAAEgE,KAAK,CAAC;QAC1C;MACF;IACF;EACF,CAAC;EAED,MAAM,CAACkE,qBAAqBS,CAC1BC,iBAAyB,EACzBrF,gBAAoC,EAC6B;IACjE,IAAIA,gBAAgB,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,MAAMsF,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,CAACtI,MAAM,CAAC8B,gBAAgB,CACtDC,mBAAmB,CAACsG,iBAAiB,CAAC,EAAEC,YAAY;IACvD,OAAO;MACL,CAACtF,gBAAgB,GAAG;QAClB,CAACqF,iBAAiB,GAAGC,YAAY,CAACtF,gBAAgB;MACpD;IACF,CAAC;EACH;EAEA,CAAC0D,8BAA8B,GAAIvC,OAAyB,IAAK;IAC/D,MAAM1E,GAAG,GAAG,IAAI,CAAC,CAACiB,aAAa,CAACR,GAAG,CAACiE,OAAO,CAACL,EAAE,CAAC;IAC/C,CAAUrE,GAAG,GAAA2B,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbtC,SAAS,QAAM,4BAA4BmF,OAAO,CAACL,EAAE,EAAE,IAAvD9E,SAAS;IACT,IAAI;MACFS,GAAG,CAACiC,QAAQ,CAACpC,WAAW,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAOmE,KAAK,EAAE;MACd,IAAI,CAAC,CAAClD,MAAM,EAAEkD,KAAK,CAACA,KAAK,EAAE,+BAA+B,CAAC;MAC3D,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,KAAK,EAAEgE,KAAK,CAAC;IAC1C;EACF,CAAC;EAED,CAACkD,gCAAgC,GAC/BxC,OAAoC,IACjC;IACH,MAAM;MAAEL,EAAE;MAAEyE;IAAU,CAAC,GAAGpE,OAAO;IAEjC,MAAMqE,IAAI,GAAG,IAAI,CAAC,CAAChI,oBAAoB,CAACN,GAAG,CAAC4D,EAAE,CAAC;IAC/C,CAAU0E,IAAI,GAAApH,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAdtC,SAAS,QAAO,0CAA0C8E,EAAE,EAAE,IAA9D9E,SAAS;IACT,IAAI,CAAC,CAACwB,oBAAoB,CAACiE,MAAM,CAACX,EAAE,CAAC;IAErC,KAAK,IAAI2E,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,SAAS,CAACnG,MAAM,EAAEqG,CAAC,EAAE,EAAE;MACzC,MAAMhJ,GAAG,GAAG+I,IAAI,CAACC,CAAC,CAAC;MACnB,MAAMC,QAAQ,GAAGH,SAAS,CAACE,CAAC,CAAC;MAE7B,QAAQC,QAAQ,CAAC7G,IAAI;QACnB,KAAK,OAAO;UACV,IAAI,CAAC,CAAC6B,eAAe,CAACjE,GAAG,EAAE,IAAI,EAAEiJ,QAAQ,CAACC,MAAM,CAAC;UACjD,IAAI,CAAC,CAACzF,WAAW,CAACzD,GAAG,EAAE,OAAO,CAAC;UAC/B;QAEF,KAAK,KAAK;UACR;UACA,IAAI,CAAC,CAACqF,cAAc,CAAC,CAAC;UACtB;QAEF,KAAK,SAAS;UACZ;UACA,MAAM8D,mBAAmB,GAAGnJ,GAAG,CAACE,MAAM,KAAK,SAAS,IAC/CF,GAAG,CAACE,MAAM,KAAK,cAAc;UAElC,IAAIyB,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;YACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC;cAAEwF;YAAoB,CAAC,EAAE,SAAS,CAAC;UACzD;UACAnJ,GAAG,CAACE,MAAM,GAAG,YAAY;UACzB,IAAIF,GAAG,CAACqD,cAAc,KAAK4F,QAAQ,CAAC5E,EAAE,EAAE;YACtC;YACA,IAAI,CAAC,CAACpD,aAAa,CAAC+D,MAAM,CAAChF,GAAG,CAACqD,cAAc,CAAC;YAC9CrD,GAAG,CAACqD,cAAc,GAAG4F,QAAQ,CAAC5E,EAAE;YAChC,IAAI,CAAC,CAACpD,aAAa,CAACN,GAAG,CAACX,GAAG,CAACqD,cAAc,EAAErD,GAAG,CAAC,CAAC,CAAC;UACpD;UACA,IAAI;YACF,IAAImJ,mBAAmB,EAAEnJ,GAAG,CAACiC,QAAQ,CAACpC,WAAW,CAAC,CAAC,CAAC,KAC/CG,GAAG,CAACiC,QAAQ,CAACnC,wBAAwB,CAAC,CAAC;UAC9C,CAAC,CAAC,OAAOkE,KAAK,EAAE;YACd,IAAI,CAAC,CAAClD,MAAM,EAAEkD,KAAK,CACjBA,KAAK,EACL,2DACF,CAAC;YACD,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,KAAK,EAAEgE,KAAK,CAAC;UAC1C;UACA;QACF;UACE,IAAI,CAAC,CAACC,eAAe,CAACjE,GAAG,EAAE,IAAI,EAAEiJ,QAAQ,CAAC;MAC9C;IACF;EACF,CAAC;EAED,CAAC9B,gCAAgCiC,CAAC1E,OAA2B,EAAE;IAC7D,MAAM1E,GAAG,GAAG,IAAI,CAAC,CAACiB,aAAa,CAACR,GAAG,CAACiE,OAAO,CAACL,EAAE,CAAC;IAC/C,IAAIrE,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,CAACkB,kBAAkB,CAACmI,GAAG,CAAC3E,OAAO,CAACL,EAAE,CAAC,EAAE;IAC7D,CAAUrE,GAAG,GAAA2B,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbtC,SAAS,QAAM,4BAA4BmF,OAAO,CAACL,EAAE,EAAE,IAAvD9E,SAAS;IACT,IAAI,CAAC,CAAC0E,eAAe,CAACjE,GAAG,EAAE,IAAI,EAAE0E,OAAO,CAAC4E,KAAK,CAAC;IAC/C,IAAI,CAAC,CAAC7F,WAAW,CAACzD,GAAG,EAAE,OAAO,CAAC;EACjC;EAEA,CAACkG,OAAO,GAAIqD,KAA2B,IAAK;IAC1C,IAAI5H,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAAC,CAACf,MAAM,EAAE6C,KAAK,CAAC;QAAE4F;MAAM,CAAC,EAAE,8BAA8B,EAAEA,KAAK,CAAC;IACvE;IACA;IACA,IAAI,CAAC,CAAClE,cAAc,CAAC,CAAC;EACxB,CAAC;EAED,CAACA,cAAc,GAAGmE,CAAA,KAAM;IACtB,IAAI,IAAI,CAAC,CAAC5I,EAAE,EAAE;MACZ,IAAI,CAAC,CAACA,EAAE,CAAC4F,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAACJ,MAAM,CAAC;MAClD,IAAI,CAAC,CAACxF,EAAE,CAAC4F,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAACL,SAAS,CAAC;MACxD,IAAI,CAAC,CAACvF,EAAE,CAAC4F,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAACN,OAAO,CAAC;MAEpD,IACE,IAAI,CAAC,CAACtF,EAAE,CAACiD,UAAU,KAAKvE,SAAS,CAACmK,OAAO,IACtC,IAAI,CAAC,CAAC7I,EAAE,CAACiD,UAAU,KAAKvE,SAAS,CAACoK,MAAM,EAC3C;QACA,IAAI,CAAC,CAAC9I,EAAE,CAAC+I,KAAK,CAAC,CAAC;MAClB;MACA,IAAI,CAAC,CAAC/I,EAAE,GAAGqC,SAAS;IACtB;;IAEA;IACA,IAAI,IAAI,CAAC,CAAChC,aAAa,CAACmE,IAAI,GAAG,CAAC,EAAE;MAChC,IAAIzD,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC,KAAK,MAAM+H,CAAC,IAAI,IAAI,CAAC,CAAC3I,aAAa,CAACmD,MAAM,CAAC,CAAC,EAAE;UAC5C,EACEwF,CAAC,CAAC1J,MAAM,KAAK,MAAM,IAAI0J,CAAC,CAAC1J,MAAM,KAAK,OAAO,IAAAyB,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAD7CtC,SAAS,QAEP,gDAAgD,IAFlDA,SAAS;QAIX;MACF;MAEA,KAAK,MAAMqK,CAAC,IAAI,IAAI,CAAC,CAAC3I,aAAa,CAACmD,MAAM,CAAC,CAAC,EAAE;QAC5C,IAAIwF,CAAC,CAAC1J,MAAM,KAAK,YAAY,EAAE0J,CAAC,CAAC1J,MAAM,GAAG,cAAc;MAC1D;;MAEA;MACA;MACA,KAAK,IAAI,CAAC,CAAC0D,eAAe,CAAC,CAAC;IAC9B;EACF,CAAC;EAED,CAACK,eAAe,GAAG4F,CACjB7J,GAA2B,EAC3B8J,kBAA2B,EAC3B9F,KAAU,KACP;IACH,IAAI;MACFhE,GAAG,CAACiC,QAAQ,CAACrC,OAAO,CAAC;QAAEkK,kBAAkB,EAAEA,kBAAkB;QAAE9F;MAAM,CAAC,CAAC;IACzE,CAAC,CAAC,OAAO+F,YAAY,EAAE;MACrB;MACAC,OAAO,CAAChG,KAAK,CACX,mEAAmE,EACnE+F,YACF,CAAC;MACD;MACAC,OAAO,CAAChG,KAAK,CACX,iEAAiE,EACjEA,KACF,CAAC;MACD;MACAgG,OAAO,CAAChG,KAAK,CACX,mCAAmC,EACnCA,KACF,CAAC;MAED,IAAI,CAAC8F,kBAAkB,EAAE;QACvB,IAAI,CAAC,CAAChJ,MAAM,EAAEkD,KAAK,CAACA,KAAK,EAAE,2BAA2B,CAAC;QACvD,IAAI,CAAC,CAACP,WAAW,CAACzD,GAAG,EAAE,OAAO,CAAC;QAC/B,IAAI,CAAC,CAACiE,eAAe,CAACjE,GAAG,EAAE,IAAI,EAAE+J,YAAY,CAAC;MAChD;IACF;EACF,CAAC;AACH;;AAEA;AACA,OAAO,SAAStE,qBAAqBA,CACnChE,OAAe,EACfiE,WAAmB,EACnB;EACA,MAAMuE,IAAI,GAAG,IAAIC,GAAG,CAACzI,OAAO,CAAC;EAC7B,MAAM+D,GAAG,GAAG,IAAI0E,GAAG,CACjB,2CAA2CxE,WAAW,sBAAsB,EAC5EuE,IACF,CAAC;EACDzE,GAAG,CAAC2E,QAAQ,GAAG3E,GAAG,CAAC2E,QAAQ,CAACC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;EACnD,OAAO5E,GAAG;AACZ;AAEA,IAAI6E,WAAW,GAAG,CAAC;AAEnB,SAAS/G,QAAQA,CAAA,EAAG;EAClB,OAAO,2BACL,CAAC+G,WAAW,EAAE,EAAEtD,QAAQ,CAAC,CAAC,CAACuD,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAC5C;AACJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.js","names":["WebSocket","invariant","ExponentialBackoff","MINIMUM_RECONNECT_DELAY_MS","EXPONENTIAL_BACKOFF_INITIAL_DELAY_MS","EXPONENTIAL_BACKOFF_MAX_DELAY_MS","EXPONENTIAL_BACKOFF_MULTIPLIER","EXPONENTIAL_BACKOFF_JITTER_FACTOR","WEBSOCKET_IDLE_DISCONNECT_DELAY_MS","doNothing","fillOutListener","onChange","onError","onOutOfDate","onSuccessfulSubscription","isReady","sub","subscriptionIsDone","status","ObjectSetListenerWebsocket","instances","WeakMap","getInstance","client","instance","get","clientCacheKey","set","ws","lastWsConnect","backoff","isFirstConnection","logger","pendingSubscriptions","Map","subscriptions","endedSubscriptions","Set","maybeDisconnectTimeout","constructor","minimumReconnectDelayMs","initialDelayMs","maxDelayMs","multiplier","jitterFactor","child","msgPrefix","baseUrl","startsWith","process","env","NODE_ENV","subscribe","objectType","objectSet","listener","properties","objOrInterfaceDef","type","ontologyProvider","getObjectDefinition","apiName","getInterfaceDefinition","objectProperties","referenceProperties","length","Object","keys","filter","p","primaryKeyPropertyName","undefined","primaryKeyApiName","requestedProperties","requestedReferenceProperties","subscriptionId","nextUuid","interfaceApiName","initiateSubscribe","unsubscribe","#initiateSubscribe","debug","ensureWebsocket","readyState","OPEN","sendSubscribeMessage","error","tryCatchOnError","#sendSubscribeMessage","readySubs","values","id","requests","map","propertySet","referenceSet","payload","send","JSON","stringify","#unsubscribe","newStatus","delete","add","clearTimeout","setTimeout","size","cycleWebsocket","#ensureWebsocket","tokenProvider","url","constructWebsocketUrl","ontologyRid","token","delay","calculateDelay","attempt","getAttempt","Promise","resolve","Date","now","addEventListener","onClose","onMessage","onOpen","CONNECTING","reject","cleanup","removeEventListener","open","evt","Error","String","#onOpen","reset","message","data","parse","handleMessage_objectSetChanged","handleMessage_refreshObjectSet","handleMessage_subscribeResponses","handleMessage_subscriptionClosed","objectUpdates","updates","update","referenceUpdates","osdkObjectsWithReferenceUpdates","all","o","osdkObjectArray","objectFactory2","__apiName","__primaryKey","primaryKey","property","value","fetchInterfaceMapping","singleOsdkObject","object","state","osdkObjects","keysToDelete","key","includes","osdkObject","#fetchInterfaceMapping","objectTypeApiName","interfaceMap","responses","subs","i","response","errors","shouldFireOutOfDate","#handleMessage_subscriptionClosed","has","cause","event","#cycleWebsocket","CLOSING","CLOSED","close","s","#tryCatchOnError","subscriptionClosed","onErrorError","console","base","URL","protocol","replace","uuidCounter","toString","padStart"],"sources":["ObjectSetListenerWebsocket.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 Logger,\n ObjectOrInterfaceDefinition,\n ObjectSetSubscription,\n Osdk,\n PropertyKeys,\n} from \"@osdk/api\";\nimport type {\n ObjectSet,\n ObjectSetStreamSubscribeRequest,\n ObjectSetStreamSubscribeRequests,\n ObjectSetSubscribeResponses,\n ObjectSetUpdates,\n ObjectState,\n RefreshObjectSet,\n StreamMessage,\n SubscriptionClosed,\n} from \"@osdk/foundry.ontologies\";\nimport WebSocket from \"isomorphic-ws\";\nimport invariant from \"tiny-invariant\";\nimport type { ClientCacheKey, MinimalClient } from \"../MinimalClientContext.js\";\nimport { ExponentialBackoff } from \"../util/exponentialBackoff.js\";\n\nconst MINIMUM_RECONNECT_DELAY_MS = 5 * 1000;\nconst EXPONENTIAL_BACKOFF_INITIAL_DELAY_MS = 1000;\nconst EXPONENTIAL_BACKOFF_MAX_DELAY_MS = 60000;\nconst EXPONENTIAL_BACKOFF_MULTIPLIER = 2;\nconst EXPONENTIAL_BACKOFF_JITTER_FACTOR = 0.3;\nconst WEBSOCKET_IDLE_DISCONNECT_DELAY_MS = 15000;\n\n/** Noop function to reduce conditional checks */\nfunction doNothing() {}\n\n/**\n * Converts an ObjectSetListener to one where all the functions are defined.\n */\nfunction fillOutListener<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n>(\n {\n onChange = doNothing,\n onError = doNothing,\n onOutOfDate = doNothing,\n onSuccessfulSubscription = doNothing,\n }: ObjectSetSubscription.Listener<Q, P>,\n): Required<ObjectSetSubscription.Listener<Q, P>> {\n return { onChange, onError, onOutOfDate, onSuccessfulSubscription };\n}\n\ninterface Subscription<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n> {\n listener: Required<ObjectSetSubscription.Listener<Q, P>>;\n requestedProperties: Array<P>;\n requestedReferenceProperties: Array<P>;\n objectSet: ObjectSet;\n\n subscriptionId: string;\n isReady?: boolean;\n status:\n | \"preparing\"\n | \"subscribed\"\n | \"done\"\n | \"expired\"\n | \"error\"\n | \"reconnecting\";\n\n interfaceApiName?: string;\n primaryKeyPropertyName?: string;\n}\n\nfunction isReady<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n>(\n sub: Subscription<Q, P>,\n): sub is Subscription<Q, P> & { temporaryObjectSetId: string } {\n return sub.isReady != null;\n}\n\nfunction subscriptionIsDone(sub: Subscription<any, any>) {\n return sub.status === \"done\" || sub.status === \"error\";\n}\n\n/** @internal */\nexport class ObjectSetListenerWebsocket {\n static #instances = new WeakMap<\n ClientCacheKey,\n ObjectSetListenerWebsocket\n >();\n readonly MINIMUM_RECONNECT_DELAY_MS: number;\n\n // FIXME\n static getInstance(client: MinimalClient): ObjectSetListenerWebsocket {\n let instance = ObjectSetListenerWebsocket.#instances.get(\n client.clientCacheKey,\n );\n if (instance == null) {\n instance = new ObjectSetListenerWebsocket(client);\n ObjectSetListenerWebsocket.#instances.set(\n client.clientCacheKey,\n instance,\n );\n }\n return instance;\n }\n\n #ws: WebSocket | undefined;\n #lastWsConnect = 0;\n #client: MinimalClient;\n #backoff: ExponentialBackoff;\n #isFirstConnection = true;\n\n #logger?: Logger;\n\n /**\n * map of requestId to all active subscriptions at the time of the request\n */\n #pendingSubscriptions = new Map<\n string,\n Subscription<any, any>[]\n >();\n\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 string,\n Subscription<any, any>\n >();\n\n #endedSubscriptions = new Set<\n string\n >();\n\n #maybeDisconnectTimeout: ReturnType<typeof setTimeout> | undefined;\n\n // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM\n constructor(\n client: MinimalClient,\n {\n minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS,\n } = {},\n ) {\n this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;\n this.#client = client;\n this.#backoff = new ExponentialBackoff({\n initialDelayMs: EXPONENTIAL_BACKOFF_INITIAL_DELAY_MS,\n maxDelayMs: EXPONENTIAL_BACKOFF_MAX_DELAY_MS,\n multiplier: EXPONENTIAL_BACKOFF_MULTIPLIER,\n jitterFactor: EXPONENTIAL_BACKOFF_JITTER_FACTOR,\n });\n this.#logger = client.logger?.child({}, {\n msgPrefix: \"<OSW> \",\n });\n invariant(\n client.baseUrl.startsWith(\"https://\")\n || client.baseUrl.startsWith(\"http://\"),\n \"Stack must be a URL\",\n );\n }\n\n async subscribe<\n Q extends ObjectOrInterfaceDefinition,\n P extends PropertyKeys<Q>,\n >(\n objectType: ObjectOrInterfaceDefinition,\n objectSet: ObjectSet,\n listener: ObjectSetSubscription.Listener<Q, P>,\n properties: Array<P> = [],\n ): Promise<() => void> {\n const objOrInterfaceDef = objectType.type === \"object\"\n ? await this.#client.ontologyProvider.getObjectDefinition(\n objectType.apiName,\n )\n : await this.#client.ontologyProvider.getInterfaceDefinition(\n objectType.apiName,\n );\n\n let objectProperties: Array<P> = [];\n let referenceProperties: Array<P> = [];\n\n if (properties.length === 0) {\n properties = Object.keys(objOrInterfaceDef.properties) as Array<P>;\n }\n\n objectProperties = properties.filter((p) =>\n objOrInterfaceDef.properties[p].type !== \"geotimeSeriesReference\"\n );\n\n referenceProperties = properties.filter((p) =>\n objOrInterfaceDef.properties[p].type === \"geotimeSeriesReference\"\n );\n\n const sub: Subscription<Q, P> = {\n listener: fillOutListener<Q, P>(listener),\n objectSet,\n primaryKeyPropertyName: objOrInterfaceDef.type === \"interface\"\n ? undefined\n : objOrInterfaceDef.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-${nextUuid()}}`,\n interfaceApiName: objOrInterfaceDef.type === \"object\"\n ? undefined\n : objOrInterfaceDef.apiName,\n };\n\n this.#subscriptions.set(sub.subscriptionId, sub);\n\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 void this.#initiateSubscribe(sub);\n\n return () => {\n this.#unsubscribe(sub);\n };\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: Subscription<any, any>) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\"#initiateSubscribe()\");\n }\n\n try {\n await this.#ensureWebsocket();\n\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 } catch (error) {\n this.#logger?.error(error, \"Error in #initiateSubscribe\");\n this.#tryCatchOnError(sub, true, error);\n }\n }\n\n #sendSubscribeMessage() {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\"#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\n const id = nextUuid();\n // responses come back as an array of subIds, so we need to know the sources\n this.#pendingSubscriptions.set(id, readySubs);\n\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: ObjectSetStreamSubscribeRequests = {\n id,\n requests: readySubs.map<ObjectSetStreamSubscribeRequest>((\n {\n objectSet,\n requestedProperties,\n requestedReferenceProperties,\n interfaceApiName,\n },\n ) => {\n return {\n objectSet: objectSet,\n propertySet: requestedProperties,\n referenceSet: requestedReferenceProperties,\n };\n }),\n };\n\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\n { payload: subscribe },\n \"sending subscribe message\",\n );\n }\n this.#ws?.send(JSON.stringify(subscribe));\n }\n\n #unsubscribe<Q extends ObjectOrInterfaceDefinition>(\n sub: Subscription<Q, any>,\n newStatus: \"done\" | \"error\" = \"done\",\n ) {\n if (subscriptionIsDone(sub)) {\n // if we are already done, we don't need to do anything\n return;\n }\n\n sub.status = newStatus;\n\n // make sure listeners do nothing now\n sub.listener = fillOutListener<Q, any>({});\n\n this.#subscriptions.delete(sub.subscriptionId);\n this.#endedSubscriptions.add(sub.subscriptionId);\n this.#sendSubscribeMessage();\n\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 }, WEBSOCKET_IDLE_DISCONNECT_DELAY_MS);\n }\n\n async #ensureWebsocket() {\n if (this.#ws == null) {\n const { baseUrl, tokenProvider } = this.#client;\n const url = constructWebsocketUrl(\n baseUrl,\n await this.#client.ontologyRid,\n );\n\n const token = await tokenProvider();\n\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 // Only apply exponential backoff delay on reconnection attempts, not the first connection\n if (!this.#isFirstConnection) {\n const delay = this.#backoff.calculateDelay();\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug(\n { delay, attempt: this.#backoff.getAttempt() },\n \"Waiting before reconnect\",\n );\n }\n await new Promise((resolve) => {\n setTimeout(resolve, delay);\n });\n }\n\n this.#lastWsConnect = Date.now();\n\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?.debug(\"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<void>((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: unknown) {\n cleanup();\n reject(new Error(String(evt)));\n }\n ws.addEventListener(\"open\", open);\n ws.addEventListener(\"error\", error);\n ws.addEventListener(\"close\", cleanup);\n });\n }\n }\n }\n\n #onOpen = () => {\n // Mark that we've successfully connected at least once\n this.#isFirstConnection = false;\n // Reset backoff on successful connection\n this.#backoff.reset();\n // resubscribe all of the listeners\n this.#sendSubscribeMessage();\n };\n\n #onMessage = async (message: WebSocket.MessageEvent): Promise<void> => {\n const data = JSON.parse(String(message.data)) as StreamMessage;\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ payload: data }, \"received message from ws\");\n }\n switch (data.type) {\n case \"objectSetChanged\":\n await this.#handleMessage_objectSetChanged(data);\n return;\n\n case \"refreshObjectSet\":\n this.#handleMessage_refreshObjectSet(data);\n return;\n\n case \"subscribeResponses\":\n this.#handleMessage_subscribeResponses(data);\n return;\n\n case \"subscriptionClosed\": {\n this.#handleMessage_subscriptionClosed(data);\n return;\n }\n\n default:\n const _: never = data;\n invariant(false, \"Unexpected message type\");\n }\n };\n\n #handleMessage_objectSetChanged = async (\n payload: ObjectSetUpdates,\n ) => {\n const sub = this.#subscriptions.get(payload.id);\n if (sub == null) return;\n\n const objectUpdates = payload.updates.filter((update) =>\n update.type === \"object\"\n );\n const referenceUpdates = payload.updates.filter((update) =>\n update.type === \"reference\"\n );\n const osdkObjectsWithReferenceUpdates = await Promise.all(\n referenceUpdates.map(async (o) => {\n const osdkObjectArray = await this.#client.objectFactory2(\n this.#client,\n [{\n __apiName: o.objectType,\n __primaryKey: sub.primaryKeyPropertyName != null\n ? o.primaryKey[sub.primaryKeyPropertyName]\n : undefined,\n ...o.primaryKey,\n [o.property]: o.value,\n }],\n sub.interfaceApiName,\n {},\n false,\n undefined,\n false,\n await this.#fetchInterfaceMapping(\n o.objectType,\n sub.interfaceApiName,\n ),\n );\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject as Osdk.Instance<any, never, any>,\n state: \"ADDED_OR_UPDATED\" as ObjectState,\n }\n : undefined;\n }),\n );\n\n for (const update of osdkObjectsWithReferenceUpdates) {\n if (update != null) {\n try {\n sub.listener.onChange?.(update);\n } catch (error) {\n this.#logger?.error(error, \"Error in onChange callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n }\n }\n\n const osdkObjects = await Promise.all(objectUpdates.map(async (o) => {\n const keysToDelete = Object.keys(o.object).filter((key) =>\n sub.requestedReferenceProperties.includes(key)\n );\n for (const key of keysToDelete) {\n delete o.object[key];\n }\n\n const osdkObjectArray = await this.#client.objectFactory2(\n this.#client,\n [o.object],\n sub.interfaceApiName,\n {},\n false,\n undefined,\n false,\n await this.#fetchInterfaceMapping(\n o.object.__apiName,\n sub.interfaceApiName,\n ),\n ) as Array<Osdk.Instance<any>>;\n const singleOsdkObject = osdkObjectArray[0] ?? undefined;\n return singleOsdkObject != null\n ? {\n object: singleOsdkObject,\n state: o.state,\n }\n : undefined;\n }));\n\n for (const osdkObject of osdkObjects) {\n if (osdkObject != null) {\n try {\n sub.listener.onChange?.(osdkObject);\n } catch (error) {\n this.#logger?.error(error, \"Error in onChange callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n }\n }\n };\n\n async #fetchInterfaceMapping(\n objectTypeApiName: string,\n interfaceApiName: string | undefined,\n ): Promise<Record<string, Record<string, Record<string, string>>>> {\n if (interfaceApiName == null) return {};\n const interfaceMap = (await this.#client.ontologyProvider\n .getObjectDefinition(objectTypeApiName)).interfaceMap;\n return {\n [interfaceApiName]: {\n [objectTypeApiName]: interfaceMap[interfaceApiName],\n },\n };\n }\n\n #handleMessage_refreshObjectSet = (payload: RefreshObjectSet) => {\n const sub = this.#subscriptions.get(payload.id);\n invariant(sub, `Expected subscription id ${payload.id}`);\n try {\n sub.listener.onOutOfDate();\n } catch (error) {\n this.#logger?.error(error, \"Error in onOutOfDate callback\");\n this.#tryCatchOnError(sub, false, error);\n }\n };\n\n #handleMessage_subscribeResponses = (\n payload: ObjectSetSubscribeResponses,\n ) => {\n const { id, responses } = payload;\n\n const subs = this.#pendingSubscriptions.get(id);\n invariant(subs, `should have a pending subscription for ${id}`);\n this.#pendingSubscriptions.delete(id);\n\n for (let i = 0; i < responses.length; i++) {\n const sub = subs[i];\n const response = responses[i];\n\n switch (response.type) {\n case \"error\":\n this.#tryCatchOnError(sub, true, response.errors);\n this.#unsubscribe(sub, \"error\");\n break;\n\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\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\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ 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 try {\n if (shouldFireOutOfDate) sub.listener.onOutOfDate();\n else sub.listener.onSuccessfulSubscription();\n } catch (error) {\n this.#logger?.error(\n error,\n \"Error in onOutOfDate or onSuccessfulSubscription callback\",\n );\n this.#tryCatchOnError(sub, false, error);\n }\n break;\n default:\n this.#tryCatchOnError(sub, true, response);\n }\n }\n };\n\n #handleMessage_subscriptionClosed(payload: SubscriptionClosed) {\n const sub = this.#subscriptions.get(payload.id);\n if (sub == null && this.#endedSubscriptions.has(payload.id)) return;\n invariant(sub, `Expected subscription id ${payload.id}`);\n this.#tryCatchOnError(sub, true, payload.cause);\n this.#unsubscribe(sub, \"error\");\n }\n\n #onClose = (event: WebSocket.CloseEvent) => {\n if (process.env.NODE_ENV !== \"production\") {\n this.#logger?.debug({ event }, \"Received close event from ws\", event);\n }\n this.#cycleWebsocket();\n };\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\n if (\n this.#ws.readyState !== WebSocket.CLOSING\n && this.#ws.readyState !== WebSocket.CLOSED\n ) {\n this.#ws.close();\n }\n this.#ws = undefined;\n }\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(\n s.status !== \"done\" && s.status !== \"error\",\n \"should not have done/error subscriptions still\",\n );\n }\n }\n\n for (const s of this.#subscriptions.values()) {\n if (s.status === \"subscribed\") s.status = \"reconnecting\";\n }\n\n // we don't care about the result of this (we want cycleWebsocket to be fire and forget)\n // just that it happens\n void this.#ensureWebsocket();\n }\n };\n\n #tryCatchOnError = (\n sub: Subscription<any, any>,\n subscriptionClosed: boolean,\n error: any,\n ) => {\n try {\n sub.listener.onError({ subscriptionClosed: subscriptionClosed, error });\n } catch (onErrorError) {\n // eslint-disable-next-line no-console\n console.error(\n `Error encountered in an onError callback for an OSDK subscription`,\n onErrorError,\n );\n // eslint-disable-next-line no-console\n console.error(\n `This onError call was triggered by an error in another callback`,\n error,\n );\n // eslint-disable-next-line no-console\n console.error(\n `The subscription has been closed.`,\n error,\n );\n\n if (!subscriptionClosed) {\n this.#logger?.error(error, \"Error in onError callback\");\n this.#unsubscribe(sub, \"error\");\n this.#tryCatchOnError(sub, true, onErrorError);\n }\n }\n };\n}\n\n/** @internal */\nexport function constructWebsocketUrl(\n baseUrl: string,\n ontologyRid: string,\n) {\n const base = new URL(baseUrl);\n const url = new URL(\n `api/v2/ontologySubscriptions/ontologies/${ontologyRid}/streamSubscriptions`,\n base,\n );\n url.protocol = url.protocol.replace(\"https\", \"wss\");\n return url;\n}\n\nlet uuidCounter = 0;\n\nfunction nextUuid() {\n return `00000000-0000-0000-0000-${\n (uuidCounter++).toString().padStart(12, \"0\")\n }`;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -169,8 +169,9 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
169
169
|
describe("reconnect", async () => {
|
|
170
170
|
beforeEach(async () => {
|
|
171
171
|
[ws] = await Promise.all([expectWebSocketConstructed(),
|
|
172
|
-
// delay for connection reconnect
|
|
173
|
-
|
|
172
|
+
// delay for connection reconnect with exponential backoff
|
|
173
|
+
// First attempt: MINIMUM_RECONNECT_DELAY * 2^0 = 2000ms +/- jitter
|
|
174
|
+
vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY * (1 + 0.3))]);
|
|
174
175
|
setWebSocketState(ws, "open");
|
|
175
176
|
});
|
|
176
177
|
describe("subscribe and respond", () => {
|
|
@@ -289,8 +290,9 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
289
290
|
describe("reconnect, resubscribe successfully", async () => {
|
|
290
291
|
beforeEach(async () => {
|
|
291
292
|
[ws] = await Promise.all([expectWebSocketConstructed(),
|
|
292
|
-
// delay for connection reconnect
|
|
293
|
-
|
|
293
|
+
// delay for connection reconnect with exponential backoff
|
|
294
|
+
// First attempt: MINIMUM_RECONNECT_DELAY * 2^0 = 2000ms +/- jitter
|
|
295
|
+
vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY * (1 + 0.3))]);
|
|
294
296
|
setWebSocketState(ws, "open");
|
|
295
297
|
const subReq2 = await expectSubscribeMessages(ws);
|
|
296
298
|
respondSuccessToSubscribe(ws, subReq2);
|
|
@@ -311,6 +313,69 @@ describe("ObjectSetListenerWebsocket", async () => {
|
|
|
311
313
|
});
|
|
312
314
|
});
|
|
313
315
|
});
|
|
316
|
+
describe("exponential backoff behavior", () => {
|
|
317
|
+
let minimalClient;
|
|
318
|
+
let client;
|
|
319
|
+
let listener;
|
|
320
|
+
beforeEach(() => {
|
|
321
|
+
minimalClient = createMinimalClient({
|
|
322
|
+
ontologyRid: $ontologyRid
|
|
323
|
+
}, STACK, async () => "myAccessToken", {
|
|
324
|
+
logger: rootLogger
|
|
325
|
+
});
|
|
326
|
+
client = new ObjectSetListenerWebsocket({
|
|
327
|
+
...minimalClient,
|
|
328
|
+
logger: rootLogger.child({
|
|
329
|
+
oslwInst: "backoff-test"
|
|
330
|
+
})
|
|
331
|
+
}, {
|
|
332
|
+
minimumReconnectDelayMs: 1000
|
|
333
|
+
});
|
|
334
|
+
listener = {
|
|
335
|
+
onChange: vi.fn(),
|
|
336
|
+
onError: vi.fn(),
|
|
337
|
+
onOutOfDate: vi.fn(),
|
|
338
|
+
onSuccessfulSubscription: vi.fn()
|
|
339
|
+
};
|
|
340
|
+
vi.useFakeTimers();
|
|
341
|
+
});
|
|
342
|
+
afterEach(() => {
|
|
343
|
+
vi.restoreAllMocks();
|
|
344
|
+
});
|
|
345
|
+
it("should use exponential backoff for reconnection attempts", async () => {
|
|
346
|
+
// First connection attempt
|
|
347
|
+
const [ws1, unsubscribe] = await subscribeAndExpectWebSocket(client, listener);
|
|
348
|
+
setWebSocketState(ws1, "close");
|
|
349
|
+
|
|
350
|
+
// Second connection (first reconnect) - should wait ~1000ms (+/- jitter)
|
|
351
|
+
const ws2Promise = expectWebSocketConstructed();
|
|
352
|
+
await vi.advanceTimersByTimeAsync(1300); // 1000ms + max jitter (30%)
|
|
353
|
+
const ws2 = await ws2Promise;
|
|
354
|
+
setWebSocketState(ws2, "close");
|
|
355
|
+
|
|
356
|
+
// Third connection (second reconnect) - should wait ~2000ms (+/- jitter)
|
|
357
|
+
const ws3Promise = expectWebSocketConstructed();
|
|
358
|
+
await vi.advanceTimersByTimeAsync(2600); // 2000ms + max jitter (30%)
|
|
359
|
+
const ws3 = await ws3Promise;
|
|
360
|
+
setWebSocketState(ws3, "close");
|
|
361
|
+
|
|
362
|
+
// Fourth connection (third reconnect) - should wait ~4000ms (+/- jitter)
|
|
363
|
+
const ws4Promise = expectWebSocketConstructed();
|
|
364
|
+
await vi.advanceTimersByTimeAsync(5200); // 4000ms + max jitter (30%)
|
|
365
|
+
const ws4 = await ws4Promise;
|
|
366
|
+
|
|
367
|
+
// Verify backoff reset on successful connection
|
|
368
|
+
setWebSocketState(ws4, "open");
|
|
369
|
+
setWebSocketState(ws4, "close");
|
|
370
|
+
|
|
371
|
+
// After successful connection, backoff should reset to initial delay
|
|
372
|
+
const ws5Promise = expectWebSocketConstructed();
|
|
373
|
+
await vi.advanceTimersByTimeAsync(1300); // Back to 1000ms + max jitter
|
|
374
|
+
const ws5 = await ws5Promise;
|
|
375
|
+
unsubscribe();
|
|
376
|
+
setWebSocketState(ws5, "close");
|
|
377
|
+
});
|
|
378
|
+
});
|
|
314
379
|
});
|
|
315
380
|
});
|
|
316
381
|
function respondSuccessToSubscribe(ws, subReq2) {
|