@osdk/client 2.0.0-beta.12 → 2.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/build/browser/{chunk-WOFO4EAQ.js → chunk-CG25K4WC.js} +734 -621
  3. package/build/browser/chunk-CG25K4WC.js.map +1 -0
  4. package/build/browser/index.js +716 -3
  5. package/build/browser/index.js.map +1 -1
  6. package/build/browser/public/unstable-do-not-use.js +1 -878
  7. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  8. package/build/esm/Client.d.ts +25 -6
  9. package/build/esm/Client.d.ts.map +1 -1
  10. package/build/esm/actions/applyAction.d.ts +4 -4
  11. package/build/esm/actions/applyAction.d.ts.map +1 -1
  12. package/build/esm/{chunk-WOFO4EAQ.js → chunk-MQTCPUPF.js} +737 -621
  13. package/build/esm/chunk-MQTCPUPF.js.map +1 -0
  14. package/build/esm/createClient.d.ts.map +1 -1
  15. package/build/esm/index.js +716 -3
  16. package/build/esm/index.js.map +1 -1
  17. package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.d.ts +2 -2
  18. package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.d.ts.map +1 -1
  19. package/build/esm/object/fetchPage.d.ts.map +1 -1
  20. package/build/esm/object/object.test.d.ts +3 -4
  21. package/build/esm/object/object.test.d.ts.map +1 -1
  22. package/build/esm/objectSet/ObjectSetListenerWebsocket.d.ts.map +1 -1
  23. package/build/esm/ontology/OntologyProvider.d.ts +6 -6
  24. package/build/esm/ontology/OntologyProvider.d.ts.map +1 -1
  25. package/build/esm/ontology/StandardOntologyProvider.d.ts.map +1 -1
  26. package/build/esm/ontology/loadActionMetadata.d.ts +4 -0
  27. package/build/esm/ontology/loadActionMetadata.d.ts.map +1 -0
  28. package/build/esm/ontology/loadFullObjectMetadata.d.ts +2 -2
  29. package/build/esm/ontology/loadFullObjectMetadata.d.ts.map +1 -1
  30. package/build/esm/ontology/loadInterfaceMetadata.d.ts +4 -0
  31. package/build/esm/ontology/loadInterfaceMetadata.d.ts.map +1 -0
  32. package/build/esm/ontology/loadQueryMetadata.d.ts +4 -0
  33. package/build/esm/ontology/loadQueryMetadata.d.ts.map +1 -0
  34. package/build/esm/public/unstable-do-not-use.d.ts +0 -4
  35. package/build/esm/public/unstable-do-not-use.d.ts.map +1 -1
  36. package/build/esm/public/unstable-do-not-use.js +1 -881
  37. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  38. package/build/esm/queries/applyQuery.d.ts +2 -2
  39. package/build/esm/queries/applyQuery.d.ts.map +1 -1
  40. package/build/esm/queries/types.d.ts +3 -3
  41. package/build/esm/queries/types.d.ts.map +1 -1
  42. package/package.json +13 -13
  43. package/build/browser/chunk-WOFO4EAQ.js.map +0 -1
  44. package/build/esm/__unstable/UNSTABLE_createClient.d.ts +0 -4
  45. package/build/esm/__unstable/UNSTABLE_createClient.d.ts.map +0 -1
  46. package/build/esm/__unstable/UnstableClient.d.ts +0 -12
  47. package/build/esm/__unstable/UnstableClient.d.ts.map +0 -1
  48. package/build/esm/chunk-WOFO4EAQ.js.map +0 -1
  49. package/build/esm/objectSet/ObjectSetListener.d.ts +0 -18
  50. package/build/esm/objectSet/ObjectSetListener.d.ts.map +0 -1
  51. package/build/esm/objectSet/createUnstableObjectSet.d.ts +0 -8
  52. package/build/esm/objectSet/createUnstableObjectSet.d.ts.map +0 -1
  53. package/build/esm/ontology/loadInterfaceDefinition.d.ts +0 -4
  54. package/build/esm/ontology/loadInterfaceDefinition.d.ts.map +0 -1
  55. package/build/esm/ontology/loadQueryDefinition.d.ts +0 -4
  56. package/build/esm/ontology/loadQueryDefinition.d.ts.map +0 -1
