@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/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) =>
@@ -243,17 +116,17 @@ class Spark {
243
116
 
244
117
  let response;
245
118
  response = await lookup[this.priority[0]](input, versionID, this);
246
- // if (response instanceof Error) {
247
- // response = await lookup[this.priority[1]](input, versionID, this);
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 = ds._findModel(input.request_meta);
254
-
127
+ const model = findModel(input.request_meta, ds.model);
255
128
  const modelVersionId = versionID || (model && model?.versionId);
256
- // const modelVersionId = input?.request_meta?.version_id || versionID;
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 = ds._findModel(input.request_meta);
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 (utils.isEmpty(ds.token)) {
333
- 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
+ }
334
216
  }
217
+
335
218
  try {
336
- const header = utils.getAuthHeaders(token, ds.authType, ds.tenant);
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(`/${ds.tenant}/api/v3/execute`, ds.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
- // 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;