@osdk/client 0.1.1 → 0.2.0

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.
@@ -1,31 +1,703 @@
1
1
  'use strict';
2
2
 
3
- var chunkGVR2K3BV_cjs = require('./chunk-GVR2K3BV.cjs');
3
+ var chunkCCKGGMYW_cjs = require('./chunk-CCKGGMYW.cjs');
4
4
  var shared_net = require('@osdk/shared.net');
5
5
  var requests = require('@osdk/gateway/requests');
6
- var f = require('isomorphic-ws');
7
- var E = require('tiny-invariant');
6
+ var WebSocket = require('isomorphic-ws');
7
+ var invariant = require('tiny-invariant');
8
8
  var conjureLite = require('conjure-lite');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
- var f__default = /*#__PURE__*/_interopDefault(f);
13
- var E__default = /*#__PURE__*/_interopDefault(E);
12
+ var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
13
+ var invariant__default = /*#__PURE__*/_interopDefault(invariant);
14
14
 
15
- async function F(t,e,o,r){let s=await requests.applyActionV2(shared_net.createOpenApiRequest(t.stack,t.fetch),t.ontology.metadata.ontologyApiName,e,{parameters:o,options:{mode:r?.validateOnly?"VALIDATE_ONLY":"VALIDATE_AND_EXECUTE",returnEdits:r?.returnEdits?"ALL":"NONE"}}),a=s.edits?.type=="largeScaleEdits"?s.edits.editedObjectTypes:void 0,n=s.edits?.type=="edits"?s.edits:void 0;n?.edits[0];return {__unstable:{bulkEdits:a,addedLinksCount:n?.addedLinksCount,addedObjectCount:n?.addedObjectCount,modifiedObjectsCount:n?.modifiedObjectsCount,edits:n?.edits}}}function w(t){return new Proxy({},{get:(e,o,r)=>{if(typeof o=="string")return function(...s){return F(t,o,...s)}}})}async function g(t,e){return conjureLite.conjureFetch(t,"/objectSets/temporary","POST",e)}async function h(t,e){return conjureLite.conjureFetch(t,"/object-set-watcher/batchEnableWatcher","POST",e)}async function O(t,e){return conjureLite.conjureFetch(t,"/ontology/ontology/loadEntities","POST",e)}function u(t,e){switch(t.type){case"base":return {type:"base",base:{objectTypeId:e.id}};case"static":return {type:"static",static:{objectRids:t.objects,provenance:void 0}};case"reference":return {type:"referenced",referenced:{objectSetRid:t.reference}};case"filter":return {type:"filtered",filtered:{objectSet:u(t.objectSet,e),runtimeDerivedProperties:void 0,filter:d(t.where,e)}};case"union":return {type:"unioned",unioned:{objectSets:t.objectSets.map(o=>u(o,e))}};case"intersect":return {type:"intersected",intersected:{objectSets:t.objectSets.map(o=>u(o,e))}};case"subtract":return {type:"subtracted",subtracted:{objectSets:t.objectSets.map(o=>u(o,e))}};case"searchAround":throw new Error("not implemented")}}async function p(t){switch(t.type){case"base":return t.objectType;case"static":throw new Error("not implemented");case"reference":throw new Error("not implemented");case"filter":return p(t.objectSet);case"union":return p(t.objectSets[0]);case"intersect":return p(t.objectSets[0]);case"subtract":return p(t.objectSets[0]);case"searchAround":throw new Error("not implemented")}}function d(t,e){switch(t.type){case"lt":return {type:"range",range:{propertyId:e.propertyApiNameToIdMapping[t.field],lt:t.value,lte:void 0,gt:void 0,gte:void 0}};case"gt":return {type:"range",range:{propertyId:e.propertyApiNameToIdMapping[t.field],gt:t.value,lte:void 0,lt:void 0,gte:void 0}};case"lte":return {type:"range",range:{propertyId:e.propertyApiNameToIdMapping[t.field],lte:t.value,lt:void 0,gt:void 0,gte:void 0}};case"gte":return {type:"range",range:{propertyId:e.propertyApiNameToIdMapping[t.field],gte:t.value,lt:void 0,lte:void 0,gt:void 0}};case"eq":return {type:"exactMatch",exactMatch:{propertyId:e.propertyApiNameToIdMapping[t.field],terms:[]}};case"and":return {type:"and",and:{filters:t.value.map(o=>d(o,e))}};case"or":return {type:"or",or:{filters:t.value.map(o=>d(o,e))}};case"isNull":return {type:"not",not:{filter:{type:"hasProperty",hasProperty:{propertyId:e.propertyApiNameToIdMapping[t.field]}}}};case"not":return {type:"not",not:{filter:d(t.value,e)}};case"contains":case"startsWith":case"containsAllTermsInOrder":case"containsAnyTerm":case"containsAllTerms":case"withinDistanceOf":case"withinBoundingBox":case"intersectsBoundingBox":case"doesNotIntersectBoundingBox":case"withinPolygon":case"intersectsPolygon":case"doesNotIntersectPolygon":throw new Error("not implemented")}}var M=24*60*60*1e3,R=5*1e3,m=class t{static#u=new WeakMap;static getInstance(e){let o=t.#u.get(e);return o==null&&(o=new t(e),t.#u.set(e,o)),o}#e;#l=0;#o;#t=new Map;#r=new Map;#y;#s;#d;constructor(e){this.#o=e;let o=new URL(e.stack);this.#y={baseUrl:o.origin,servicePath:"/object-set-watcher/api",fetchFn:e.fetch,tokenProvider:async()=>await e.tokenProvider()},this.#d={baseUrl:o.origin,servicePath:"/object-set-service/api",fetchFn:e.fetch,tokenProvider:async()=>await e.tokenProvider()},this.#s={baseUrl:o.origin,servicePath:"/ontology-metadata/api",fetchFn:e.fetch,tokenProvider:async()=>await e.tokenProvider()};}subscribe(e,o){let r=crypto.randomUUID(),s=setTimeout(()=>{this.#O(r);},M);return this.#t.set(r,{listener:o,objectSet:e,expiry:s}),this.#a(r,e),()=>{this.#f(r);}}async#a(e,o){try{let[r]=await Promise.all([this.#T(o),this.#i(),p(o).then(a=>requests.getObjectTypeV2(shared_net.createOpenApiRequest(this.#o.stack,this.#o.fetch),this.#o.ontology.metadata.ontologyApiName,a)).then(a=>this.#b([a.rid]))]);if(!this.#t.has(e))return;let s={id:e,requests:[{objectSet:r.objectSetRid,objectSetContext:{objectSetFilterContext:{parameterOverrides:{}}},watchAllLinks:!1}]};this.#e?.send(JSON.stringify(s));}catch(r){this.#n(e,"onError")?.(r);}}#O(e){let o=this.#t.get(e);if(o){let{subscriptionId:r,objectSet:s}=o;r&&(o.subscriptionId=void 0,this.#r.delete(r)),this.#a(e,s);}}#f(e){let o=this.#t.get(e);if(o==null)return;this.#t.delete(e),clearTimeout(o.expiry);let{subscriptionId:r}=o;r!=null&&this.#r.delete(r),this.#t.size===0&&this.#c();}async#i(){if(this.#e==null){let{stack:e,tokenProvider:o}=this.#o,s=`wss://${new URL(e).host}/object-set-watcher/ws/subscriptions`,a=await o();if(this.#e==null){let n=(this.#l??0)+R;n>Date.now()&&await new Promise(i=>{setTimeout(i,n-Date.now());}),this.#l=Date.now(),this.#e==null&&(this.#e=new f__default.default(s,[`Bearer-${a}`]),this.#e.addEventListener("close",this.#h),this.#e.addEventListener("message",this.#g),this.#e.addEventListener("open",this.#m));}if(this.#e.readyState===f__default.default.CONNECTING)return new Promise((n,i)=>{this.#e.addEventListener("open",()=>{n();}),this.#e.addEventListener("error",c=>{i(new Error(c.toString()));});})}}#m=()=>{for(let[e,o]of this.#t)this.#a(e,o.objectSet);};#g=async e=>{let o=JSON.parse(e.data.toString());switch(o.type){case"objectSetChanged":{if(o.objectSetChanged.confidenceValue){this.#p(o.objectSetChanged.id,"onOutOfDate")?.();break}let{id:s,objects:a}=o.objectSetChanged,n=this.#p(s,"onChange");n&&n(await W(this.#o,this.#s,a));break}case"refreshObjectSet":{let{id:s}=o.refreshObjectSet;this.#p(s,"onOutOfDate")?.();break}case"subscribeResponses":{let{id:s,responses:a}=o.subscribeResponses,n=this.#t.get(s);if(n==null)return;if(a.length!==1)throw new Error("Got more than one response but we only expect a single one");let i=a[0];switch(i.type){case"error":this.#n(s,"onError")?.(i.error),this.#f(s);return;case"qos":this.#c(),this.#i();return;case"success":let{id:c}=i.success;n.subscriptionId=c,this.#r.set(c,s),this.#n(s,"onOutOfDate")?.();break;default:this.#n(s,"onError")?.(i);}break}}};#h=()=>{this.#c();};async#b(e){return h(this.#y,{requests:e})}async#T(e){let o=await p(e),r=await _(this.#o,this.#s,o);return {objectSetRid:(await g(this.#d,{objectSet:u(e,r),timeToLive:"ONE_DAY",objectSetFilterContext:{parameterOverrides:{}}})).objectSetRid}}#c=()=>{this.#e&&(this.#e.removeEventListener("open",this.#m),this.#e.removeEventListener("message",this.#g),this.#e.removeEventListener("close",this.#h),this.#e.readyState!==f__default.default.CLOSING&&this.#e.readyState!==f__default.default.CLOSED&&this.#e.close(),this.#e=void 0),this.#r.clear();for(let e of this.#t.values())e.subscriptionId=void 0;this.#t.size>0&&this.#i();};#n(e,o){return this.#t.get(e)?.listener?.[o]}#p(e,o){let r=this.#r.get(e);if(r)return this.#n(r,o)}};async function W(t,e,o){return await Promise.all(o.map(async s=>{let a=await k(e,s.type),n=Object.fromEntries([...Object.entries(s.properties).map(([i,c])=>[a?.propertyIdToApiNameMapping[i],c]),[a?.propertyIdToApiNameMapping[Object.entries(s.key)[0][0]],Object.entries(s.key)[0][1]],["__apiName",a?.apiName]]);return chunkGVR2K3BV_cjs.c(t,a?.apiName,[n])}))}var l=new WeakMap,b=new Map;async function _(t,e,o){if(b.has(o))return l.get(e)?.get(b.get(o));let r=await requests.getObjectTypeV2(shared_net.createOpenApiRequest(t.stack,t.fetch),t.ontology.metadata.ontologyApiName,o);return k(e,r.rid)}async function k(t,e){if(l.has(t)||l.set(t,new Map),!l.get(t).has(e)){let o={objectTypeVersions:{[e]:"0000000a-0692-bbe3-af23-ddbb6c020392"},linkTypeVersions:{},loadRedacted:!1,includeObjectTypesWithoutSearchableDatasources:!0},r=await O(t,o);r.objectTypes[e]||(process.env.NODE_ENV!=="production"?E__default.default(!1,"object type should be loaded"):E__default.default(!1));let s=Object.fromEntries(Object.values(r.objectTypes[e].propertyTypes).map(n=>[n.id,n.apiName])),a=Object.fromEntries(Object.values(r.objectTypes[e].propertyTypes).map(n=>[n.id,n.apiName]));l.get(t)?.set(e,{apiName:r.objectTypes[e].apiName,id:r.objectTypes[e].id,propertyIdToApiNameMapping:s,propertyApiNameToIdMapping:a}),b.set(r.objectTypes[e].apiName,e);}return l.get(t)?.get(e)}var v="searchAround_";function y(t,e,o,r={type:"base",objectType:t}){let s={aggregateOrThrow:async n=>chunkGVR2K3BV_cjs.b(e,t,n),fetchPageOrThrow:async n=>chunkGVR2K3BV_cjs.d(e,t,n??{},r),where:n=>y(t,e,o,{type:"filter",objectSet:r,where:chunkGVR2K3BV_cjs.a(n)}),pivotTo:function(n,i){return a(n)().where(i?.$where??{})},subscribe(n){return m.getInstance(e).subscribe(r,n)}};function a(n){return ()=>y(t,e,{},{type:"searchAround",objectSet:r,link:n})}return new Proxy(s,{get(n,i,c){return typeof i=="string"&&i.startsWith(v)?a(i.substring(v.length)):n[i]}})}function I(t){return new Proxy({},{get:(e,o,r)=>{if(typeof o=="string")return t.objectSet(o)}})}function G(t,e,o,r=fetch){let s=shared_net.createClientContext(t,e,o,"@osdk/client/0.0.0 ()",r),a=(i,c)=>y(i,s,c),n=Object.defineProperties({},{objectSet:{get:()=>a},objects:{get:()=>I(n)},actions:{get:()=>w(s)},__UNSTABLE_preexistingObjectSet:{get:()=>(i,c)=>y(i,s,{},{type:"reference",reference:c})}});return n}
15
+ async function applyAction(client, actionApiName, parameters, options) {
16
+ const response = await requests.applyActionV2(shared_net.createOpenApiRequest(client.stack, client.fetch), client.ontology.metadata.ontologyApiName, actionApiName, {
17
+ parameters,
18
+ options: {
19
+ mode: options?.validateOnly ? "VALIDATE_ONLY" : "VALIDATE_AND_EXECUTE",
20
+ returnEdits: options?.returnEdits ? "ALL" : "NONE"
21
+ }
22
+ });
23
+ const bulkEdits = response.edits?.type == "largeScaleEdits" ? response.edits.editedObjectTypes : void 0;
24
+ const edits = response.edits?.type == "edits" ? response.edits : void 0;
25
+ edits?.edits[0];
26
+ return {
27
+ __unstable: {
28
+ bulkEdits,
29
+ addedLinksCount: edits?.addedLinksCount,
30
+ addedObjectCount: edits?.addedObjectCount,
31
+ modifiedObjectsCount: edits?.modifiedObjectsCount,
32
+ edits: edits?.edits
33
+ }
34
+ };
35
+ }
36
+
37
+ // src/actions/createActionInvoker.ts
38
+ function createActionInvoker(client) {
39
+ return new Proxy({}, {
40
+ get: (target, p, receiver) => {
41
+ if (typeof p === "string") {
42
+ return function(...args) {
43
+ return applyAction(client, p, ...args);
44
+ };
45
+ }
46
+ return void 0;
47
+ }
48
+ });
49
+ }
50
+ async function createTemporaryObjectSet(ctx, request) {
51
+ return conjureLite.conjureFetch(ctx, `/objectSets/temporary`, "POST", request);
52
+ }
53
+ async function batchEnableWatcher(ctx, request) {
54
+ return conjureLite.conjureFetch(ctx, `/object-set-watcher/batchEnableWatcher`, "POST", request);
55
+ }
56
+ async function loadAllOntologies(ctx, request) {
57
+ return conjureLite.conjureFetch(ctx, `/ontology/ontology/ontologies/load/all`, "POST", request);
58
+ }
59
+ async function loadOntologyEntities(ctx, request) {
60
+ return conjureLite.conjureFetch(ctx, `/ontology/ontology/loadEntities`, "POST", request);
61
+ }
62
+
63
+ // src/objectSet/toConjureObjectSet.ts
64
+ function toConjureObjectSet(objectSet, objectPropertyMapping) {
65
+ switch (objectSet.type) {
66
+ case "base":
67
+ return {
68
+ type: "base",
69
+ base: {
70
+ objectTypeId: objectPropertyMapping.id
71
+ }
72
+ };
73
+ case "static":
74
+ return {
75
+ type: "static",
76
+ static: {
77
+ objectRids: objectSet.objects,
78
+ provenance: void 0
79
+ }
80
+ };
81
+ case "reference":
82
+ return {
83
+ type: "referenced",
84
+ referenced: {
85
+ objectSetRid: objectSet.reference
86
+ }
87
+ };
88
+ case "filter":
89
+ return {
90
+ type: "filtered",
91
+ filtered: {
92
+ objectSet: toConjureObjectSet(objectSet.objectSet, objectPropertyMapping),
93
+ runtimeDerivedProperties: void 0,
94
+ filter: mapWhereClauseToObjectSetFilter(objectSet.where, objectPropertyMapping)
95
+ }
96
+ };
97
+ case "union":
98
+ return {
99
+ type: "unioned",
100
+ unioned: {
101
+ objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
102
+ }
103
+ };
104
+ case "intersect":
105
+ return {
106
+ type: "intersected",
107
+ intersected: {
108
+ objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
109
+ }
110
+ };
111
+ case "subtract":
112
+ return {
113
+ type: "subtracted",
114
+ subtracted: {
115
+ objectSets: objectSet.objectSets.map((os) => toConjureObjectSet(os, objectPropertyMapping))
116
+ }
117
+ };
118
+ case "searchAround":
119
+ throw new Error("not implemented");
120
+ }
121
+ }
122
+ async function getObjectSetBaseType(objectSet) {
123
+ switch (objectSet.type) {
124
+ case "base":
125
+ return objectSet.objectType;
126
+ case "static":
127
+ throw new Error("not implemented");
128
+ case "reference":
129
+ throw new Error("not implemented");
130
+ case "filter":
131
+ return getObjectSetBaseType(objectSet.objectSet);
132
+ case "union":
133
+ return getObjectSetBaseType(objectSet.objectSets[0]);
134
+ case "intersect":
135
+ return getObjectSetBaseType(objectSet.objectSets[0]);
136
+ case "subtract":
137
+ return getObjectSetBaseType(objectSet.objectSets[0]);
138
+ case "searchAround":
139
+ throw new Error("not implemented");
140
+ }
141
+ }
142
+ function mapWhereClauseToObjectSetFilter(objectSetFilter, propertyMapping) {
143
+ switch (objectSetFilter.type) {
144
+ case "lt":
145
+ return {
146
+ type: "range",
147
+ range: {
148
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
149
+ lt: objectSetFilter.value,
150
+ lte: void 0,
151
+ gt: void 0,
152
+ gte: void 0
153
+ }
154
+ };
155
+ case "gt":
156
+ return {
157
+ type: "range",
158
+ range: {
159
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
160
+ gt: objectSetFilter.value,
161
+ lte: void 0,
162
+ lt: void 0,
163
+ gte: void 0
164
+ }
165
+ };
166
+ case "lte":
167
+ return {
168
+ type: "range",
169
+ range: {
170
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
171
+ lte: objectSetFilter.value,
172
+ lt: void 0,
173
+ gt: void 0,
174
+ gte: void 0
175
+ }
176
+ };
177
+ case "gte":
178
+ return {
179
+ type: "range",
180
+ range: {
181
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
182
+ gte: objectSetFilter.value,
183
+ lt: void 0,
184
+ lte: void 0,
185
+ gt: void 0
186
+ }
187
+ };
188
+ case "eq":
189
+ return {
190
+ type: "exactMatch",
191
+ exactMatch: {
192
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field],
193
+ terms: []
194
+ }
195
+ };
196
+ case "and":
197
+ return {
198
+ type: "and",
199
+ and: {
200
+ filters: objectSetFilter.value.map((filter) => mapWhereClauseToObjectSetFilter(filter, propertyMapping))
201
+ }
202
+ };
203
+ case "or":
204
+ return {
205
+ type: "or",
206
+ or: {
207
+ filters: objectSetFilter.value.map((filter) => mapWhereClauseToObjectSetFilter(filter, propertyMapping))
208
+ }
209
+ };
210
+ case "isNull":
211
+ return {
212
+ type: "not",
213
+ not: {
214
+ filter: {
215
+ type: "hasProperty",
216
+ hasProperty: {
217
+ propertyId: propertyMapping.propertyApiNameToIdMapping[objectSetFilter.field]
218
+ }
219
+ }
220
+ }
221
+ };
222
+ case "not":
223
+ return {
224
+ type: "not",
225
+ not: {
226
+ filter: mapWhereClauseToObjectSetFilter(objectSetFilter.value, propertyMapping)
227
+ }
228
+ };
229
+ case "contains":
230
+ case "startsWith":
231
+ case "containsAllTermsInOrder":
232
+ case "containsAnyTerm":
233
+ case "containsAllTerms":
234
+ case "withinDistanceOf":
235
+ case "withinBoundingBox":
236
+ case "intersectsBoundingBox":
237
+ case "doesNotIntersectBoundingBox":
238
+ case "withinPolygon":
239
+ case "intersectsPolygon":
240
+ case "doesNotIntersectPolygon":
241
+ throw new Error("not implemented");
242
+ }
243
+ }
244
+
245
+ // src/objectSet/ObjectSetListenerWebsocket.ts
246
+ var ONE_DAY_MS = 24 * 60 * 60 * 1e3;
247
+ var MINIMUM_RECONNECT_DELAY_MS = 5 * 1e3;
248
+ var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
249
+ static #instances = /* @__PURE__ */ new WeakMap();
250
+ static getInstance(client) {
251
+ let instance = _ObjectSetListenerWebsocket.#instances.get(client);
252
+ if (instance == null) {
253
+ instance = new _ObjectSetListenerWebsocket(client);
254
+ _ObjectSetListenerWebsocket.#instances.set(client, instance);
255
+ }
256
+ return instance;
257
+ }
258
+ #ws;
259
+ #lastWsConnect = 0;
260
+ #client;
261
+ /** map of listenerId to listener */
262
+ #listeners = /* @__PURE__ */ new Map();
263
+ /** map of subscriptionId to listenerId */
264
+ #subscriptionToRequestId = /* @__PURE__ */ new Map();
265
+ #conjureContext;
266
+ #metadataContext;
267
+ #ossContext;
268
+ constructor(client) {
269
+ this.#client = client;
270
+ const stackUrl = new URL(client.stack);
271
+ this.#conjureContext = {
272
+ baseUrl: stackUrl.origin,
273
+ servicePath: "/object-set-watcher/api",
274
+ fetchFn: client.fetch,
275
+ tokenProvider: async () => await client.tokenProvider()
276
+ };
277
+ this.#ossContext = {
278
+ baseUrl: stackUrl.origin,
279
+ servicePath: "/object-set-service/api",
280
+ fetchFn: client.fetch,
281
+ tokenProvider: async () => await client.tokenProvider()
282
+ };
283
+ this.#metadataContext = {
284
+ baseUrl: stackUrl.origin,
285
+ servicePath: "/ontology-metadata/api",
286
+ fetchFn: client.fetch,
287
+ tokenProvider: async () => await client.tokenProvider()
288
+ };
289
+ }
290
+ subscribe(objectSet, listener) {
291
+ const requestId = crypto.randomUUID();
292
+ const expiry = setTimeout(() => {
293
+ this.#expire(requestId);
294
+ }, ONE_DAY_MS);
295
+ this.#listeners.set(requestId, {
296
+ listener,
297
+ objectSet,
298
+ expiry
299
+ });
300
+ this.#subscribe(requestId, objectSet);
301
+ return () => {
302
+ this.#unsubscribe(requestId);
303
+ };
304
+ }
305
+ async #subscribe(requestId, objectSet) {
306
+ try {
307
+ const [temporaryObjectSet] = await Promise.all([
308
+ // create a time-bounded object set representation for watching
309
+ this.#createTemporaryObjectSet(objectSet),
310
+ this.#ensureWebsocket(),
311
+ // look up the object type's rid and ensure that we have enabled object set watcher for that rid
312
+ // TODO ???
313
+ getObjectSetBaseType(objectSet).then((baseType) => requests.getObjectTypeV2(shared_net.createOpenApiRequest(this.#client.stack, this.#client.fetch), this.#client.ontology.metadata.ontologyApiName, baseType)).then((objectType) => this.#enableObjectSetsWatcher([objectType.rid]))
314
+ ]);
315
+ if (!this.#listeners.has(requestId)) {
316
+ return;
317
+ }
318
+ const subscribe = {
319
+ id: requestId,
320
+ requests: [{
321
+ objectSet: temporaryObjectSet.objectSetRid,
322
+ objectSetContext: {
323
+ objectSetFilterContext: {
324
+ parameterOverrides: {}
325
+ }
326
+ },
327
+ watchAllLinks: false
328
+ }]
329
+ };
330
+ this.#ws?.send(JSON.stringify(subscribe));
331
+ } catch (error) {
332
+ this.#getCallbackByRequestId(requestId, "onError")?.(error);
333
+ }
334
+ }
335
+ #expire(requestId) {
336
+ const state = this.#listeners.get(requestId);
337
+ if (state) {
338
+ const {
339
+ subscriptionId,
340
+ objectSet
341
+ } = state;
342
+ if (subscriptionId) {
343
+ state.subscriptionId = void 0;
344
+ this.#subscriptionToRequestId.delete(subscriptionId);
345
+ }
346
+ this.#subscribe(requestId, objectSet);
347
+ }
348
+ }
349
+ #unsubscribe(requestId) {
350
+ const data = this.#listeners.get(requestId);
351
+ if (data == null) {
352
+ return;
353
+ }
354
+ this.#listeners.delete(requestId);
355
+ clearTimeout(data.expiry);
356
+ const {
357
+ subscriptionId
358
+ } = data;
359
+ if (subscriptionId != null) {
360
+ this.#subscriptionToRequestId.delete(subscriptionId);
361
+ }
362
+ if (this.#listeners.size === 0) {
363
+ this.#destroyWebsocket();
364
+ }
365
+ }
366
+ async #ensureWebsocket() {
367
+ if (this.#ws == null) {
368
+ const {
369
+ stack,
370
+ tokenProvider
371
+ } = this.#client;
372
+ const base = new URL(stack);
373
+ const url = `wss://${base.host}/object-set-watcher/ws/subscriptions`;
374
+ const token = await tokenProvider();
375
+ if (this.#ws == null) {
376
+ const nextConnectTime = (this.#lastWsConnect ?? 0) + MINIMUM_RECONNECT_DELAY_MS;
377
+ if (nextConnectTime > Date.now()) {
378
+ await new Promise((resolve) => {
379
+ setTimeout(resolve, nextConnectTime - Date.now());
380
+ });
381
+ }
382
+ this.#lastWsConnect = Date.now();
383
+ if (this.#ws == null) {
384
+ this.#ws = new WebSocket__default.default(url, [`Bearer-${token}`]);
385
+ this.#ws.addEventListener("close", this.#onClose);
386
+ this.#ws.addEventListener("message", this.#onMessage);
387
+ this.#ws.addEventListener("open", this.#onOpen);
388
+ }
389
+ }
390
+ if (this.#ws.readyState === WebSocket__default.default.CONNECTING) {
391
+ return new Promise((resolve, reject) => {
392
+ this.#ws.addEventListener("open", () => {
393
+ resolve();
394
+ });
395
+ this.#ws.addEventListener("error", (event) => {
396
+ reject(new Error(event.toString()));
397
+ });
398
+ });
399
+ }
400
+ }
401
+ }
402
+ #onOpen = () => {
403
+ for (const [requestId, state] of this.#listeners) {
404
+ this.#subscribe(requestId, state.objectSet);
405
+ }
406
+ };
407
+ #onMessage = async (message) => {
408
+ const data = JSON.parse(message.data.toString());
409
+ switch (data.type) {
410
+ case "objectSetChanged": {
411
+ if (data.objectSetChanged.confidenceValue) {
412
+ this.#getCallback(data.objectSetChanged.id, "onOutOfDate")?.();
413
+ break;
414
+ }
415
+ const {
416
+ id: subscriptionId,
417
+ objects
418
+ } = data.objectSetChanged;
419
+ const callback = this.#getCallback(subscriptionId, "onChange");
420
+ if (callback) {
421
+ callback(await convertFoundryToOsdkObjects(this.#client, this.#metadataContext, objects));
422
+ }
423
+ break;
424
+ }
425
+ case "refreshObjectSet": {
426
+ const {
427
+ id: subscriptionId
428
+ } = data.refreshObjectSet;
429
+ this.#getCallback(subscriptionId, "onOutOfDate")?.();
430
+ break;
431
+ }
432
+ case "subscribeResponses": {
433
+ const {
434
+ id: requestId,
435
+ responses
436
+ } = data.subscribeResponses;
437
+ const listenerData = this.#listeners.get(requestId);
438
+ if (listenerData == null) {
439
+ return;
440
+ }
441
+ if (responses.length !== 1) {
442
+ throw new Error("Got more than one response but we only expect a single one");
443
+ }
444
+ const response = responses[0];
445
+ switch (response.type) {
446
+ case "error":
447
+ this.#getCallbackByRequestId(requestId, "onError")?.(response.error);
448
+ this.#unsubscribe(requestId);
449
+ return;
450
+ case "qos":
451
+ this.#destroyWebsocket();
452
+ this.#ensureWebsocket();
453
+ return;
454
+ case "success":
455
+ const {
456
+ id: subscriptionId
457
+ } = response.success;
458
+ listenerData.subscriptionId = subscriptionId;
459
+ this.#subscriptionToRequestId.set(subscriptionId, requestId);
460
+ this.#getCallbackByRequestId(requestId, "onOutOfDate")?.();
461
+ break;
462
+ default:
463
+ this.#getCallbackByRequestId(requestId, "onError")?.(response);
464
+ }
465
+ break;
466
+ }
467
+ }
468
+ };
469
+ #onClose = () => {
470
+ this.#destroyWebsocket();
471
+ };
472
+ async #enableObjectSetsWatcher(objectTypeRids) {
473
+ return batchEnableWatcher(this.#conjureContext, {
474
+ requests: objectTypeRids
475
+ });
476
+ }
477
+ async #createTemporaryObjectSet(objectSet) {
478
+ const objectSetBaseType = await getObjectSetBaseType(objectSet);
479
+ const mapping = await getOntologyPropertyMappingForApiName(this.#client, this.#metadataContext, objectSetBaseType);
480
+ const temporaryObjectSet = await createTemporaryObjectSet(this.#ossContext, {
481
+ objectSet: toConjureObjectSet(objectSet, mapping),
482
+ timeToLive: "ONE_DAY",
483
+ objectSetFilterContext: {
484
+ parameterOverrides: {}
485
+ }
486
+ });
487
+ return {
488
+ objectSetRid: temporaryObjectSet.objectSetRid
489
+ };
490
+ }
491
+ #destroyWebsocket = () => {
492
+ if (this.#ws) {
493
+ this.#ws.removeEventListener("open", this.#onOpen);
494
+ this.#ws.removeEventListener("message", this.#onMessage);
495
+ this.#ws.removeEventListener("close", this.#onClose);
496
+ if (this.#ws.readyState !== WebSocket__default.default.CLOSING && this.#ws.readyState !== WebSocket__default.default.CLOSED) {
497
+ this.#ws.close();
498
+ }
499
+ this.#ws = void 0;
500
+ }
501
+ this.#subscriptionToRequestId.clear();
502
+ for (const state of this.#listeners.values()) {
503
+ state.subscriptionId = void 0;
504
+ }
505
+ if (this.#listeners.size > 0) {
506
+ this.#ensureWebsocket();
507
+ }
508
+ };
509
+ #getCallbackByRequestId(requestId, type) {
510
+ const maybeListener = this.#listeners.get(requestId);
511
+ return maybeListener?.listener?.[type];
512
+ }
513
+ #getCallback(subscriptionId, type) {
514
+ const requestId = this.#subscriptionToRequestId.get(subscriptionId);
515
+ if (requestId) {
516
+ return this.#getCallbackByRequestId(requestId, type);
517
+ }
518
+ return;
519
+ }
520
+ };
521
+ async function convertFoundryToOsdkObjects(client, ctx, objects) {
522
+ const osdkObjects = await Promise.all(objects.map(async (object) => {
523
+ const propertyMapping = await getOntologyPropertyMappingForRid(ctx, client.ontology.metadata.ontologyRid, object.type);
524
+ const convertedObject = Object.fromEntries([...Object.entries(object.properties).map(([key, value]) => {
525
+ return [propertyMapping?.propertyIdToApiNameMapping[key], value];
526
+ }), [propertyMapping?.propertyIdToApiNameMapping[Object.entries(object.key)[0][0]], Object.entries(object.key)[0][1]], ["__apiName", propertyMapping?.apiName]]);
527
+ return chunkCCKGGMYW_cjs.convertWireToOsdkObjects(client, propertyMapping?.apiName, [convertedObject]);
528
+ }));
529
+ return osdkObjects;
530
+ }
531
+ var objectTypeMapping = /* @__PURE__ */ new WeakMap();
532
+ var objectApiNameToRid = /* @__PURE__ */ new Map();
533
+ async function getOntologyPropertyMappingForApiName(client, ctx, objectApiName) {
534
+ if (objectApiNameToRid.has(objectApiName)) {
535
+ return objectTypeMapping.get(ctx)?.get(objectApiNameToRid.get(objectApiName));
536
+ }
537
+ const wireObjectType = await requests.getObjectTypeV2(shared_net.createOpenApiRequest(client.stack, client.fetch), client.ontology.metadata.ontologyApiName, objectApiName);
538
+ return getOntologyPropertyMappingForRid(ctx, client.ontology.metadata.ontologyRid, wireObjectType.rid);
539
+ }
540
+ var cachedAllOntologies;
541
+ async function getOntologyVersionForRid(ctx, ontologyRid) {
542
+ cachedAllOntologies ??= await loadAllOntologies(ctx, {});
543
+ !cachedAllOntologies.ontologies[ontologyRid] ? process.env.NODE_ENV !== "production" ? invariant__default.default(false, "ontology should be loaded") : invariant__default.default(false) : void 0;
544
+ return cachedAllOntologies.ontologies[ontologyRid].currentOntologyVersion;
545
+ }
546
+ async function getOntologyPropertyMappingForRid(ctx, ontologyRid, objectRid) {
547
+ if (!objectTypeMapping.has(ctx)) {
548
+ objectTypeMapping.set(ctx, /* @__PURE__ */ new Map());
549
+ }
550
+ if (!objectTypeMapping.get(ctx).has(objectRid)) {
551
+ const ontologyVersion = await getOntologyVersionForRid(ctx, ontologyRid);
552
+ const body = {
553
+ objectTypeVersions: {
554
+ // TODO: Undefined drops this in the body
555
+ [objectRid]: ontologyVersion
556
+ },
557
+ linkTypeVersions: {},
558
+ loadRedacted: false,
559
+ includeObjectTypesWithoutSearchableDatasources: true
560
+ };
561
+ const entities = await loadOntologyEntities(ctx, body);
562
+ !entities.objectTypes[objectRid] ? process.env.NODE_ENV !== "production" ? invariant__default.default(false, "object type should be loaded") : invariant__default.default(false) : void 0;
563
+ const propertyIdToApiNameMapping = Object.fromEntries(Object.values(entities.objectTypes[objectRid].propertyTypes).map((property) => {
564
+ return [property.id, property.apiName];
565
+ }));
566
+ const propertyApiNameToIdMapping = Object.fromEntries(Object.values(entities.objectTypes[objectRid].propertyTypes).map((property) => {
567
+ return [property.id, property.apiName];
568
+ }));
569
+ objectTypeMapping.get(ctx)?.set(objectRid, {
570
+ apiName: entities.objectTypes[objectRid].apiName,
571
+ id: entities.objectTypes[objectRid].id,
572
+ propertyIdToApiNameMapping,
573
+ propertyApiNameToIdMapping
574
+ });
575
+ objectApiNameToRid.set(entities.objectTypes[objectRid].apiName, objectRid);
576
+ }
577
+ return objectTypeMapping.get(ctx)?.get(objectRid);
578
+ }
579
+
580
+ // src/objectSet/createObjectSet.ts
581
+ var searchAroundPrefix = "searchAround_";
582
+ function createObjectSet2(objectType, clientCtx, opts, objectSet = {
583
+ type: "base",
584
+ objectType
585
+ }) {
586
+ const base = {
587
+ // aggregate: <
588
+ // AC extends AggregationClause<O, K>,
589
+ // GBC extends GroupByClause<O, K> | undefined = undefined,
590
+ // >(req: {
591
+ // select: AC;
592
+ // where?: WhereClause<ObjectTypeDefinitionFrom<O, K>>;
593
+ // groupBy?: GBC;
594
+ // }) => {
595
+ // throw "TODO";
596
+ // },
597
+ aggregateOrThrow: async (req) => {
598
+ return chunkCCKGGMYW_cjs.aggregateOrThrow(clientCtx, objectType, req);
599
+ },
600
+ // fetchPage: async (args?: { nextPageToken?: string }) => {
601
+ // throw "TODO";
602
+ // },
603
+ fetchPageOrThrow: async (args) => {
604
+ return chunkCCKGGMYW_cjs.fetchPageOrThrow(clientCtx, objectType, args ?? {}, objectSet);
605
+ },
606
+ // asyncIter: () => {
607
+ // throw "";
608
+ // },
609
+ where: (clause) => {
610
+ return createObjectSet2(objectType, clientCtx, opts, {
611
+ type: "filter",
612
+ objectSet,
613
+ where: chunkCCKGGMYW_cjs.modernToLegacyWhereClause(clause)
614
+ });
615
+ },
616
+ // [Symbol.asyncIterator]: () => {
617
+ // throw "";
618
+ // },
619
+ pivotTo: function(type, opts2) {
620
+ return createSearchAround(type)().where(opts2?.$where ?? {});
621
+ },
622
+ subscribe(listener) {
623
+ const instance = ObjectSetListenerWebsocket.getInstance(clientCtx);
624
+ return instance.subscribe(objectSet, listener);
625
+ }
626
+ };
627
+ function createSearchAround(link) {
628
+ return () => {
629
+ return createObjectSet2(objectType, clientCtx, {}, {
630
+ type: "searchAround",
631
+ objectSet,
632
+ link
633
+ });
634
+ };
635
+ }
636
+ return new Proxy(base, {
637
+ get(target, p, receiver) {
638
+ if (typeof p === "string" && p.startsWith(searchAroundPrefix)) {
639
+ return createSearchAround(p.substring(searchAroundPrefix.length));
640
+ }
641
+ return target[p];
642
+ }
643
+ });
644
+ }
645
+
646
+ // src/ObjectSetCreator.ts
647
+ function createObjectSetCreator(client) {
648
+ return new Proxy({}, {
649
+ get: (target, p, receiver) => {
650
+ if (typeof p === "string")
651
+ return client.objectSet(p);
652
+ return void 0;
653
+ }
654
+ });
655
+ }
656
+
657
+ // src/createClient.ts
658
+ function createClient(ontology, stack, tokenProvider, fetchFn = fetch) {
659
+ const clientCtx = shared_net.createClientContext(ontology, stack, tokenProvider, "@osdk/client/0.0.0 ()", fetchFn);
660
+ const objectSetFactory = (type, opts) => createObjectSet2(type, clientCtx, opts);
661
+ const client = Object.defineProperties({}, {
662
+ objectSet: {
663
+ get: () => objectSetFactory
664
+ },
665
+ objects: {
666
+ get: () => createObjectSetCreator(client)
667
+ },
668
+ actions: {
669
+ get: () => createActionInvoker(clientCtx)
670
+ },
671
+ __UNSTABLE_preexistingObjectSet: {
672
+ get: () => (objectType, rid) => {
673
+ return createObjectSet2(objectType, clientCtx, {}, {
674
+ type: "intersect",
675
+ objectSets: [{
676
+ type: "base",
677
+ objectType
678
+ }, {
679
+ type: "reference",
680
+ reference: rid
681
+ }]
682
+ });
683
+ }
684
+ }
685
+ });
686
+ return client;
687
+ }
16
688
 
17
689
  Object.defineProperty(exports, 'Objects', {
18
- enumerable: true,
19
- get: function () { return chunkGVR2K3BV_cjs.e; }
690
+ enumerable: true,
691
+ get: function () { return chunkCCKGGMYW_cjs.object_exports; }
20
692
  });
21
693
  Object.defineProperty(exports, 'createClientContext', {
22
- enumerable: true,
23
- get: function () { return shared_net.createClientContext; }
694
+ enumerable: true,
695
+ get: function () { return shared_net.createClientContext; }
24
696
  });
25
697
  Object.defineProperty(exports, 'isOk', {
26
- enumerable: true,
27
- get: function () { return shared_net.isOk; }
698
+ enumerable: true,
699
+ get: function () { return shared_net.isOk; }
28
700
  });
29
- exports.createClient = G;
701
+ exports.createClient = createClient;
30
702
  //# sourceMappingURL=out.js.map
31
703
  //# sourceMappingURL=index.cjs.map