@coherentglobal/spark-execute-sdk 0.4.4 → 0.4.7
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/README.md +38 -9
- package/dist/browser.js +154 -144
- package/package.json +9 -3
- package/src/browser.js +42 -155
- package/src/findModels.js +132 -0
- package/src/models.js +6 -12
- package/src/node.js +80 -182
- package/src/services/resolver.js +5 -6
- package/src/validate.js +2 -3
- package/types/browser.d.ts +6 -0
- package/types/browser.d.ts.map +1 -1
- package/types/models.d.ts +1 -1
- package/types/models.d.ts.map +1 -1
- package/types/node.d.ts +19 -5
- package/types/node.d.ts.map +1 -1
- package/types/resolver/externalResolver.d.ts.map +1 -1
- package/types/validate.d.ts.map +1 -1
package/src/browser.js
CHANGED
|
@@ -3,6 +3,7 @@ const WasmRunnerErrors = require("./error.js");
|
|
|
3
3
|
const { WasmRunner } = require("@coherentglobal/wasm-runner");
|
|
4
4
|
const validate = require("./validate.js");
|
|
5
5
|
const processModels = require("./models.js");
|
|
6
|
+
const findModel = require("./findModels.js");
|
|
6
7
|
|
|
7
8
|
let registry = {};
|
|
8
9
|
|
|
@@ -16,26 +17,25 @@ class Spark {
|
|
|
16
17
|
*/
|
|
17
18
|
this.config = this.validateConfig(config);
|
|
18
19
|
|
|
19
|
-
const {
|
|
20
|
-
sparkEndpoint: { syntheticKey, bearerToken, authType, tenant, url },
|
|
21
|
-
nodeGenModels,
|
|
22
|
-
} = this.config;
|
|
23
20
|
/**
|
|
24
21
|
* @private
|
|
25
22
|
*/
|
|
26
|
-
this.tenant = tenant;
|
|
23
|
+
this.tenant = this.config?.sparkEndpoint?.tenant ?? "";
|
|
27
24
|
/**
|
|
28
25
|
* @private
|
|
29
26
|
*/
|
|
30
|
-
this.authType = authType;
|
|
27
|
+
this.authType = this.config?.sparkEndpoint?.authType ?? "";
|
|
31
28
|
/**
|
|
32
29
|
* @private
|
|
33
30
|
*/
|
|
34
|
-
this.token =
|
|
31
|
+
this.token =
|
|
32
|
+
this.config?.sparkEndpoint?.syntheticKey ??
|
|
33
|
+
this.config?.sparkEndpoint?.bearerToken ??
|
|
34
|
+
"";
|
|
35
35
|
/**
|
|
36
36
|
* @private
|
|
37
37
|
*/
|
|
38
|
-
this.url = url;
|
|
38
|
+
this.url = this.config?.sparkEndpoint?.url ?? "";
|
|
39
39
|
/**
|
|
40
40
|
* @private
|
|
41
41
|
*/
|
|
@@ -43,12 +43,13 @@ class Spark {
|
|
|
43
43
|
/**
|
|
44
44
|
* @private
|
|
45
45
|
*/
|
|
46
|
-
this.model = this._models(nodeGenModels);
|
|
46
|
+
this.model = this._models(this.config?.nodeGenModels);
|
|
47
47
|
/**
|
|
48
48
|
* @private
|
|
49
49
|
*/
|
|
50
|
-
this.priority = ["model"];
|
|
50
|
+
this.priority = ["model", "onlineEndpoint"];
|
|
51
51
|
}
|
|
52
|
+
|
|
52
53
|
/**
|
|
53
54
|
*
|
|
54
55
|
* @param {object} nodegen
|
|
@@ -85,134 +86,6 @@ class Spark {
|
|
|
85
86
|
return model;
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
_findModel(requestMeta) {
|
|
89
|
-
let model = {};
|
|
90
|
-
if (requestMeta.version_id) {
|
|
91
|
-
model = this.model.filter(({ versionId }) => {
|
|
92
|
-
return versionId === requestMeta.version_id;
|
|
93
|
-
});
|
|
94
|
-
} else if (requestMeta.servicename && requestMeta.version) {
|
|
95
|
-
model = this.model.filter(
|
|
96
|
-
({ metaData }) =>
|
|
97
|
-
metaData.EngineInformation.ServiceName === requestMeta.servicename &&
|
|
98
|
-
metaData.EngineInformation.Revision === requestMeta.version
|
|
99
|
-
);
|
|
100
|
-
} else if (requestMeta.servicename && requestMeta.transaction_date) {
|
|
101
|
-
model = this.model.filter(
|
|
102
|
-
({ metaData }) =>
|
|
103
|
-
metaData.EngineInformation.ServiceName === requestMeta.servicename &&
|
|
104
|
-
new Date(requestMeta.transaction_date) >=
|
|
105
|
-
new Date(metaData.EffectiveStartDate) &&
|
|
106
|
-
new Date(requestMeta.transaction_date) <=
|
|
107
|
-
new Date(metaData.EffectiveEndDate)
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
if (model.length > 1) {
|
|
111
|
-
return model
|
|
112
|
-
.sort((versionA, versionB) =>
|
|
113
|
-
versionA.metaData.EngineInformation.Revision.replace(
|
|
114
|
-
/\d+/g,
|
|
115
|
-
(n) => +n + 100000
|
|
116
|
-
).localCompare(
|
|
117
|
-
versionB.metaData.EngineInformation.Revision.replace(
|
|
118
|
-
/\d+/g,
|
|
119
|
-
(n) => +n + 100000
|
|
120
|
-
)
|
|
121
|
-
)
|
|
122
|
-
)
|
|
123
|
-
.reverse();
|
|
124
|
-
}
|
|
125
|
-
} else if (requestMeta.service_id && requestMeta.version) {
|
|
126
|
-
model = this.model.filter(
|
|
127
|
-
({ metaData }) =>
|
|
128
|
-
metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
|
|
129
|
-
metaData.EngineInformation.Revision === requestMeta.version
|
|
130
|
-
);
|
|
131
|
-
} else if (requestMeta.service_id && requestMeta.transaction_date) {
|
|
132
|
-
model = this.model.filter(
|
|
133
|
-
({ metaData }) =>
|
|
134
|
-
metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
|
|
135
|
-
new Date(requestMeta.transaction_date) >=
|
|
136
|
-
new Date(metaData.EffectiveStartDate) &&
|
|
137
|
-
new Date(requestMeta.transaction_date) <=
|
|
138
|
-
new Date(metaData.EffectiveEndDate)
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
if (model.length > 1) {
|
|
142
|
-
return model
|
|
143
|
-
.sort((versionA, versionB) =>
|
|
144
|
-
versionA.metaData.EngineInformation.Revision.replace(
|
|
145
|
-
/\d+/g,
|
|
146
|
-
(n) => +n + 100000
|
|
147
|
-
).localCompare(
|
|
148
|
-
versionB.metaData.EngineInformation.Revision.replace(
|
|
149
|
-
/\d+/g,
|
|
150
|
-
(n) => +n + 100000
|
|
151
|
-
)
|
|
152
|
-
)
|
|
153
|
-
)
|
|
154
|
-
.reverse();
|
|
155
|
-
}
|
|
156
|
-
} else if (requestMeta.service_uri && requestMeta.transaction_date) {
|
|
157
|
-
const regex = /folders\/(.+)\/services\/(.+)/gi;
|
|
158
|
-
const parts = regex.exec(requestMeta.service_uri);
|
|
159
|
-
let folder, service;
|
|
160
|
-
if (parts) {
|
|
161
|
-
folder = decodeURI(parts[1]);
|
|
162
|
-
service = decodeURI(parts[2]);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
model = this.model.filter(
|
|
166
|
-
({ metaData }) =>
|
|
167
|
-
metaData.EngineInformation.ProductName === folder &&
|
|
168
|
-
metaData.EngineInformation.ServiceName === service &&
|
|
169
|
-
new Date(requestMeta.transaction_date) >=
|
|
170
|
-
new Date(metaData.EffectiveStartDate) &&
|
|
171
|
-
new Date(requestMeta.transaction_date) <=
|
|
172
|
-
new Date(metaData.EffectiveEndDate)
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
if (model.length > 1) {
|
|
176
|
-
return model
|
|
177
|
-
.sort((versionA, versionB) =>
|
|
178
|
-
versionA.metaData.EngineInformation.Revision.replace(
|
|
179
|
-
/\d+/g,
|
|
180
|
-
(n) => +n + 100000
|
|
181
|
-
).localCompare(
|
|
182
|
-
versionB.metaData.EngineInformation.Revision.replace(
|
|
183
|
-
/\d+/g,
|
|
184
|
-
(n) => +n + 100000
|
|
185
|
-
)
|
|
186
|
-
)
|
|
187
|
-
)
|
|
188
|
-
.reverse();
|
|
189
|
-
}
|
|
190
|
-
} else if (requestMeta.service_uri && requestMeta.version) {
|
|
191
|
-
const regex = /folders\/(.+)\/services\/(.+)/gi;
|
|
192
|
-
const parts = regex.exec(requestMeta.service_uri);
|
|
193
|
-
let folder, service;
|
|
194
|
-
if (parts) {
|
|
195
|
-
folder = decodeURI(parts[1]);
|
|
196
|
-
service = decodeURI(parts[2]);
|
|
197
|
-
}
|
|
198
|
-
model = this.model.filter(
|
|
199
|
-
({ metaData }) =>
|
|
200
|
-
metaData.EngineInformation.ProductName === folder &&
|
|
201
|
-
metaData.EngineInformation.ServiceName === service &&
|
|
202
|
-
metaData.EngineInformation.Revision === requestMeta.version
|
|
203
|
-
);
|
|
204
|
-
} else {
|
|
205
|
-
throw new Error(
|
|
206
|
-
"Model not found. requestMeta: " +
|
|
207
|
-
JSON.stringify(requestMeta) +
|
|
208
|
-
" tenant: " +
|
|
209
|
-
this.tenant
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return model[0];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
89
|
_getModelByMeta(folderName, serviceName) {
|
|
217
90
|
const model = this.model.find(
|
|
218
91
|
(m) =>
|
|
@@ -232,7 +105,6 @@ class Spark {
|
|
|
232
105
|
* @returns {object}
|
|
233
106
|
*/
|
|
234
107
|
async execute(input, version_id) {
|
|
235
|
-
console.log("-------UOPD---");
|
|
236
108
|
const versionID =
|
|
237
109
|
version_id ||
|
|
238
110
|
input?.request_meta?.version_id ||
|
|
@@ -244,17 +116,17 @@ class Spark {
|
|
|
244
116
|
|
|
245
117
|
let response;
|
|
246
118
|
response = await lookup[this.priority[0]](input, versionID, this);
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
119
|
+
if (response instanceof Error && this.config.sparkEndpoint !== undefined) {
|
|
120
|
+
response = await lookup[this.priority[1]](input, versionID, this);
|
|
121
|
+
}
|
|
122
|
+
|
|
250
123
|
return response;
|
|
251
124
|
}
|
|
252
125
|
|
|
253
126
|
async offlineModel(input, versionID, ds) {
|
|
254
|
-
const model =
|
|
255
|
-
|
|
127
|
+
const model = findModel(input.request_meta, ds.model);
|
|
256
128
|
const modelVersionId = versionID || (model && model?.versionId);
|
|
257
|
-
|
|
129
|
+
|
|
258
130
|
if (!input?.request_meta) {
|
|
259
131
|
input.request_meta = {};
|
|
260
132
|
}
|
|
@@ -304,8 +176,10 @@ class Spark {
|
|
|
304
176
|
};
|
|
305
177
|
registry = new WasmRunner("", callback);
|
|
306
178
|
}
|
|
179
|
+
|
|
307
180
|
if (!registry.isExist(modelVersionId)) {
|
|
308
|
-
const model =
|
|
181
|
+
const model = findModel(input.request_meta, ds.model);
|
|
182
|
+
|
|
309
183
|
await registry.append({
|
|
310
184
|
id: modelVersionId,
|
|
311
185
|
url: model.binary,
|
|
@@ -323,18 +197,28 @@ class Spark {
|
|
|
323
197
|
}
|
|
324
198
|
|
|
325
199
|
async onlineModelEndpoint(input, versionID, ds) {
|
|
200
|
+
const isPublic = ds.authType === "public";
|
|
201
|
+
|
|
326
202
|
let token = "";
|
|
327
|
-
if (ds.token.constructor.name === "AsyncFunction") {
|
|
328
|
-
token = await ds.token();
|
|
329
|
-
} else {
|
|
330
|
-
token = ds.token;
|
|
331
|
-
}
|
|
332
203
|
|
|
333
|
-
if (
|
|
334
|
-
|
|
204
|
+
if (!isPublic) {
|
|
205
|
+
if (ds.token.constructor.name === "AsyncFunction") {
|
|
206
|
+
token = await ds.token();
|
|
207
|
+
} else if (typeof ds.token === "function") {
|
|
208
|
+
token = ds.token();
|
|
209
|
+
} else {
|
|
210
|
+
token = ds.token;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (utils.isEmpty(ds.token)) {
|
|
214
|
+
throw new WasmRunnerErrors.UnauthorizedError();
|
|
215
|
+
}
|
|
335
216
|
}
|
|
217
|
+
|
|
336
218
|
try {
|
|
337
|
-
const header =
|
|
219
|
+
const header = !isPublic
|
|
220
|
+
? utils.getAuthHeaders(token, ds.authType, ds.tenant)
|
|
221
|
+
: {};
|
|
338
222
|
|
|
339
223
|
const options = {
|
|
340
224
|
method: "POST",
|
|
@@ -345,7 +229,10 @@ class Spark {
|
|
|
345
229
|
headers: { ...{ "content-type": "application/json" }, ...header },
|
|
346
230
|
};
|
|
347
231
|
|
|
348
|
-
const modelUrl = new URL(
|
|
232
|
+
const modelUrl = new URL(
|
|
233
|
+
`/${ds.tenant}/api/v3/${!isPublic ? "execute" : "public"}`,
|
|
234
|
+
ds.url
|
|
235
|
+
);
|
|
349
236
|
|
|
350
237
|
const response = await fetch(modelUrl, options);
|
|
351
238
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
const WasmRunnerErrors = require("./error");
|
|
2
|
+
|
|
3
|
+
const findModel = (requestMeta, nodegenModels) => {
|
|
4
|
+
let model = {};
|
|
5
|
+
if (requestMeta.version_id) {
|
|
6
|
+
model = nodegenModels.filter(({ versionId }) => {
|
|
7
|
+
return versionId === requestMeta.version_id;
|
|
8
|
+
});
|
|
9
|
+
} else if (requestMeta.servicename && requestMeta.version) {
|
|
10
|
+
model = nodegenModels.filter(
|
|
11
|
+
({ metaData }) =>
|
|
12
|
+
metaData.EngineInformation.ServiceName === requestMeta.servicename &&
|
|
13
|
+
metaData.EngineInformation.Revision === requestMeta.version
|
|
14
|
+
);
|
|
15
|
+
} else if (requestMeta.servicename && requestMeta.transaction_date) {
|
|
16
|
+
model = nodegenModels.filter(
|
|
17
|
+
({ metaData }) =>
|
|
18
|
+
metaData.EngineInformation.ServiceName === requestMeta.servicename &&
|
|
19
|
+
new Date(requestMeta.transaction_date) >=
|
|
20
|
+
new Date(metaData.EffectiveStartDate) &&
|
|
21
|
+
new Date(requestMeta.transaction_date) <=
|
|
22
|
+
new Date(metaData.EffectiveEndDate)
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (model.length > 1) {
|
|
26
|
+
return model
|
|
27
|
+
.sort((versionA, versionB) =>
|
|
28
|
+
versionA.metaData.EngineInformation.Revision.replace(
|
|
29
|
+
/\d+/g,
|
|
30
|
+
(n) => +n + 100000
|
|
31
|
+
).localCompare(
|
|
32
|
+
versionB.metaData.EngineInformation.Revision.replace(
|
|
33
|
+
/\d+/g,
|
|
34
|
+
(n) => +n + 100000
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
.reverse();
|
|
39
|
+
}
|
|
40
|
+
} else if (requestMeta.service_id && requestMeta.version) {
|
|
41
|
+
model = nodegenModels.filter(
|
|
42
|
+
({ metaData }) =>
|
|
43
|
+
metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
|
|
44
|
+
metaData.EngineInformation.Revision === requestMeta.version
|
|
45
|
+
);
|
|
46
|
+
} else if (requestMeta.service_id && requestMeta.transaction_date) {
|
|
47
|
+
model = nodegenModels.filter(
|
|
48
|
+
({ metaData }) =>
|
|
49
|
+
metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
|
|
50
|
+
new Date(requestMeta.transaction_date) >=
|
|
51
|
+
new Date(metaData.EffectiveStartDate) &&
|
|
52
|
+
new Date(requestMeta.transaction_date) <=
|
|
53
|
+
new Date(metaData.EffectiveEndDate)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
if (model.length > 1) {
|
|
57
|
+
return model
|
|
58
|
+
.sort((versionA, versionB) =>
|
|
59
|
+
versionA.metaData.EngineInformation.Revision.replace(
|
|
60
|
+
/\d+/g,
|
|
61
|
+
(n) => +n + 100000
|
|
62
|
+
).localCompare(
|
|
63
|
+
versionB.metaData.EngineInformation.Revision.replace(
|
|
64
|
+
/\d+/g,
|
|
65
|
+
(n) => +n + 100000
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
.reverse();
|
|
70
|
+
}
|
|
71
|
+
} else if (requestMeta.service_uri && requestMeta.transaction_date) {
|
|
72
|
+
const regex = /folders\/(.+)\/services\/(.+)/gi;
|
|
73
|
+
const parts = regex.exec(requestMeta.service_uri);
|
|
74
|
+
let folder, service;
|
|
75
|
+
if (parts) {
|
|
76
|
+
folder = decodeURI(parts[1]);
|
|
77
|
+
service = decodeURI(parts[2]);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
model = nodegenModels.filter(
|
|
81
|
+
({ metaData }) =>
|
|
82
|
+
metaData.EngineInformation.ProductName === folder &&
|
|
83
|
+
metaData.EngineInformation.ServiceName === service &&
|
|
84
|
+
new Date(requestMeta.transaction_date) >=
|
|
85
|
+
new Date(metaData.EffectiveStartDate) &&
|
|
86
|
+
new Date(requestMeta.transaction_date) <=
|
|
87
|
+
new Date(metaData.EffectiveEndDate)
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (model.length > 1) {
|
|
91
|
+
return model
|
|
92
|
+
.sort((versionA, versionB) =>
|
|
93
|
+
versionA.metaData.EngineInformation.Revision.replace(
|
|
94
|
+
/\d+/g,
|
|
95
|
+
(n) => +n + 100000
|
|
96
|
+
).localCompare(
|
|
97
|
+
versionB.metaData.EngineInformation.Revision.replace(
|
|
98
|
+
/\d+/g,
|
|
99
|
+
(n) => +n + 100000
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
.reverse();
|
|
104
|
+
}
|
|
105
|
+
} else if (requestMeta.service_uri && requestMeta.version) {
|
|
106
|
+
const regex = /folders\/(.+)\/services\/(.+)/gi;
|
|
107
|
+
const parts = regex.exec(requestMeta.service_uri);
|
|
108
|
+
let folder, service;
|
|
109
|
+
if (parts) {
|
|
110
|
+
folder = decodeURI(parts[1]);
|
|
111
|
+
service = decodeURI(parts[2]);
|
|
112
|
+
}
|
|
113
|
+
model = nodegenModels.filter(
|
|
114
|
+
({ metaData }) =>
|
|
115
|
+
metaData.EngineInformation.ProductName === folder &&
|
|
116
|
+
metaData.EngineInformation.ServiceName === service &&
|
|
117
|
+
metaData.EngineInformation.Revision === requestMeta.version
|
|
118
|
+
);
|
|
119
|
+
} else {
|
|
120
|
+
throw new Error(
|
|
121
|
+
"Model not found. requestMeta: " + JSON.stringify(requestMeta)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (model.length === 0) {
|
|
126
|
+
throw new WasmRunnerErrors.MissingModelError(requestMeta?.version_id);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return model[0];
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
module.exports = findModel;
|
package/src/models.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @returns
|
|
5
5
|
*/
|
|
6
6
|
const processModels = (nodegen) => {
|
|
7
|
-
const processedModels = {...nodegen}
|
|
8
|
-
|
|
7
|
+
const processedModels = { ...nodegen };
|
|
8
|
+
|
|
9
9
|
switch (nodegen.type) {
|
|
10
10
|
case "binary":
|
|
11
11
|
case "uint8array":
|
|
@@ -17,12 +17,10 @@ const processModels = (nodegen) => {
|
|
|
17
17
|
js: Buffer.from(nodegen.binary.js, "base64"),
|
|
18
18
|
data: Buffer.from(nodegen.binary.data, "base64"),
|
|
19
19
|
};
|
|
20
|
-
processedModels.binary = model
|
|
21
|
-
// nodegen.binary = model;
|
|
20
|
+
processedModels.binary = model;
|
|
22
21
|
} else {
|
|
23
22
|
const model = Buffer.from(nodegen.binary, "base64");
|
|
24
|
-
processedModels.binary = model
|
|
25
|
-
// nodegen.binary = model;
|
|
23
|
+
processedModels.binary = model;
|
|
26
24
|
}
|
|
27
25
|
break;
|
|
28
26
|
case "function":
|
|
@@ -31,16 +29,12 @@ const processModels = (nodegen) => {
|
|
|
31
29
|
if (func.constructor.name === "AsyncFunction") {
|
|
32
30
|
(async () => {
|
|
33
31
|
processedModels.binary = await func();
|
|
34
|
-
|
|
32
|
+
|
|
35
33
|
const model = Buffer.from(nodegen.binary, "base64");
|
|
36
34
|
processedModels.binary = model;
|
|
37
|
-
// nodegen.binary = model;
|
|
38
35
|
})();
|
|
39
36
|
} else {
|
|
40
|
-
|
|
41
|
-
const model = Buffer.from(nodegen.binary, "base64");
|
|
42
|
-
processedModels.binary = model;
|
|
43
|
-
// nodegen.binary = model;
|
|
37
|
+
processedModels.binary = func();
|
|
44
38
|
}
|
|
45
39
|
default:
|
|
46
40
|
break;
|