@vertexvis/api-client-node 0.17.3 → 0.20.3
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/dist/cjs/api.d.ts +134 -42
- package/dist/cjs/api.js +29 -24
- package/dist/cjs/client/helpers/parts.d.ts +2 -2
- package/dist/cjs/client/helpers/queued-jobs.js +11 -4
- package/dist/cjs/client/helpers/scenes.d.ts +19 -3
- package/dist/cjs/client/helpers/scenes.js +104 -54
- package/dist/cjs/client/version.d.ts +1 -1
- package/dist/cjs/client/version.js +1 -1
- package/dist/esm/api.d.ts +134 -42
- package/dist/esm/api.js +26 -21
- package/dist/esm/client/helpers/parts.d.ts +2 -2
- package/dist/esm/client/helpers/queued-jobs.js +11 -4
- package/dist/esm/client/helpers/scenes.d.ts +19 -3
- package/dist/esm/client/helpers/scenes.js +104 -54
- package/dist/esm/client/version.d.ts +1 -1
- package/dist/esm/client/version.js +1 -1
- package/package.json +2 -2
|
@@ -17,6 +17,22 @@ export interface CreateSceneAndSceneItemsReq extends BaseReq {
|
|
|
17
17
|
/** Whether or not to return queued scene items. */
|
|
18
18
|
readonly returnQueued?: boolean;
|
|
19
19
|
}
|
|
20
|
+
export interface CreateSceneAndSceneItemsReqEXPERIMENTAL extends BaseReq {
|
|
21
|
+
/** A list of {@link CreateSceneItemRequest}. */
|
|
22
|
+
readonly createSceneItemReqs: Array<Array<CreateSceneItemRequest>>;
|
|
23
|
+
/** Function returning a {@link CreateSceneRequest}. */
|
|
24
|
+
readonly createSceneReq: () => CreateSceneRequest;
|
|
25
|
+
/** Whether or not to fail if any scene item fails initial validation. */
|
|
26
|
+
readonly failFast?: boolean;
|
|
27
|
+
/** How many requests to run in parallel. */
|
|
28
|
+
readonly parallelism: number;
|
|
29
|
+
/** {@link Polling} */
|
|
30
|
+
readonly polling?: Polling;
|
|
31
|
+
/** Callback with total number of requests and number complete. */
|
|
32
|
+
onProgress?: (complete: number, total: number) => void;
|
|
33
|
+
/** Whether or not to return queued scene items. */
|
|
34
|
+
readonly returnQueued?: boolean;
|
|
35
|
+
}
|
|
20
36
|
export interface CreateSceneAndSceneItemsRes {
|
|
21
37
|
readonly errors: QueuedSceneItem[];
|
|
22
38
|
readonly scene: Scene;
|
|
@@ -90,13 +106,13 @@ export declare function createSceneAndSceneItems({ client, createSceneItemReqs,
|
|
|
90
106
|
*/
|
|
91
107
|
export declare function createSceneItems({ client, createSceneItemReqs, failFast, onProgress, parallelism, sceneId, }: CreateSceneItemsReq): Promise<CreateSceneItemsRes>;
|
|
92
108
|
/**
|
|
93
|
-
* Create a scene with scene items.
|
|
109
|
+
* Create a scene with scene items using experimental strategy.
|
|
94
110
|
*/
|
|
95
|
-
export declare function createSceneAndSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, createSceneReq, failFast, onMsg, onProgress, parallelism, polling, returnQueued, verbose, }:
|
|
111
|
+
export declare function createSceneAndSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, createSceneReq, failFast, onMsg, onProgress, parallelism, polling, returnQueued, verbose, }: CreateSceneAndSceneItemsReqEXPERIMENTAL): Promise<CreateSceneAndSceneItemsResEXPERIMENTAL>;
|
|
96
112
|
/**
|
|
97
113
|
* Create scene items within a scene.
|
|
98
114
|
*/
|
|
99
|
-
export declare function createSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, failFast,
|
|
115
|
+
export declare function createSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, failFast, parallelism, sceneId, }: CreateSceneItemsReq): Promise<CreateSceneItemsResEXPERIMENTAL>;
|
|
100
116
|
/**
|
|
101
117
|
* Delete all scenes.
|
|
102
118
|
*
|
|
@@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import pLimit from 'p-limit';
|
|
11
|
+
import { hrtime } from 'process';
|
|
11
12
|
import { BatchOperationOpEnum, BatchOperationRefTypeEnum, CameraFitTypeEnum, SceneRelationshipDataTypeEnum, UpdateSceneRequestDataAttributesStateEnum, } from '../../index';
|
|
12
13
|
import { defined, getPage, hasVertexError, isQueuedJob, MaxAttempts, partition, PollIntervalMs, tryStream, } from '../index';
|
|
13
14
|
import { arrayChunked, delay, isApiError, toAccept } from '../utils';
|
|
@@ -113,45 +114,93 @@ export function createSceneItems({ client, createSceneItemReqs, failFast, onProg
|
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
116
|
/**
|
|
116
|
-
* Create a scene with scene items.
|
|
117
|
+
* Create a scene with scene items using experimental strategy.
|
|
117
118
|
*/
|
|
118
119
|
export function createSceneAndSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, createSceneReq, failFast = false, onMsg = console.log, onProgress, parallelism, polling = { intervalMs: PollIntervalMs, maxAttempts: MaxAttempts }, returnQueued = false, verbose, }) {
|
|
119
120
|
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
const startTime = hrtime.bigint();
|
|
122
|
+
if (verbose)
|
|
123
|
+
onMsg(`Creating scene...`);
|
|
120
124
|
const scene = (yield client.scenes.createScene({ createSceneRequest: createSceneReq() })).data;
|
|
121
125
|
const sceneId = scene.data.id;
|
|
122
|
-
const createRes = yield createSceneItemsEXPERIMENTAL({
|
|
123
|
-
client,
|
|
124
|
-
createSceneItemReqs,
|
|
125
|
-
failFast,
|
|
126
|
-
onProgress,
|
|
127
|
-
parallelism,
|
|
128
|
-
sceneId,
|
|
129
|
-
});
|
|
130
|
-
const { a: queuedOps, b: errors } = partition(createRes.queuedBatchOps, (i) => isQueuedJob(i.res));
|
|
131
|
-
const queued = returnQueued ? createRes.queuedBatchOps : [];
|
|
132
|
-
// Nothing succeeded, return early as something is likely wrong
|
|
133
|
-
if (queuedOps.length === 0 || errors.length === createRes.chunks) {
|
|
134
|
-
return { errors, queued, scene, sceneItemErrors: [] };
|
|
135
|
-
}
|
|
136
126
|
if (verbose)
|
|
137
|
-
onMsg(`
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
127
|
+
onMsg(`Creating scene items...`);
|
|
128
|
+
let itemCount = 0;
|
|
129
|
+
let batchQueuedOps = [];
|
|
130
|
+
let batchErrors = [];
|
|
131
|
+
let sceneItemErrors = [];
|
|
132
|
+
for (let depth = 0; depth < createSceneItemReqs.length; depth++) {
|
|
133
|
+
const createItemReqs = createSceneItemReqs[depth];
|
|
134
|
+
itemCount += createItemReqs.length;
|
|
135
|
+
if (verbose)
|
|
136
|
+
onMsg(`Creating ${createItemReqs.length} scene items at depth ${depth}...`);
|
|
137
|
+
// Await is used intentionally to defer loop iteration
|
|
138
|
+
// until all scene items have been created at each depth.
|
|
139
|
+
// eslint-disable-next-line no-await-in-loop
|
|
140
|
+
const createRes = yield createSceneItemsEXPERIMENTAL({
|
|
141
|
+
client,
|
|
142
|
+
createSceneItemReqs: createItemReqs,
|
|
143
|
+
failFast,
|
|
144
|
+
onProgress,
|
|
145
|
+
parallelism,
|
|
146
|
+
sceneId,
|
|
152
147
|
});
|
|
148
|
+
const { a: queuedOps, b: errors } = partition(createRes.queuedBatchOps, (i) => isQueuedJob(i.res));
|
|
149
|
+
batchQueuedOps = batchQueuedOps.concat(queuedOps);
|
|
150
|
+
if (errors.length) {
|
|
151
|
+
batchErrors = batchErrors.concat(errors);
|
|
152
|
+
if (verbose)
|
|
153
|
+
onMsg(`WARNING: ${errors.length} scene item batch errors at depth ${depth}.`);
|
|
154
|
+
}
|
|
155
|
+
// Nothing succeeded, return early as something is likely wrong
|
|
156
|
+
if (queuedOps.length === 0 || errors.length === createRes.chunks) {
|
|
157
|
+
return {
|
|
158
|
+
errors,
|
|
159
|
+
queued: returnQueued ? createRes.queuedBatchOps : [],
|
|
160
|
+
scene,
|
|
161
|
+
sceneItemErrors: [],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const limit = pLimit(Math.min(parallelism, 20));
|
|
165
|
+
function poll({ ops, res, }) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
const r = yield pollQueuedJob({
|
|
168
|
+
id: res.data.id,
|
|
169
|
+
getQueuedJob: (id, cancelToken) => client.batches.getQueuedBatch({ id }, { cancelToken }),
|
|
170
|
+
allow404: true,
|
|
171
|
+
limit,
|
|
172
|
+
polling,
|
|
173
|
+
});
|
|
174
|
+
if (isPollError(r.res)) {
|
|
175
|
+
failFast ? throwOnError(r) : errors.push({ ops, res: r.res });
|
|
176
|
+
}
|
|
177
|
+
return r;
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// eslint-disable-next-line no-await-in-loop
|
|
181
|
+
const batchRes = yield Promise.all(queuedOps.map((is) => limit(poll, is)));
|
|
182
|
+
const batchItemErrors = batchRes
|
|
183
|
+
.flatMap((b, i) => isBatch(b.res)
|
|
184
|
+
? b.res['vertexvis/batch:results'].map((r, j) => isApiError(r)
|
|
185
|
+
? { req: queuedOps[i].ops[j].data, res: r }
|
|
186
|
+
: undefined)
|
|
187
|
+
: [])
|
|
188
|
+
.filter(defined);
|
|
189
|
+
if (batchItemErrors.length) {
|
|
190
|
+
sceneItemErrors = sceneItemErrors.concat(batchItemErrors);
|
|
191
|
+
if (verbose)
|
|
192
|
+
onMsg(`WARNING: ${batchItemErrors.length} scene item creation errors at depth ${depth}.`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (verbose) {
|
|
196
|
+
onMsg(`Scene item creation complete for ${itemCount} scene items with max depth of ${createSceneItemReqs.length - 1}.`);
|
|
197
|
+
if (batchErrors.length) {
|
|
198
|
+
onMsg(` Batch errors: ${batchErrors.length}`);
|
|
199
|
+
}
|
|
200
|
+
if (sceneItemErrors.length) {
|
|
201
|
+
onMsg(` Scene item errors: ${sceneItemErrors.length}`);
|
|
202
|
+
}
|
|
153
203
|
}
|
|
154
|
-
const batchRes = yield Promise.all(queuedOps.map((is) => limit(poll, is)));
|
|
155
204
|
if (verbose)
|
|
156
205
|
onMsg(`Committing scene and polling until ready...`);
|
|
157
206
|
yield updateScene({
|
|
@@ -161,35 +210,40 @@ export function createSceneAndSceneItemsEXPERIMENTAL({ client, createSceneItemRe
|
|
|
161
210
|
});
|
|
162
211
|
yield pollSceneReady({ client, id: sceneId, onMsg, polling, verbose });
|
|
163
212
|
if (verbose)
|
|
164
|
-
onMsg(`Fitting scene's camera to scene
|
|
213
|
+
onMsg(`Fitting scene's camera to scene items...`);
|
|
214
|
+
const sceneResult = (yield updateScene({
|
|
215
|
+
attributes: {
|
|
216
|
+
camera: { type: CameraFitTypeEnum.FitVisibleSceneItems },
|
|
217
|
+
},
|
|
218
|
+
client,
|
|
219
|
+
sceneId,
|
|
220
|
+
})).scene;
|
|
221
|
+
if (verbose) {
|
|
222
|
+
const formatTime = (seconds) => {
|
|
223
|
+
const h = Math.floor(seconds / 3600);
|
|
224
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
225
|
+
const s = Math.round(seconds % 60);
|
|
226
|
+
return [h, m > 9 ? m : h ? '0' + m : m || '0', s > 9 ? s : '0' + s]
|
|
227
|
+
.filter(Boolean)
|
|
228
|
+
.join(':');
|
|
229
|
+
};
|
|
230
|
+
onMsg(`Scene creation completed in ${formatTime(Number(hrtime.bigint() - startTime) / 1000000000)}.`);
|
|
231
|
+
}
|
|
165
232
|
return {
|
|
166
|
-
errors,
|
|
167
|
-
queued,
|
|
168
|
-
scene:
|
|
169
|
-
|
|
170
|
-
camera: { type: CameraFitTypeEnum.FitVisibleSceneItems },
|
|
171
|
-
},
|
|
172
|
-
client,
|
|
173
|
-
sceneId,
|
|
174
|
-
})).scene,
|
|
175
|
-
sceneItemErrors: batchRes
|
|
176
|
-
.flatMap((b, i) => isBatch(b.res)
|
|
177
|
-
? b.res['vertexvis/batch:results'].map((r, j) => isApiError(r)
|
|
178
|
-
? { req: queuedOps[i].ops[j].data, res: r }
|
|
179
|
-
: undefined)
|
|
180
|
-
: [])
|
|
181
|
-
.filter(defined),
|
|
233
|
+
errors: batchErrors,
|
|
234
|
+
queued: batchQueuedOps,
|
|
235
|
+
scene: sceneResult,
|
|
236
|
+
sceneItemErrors,
|
|
182
237
|
};
|
|
183
238
|
});
|
|
184
239
|
}
|
|
185
240
|
/**
|
|
186
241
|
* Create scene items within a scene.
|
|
187
242
|
*/
|
|
188
|
-
export function createSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, failFast,
|
|
243
|
+
export function createSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, failFast, parallelism, sceneId, }) {
|
|
189
244
|
return __awaiter(this, void 0, void 0, function* () {
|
|
190
245
|
const limit = pLimit(parallelism);
|
|
191
246
|
const batchSize = 500;
|
|
192
|
-
let complete = 0;
|
|
193
247
|
const opChunks = arrayChunked(createSceneItemReqs.map((req) => ({
|
|
194
248
|
data: req.data,
|
|
195
249
|
op: BatchOperationOpEnum.Add,
|
|
@@ -213,10 +267,6 @@ export function createSceneItemsEXPERIMENTAL({ client, createSceneItemReqs, fail
|
|
|
213
267
|
else
|
|
214
268
|
throw error;
|
|
215
269
|
}
|
|
216
|
-
if (onProgress != null) {
|
|
217
|
-
complete += opChunk.length;
|
|
218
|
-
onProgress(complete, createSceneItemReqs.length);
|
|
219
|
-
}
|
|
220
270
|
return { ops, res };
|
|
221
271
|
}), opChunk)));
|
|
222
272
|
return { chunks: opChunks.length, queuedBatchOps };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "0.
|
|
1
|
+
export declare const version = "0.20.3";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '0.
|
|
1
|
+
export const version = '0.20.3';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vertexvis/api-client-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.3",
|
|
4
4
|
"description": "The Vertex REST API client for Node.js.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Vertex Developers <support@vertexvis.com> (https://developer.vertexvis.com)",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"typescript"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"axios": "^0.
|
|
36
|
+
"axios": "^0.27.2",
|
|
37
37
|
"p-limit": "^3"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|