@@ -1,883 +1,3 @@
1
- import { createSimpleAsyncCache, createClientInternal, createObjectSet, esm_exports, convertWireToOsdkObjects } from '../chunk-WOFO4EAQ.js';
2
- export { augment } from '../chunk-WOFO4EAQ.js';
3
- import { symbolClientContext } from '@osdk/shared.client';
4
- import { getBulkLinksPage, getLinkTypesForObjectTypes, bulkLoadOntologyEntities, createTemporaryObjectSet, loadAllOntologies } from '@osdk/client.unstable';
5
- import { batchEnableWatcher } from '@osdk/client.unstable.osw';
6
- import WebSocket from 'isomorphic-ws';
7
- import invariant2 from 'tiny-invariant';
8
-
9
- // src/ontology/makeConjureContext.ts
10
- function makeConjureContext({
11
- baseUrl,
12
- fetch: fetchFn,
13
- tokenProvider
14
- }, servicePath) {
15
- return {
16
- baseUrl,
17
- servicePath,
18
- fetchFn,
19
- tokenProvider
20
- };
21
- }
22
-
23
- // src/__unstable/ConjureSupport.ts
24
- var cachedAllOntologies;
25
- async function getOntologyVersionForRid(ctx, ontologyRid) {
26
- cachedAllOntologies ??= await loadAllOntologies(ctx, {});
27
- !cachedAllOntologies.ontologies[ontologyRid] ? process.env.NODE_ENV !== "production" ? invariant2(false, "ontology should be loaded") : invariant2(false) : void 0;
28
- return cachedAllOntologies.ontologies[ontologyRid].currentOntologyVersion;
29
- }
30
- var strongMemoAsync = (fn) => createSimpleAsyncCache("strong", fn).get;
31
- var weakMemoAsync = (fn) => createSimpleAsyncCache("weak", fn).get;
32
- var MetadataClient = class {
33
- #client;
34
- #ctx;
35
- #logger;
36
- constructor(client) {
37
- this.#client = client;
38
- this.#ctx = makeConjureContext(client, "/ontology-metadata/api");
39
- this.#client.ontologyProvider.getObjectDefinition;
40
- this.#logger = this.#client.logger?.child({
41
- mcc: true
42
- });
43
- }
44
- forObjectByRid = strongMemoAsync(async (rid) => {
45
- return Promise.resolve({
46
- getPropertyMapping: this.#objectPropertyMapping.bind(this, rid),
47
- getLinkMapping: this.#objectLinkMapping.bind(this, rid),
48
- getRid: () => rid,
49
- getApiName: async () => (await this.#getConjureObjectType(rid)).apiName
50
- });
51
- });
52
- forObjectByApiName = strongMemoAsync(async (objectApiName) => {
53
- const objectDef = await this.#client.ontologyProvider.getObjectDefinition(objectApiName);
54
- return this.forObjectByRid(objectDef.rid);
55
- });
56
- #objectPropertyMapping = strongMemoAsync(async (objectTypeRid) => {
57
- const conjureObjectType = await this.#getConjureObjectType(objectTypeRid);
58
- return createObjectPropertyMapping(conjureObjectType);
59
- });
60
- #objectLinkMapping = strongMemoAsync(async (objectTypeRid) => {
61
- const linkTypes = await getLinkTypesForObjectTypes(this.#ctx, {
62
- includeObjectTypesWithoutSearchableDatasources: true,
63
- loadRedacted: false,
64
- objectTypeBranches: {},
65
- objectTypeVersions: {
66
- [objectTypeRid]: await this.ontologyVersion("")
67
- }
68
- });
69
- !linkTypes.linkTypes[objectTypeRid] ? process.env.NODE_ENV !== "production" ? invariant2(false, "link type should be loaded") : invariant2(false) : void 0;
70
- const ret = {};
71
- for (const l of linkTypes.linkTypes[objectTypeRid]) {
72
- const helper = ({
73
- apiName
74
- }, linkSide, otherObjectType) => {
75
- if (apiName) {
76
- ret[apiName] = {
77
- apiName,
78
- directedLinkTypeRid: {
79
- linkTypeRid: l.rid,
80
- linkSide
81
- },
82
- otherObjectType
83
- };
84
- }
85
- };
86
- if (l.definition.type === "oneToMany") {
87
- const {
88
- oneToMany: {
89
- objectTypeRidManySide,
90
- manyToOneLinkMetadata,
91
- objectTypeRidOneSide,
92
- oneToManyLinkMetadata
93
- }
94
- } = l.definition;
95
- if (objectTypeRidManySide === objectTypeRid) {
96
- helper(manyToOneLinkMetadata, "TARGET", objectTypeRidOneSide);
97
- }
98
- if (objectTypeRidOneSide === objectTypeRid) {
99
- helper(oneToManyLinkMetadata, "SOURCE", objectTypeRidManySide);
100
- }
101
- } else if (l.definition.type === "manyToMany") {
102
- const {
103
- manyToMany: {
104
- objectTypeRidA,
105
- objectTypeAToBLinkMetadata,
106
- objectTypeRidB,
107
- objectTypeBToALinkMetadata
108
- }
109
- } = l.definition;
110
- if (objectTypeRidA === objectTypeRid) {
111
- helper(objectTypeAToBLinkMetadata, "SOURCE", objectTypeRidB);
112
- }
113
- if (objectTypeRidB === objectTypeRid) {
114
- helper(objectTypeBToALinkMetadata, "TARGET", objectTypeRidA);
115
- }
116
- }
117
- }
118
- return ret;
119
- });
120
- #getConjureObjectType = strongMemoAsync(async (objectTypeRid) => {
121
- this.#logger?.debug(`getConjureObjectType(${objectTypeRid})`);
122
- const body = {
123
- datasourceTypes: [],
124
- objectTypes: [{
125
- identifier: {
126
- type: "objectTypeRid",
127
- objectTypeRid
128
- },
129
- versionReference: {
130
- type: "ontologyVersion",
131
- ontologyVersion: await this.ontologyVersion("")
132
- }
133
- }],
134
- linkTypes: [],
135
- sharedPropertyTypes: [],
136
- interfaceTypes: [],
137
- typeGroups: [],
138
- loadRedacted: false,
139
- includeObjectTypeCount: void 0,
140
- includeObjectTypesWithoutSearchableDatasources: true,
141
- includeEntityMetadata: void 0
142
- };
143
- const entities = await bulkLoadOntologyEntities(this.#ctx, void 0, body);
144
- !entities.objectTypes[0]?.objectType ? process.env.NODE_ENV !== "production" ? invariant2(false, "object type should be loaded") : invariant2(false) : void 0;
145
- return entities.objectTypes[0].objectType;
146
- });
147
- ontologyVersion = strongMemoAsync(async (_) => getOntologyVersionForRid(this.#ctx, await this.#client.ontologyRid));
148
- };
149
- var metadataCacheClient = weakMemoAsync((client) => Promise.resolve(new MetadataClient(client)));
150
- function createObjectPropertyMapping(conjureOT) {
151
- !(conjureOT.primaryKeys.length === 1) ? process.env.NODE_ENV !== "production" ? invariant2(false, `only one primary key supported, got ${conjureOT.primaryKeys.length}`) : invariant2(false) : void 0;
152
- const pkRid = conjureOT.primaryKeys[0];
153
- const pkProperty = Object.values(conjureOT.propertyTypes).find((a) => a.rid === pkRid);
154
- if (!pkProperty) {
155
- throw new Error(`Could not find PK property by rid: ${pkRid}`);
156
- }
157
- const propertyIdToApiNameMapping = Object.fromEntries(Object.values(conjureOT.propertyTypes).map((property) => {
158
- return [property.id, property.apiName];
159
- }));
160
- const propertyApiNameToIdMapping = Object.fromEntries(Object.values(conjureOT.propertyTypes).map((property) => {
161
- return [property.apiName, property.id];
162
- }));
163
- return {
164
- apiName: conjureOT.apiName,
165
- id: conjureOT.id,
166
- propertyIdToApiNameMapping,
167
- propertyApiNameToIdMapping,
168
- pk: {
169
- rid: pkRid,
170
- apiName: pkProperty.apiName,
171
- type: pkProperty.type
172
- }
173
- };
174
- }
175
-
176
- // src/objectSet/conjureUnionType.ts
177
- function conjureUnionType(type, value) {
178
- return {
179
- type,
180
- [type]: value
181
- };
182
- }
183
-
184
- // src/objectSet/toConjureObjectSet.ts
185
- function toConjureObjectSet(objectSet, objectPropertyMapping) {
186
- switch (objectSet.type) {
187
- case "base":
188
- return conjureUnionType("base", {
189
- objectTypeId: objectPropertyMapping.id
190
- });
191
- case "static":
192
- return conjureUnionType("static", {
193
- objectRids: objectSet.objects,
194
- provenance: void 0
195
- });
196
- case "reference":
197
- return conjureUnionType("referenced", {
198
- objectSetRid: objectSet.reference
199
- });
200
- case "filter":
201
- return conjureUnionType("filtered", {
202
- objectSet: toConjureObjectSet(objectSet.objectSet, objectPropertyMapping),
203
- runtimeDerivedProperties: void 0,
204
- filter: mapWhereClauseToObjectSetFilter(objectSet.where, objectPropertyMapping)
205
- });
206
- case "union":
207
- return conjureUnionType("unioned", {
208
- objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
209
- });
210
- case "intersect":
211
- return conjureUnionType("intersected", {
212
- objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
213
- });
214
- case "subtract":
215
- return conjureUnionType("subtracted", {
216
- objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
217
- });
218
- case "searchAround":
219
- throw new Error("not implemented");
220
- }
221
- }
222
- async function getObjectSetBaseType(objectSet) {
223
- switch (objectSet.type) {
224
- case "base":
225
- return objectSet.objectType;
226
- case "static":
227
- throw new Error("not implemented");
228
- case "reference":
229
- throw new Error("not implemented");
230
- case "filter":
231
- return getObjectSetBaseType(objectSet.objectSet);
232
- case "union":
233
- return getObjectSetBaseType(objectSet.objectSets[0]);
234
- case "intersect":
235
- return getObjectSetBaseType(objectSet.objectSets[0]);
236
- case "subtract":
237
- return getObjectSetBaseType(objectSet.objectSets[0]);
238
- case "searchAround":
239
- throw new Error("not implemented");
240
- }
241
- }
242
- function mapWhereClauseToObjectSetFilter(objectSetFilter, propertyMapping) {
243
- switch (objectSetFilter.type) {
244
- case "lt":
245
- return conjureUnionType("range", {
246
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
247
- lt: objectSetFilter.value,
248
- lte: void 0,
249
- gt: void 0,
250
- gte: void 0
251
- });
252
- case "gt":
253
- return conjureUnionType("range", {
254
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
255
- gt: objectSetFilter.value,
256
- lte: void 0,
257
- lt: void 0,
258
- gte: void 0
259
- });
260
- case "lte":
261
- return conjureUnionType("range", {
262
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
263
- lte: objectSetFilter.value,
264
- lt: void 0,
265
- gt: void 0,
266
- gte: void 0
267
- });
268
- case "gte":
269
- return conjureUnionType("range", {
270
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
271
- gte: objectSetFilter.value,
272
- lt: void 0,
273
- lte: void 0,
274
- gt: void 0
275
- });
276
- case "eq":
277
- return conjureUnionType("exactMatch", {
278
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
279
- terms: [objectSetFilter.value]
280
- });
281
- case "and":
282
- return conjureUnionType("and", {
283
- filters: objectSetFilter.value.map((filter) => mapWhereClauseToObjectSetFilter(filter, propertyMapping))
284
- });
285
- case "or":
286
- return conjureUnionType("or", {
287
- filters: objectSetFilter.value.map((filter) => mapWhereClauseToObjectSetFilter(filter, propertyMapping))
288
- });
289
- case "isNull":
290
- return conjureUnionType("not", {
291
- filter: {
292
- type: "hasProperty",
293
- hasProperty: {
294
- propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field]
295
- }
296
- }
297
- });
298
- case "not":
299
- return conjureUnionType("not", {
300
- filter: mapWhereClauseToObjectSetFilter(objectSetFilter.value, propertyMapping)
301
- });
302
- case "contains":
303
- case "startsWith":
304
- case "containsAllTermsInOrder":
305
- case "containsAnyTerm":
306
- case "containsAllTerms":
307
- case "withinDistanceOf":
308
- case "withinBoundingBox":
309
- case "intersectsBoundingBox":
310
- case "doesNotIntersectBoundingBox":
311
- case "withinPolygon":
312
- case "intersectsPolygon":
313
- case "doesNotIntersectPolygon":
314
- case "containsAllTermsInOrderPrefixLastTerm":
315
- case "in":
316
- throw new Error("not implemented");
317
- }
318
- }
319
-
320
- // src/objectSet/ObjectSetListenerWebsocket.ts
321
- var ONE_DAY_MS = 24 * 60 * 60 * 1e3;
322
- var MINIMUM_RECONNECT_DELAY_MS = 5 * 1e3;
323
- function doNothing() {
324
- }
325
- function fillOutListener({
326
- onChange = doNothing,
327
- onError = doNothing,
328
- onOutOfDate = doNothing
329
- }) {
330
- return {
331
- onChange,
332
- onError,
333
- onOutOfDate
334
- };
335
- }
336
- function isReady(sub) {
337
- return sub.temporaryObjectSetId != null;
338
- }
339
- function subscriptionIsDone(sub) {
340
- return sub.status === "done" || sub.status === "error";
341
- }
342
- var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
343
- static #instances = /* @__PURE__ */ new WeakMap();
344
- // FIXME
345
- static getInstance(client) {
346
- let instance = _ObjectSetListenerWebsocket.#instances.get(client.clientCacheKey);
347
- if (instance == null) {
348
- instance = new _ObjectSetListenerWebsocket(client);
349
- _ObjectSetListenerWebsocket.#instances.set(client.clientCacheKey, instance);
350
- }
351
- return instance;
352
- }
353
- #ws;
354
- #lastWsConnect = 0;
355
- #client;
356
- #logger;
357
- /**
358
- * map of requestId to all active subscriptions at the time of the request
359
- */
360
- #pendingSubscriptions = /* @__PURE__ */ new Map();
361
- /**
362
- * Map of subscriptionId to Subscription. Note: the subscriptionId may be
363
- * temporary and not the actual subscriptionId from the server.
364
- */
365
- #subscriptions = /* @__PURE__ */ new Map();
366
- #oswContext;
367
- #metadataContext;
368
- #ossContext;
369
- #maybeDisconnectTimeout;
370
- // DO NOT CONSTRUCT DIRECTLY. ONLY EXPOSED AS A TESTING SEAM
371
- constructor(client, {
372
- objectSetExpiryMs = ONE_DAY_MS,
373
- minimumReconnectDelayMs = MINIMUM_RECONNECT_DELAY_MS
374
- } = {}) {
375
- this.OBJECT_SET_EXPIRY_MS = objectSetExpiryMs;
376
- this.MINIMUM_RECONNECT_DELAY_MS = minimumReconnectDelayMs;
377
- this.#client = client;
378
- this.#logger = client.logger?.child({}, {
379
- msgPrefix: "<OSW> "
380
- });
381
- !(client.baseUrl.startsWith("https://") || client.baseUrl.startsWith("http://")) ? process.env.NODE_ENV !== "production" ? invariant2(false, "Stack must be a URL") : invariant2(false) : void 0;
382
- this.#oswContext = {
383
- baseUrl: client.baseUrl,
384
- servicePath: "/object-set-watcher/api",
385
- fetchFn: client.fetch,
386
- tokenProvider: async () => await client.tokenProvider()
387
- };
388
- this.#ossContext = {
389
- ...this.#oswContext,
390
- servicePath: "/object-set-service/api"
391
- };
392
- this.#metadataContext = {
393
- ...this.#oswContext,
394
- servicePath: "/ontology-metadata/api"
395
- };
396
- }
397
- async subscribe(objectSet, listener) {
398
- {
399
- globalThis.crypto ??= (await import('crypto')).webcrypto;
400
- }
401
- const sub = {
402
- listener: fillOutListener(listener),
403
- objectSet,
404
- status: "preparing",
405
- // Since we don't have a real subscription id yet but we need to keep
406
- // track of this reference, we can just use a random uuid.
407
- subscriptionId: `TMP-${crypto.randomUUID()}`
408
- };
409
- this.#subscriptions.set(sub.subscriptionId, sub);
410
- this.#initiateSubscribe(sub);
411
- return () => {
412
- this.#unsubscribe(sub);
413
- };
414
- }
415
- /**
416
- * Called at least once for every subscription.
417
- *
418
- * - Resets pending expiry
419
- * - Recreates temporary object set
420
- * - Triggers a full subscribe message
421
- *
422
- * @returns
423
- */
424
- async #initiateSubscribe(sub) {
425
- if (process?.env?.NODE_ENV !== "production") {
426
- this.#logger?.trace("#initiateSubscribe()");
427
- }
428
- if (sub.expiry) {
429
- clearTimeout(sub.expiry);
430
- }
431
- sub.expiry = setTimeout(() => this.#expire(sub), this.OBJECT_SET_EXPIRY_MS);
432
- const ontologyRid = await this.#client.ontologyRid;
433
- try {
434
- const [temporaryObjectSet] = await Promise.all([
435
- // create a time-bounded object set representation for watching
436
- this.#createTemporaryObjectSet(sub.objectSet),
437
- this.#ensureWebsocket(),
438
- // look up the object type's rid and ensure that we have enabled object set watcher for that rid
439
- // TODO ???
440
- getObjectSetBaseType(sub.objectSet).then((baseType) => esm_exports.ObjectTypesV2.getObjectTypeV2(this.#client, ontologyRid, baseType)).then((objectType) => this.#enableObjectSetsWatcher([objectType.rid]))
441
- ]);
442
- if (subscriptionIsDone(sub)) {
443
- return;
444
- }
445
- sub.temporaryObjectSetId = temporaryObjectSet.objectSetRid;
446
- if (this.#ws?.readyState === WebSocket.OPEN) {
447
- this.#sendSubscribeMessage();
448
- }
449
- } catch (error) {
450
- this.#logger?.error(error, "Error in #initiateSubscribe");
451
- sub.listener.onError(error);
452
- }
453
- }
454
- #sendSubscribeMessage() {
455
- if (process?.env?.NODE_ENV !== "production") {
456
- this.#logger?.trace("#sendSubscribeMessage()");
457
- }
458
- const readySubs = [...this.#subscriptions.values()].filter(isReady);
459
- if (readySubs.length === 0) {
460
- if (process?.env?.NODE_ENV !== "production") {
461
- this.#logger?.trace("#sendSubscribeMessage(): aborting due to no ready subscriptions");
462
- }
463
- return;
464
- }
465
- const id = crypto.randomUUID();
466
- this.#pendingSubscriptions.set(id, readySubs);
467
- const subscribe = {
468
- id,
469
- requests: readySubs.map(({
470
- temporaryObjectSetId
471
- }) => ({
472
- objectSet: temporaryObjectSetId,
473
- objectSetContext: {
474
- objectSetFilterContext: {
475
- parameterOverrides: {}
476
- }
477
- },
478
- watchAllLinks: false
479
- }))
480
- };
481
- if (process?.env?.NODE_ENV !== "production") {
482
- this.#logger?.trace({
483
- payload: subscribe
484
- }, "sending subscribe message");
485
- }
486
- this.#ws?.send(JSON.stringify(subscribe));
487
- }
488
- #expire(sub) {
489
- if (process?.env?.NODE_ENV !== "production") {
490
- this.#logger?.trace({
491
- subscription: sub
492
- }, "#expire()");
493
- }
494
- sub.status = "expired";
495
- this.#initiateSubscribe(sub);
496
- }
497
- #unsubscribe(sub, newStatus = "done") {
498
- if (subscriptionIsDone(sub)) {
499
- return;
500
- }
501
- sub.status = newStatus;
502
- sub.listener = fillOutListener({});
503
- if (sub.expiry) {
504
- clearTimeout(sub.expiry);
505
- sub.expiry = void 0;
506
- }
507
- this.#subscriptions.delete(sub.subscriptionId);
508
- if (this.#maybeDisconnectTimeout) {
509
- clearTimeout(this.#maybeDisconnectTimeout);
510
- }
511
- this.#maybeDisconnectTimeout = setTimeout(
512
- () => {
513
- this.#maybeDisconnectTimeout = void 0;
514
- if (this.#subscriptions.size === 0) {
515
- this.#cycleWebsocket();
516
- }
517
- },
518
- 15e3
519
- /* ms */
520
- );
521
- }
522
- async #ensureWebsocket() {
523
- if (this.#ws == null) {
524
- const {
525
- baseUrl,
526
- tokenProvider
527
- } = this.#client;
528
- const base = new URL(baseUrl);
529
- const url = `wss://${base.host}/object-set-watcher/ws/subscriptions`;
530
- const token = await tokenProvider();
531
- if (this.#ws == null) {
532
- const nextConnectTime = (this.#lastWsConnect ?? 0) + this.MINIMUM_RECONNECT_DELAY_MS;
533
- if (nextConnectTime > Date.now()) {
534
- await new Promise((resolve) => {
535
- setTimeout(resolve, nextConnectTime - Date.now());
536
- });
537
- }
538
- this.#lastWsConnect = Date.now();
539
- if (this.#ws == null) {
540
- if (process?.env?.NODE_ENV !== "production") {
541
- this.#logger?.trace("Creating websocket");
542
- }
543
- this.#ws = new WebSocket(url, [`Bearer-${token}`]);
544
- this.#ws.addEventListener("close", this.#onClose);
545
- this.#ws.addEventListener("message", this.#onMessage);
546
- this.#ws.addEventListener("open", this.#onOpen);
547
- }
548
- }
549
- if (this.#ws.readyState === WebSocket.CONNECTING) {
550
- const ws = this.#ws;
551
- return new Promise((resolve, reject) => {
552
- function cleanup() {
553
- ws.removeEventListener("open", open);
554
- ws.removeEventListener("error", error);
555
- ws.removeEventListener("close", cleanup);
556
- }
557
- function open() {
558
- cleanup();
559
- resolve();
560
- }
561
- function error(evt) {
562
- cleanup();
563
- reject(evt);
564
- }
565
- ws.addEventListener("open", open);
566
- ws.addEventListener("error", error);
567
- ws.addEventListener("close", cleanup);
568
- });
569
- }
570
- }
571
- }
572
- #onOpen = () => {
573
- this.#sendSubscribeMessage();
574
- };
575
- #onMessage = async (message) => {
576
- const data = JSON.parse(message.data.toString());
577
- if (process?.env?.NODE_ENV !== "production") {
578
- this.#logger?.trace({
579
- payload: data
580
- }, "received message from ws");
581
- }
582
- switch (data.type) {
583
- case "objectSetChanged":
584
- return this.#handleMessage_objectSetChanged(data.objectSetChanged);
585
- case "refreshObjectSet":
586
- return this.#handleMessage_refreshObjectSet(data.refreshObjectSet);
587
- case "subscribeResponses":
588
- return this.#handleMessage_subscribeResponses(data.subscribeResponses);
589
- case "subscriptionClosed": {
590
- const payload = data.subscriptionClosed;
591
- return this.#handleMessage_subscriptionClosed(payload);
592
- }
593
- default:
594
- process.env.NODE_ENV !== "production" ? invariant2(false, "Unexpected message type") : invariant2(false) ;
595
- }
596
- };
597
- #handleMessage_objectSetChanged = async (payload) => {
598
- const sub = this.#subscriptions.get(payload.id);
599
- !sub ? process.env.NODE_ENV !== "production" ? invariant2(false, `Expected subscription id ${payload.id}`) : invariant2(false) : void 0;
600
- if ("confidenceValue" in payload) {
601
- sub.listener.onOutOfDate();
602
- return;
603
- }
604
- const objects = payload.updates.filter(function(a) {
605
- return a.type === "object";
606
- }).map((a) => a.object);
607
- !(objects.length === payload.updates.length) ? process.env.NODE_ENV !== "production" ? invariant2(false, "currently only support full updates not reference updates") : invariant2(false) : void 0;
608
- sub.listener.onChange(await convertFoundryToOsdkObjects(this.#client, this.#metadataContext, objects));
609
- };
610
- #handleMessage_refreshObjectSet = (payload) => {
611
- const sub = this.#subscriptions.get(payload.id);
612
- !sub ? process.env.NODE_ENV !== "production" ? invariant2(false, `Expected subscription id ${payload.id}`) : invariant2(false) : void 0;
613
- sub.listener.onOutOfDate();
614
- };
615
- #handleMessage_subscribeResponses = (payload) => {
616
- const {
617
- id,
618
- responses
619
- } = payload;
620
- const subs = this.#pendingSubscriptions.get(id);
621
- !subs ? process.env.NODE_ENV !== "production" ? invariant2(false, `should have a pending subscription for ${id}`) : invariant2(false) : void 0;
622
- this.#pendingSubscriptions.delete(id);
623
- for (let i = 0; i < responses.length; i++) {
624
- const sub = subs[i];
625
- const response = responses[i];
626
- switch (response.type) {
627
- case "error":
628
- sub.listener.onError(response.error);
629
- this.#unsubscribe(sub, "error");
630
- break;
631
- case "qos":
632
- this.#cycleWebsocket();
633
- break;
634
- case "success":
635
- const shouldFireOutOfDate = sub.status === "expired" || sub.status === "reconnecting";
636
- if (process?.env?.NODE_ENV !== "production") {
637
- this.#logger?.trace({
638
- shouldFireOutOfDate
639
- }, "success");
640
- }
641
- sub.status = "subscribed";
642
- if (sub.subscriptionId !== response.success.id) {
643
- this.#subscriptions.delete(sub.subscriptionId);
644
- sub.subscriptionId = response.success.id;
645
- this.#subscriptions.set(sub.subscriptionId, sub);
646
- }
647
- if (shouldFireOutOfDate) sub.listener.onOutOfDate();
648
- break;
649
- default:
650
- sub.listener.onError(response);
651
- }
652
- }
653
- };
654
- #handleMessage_subscriptionClosed(payload) {
655
- const sub = this.#subscriptions.get(payload.id);
656
- !sub ? process.env.NODE_ENV !== "production" ? invariant2(false, `Expected subscription id ${payload.id}`) : invariant2(false) : void 0;
657
- sub.listener.onError(payload.error);
658
- this.#unsubscribe(sub, "error");
659
- }
660
- #onClose = (event) => {
661
- if (process?.env?.NODE_ENV !== "production") {
662
- this.#logger?.trace({
663
- event
664
- }, "Received close event from ws", event);
665
- }
666
- this.#cycleWebsocket();
667
- };
668
- async #enableObjectSetsWatcher(objectTypeRids) {
669
- return batchEnableWatcher(this.#oswContext, {
670
- requests: objectTypeRids
671
- });
672
- }
673
- async #createTemporaryObjectSet(objectSet) {
674
- const objectSetBaseType = await getObjectSetBaseType(objectSet);
675
- const mcc = await metadataCacheClient(this.#client);
676
- const objectInfo = await mcc.forObjectByApiName(objectSetBaseType);
677
- const propMapping = await objectInfo.getPropertyMapping();
678
- const temporaryObjectSet = await createTemporaryObjectSet(this.#ossContext, {
679
- objectSet: toConjureObjectSet(objectSet, propMapping),
680
- timeToLive: "ONE_DAY",
681
- // MUST keep in sync with the value for expiry in `#initiateSubscribe`.
682
- objectSetFilterContext: {
683
- parameterOverrides: {}
684
- }
685
- });
686
- return {
687
- objectSetRid: temporaryObjectSet.objectSetRid
688
- };
689
- }
690
- #cycleWebsocket = () => {
691
- if (this.#ws) {
692
- this.#ws.removeEventListener("open", this.#onOpen);
693
- this.#ws.removeEventListener("message", this.#onMessage);
694
- this.#ws.removeEventListener("close", this.#onClose);
695
- if (this.#ws.readyState !== WebSocket.CLOSING && this.#ws.readyState !== WebSocket.CLOSED) {
696
- this.#ws.close();
697
- }
698
- this.#ws = void 0;
699
- }
700
- if (this.#subscriptions.size > 0) {
701
- if (process?.env?.NODE_ENV !== "production") {
702
- for (const s of this.#subscriptions.values()) {
703
- !(s.status !== "done" && s.status !== "error") ? process.env.NODE_ENV !== "production" ? invariant2(false, "should not have done/error subscriptions still") : invariant2(false) : void 0;
704
- }
705
- }
706
- for (const s of this.#subscriptions.values()) {
707
- if (s.status === "subscribed") s.status = "reconnecting";
708
- }
709
- this.#ensureWebsocket();
710
- }
711
- };
712
- };
713
- async function convertFoundryToOsdkObjects(client, ctx, objects) {
714
- const osdkObjects = await Promise.all(objects.map(async (object) => {
715
- const propertyMapping = await (await (await metadataCacheClient(client)).forObjectByRid(object.type)).getPropertyMapping();
716
- const convertedObject = Object.fromEntries([...Object.entries(object.properties).map(([key, value]) => {
717
- return [propertyMapping?.propertyIdToApiNameMapping[key], value];
718
- }), [propertyMapping?.propertyIdToApiNameMapping[Object.entries(object.key)[0][0]], Object.entries(object.key)[0][1]], ["__apiName", propertyMapping?.apiName], ["$apiName", propertyMapping?.apiName]]);
719
- return convertedObject;
720
- }));
721
- return await convertWireToOsdkObjects(client, osdkObjects, void 0);
722
- }
723
-
724
- // src/objectSet/createUnstableObjectSet.ts
725
- function UNSTABLE_createObjectSet(objectType, clientCtx, objectSet = {
726
- type: "base",
727
- objectType: objectType["apiName"]
728
- }) {
729
- return Object.assign(
730
- createObjectSet(objectType, clientCtx, objectSet),
731
- {
732
- subscribe(listener) {
733
- const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(clientCtx).subscribe(objectSet, listener);
734
- return async () => (await pendingSubscribe)();
735
- }
736
- }
737
- // cast is needed because we are relying on the where clause doing the right thing via client.createObjectSet
738
- );
739
- }
740
-
741
- // src/pageRequestAsAsyncIter.ts
742
- function getResults(x) {
743
- return x.results;
744
- }
745
- function applyPageToken(payload, {
746
- pageToken
747
- }) {
748
- return pageToken ? {
749
- ...payload,
750
- pageToken
751
- } : void 0;
752
- }
753
- async function* pageRequestAsAsyncIter(call, values, nextArgs, initialPayload) {
754
- let payload = initialPayload;
755
- while (payload) {
756
- const r = await call(payload);
757
- for (const q of values(r)) {
758
- yield q;
759
- }
760
- payload = nextArgs(payload, r);
761
- }
762
- }
763
-
764
- // src/__unstable/createBulkLinksAsyncIterFactory.ts
765
- function createBulkLinksAsyncIterFactory(ctx) {
766
- return async function* (objs, linkTypes) {
767
- if (objs.length === 0) {
768
- return;
769
- }
770
- ctx.logger?.debug("Preparing to fetch bulk links");
771
- !objs.every((a) => a.$objectType === objs[0].$objectType) ? process.env.NODE_ENV !== "production" ? invariant2(false) : invariant2(false) : void 0;
772
- const mcc = await metadataCacheClient(ctx);
773
- const helper = await mcc.forObjectByApiName(objs[0].$objectType);
774
- const [objectTypeRid, propertyMapping, fullLinkMapping] = await Promise.all([helper.getRid(), helper.getPropertyMapping(), helper.getLinkMapping()]);
775
- const linkMapping = Object.fromEntries(Object.entries(fullLinkMapping).filter(([apiName]) => linkTypes.includes(apiName)));
776
- for (const linkType of linkTypes) {
777
- if (linkMapping[linkType] == null) {
778
- throw "Unable to find link type: " + linkType;
779
- }
780
- }
781
- const req = {
782
- objectSetContext: {
783
- forkRid: void 0,
784
- objectSetFilterContext: {
785
- parameterOverrides: {}
786
- },
787
- ontologyBranchRid: void 0,
788
- owningRid: void 0,
789
- reportUsage: void 0,
790
- workstateRid: void 0
791
- },
792
- responseOptions: {
793
- includeObjectSetEntities: true,
794
- includeUsageCost: false
795
- },
796
- pageSize: 1e3,
797
- pageToken: void 0,
798
- linksRequests: [{
799
- directedLinkTypes: Object.values(linkMapping).map(({
800
- directedLinkTypeRid
801
- }) => directedLinkTypeRid),
802
- objects: conjureUnionType("objects", objs.map((o) => conjureUnionType("objectLocatorV2", {
803
- objectTypeRid,
804
- objectPrimaryKey: {
805
- [propertyMapping.pk.rid]: conjureUnionType(propertyMapping.pk.type.type, o.$primaryKey)
806
- }
807
- })))
808
- }]
809
- };
810
- const bulkLinksIter = pageRequestAsAsyncIter(getBulkLinksPage.bind(void 0, makeConjureContext(ctx, "/object-set-service/api")), getResults, applyPageToken, req);
811
- for await (const item of bulkLinksIter) {
812
- const {
813
- objectIdentifier
814
- } = item;
815
- const obj = findObject(objectIdentifier, objs);
816
- for (const link of item.links) {
817
- const ref = link.link[link.linkSide === "SOURCE" ? "objectSideB" : "objectSideA"];
818
- const pk = getPrimaryKeyOrThrow(ref);
819
- const otherObjectApiName = await (await mcc.forObjectByRid(pk.objectTypeRid)).getApiName();
820
- const mappedLink = Object.values(linkMapping).find((a) => a.directedLinkTypeRid.linkTypeRid === link.link.linkTypeRid && a.directedLinkTypeRid.linkSide === link.linkSide);
821
- if (!mappedLink) throw new Error("Could not find link type");
822
- yield {
823
- object: obj,
824
- linkApiName: mappedLink.apiName,
825
- otherObjectApiName,
826
- otherObjectPk: pk.pkValue
827
- };
828
- }
829
- }
830
- };
831
- }
832
- function findObject(objectIdentifier, objs) {
833
- const {
834
- pkValue
835
- } = getPrimaryKeyOrThrow(objectIdentifier);
836
- const obj = objs.find((o) => o.$primaryKey === pkValue);
837
- if (obj == null) {
838
- throw new Error(`Needed to find object with pk ${pkValue}} and could not`);
839
- }
840
- return obj;
841
- }
842
- function getPrimaryKeyOrThrow(ref) {
843
- if ("type" in ref && ref.type !== "objectLocatorV2") {
844
- throw new Error("We do not support looking up object by rid");
845
- }
846
- const pks = Object.entries(ref.objectLocatorV2.objectPrimaryKey);
847
- if (pks.length !== 1) {
848
- throw new Error("Unable to support this request due to multiple pks");
849
- }
850
- return {
851
- objectTypeRid: ref.objectLocatorV2.objectTypeRid,
852
- pkValue: pks[0][1][pks[0][1].type]
853
- };
854
- }
855
-
856
- // src/__unstable/UNSTABLE_createClient.ts
857
- function UNSTABLE_createClient(...args) {
858
- const client = createClientInternal(UNSTABLE_createObjectSet, ...args);
859
- const unstableClient = Object.defineProperties(client, {
860
- __UNSTABLE_getBulkLinks: {
861
- get: () => createBulkLinksAsyncIterFactory(client[symbolClientContext])
862
- },
863
- __UNSTABLE_preexistingObjectSet: {
864
- get: () => (definition, rid) => {
865
- return UNSTABLE_createObjectSet(definition, client[symbolClientContext], {
866
- type: "intersect",
867
- objectSets: [{
868
- type: "base",
869
- objectType: definition.apiName
870
- }, {
871
- type: "reference",
872
- reference: rid
873
- }]
874
- });
875
- }
876
- }
877
- });
878
- return unstableClient;
879
- }
880
-
881
- export { UNSTABLE_createClient as createClient };
1
+ export { augment } from '../chunk-MQTCPUPF.js';
882
2
  //# sourceMappingURL=unstable-do-not-use.js.map
883
3
  //# sourceMappingURL=unstable-do-not-use.js.map