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