@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/node.js CHANGED
@@ -5,11 +5,13 @@ const logger = require("./logger.js");
5
5
  const validate = require("./validate.js");
6
6
  const processModels = require("./models.js");
7
7
  const got = require("got");
8
- const fs = require('fs');
9
- const serializeObject = require('serialize-anything');
10
- const path = require('path')
11
- const { v4: uuidv4 } = require('uuid')
8
+ const fs = require("fs");
9
+ const serializeObject = require("serialize-anything");
10
+ const path = require("path");
11
+ const { v4: uuidv4 } = require("uuid");
12
12
  const { object } = require("joi");
13
+ const { P } = require("pino");
14
+ const findModel = require("./findModels.js");
13
15
 
14
16
  let registry = [];
15
17
 
@@ -17,42 +19,43 @@ class Spark {
17
19
  /**
18
20
  * @param {object} config
19
21
  */
20
- constructor(config, option={}) {
21
- this.externalUuid = config.externalUuid ? config.externalUuid : uuidv4()
22
+ constructor(config, option = {}) {
23
+ this.externalUuid = config.externalUuid ? config.externalUuid : uuidv4();
22
24
  /**
23
25
  * @private
24
26
  */
25
- if(option.serialize){
26
- const toBase = Buffer.from(config, 'base64').toString('utf8')
27
- const deserialize = serializeObject.deserialize(toBase)
28
- const validate = this.validateConfig(deserialize)
29
- this.config = validate
30
- this.externalUuid = validate.externalUuid ? validate.externalUuid : uuidv4()
31
- logger.info({message: "DESERIALIZE: ", value: this.externalUuid})
27
+ if (option.serialize) {
28
+ const toBase = Buffer.from(config, "base64").toString("utf8");
29
+ const deserialize = serializeObject.deserialize(toBase);
30
+ const validate = this.validateConfig(deserialize);
31
+ this.config = validate;
32
+ this.externalUuid = validate.externalUuid
33
+ ? validate.externalUuid
34
+ : uuidv4();
35
+ logger.info({ message: "DESERIALIZE: ", value: this.externalUuid });
32
36
  } else {
33
- this.config = this.validateConfig(config)
37
+ this.config = this.validateConfig(config);
34
38
  }
35
- const {
36
- // sparkEndpoint: { syntheticKey, bearerToken, authType, tenant, url },
37
- nodeGenModels,
38
- } = this.config;
39
39
 
40
40
  /**
41
41
  * @private
42
42
  */
43
- this.tenant = "";
43
+ this.tenant = this.config?.sparkEndpoint?.tenant ?? "";
44
44
  /**
45
45
  * @private
46
46
  */
47
- this.authType = "";
47
+ this.authType = this.config?.sparkEndpoint?.authType ?? "";
48
48
  /**
49
49
  * @private
50
50
  */
51
- this.token = "";
51
+ this.token =
52
+ this.config?.sparkEndpoint?.syntheticKey ??
53
+ this.config?.sparkEndpoint?.bearerToken ??
54
+ "";
52
55
  /**
53
56
  * @private
54
57
  */
55
- this.url = "";
58
+ this.url = this.config?.sparkEndpoint?.url ?? "";
56
59
  /**
57
60
  * @private
58
61
  */
@@ -60,17 +63,17 @@ class Spark {
60
63
  /**
61
64
  * @private
62
65
  */
63
- this.model = this._models(nodeGenModels);
66
+ this.model = this._models(this.config?.nodeGenModels);
64
67
 
65
68
  /**
66
69
  * @private
67
70
  */
68
- this.externalResolver = this._addExternalResolver()
71
+ this.externalResolver = this._addExternalResolver();
69
72
 
70
- /**
73
+ /**
71
74
  * @private
72
75
  */
73
- this.priority = ["model"];
76
+ this.priority = ["model", "onlineEndpoint"];
74
77
  }
75
78
 
76
79
  /**
@@ -114,134 +117,6 @@ class Spark {
114
117
  return model;
115
118
  }
116
119
 
117
- _findModel(requestMeta) {
118
- let model = {};
119
- if (requestMeta.version_id) {
120
- model = this.model.filter(({ versionId }) => {
121
- return versionId === requestMeta.version_id;
122
- });
123
- } else if (requestMeta.servicename && requestMeta.version) {
124
- model = this.model.filter(
125
- ({ metaData }) =>
126
- metaData.EngineInformation.ServiceName === requestMeta.servicename &&
127
- metaData.EngineInformation.Revision === requestMeta.version
128
- );
129
- } else if (requestMeta.servicename && requestMeta.transaction_date) {
130
- model = this.model.filter(
131
- ({ metaData }) =>
132
- metaData.EngineInformation.ServiceName === requestMeta.servicename &&
133
- new Date(requestMeta.transaction_date) >=
134
- new Date(metaData.EffectiveStartDate) &&
135
- new Date(requestMeta.transaction_date) <=
136
- new Date(metaData.EffectiveEndDate)
137
- );
138
-
139
- if (model.length > 1) {
140
- return model
141
- .sort((versionA, versionB) =>
142
- versionA.metaData.EngineInformation.Revision.replace(
143
- /\d+/g,
144
- (n) => +n + 100000
145
- ).localCompare(
146
- versionB.metaData.EngineInformation.Revision.replace(
147
- /\d+/g,
148
- (n) => +n + 100000
149
- )
150
- )
151
- )
152
- .reverse();
153
- }
154
- } else if (requestMeta.service_id && requestMeta.version) {
155
- model = this.model.filter(
156
- ({ metaData }) =>
157
- metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
158
- metaData.EngineInformation.Revision === requestMeta.version
159
- );
160
- } else if (requestMeta.service_id && requestMeta.transaction_date) {
161
- model = this.model.filter(
162
- ({ metaData }) =>
163
- metaData.EngineInformation.ServiceGuid === requestMeta.service_id &&
164
- new Date(requestMeta.transaction_date) >=
165
- new Date(metaData.EffectiveStartDate) &&
166
- new Date(requestMeta.transaction_date) <=
167
- new Date(metaData.EffectiveEndDate)
168
- );
169
-
170
- if (model.length > 1) {
171
- return model
172
- .sort((versionA, versionB) =>
173
- versionA.metaData.EngineInformation.Revision.replace(
174
- /\d+/g,
175
- (n) => +n + 100000
176
- ).localCompare(
177
- versionB.metaData.EngineInformation.Revision.replace(
178
- /\d+/g,
179
- (n) => +n + 100000
180
- )
181
- )
182
- )
183
- .reverse();
184
- }
185
- } else if (requestMeta.service_uri && requestMeta.transaction_date) {
186
- const regex = /folders\/(.+)\/services\/(.+)/gi;
187
- const parts = regex.exec(requestMeta.service_uri);
188
- let folder, service;
189
- if (parts) {
190
- folder = decodeURI(parts[1]);
191
- service = decodeURI(parts[2]);
192
- }
193
-
194
- model = this.model.filter(
195
- ({ metaData }) =>
196
- metaData.EngineInformation.ProductName === folder &&
197
- metaData.EngineInformation.ServiceName === service &&
198
- new Date(requestMeta.transaction_date) >=
199
- new Date(metaData.EffectiveStartDate) &&
200
- new Date(requestMeta.transaction_date) <=
201
- new Date(metaData.EffectiveEndDate)
202
- );
203
-
204
- if (model.length > 1) {
205
- return model
206
- .sort((versionA, versionB) =>
207
- versionA.metaData.EngineInformation.Revision.replace(
208
- /\d+/g,
209
- (n) => +n + 100000
210
- ).localCompare(
211
- versionB.metaData.EngineInformation.Revision.replace(
212
- /\d+/g,
213
- (n) => +n + 100000
214
- )
215
- )
216
- )
217
- .reverse();
218
- }
219
- } else if (requestMeta.service_uri && requestMeta.version) {
220
- const regex = /folders\/(.+)\/services\/(.+)/gi;
221
- const parts = regex.exec(requestMeta.service_uri);
222
- let folder, service;
223
- if (parts) {
224
- folder = decodeURI(parts[1]);
225
- service = decodeURI(parts[2]);
226
- }
227
- model = this.model.filter(
228
- ({ metaData }) =>
229
- metaData.EngineInformation.ProductName === folder &&
230
- metaData.EngineInformation.ServiceName === service &&
231
- metaData.EngineInformation.Revision === requestMeta.version
232
- );
233
- } else {
234
- throw new Error(
235
- "Model not found. requestMeta: " +
236
- JSON.stringify(requestMeta) +
237
- " tenant: " +
238
- this.tenant
239
- );
240
- }
241
-
242
- return model[0];
243
- }
244
-
245
120
  /**
246
121
  * Execute model
247
122
  *
@@ -261,35 +136,45 @@ class Spark {
261
136
  };
262
137
 
263
138
  let response;
139
+
264
140
  response = await lookup[this.priority[0]](input, versionID, this);
265
- // if (response instanceof Error) {
266
- // response = await lookup[this.priority[1]](input, versionID, this);
267
- // }
141
+ if (response instanceof Error && this.config.sparkEndpoint !== undefined) {
142
+ response = await lookup[this.priority[1]](input, versionID, this);
143
+ }
268
144
 
269
145
  return response;
270
146
  }
271
147
 
272
148
  _addExternalResolver() {
273
- const folder = path.join(__dirname, `resolver_temp`)
149
+ const folder = path.join(__dirname, `resolver_temp`);
274
150
  try {
275
- fs.accessSync(folder)
151
+ fs.accessSync(folder);
276
152
  } catch (err) {
277
- fs.mkdirSync(folder)
153
+ fs.mkdirSync(folder);
278
154
  }
279
- const filePath = path.join(__dirname, `resolver_temp/resolver-${this.externalUuid}.js`)
280
- if(fs.existsSync(filePath)) {
281
- return require.resolve(filePath)
155
+ const filePath = path.join(
156
+ __dirname,
157
+ `resolver_temp/resolver-${this.externalUuid}.js`
158
+ );
159
+ if (fs.existsSync(filePath)) {
160
+ return require.resolve(filePath);
282
161
  }
283
162
  let template = fs.readFileSync(
284
163
  require.resolve("./resolver/externalResolver.js"),
285
164
  {
286
- encoding: "utf8"
165
+ encoding: "utf8",
287
166
  }
288
- )
289
- const data = serializeObject.serialize({...this.config, externalUuid: this.externalUuid})
290
- template = template.replace("%%config_to_replace%%", Buffer.from(data).toString('base64'))
291
- fs.writeFileSync(filePath, template)
292
- return require.resolve(filePath)
167
+ );
168
+ const data = serializeObject.serialize({
169
+ ...this.config,
170
+ externalUuid: this.externalUuid,
171
+ });
172
+ template = template.replace(
173
+ "%%config_to_replace%%",
174
+ Buffer.from(data).toString("base64")
175
+ );
176
+ fs.writeFileSync(filePath, template);
177
+ return require.resolve(filePath);
293
178
  }
294
179
 
295
180
  _getModelByMeta(folderName, serviceName) {
@@ -303,8 +188,10 @@ class Spark {
303
188
  }
304
189
 
305
190
  _storeConfig() {
306
- fs.writeFileSync('config.json',JSON.stringify(this.config), () => console.err(err))
307
- return require.resolve('config.json')
191
+ fs.writeFileSync("config.json", JSON.stringify(this.config), () =>
192
+ console.err(err)
193
+ );
194
+ return require.resolve("config.json");
308
195
  // return JSON.stringify(this.config)
309
196
  }
310
197
 
@@ -315,9 +202,9 @@ class Spark {
315
202
 
316
203
  async offlineModel(input, versionID, ds) {
317
204
  try {
318
- const model = ds._findModel(input.request_meta);
205
+ const model = findModel(input.request_meta, ds.model);
319
206
 
320
- const versionId = versionID || (model && model?.versionId)
207
+ const versionId = versionID || (model && model?.versionId);
321
208
 
322
209
  logger.info({
323
210
  EventType: "ExecuteModel",
@@ -349,26 +236,37 @@ class Spark {
349
236
  TextMessage: `Execute uuid: ${versionID}`,
350
237
  });
351
238
 
239
+ const isPublic = ds.authType === "public";
352
240
  let token = "";
353
- if (ds.token.constructor.name === "AsyncFunction") {
354
- token = await ds.token();
355
- } else {
356
- token = ds.token;
357
- }
241
+ if (!isPublic) {
242
+ if (ds.token.constructor.name === "AsyncFunction") {
243
+ token = await ds.token();
244
+ } else if (typeof ds.token === "function") {
245
+ token = ds.token();
246
+ } else {
247
+ token = ds.token;
248
+ }
358
249
 
359
- if (utils.isEmpty(ds.token)) {
360
- throw new WasmRunnerErrors.UnauthorizedError();
250
+ if (utils.isEmpty(ds.token)) {
251
+ throw new WasmRunnerErrors.UnauthorizedError();
252
+ }
361
253
  }
254
+
362
255
  try {
363
256
  const options = {
364
- headers: utils.getAuthHeaders(token, ds.authType, ds.tenant),
257
+ headers: !isPublic
258
+ ? utils.getAuthHeaders(token, ds.authType, ds.tenant)
259
+ : {},
365
260
  json: {
366
261
  request_data: {},
367
262
  request_meta: input.request_meta,
368
263
  },
369
264
  };
370
265
 
371
- let modelUrl = new URL(`/${ds.tenant}/api/v3/execute`, ds.url);
266
+ let modelUrl = new URL(
267
+ `/${ds.tenant}/api/v3/${!isPublic ? "execute" : "public"}`,
268
+ ds.url
269
+ );
372
270
 
373
271
  const result = await got.post(modelUrl, options).json();
374
272
 
@@ -93,16 +93,15 @@ const resolveOffline = async (requestMeta, tenant, headers, servicemap) => {
93
93
  /* istanbul ignore next */
94
94
  resolverCache.delete(key);
95
95
  }
96
- // console.log("OFFLINE: ", servicemap)
97
- const productName = servicemap.dataJson.EngineInformation.ProductName
98
- const serviceName = servicemap.dataJson.EngineInformation.ServiceName
99
- const revision = servicemap.dataJson.EngineInformation.Revision
100
- const latestVersion = servicemap.latestVersionId
96
+
97
+ const productName = servicemap.dataJson.EngineInformation.ProductName;
98
+ const serviceName = servicemap.dataJson.EngineInformation.ServiceName;
99
+ const revision = servicemap.dataJson.EngineInformation.Revision;
100
+ const latestVersion = servicemap.latestVersionId;
101
101
  let wasmUrl = path.join(
102
102
  `${modelLocation}/${tenant}/${productName}/${serviceName}/${revision}`,
103
103
  `${latestVersion}.zip`
104
104
  );
105
- // console.log('wasmUrl: ', wasmUrl)
106
105
 
107
106
  const responseData = {
108
107
  cache_duration: 100,
package/src/validate.js CHANGED
@@ -15,8 +15,7 @@ const rules = Joi.object({
15
15
  .required(),
16
16
  syntheticKey: [Joi.string().allow(""), Joi.function().allow("")], // allow fns
17
17
  bearerToken: [Joi.string().allow(""), Joi.function().allow("")], // allow strings/fns
18
- })
19
- .and("url", "tenant", "authType"),
18
+ }).and("url", "tenant", "authType"),
20
19
  nodeGenModels: Joi.array()
21
20
  .items(
22
21
  Joi.object({
@@ -37,7 +36,7 @@ const rules = Joi.object({
37
36
  })
38
37
  )
39
38
  .required(),
40
- externalUuid: Joi.string().allow()
39
+ externalUuid: Joi.string().allow(),
41
40
  // xParameters: Joi.array().items(),
42
41
  // xCallCallback: Joi.func()
43
42
  }).required();
@@ -32,6 +32,10 @@ declare class Spark {
32
32
  * @private
33
33
  */
34
34
  private model;
35
+ /**
36
+ * @private
37
+ */
38
+ private priority;
35
39
  /**
36
40
  *
37
41
  * @param {object} nodegen
@@ -60,5 +64,7 @@ declare class Spark {
60
64
  * @returns {object}
61
65
  */
62
66
  execute(input: object, version_id?: string | undefined): object;
67
+ offlineModel(input: any, versionID: any, ds: any): Promise<any>;
68
+ onlineModelEndpoint(input: any, versionID: any, ds: any): Promise<any>;
63
69
  }
64
70
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.js"],"names":[],"mappings":";AAQA;IACE;;OAEG;IACH,oBAFW,MAAM,EAoChB;IAjCC;;OAEG;IACH,eAAyC;IAMzC;;OAEG;IACH,eAAoB;IACpB;;OAEG;IACH,iBAAwB;IACxB;;OAEG;IACH,cAAwC;IACxC;;OAEG;IACH,YAAc;IACd;;OAEG;IACH,qBAA2C;IAC3C;;OAEG;IACH,cAAwC;IAE1C;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAMlB;IACD;;;;OAIG;IACH,uBAHW,MAAM,GACJ,MAAM,CAUlB;IACD;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAOnB;IAED,kCA8HC;IAED,wDASC;IAED;;;;;;OAMG;IACH,eAJW,MAAM,oCAEJ,MAAM,CAmJlB;CACF"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.js"],"names":[],"mappings":";AAQA;IACE;;OAEG;IACH,oBAFW,MAAM,EA4ChB;IAzCC;;OAEG;IACH,eAAyC;IAOzC;;OAEG;IACH,eAAsD;IACtD;;OAEG;IACH,iBAA0D;IAC1D;;OAEG;IACH,cAGI;IACJ;;OAEG;IACH,YAAgD;IAChD;;OAEG;IACH,qBAA2C;IAC3C;;OAEG;IACH,cAAqD;IACrD;;OAEG;IACH,iBAA2C;IAE7C;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAMlB;IACD;;;;OAIG;IACH,uBAHW,MAAM,GACJ,MAAM,CAUlB;IACD;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAOnB;IAED,kCA8HC;IAED,wDASC;IAED;;;;;;OAMG;IACH,eAJW,MAAM,oCAEJ,MAAM,CAqBlB;IAED,gEA4DC;IAED,uEAgCC;CACF"}
package/types/models.d.ts CHANGED
@@ -4,5 +4,5 @@ export = processModels;
4
4
  * @param {object} nodegen
