@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/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 = syntheticKey || bearerToken;
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
- // if (response instanceof Error) {
248
- // response = await lookup[this.priority[1]](input, versionID, this);
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 = ds._findModel(input.request_meta);
255
-
127
+ const model = findModel(input.request_meta, ds.model);
256
128
  const modelVersionId = versionID || (model && model?.versionId);
257
- // const modelVersionId = input?.request_meta?.version_id || versionID;
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 = ds._findModel(input.request_meta);
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 (utils.isEmpty(ds.token)) {
334
- throw new WasmRunnerErrors.UnauthorizedError();
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 = utils.getAuthHeaders(token, ds.authType, ds.tenant);
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(`/${ds.tenant}/api/v3/execute`, ds.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
- // console.log('MODELS TO PROCESS: ', processedModels)
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
- // nodegen.binary = await func();
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
- // nodegen.binary = func();
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;