@coherentglobal/spark-execute-sdk 0.4.5 → 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 +152 -141
- package/package.json +9 -3
- package/src/browser.js +42 -154
- 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) =>
|
|
@@ -243,17 +116,17 @@ class Spark {
|
|
|
243
116
|
|
|
244
117
|
let response;
|
|
245
118
|
response = await lookup[this.priority[0]](input, versionID, this);
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
119
|
+
if (response instanceof Error && this.config.sparkEndpoint !== undefined) {
|
|
120
|
+
response = await lookup[this.priority[1]](input, versionID, this);
|
|
121
|
+
}
|
|
122
|
+
|
|
249
123
|
return response;
|
|
250
124
|
}
|
|
251
125
|
|
|
252
126
|
async offlineModel(input, versionID, ds) {
|
|
253
|
-
const model =
|
|
254
|
-
|
|
127
|
+
const model = findModel(input.request_meta, ds.model);
|
|
255
128
|
const modelVersionId = versionID || (model && model?.versionId);
|
|
256
|
-
|
|
129
|
+
|
|
257
130
|
if (!input?.request_meta) {
|
|
258
131
|
input.request_meta = {};
|
|
259
132
|
}
|
|
@@ -303,8 +176,10 @@ class Spark {
|
|
|
303
176
|
};
|
|
304
177
|
registry = new WasmRunner("", callback);
|
|
305
178
|
}
|
|
179
|
+
|
|
306
180
|
if (!registry.isExist(modelVersionId)) {
|
|
307
|
-
const model =
|
|
181
|
+
const model = findModel(input.request_meta, ds.model);
|
|
182
|
+
|
|
308
183
|
await registry.append({
|
|
309
184
|
id: modelVersionId,
|
|
310
185
|
url: model.binary,
|
|
@@ -322,18 +197,28 @@ class Spark {
|
|
|
322
197
|
}
|
|
323
198
|
|
|
324
199
|
async onlineModelEndpoint(input, versionID, ds) {
|
|
200
|
+
const isPublic = ds.authType === "public";
|
|
201
|
+
|
|
325
202
|
let token = "";
|
|
326
|
-
if (ds.token.constructor.name === "AsyncFunction") {
|
|
327
|
-
token = await ds.token();
|
|
328
|
-
} else {
|
|
329
|
-
token = ds.token;
|
|
330
|
-
}
|
|
331
203
|
|
|
332
|
-
if (
|
|
333
|
-
|
|
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
|
+
}
|
|
334
216
|
}
|
|
217
|
+
|
|
335
218
|
try {
|
|
336
|
-
const header =
|
|
219
|
+
const header = !isPublic
|
|
220
|
+
? utils.getAuthHeaders(token, ds.authType, ds.tenant)
|
|
221
|
+
: {};
|
|
337
222
|
|
|
338
223
|
const options = {
|
|
339
224
|
method: "POST",
|
|
@@ -344,7 +229,10 @@ class Spark {
|
|
|
344
229
|
headers: { ...{ "content-type": "application/json" }, ...header },
|
|
345
230
|
};
|
|
346
231
|
|
|
347
|
-
const modelUrl = new URL(
|
|
232
|
+
const modelUrl = new URL(
|
|
233
|
+
`/${ds.tenant}/api/v3/${!isPublic ? "execute" : "public"}`,
|
|
234
|
+
ds.url
|
|
235
|
+
);
|
|
348
236
|
|
|
349
237
|
const response = await fetch(modelUrl, options);
|
|
350
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;
|