5
5
  * @returns
6
6
  */
7
- declare function processModels(nodegen: object): object;
7
+ declare function processModels(nodegen: object): {};
8
8
  //# sourceMappingURL=models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.js"],"names":[],"mappings":";AAAA;;;;GAIG;AACH,wCAHW,MAAM,UAyChB"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.js"],"names":[],"mappings":";AAAA;;;;GAIG;AACH,wCAHW,MAAM,MAgDhB"}
package/types/node.d.ts CHANGED
@@ -3,11 +3,9 @@ declare class Spark {
3
3
  /**
4
4
  * @param {object} config
5
5
  */
6
- constructor(config: object);
7
- /**
8
- * @private
9
- */
10
- private config;
6
+ constructor(config: object, option?: {});
7
+ externalUuid: any;
8
+ config: object;
11
9
  /**
12
10
  * @private
13
11
  */
@@ -32,6 +30,14 @@ declare class Spark {
32
30
  * @private
33
31
  */
34
32
  private model;
33
+ /**
34
+ * @private
35
+ */
36
+ private externalResolver;
37
+ /**
38
+ * @private
39
+ */
40
+ private priority;
35
41
  /**
36
42
  *
37
43
  * @param {object} nodegen
@@ -59,5 +65,13 @@ declare class Spark {
59
65
  * @returns {object}
60
66
  */
61
67
  execute(input: object, version_id?: string | undefined): object;
68
+ _addExternalResolver(): string;
69
+ _getModelByMeta(folderName: any, serviceName: any): any;
70
+ _storeConfig(): string;
71
+ /**
72
+ * Remove Model
73
+ */
74
+ offlineModel(input: any, versionID: any, ds: any): Promise<any>;
75
+ onlineModelEndpoint(input: any, versionID: any, ds: any): Promise<any>;
62
76
  }
63
77
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.js"],"names":[],"mappings":";AAUA;IACE;;OAEG;IACH,oBAFW,MAAM,EAoChB;IAjCC;;OAEG;IACH,eAAyC;IAMzC;;OAEG;IACH,eAAoB;IACpB;;OAEG;IACH,iBAAwB;IACxB;;OAEG;IACH,cAAwC;IACxC;;OAEG;IACH,YAAc;IACd;;OAEG;IACH,qBAA2C;IAC3C;;OAEG;IACH,cAAwC;IAG1C;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;OAIG;IACH,uBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAOnB;IAED,kCA8HC;IAED;;;;;;OAMG;IACH,eAJW,MAAM,oCAEJ,MAAM,CA2GlB;CAMF"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.js"],"names":[],"mappings":";AAeA;IACE;;OAEG;IACH,oBAFW,MAAM,eA6DhB;IA1DC,kBAAwE;IAQtE,eAAsB;IAaxB;;OAEG;IACH,eAAsD;IACtD;;OAEG;IACH,iBAA0D;IAC1D;;OAEG;IACH,cAGI;IACJ;;OAEG;IACH,YAAgD;IAChD;;OAEG;IACH,qBAA2C;IAC3C;;OAEG;IACH,cAAqD;IAErD;;OAEG;IACH,yBAAmD;IAEnD;;OAEG;IACH,iBAAyB;IAG3B;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;OAIG;IACH,uBAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;OAIG;IACH,cAHW,MAAM,GACJ,OAAO,CAOnB;IAED,kCA8HC;IAED;;;;;;OAMG;IACH,eAJW,MAAM,oCAEJ,MAAM,CAwBlB;IAED,+BA8BC;IAED,wDAQC;IAED,uBAMC;IAED;;OAEG;IAGH,gEA4BC;IAED,uEA0CC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"externalResolver.d.ts","sourceRoot":"","sources":["../../src/resolver/externalResolver.js"],"names":[],"mappings":"AAkDgB,8EAkEb"}
1
+ {"version":3,"file":"externalResolver.d.ts","sourceRoot":"","sources":["../../src/resolver/externalResolver.js"],"names":[],"mappings":"AAkFgB,8EAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.js"],"names":[],"mappings":";AA6CA,kEAGC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.js"],"names":[],"mappings":";AA2CA,kEAGC"}