@xyo-network/module-abstract 2.92.6 → 2.92.8

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.
Files changed (42) hide show
  1. package/dist/browser/AbstractModule.d.cts +19 -7
  2. package/dist/browser/AbstractModule.d.cts.map +1 -1
  3. package/dist/browser/AbstractModule.d.mts +19 -7
  4. package/dist/browser/AbstractModule.d.mts.map +1 -1
  5. package/dist/browser/AbstractModule.d.ts +19 -7
  6. package/dist/browser/AbstractModule.d.ts.map +1 -1
  7. package/dist/browser/AbstractModuleInstance.d.cts +2 -1
  8. package/dist/browser/AbstractModuleInstance.d.cts.map +1 -1
  9. package/dist/browser/AbstractModuleInstance.d.mts +2 -1
  10. package/dist/browser/AbstractModuleInstance.d.mts.map +1 -1
  11. package/dist/browser/AbstractModuleInstance.d.ts +2 -1
  12. package/dist/browser/AbstractModuleInstance.d.ts.map +1 -1
  13. package/dist/browser/determineAccount.d.cts.map +1 -1
  14. package/dist/browser/determineAccount.d.mts.map +1 -1
  15. package/dist/browser/determineAccount.d.ts.map +1 -1
  16. package/dist/browser/index.cjs +94 -38
  17. package/dist/browser/index.cjs.map +1 -1
  18. package/dist/browser/index.js +95 -39
  19. package/dist/browser/index.js.map +1 -1
  20. package/dist/node/AbstractModule.d.cts +19 -7
  21. package/dist/node/AbstractModule.d.cts.map +1 -1
  22. package/dist/node/AbstractModule.d.mts +19 -7
  23. package/dist/node/AbstractModule.d.mts.map +1 -1
  24. package/dist/node/AbstractModule.d.ts +19 -7
  25. package/dist/node/AbstractModule.d.ts.map +1 -1
  26. package/dist/node/AbstractModuleInstance.d.cts +2 -1
  27. package/dist/node/AbstractModuleInstance.d.cts.map +1 -1
  28. package/dist/node/AbstractModuleInstance.d.mts +2 -1
  29. package/dist/node/AbstractModuleInstance.d.mts.map +1 -1
  30. package/dist/node/AbstractModuleInstance.d.ts +2 -1
  31. package/dist/node/AbstractModuleInstance.d.ts.map +1 -1
  32. package/dist/node/determineAccount.d.cts.map +1 -1
  33. package/dist/node/determineAccount.d.mts.map +1 -1
  34. package/dist/node/determineAccount.d.ts.map +1 -1
  35. package/dist/node/index.cjs +101 -42
  36. package/dist/node/index.cjs.map +1 -1
  37. package/dist/node/index.js +102 -43
  38. package/dist/node/index.js.map +1 -1
  39. package/package.json +25 -25
  40. package/src/AbstractModule.ts +111 -44
  41. package/src/AbstractModuleInstance.ts +9 -2
  42. package/src/determineAccount.ts +6 -3
@@ -21,7 +21,7 @@ import { BoundWitnessBuilder, QueryBoundWitnessBuilder } from "@xyo-network/boun
21
21
  import { QueryBoundWitnessWrapper as QueryBoundWitnessWrapper3 } from "@xyo-network/boundwitness-wrapper";
22
22
  import { ConfigSchema } from "@xyo-network/config-payload-plugin";
23
23
  import { ModuleManifestPayloadSchema } from "@xyo-network/manifest-model";
24
- import { AddressPreviousHashSchema, duplicateModules, isModuleName, ModuleAddressQuerySchema, ModuleDescribeQuerySchema, ModuleDescriptionSchema, ModuleDiscoverQuerySchema, ModuleFactory, ModuleManifestQuerySchema, ModuleStateQuerySchema, ModuleSubscribeQuerySchema, serializableField } from "@xyo-network/module-model";
24
+ import { AddressPreviousHashSchema, DeadModuleError, duplicateModules, isModuleName, ModuleAddressQuerySchema, ModuleDescribeQuerySchema, ModuleDescriptionSchema, ModuleDiscoverQuerySchema, ModuleFactory, ModuleManifestQuerySchema, ModuleStateQuerySchema, ModuleSubscribeQuerySchema, serializableField } from "@xyo-network/module-model";
25
25
  import { CompositeModuleResolver } from "@xyo-network/module-resolver";
26
26
  import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
27
27
  import { QuerySchema } from "@xyo-network/query-payload-plugin";
@@ -72,7 +72,7 @@ var BaseEmitter = _BaseEmitter;
72
72
  import { assertEx } from "@xylabs/assert";
73
73
  import { Account } from "@xyo-network/account";
74
74
  var isDetermineAccountFromAccountParams = /* @__PURE__ */ __name((params) => {
75
- assertEx(!params.accountPath, "accountPath may not be provided when account is provided");
75
+ assertEx(!params.accountPath, () => "accountPath may not be provided when account is provided");
76
76
  return !!params.account;
77
77
  }, "isDetermineAccountFromAccountParams");
78
78
  var isDetermineAccountFromWalletParams = /* @__PURE__ */ __name((params) => {
@@ -81,13 +81,13 @@ var isDetermineAccountFromWalletParams = /* @__PURE__ */ __name((params) => {
81
81
  async function determineAccount(params, allowRandomAccount = true) {
82
82
  if (isDetermineAccountFromAccountParams(params)) {
83
83
  if (params.account === "random") {
84
- assertEx(allowRandomAccount, "Random address not allowed");
84
+ assertEx(allowRandomAccount, () => "Random address not allowed");
85
85
  return Account.randomSync();
86
86
  }
87
87
  return params.account;
88
88
  }
89
89
  if (isDetermineAccountFromWalletParams(params)) {
90
- return assertEx(params.accountPath ? await params.wallet.derivePath(params.accountPath) : params.wallet, "Failed to derive account from path");
90
+ return assertEx(params.accountPath ? await params.wallet.derivePath(params.accountPath) : params.wallet, () => "Failed to derive account from path");
91
91
  }
92
92
  console.warn("AbstractModule.determineAccount: No account or wallet provided - Creating Random account");
93
93
  return Account.randomSync();
@@ -235,6 +235,7 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
235
235
  [ModuleStateQuerySchema]: "6",
236
236
  [ModuleSubscribeQuerySchema]: "3"
237
237
  };
238
+ _lastError;
238
239
  _queryAccounts = {
239
240
  [ModuleAddressQuerySchema]: void 0,
240
241
  [ModuleDescribeQuerySchema]: void 0,
@@ -248,8 +249,9 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
248
249
  moduleConfigQueryValidator;
249
250
  supportedQueryValidator;
250
251
  _busyCount = 0;
252
+ _status = "stopped";
251
253
  constructor(privateConstructorKey, params, account) {
252
- assertEx2(_AbstractModule.privateConstructorKey === privateConstructorKey, "Use create function instead of constructor");
254
+ assertEx2(_AbstractModule.privateConstructorKey === privateConstructorKey, () => "Use create function instead of constructor");
253
255
  const mutatedParams = {
254
256
  ...params
255
257
  };
@@ -262,7 +264,7 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
262
264
  return this.configSchemas[0];
263
265
  }
264
266
  get account() {
265
- return assertEx2(this._account, "Missing account");
267
+ return assertEx2(this._account, () => "Missing account");
266
268
  }
267
269
  get address() {
268
270
  return this.account.address;
@@ -274,6 +276,9 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
274
276
  get config() {
275
277
  return this.params.config;
276
278
  }
279
+ get dead() {
280
+ return this.status === "dead";
281
+ }
277
282
  get ephemeralQueryAccountEnabled() {
278
283
  return !!this.params.ephemeralQueryAccountEnabled;
279
284
  }
@@ -299,6 +304,9 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
299
304
  get queryAccounts() {
300
305
  return this._queryAccounts;
301
306
  }
307
+ get status() {
308
+ return this._status;
309
+ }
302
310
  get timestamp() {
303
311
  return this.config.timestamp ?? false;
304
312
  }
@@ -309,6 +317,11 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
309
317
  var _a;
310
318
  return ((_a = this.params) == null ? void 0 : _a.logger) ?? _AbstractModule.defaultLogger ?? Base2.defaultLogger;
311
319
  }
320
+ set status(value) {
321
+ if (this._status !== "dead") {
322
+ this._status = value;
323
+ }
324
+ }
312
325
  static _getRootFunction(funcName) {
313
326
  let anyThis = this;
314
327
  while (anyThis.__proto__[funcName]) {
@@ -319,24 +332,27 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
319
332
  static _noOverride(functionName) {
320
333
  const thisFunc = this[functionName];
321
334
  const rootFunc = this._getRootFunction(functionName);
322
- assertEx2(thisFunc === rootFunc, `Override not allowed for [${functionName}] - override ${functionName}Handler instead`);
335
+ assertEx2(thisFunc === rootFunc, () => `Override not allowed for [${functionName}] - override ${functionName}Handler instead`);
323
336
  }
324
337
  static async create(params) {
325
- var _a, _b, _c, _d, _e, _f;
338
+ var _a, _b, _c, _d, _e;
326
339
  this._noOverride("create");
327
340
  if (!this.configSchemas || this.configSchemas.length === 0) {
328
341
  throw new Error(`Missing configSchema [${(_a = params == null ? void 0 : params.config) == null ? void 0 : _a.schema}][${this.name}]`);
329
342
  }
330
- assertEx2(((_b = params == null ? void 0 : params.config) == null ? void 0 : _b.name) === void 0 || isModuleName(params.config.name), `Invalid module name: ${(_c = params == null ? void 0 : params.config) == null ? void 0 : _c.name}`);
343
+ assertEx2(((_b = params == null ? void 0 : params.config) == null ? void 0 : _b.name) === void 0 || isModuleName(params.config.name), () => {
344
+ var _a2;
345
+ return `Invalid module name: ${(_a2 = params == null ? void 0 : params.config) == null ? void 0 : _a2.name}`;
346
+ });
331
347
  const { account } = params ?? {};
332
- const schema = ((_d = params == null ? void 0 : params.config) == null ? void 0 : _d.schema) ?? this.configSchema;
348
+ const schema = ((_c = params == null ? void 0 : params.config) == null ? void 0 : _c.schema) ?? this.configSchema;
333
349
  const allowedSchemas = this.configSchemas;
334
350
  assertEx2(allowedSchemas.includes(schema), () => `Bad Config Schema [Received ${schema}] [Expected ${JSON.stringify(allowedSchemas)}]`);
335
351
  const mutatedConfig = {
336
352
  ...params == null ? void 0 : params.config,
337
353
  schema
338
354
  };
339
- (_e = params == null ? void 0 : params.logger) == null ? void 0 : _e.debug(`config: ${JSON.stringify(mutatedConfig, null, 2)}`);
355
+ (_d = params == null ? void 0 : params.logger) == null ? void 0 : _d.debug(`config: ${JSON.stringify(mutatedConfig, null, 2)}`);
340
356
  const mutatedParams = {
341
357
  ...params,
342
358
  config: mutatedConfig
@@ -349,7 +365,7 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
349
365
  mutatedParams.logger = activeLogger ? new IdLogger(activeLogger, () => `0x${address}`) : void 0;
350
366
  const newModule = new this(_AbstractModule.privateConstructorKey, mutatedParams, generatedAccount);
351
367
  if (!_AbstractModule.enableLazyLoad) {
352
- await ((_f = newModule.start) == null ? void 0 : _f.call(newModule));
368
+ await ((_e = newModule.start) == null ? void 0 : _e.call(newModule));
353
369
  }
354
370
  return newModule;
355
371
  }
@@ -366,11 +382,6 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
366
382
  }
367
383
  return anyThis[funcName];
368
384
  }
369
- _noOverride(functionName) {
370
- const thisFunc = this[functionName];
371
- const rootFunc = this._getRootFunction(functionName);
372
- assertEx2(thisFunc === rootFunc, () => `Override not allowed for [${functionName}] - override ${functionName}Handler instead`);
373
- }
374
385
  async busy(closure) {
375
386
  if (this._busyCount <= 0) {
376
387
  this._busyCount = 0;
@@ -399,11 +410,13 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
399
410
  return super.emit(eventName, eventArgs);
400
411
  }
401
412
  previousHash() {
413
+ this._checkDead();
402
414
  return this.account.previousHash;
403
415
  }
404
416
  async query(query, payloads, queryConfig) {
417
+ this._checkDead();
405
418
  this._noOverride("query");
406
- const sourceQuery = await PayloadBuilder2.build(assertEx2(QueryBoundWitnessWrapper3.unwrap(query), "Invalid query"));
419
+ const sourceQuery = await PayloadBuilder2.build(assertEx2(QueryBoundWitnessWrapper3.unwrap(query), () => "Invalid query"));
407
420
  return await this.busy(async () => {
408
421
  const resultPayloads = [];
409
422
  const errorPayloads = [];
@@ -413,9 +426,14 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
413
426
  if (!this.allowAnonymous && query.addresses.length === 0) {
414
427
  throw new Error(`Anonymous Queries not allowed, but running anyway [${this.config.name}], [${this.address}]`);
415
428
  }
429
+ if (queryConfig == null ? void 0 : queryConfig.allowedQueries) {
430
+ assertEx2(queryConfig == null ? void 0 : queryConfig.allowedQueries.includes(sourceQuery.schema), () => `Query not allowed [${sourceQuery.schema}]`);
431
+ }
416
432
  resultPayloads.push(...await this.queryHandler(sourceQuery, payloads, queryConfig));
417
433
  } catch (ex) {
418
434
  await handleErrorAsync(ex, async (error) => {
435
+ this._lastError = error;
436
+ this.status = "dead";
419
437
  errorPayloads.push(await new ModuleErrorBuilder().sources([
420
438
  sourceQuery.$hash
421
439
  ]).name(this.config.name ?? "<Unknown>").query(sourceQuery.schema).message(error.message).build());
@@ -442,6 +460,9 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
442
460
  });
443
461
  }
444
462
  async queryable(query, payloads, queryConfig) {
463
+ if (this.dead) {
464
+ return false;
465
+ }
445
466
  if (!await this.started("warn"))
446
467
  return false;
447
468
  const configValidator = queryConfig ? new ModuleConfigQueryValidator(Object.assign({}, this.config, queryConfig)).queryable : this.moduleConfigQueryValidator;
@@ -451,7 +472,7 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
451
472
  ];
452
473
  return validators.every((validator) => validator(query, payloads));
453
474
  }
454
- async resolve(idOrFilter, { required = "log", ...options } = {}) {
475
+ async resolve(idOrFilter = "*", { required = "log", ...options } = {}) {
455
476
  const childOptions = {
456
477
  ...options,
457
478
  required: false
@@ -460,41 +481,44 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
460
481
  const up = direction === "up" || direction === "all";
461
482
  const down = direction === "down" || direction === "all";
462
483
  let result;
463
- switch (typeof idOrFilter) {
464
- case "string": {
465
- result = (down ? await this.downResolver.resolve(idOrFilter, childOptions) : void 0) ?? (up ? await this.upResolver.resolve(idOrFilter, childOptions) : void 0);
466
- break;
467
- }
468
- default: {
469
- const filter = idOrFilter;
470
- result = [
471
- ...down ? await this.downResolver.resolve(filter, childOptions) : [],
472
- ...up ? await this.upResolver.resolve(filter, childOptions) : []
473
- ].filter(duplicateModules);
474
- break;
484
+ if (idOrFilter === "*") {
485
+ if (this.dead) {
486
+ return [];
475
487
  }
476
- }
477
- if (required && (result === void 0 || Array.isArray(result) && result.length > 0)) {
478
- switch (required) {
479
- case "warn": {
480
- this.logger.warn("resolve failed", idOrFilter);
481
- break;
482
- }
483
- case "log": {
484
- this.logger.log("resolve failed", idOrFilter);
488
+ return [
489
+ ...down ? await this.downResolver.resolve("*", childOptions) : [],
490
+ ...up ? await this.upResolver.resolve("*", childOptions) : []
491
+ ].filter(duplicateModules);
492
+ } else {
493
+ switch (typeof idOrFilter) {
494
+ case "string": {
495
+ if (this.dead) {
496
+ return void 0;
497
+ }
498
+ result = (down ? await this.downResolver.resolve(idOrFilter, childOptions) : void 0) ?? (up ? await this.upResolver.resolve(idOrFilter, childOptions) : void 0);
485
499
  break;
486
500
  }
487
501
  default: {
488
- this.logger.error("resolve failed", idOrFilter);
502
+ if (this.dead) {
503
+ return [];
504
+ }
505
+ const filter = idOrFilter;
506
+ result = [
507
+ ...down ? await this.downResolver.resolve(filter, childOptions) : [],
508
+ ...up ? await this.upResolver.resolve(filter, childOptions) : []
509
+ ].filter(duplicateModules);
489
510
  break;
490
511
  }
491
512
  }
492
513
  }
514
+ this.validateRequiredResolve(required, result, idOrFilter);
493
515
  return result;
494
516
  }
495
517
  start(_timeout) {
496
518
  this._startPromise = this._startPromise ?? this.startHandler();
497
- return this._startPromise;
519
+ const result = this._startPromise;
520
+ this.status = result ? "started" : "dead";
521
+ return result;
498
522
  }
499
523
  async started(notStartedAction = "log", tryStart = true) {
500
524
  const started = await this._started;
@@ -549,9 +573,20 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
549
573
  const result = await this.stopHandler();
550
574
  this._started = void 0;
551
575
  this._startPromise = void 0;
576
+ this.status = result ? "stopped" : "dead";
552
577
  return result;
553
578
  });
554
579
  }
580
+ _checkDead() {
581
+ if (this.dead) {
582
+ throw new DeadModuleError(this.id, this._lastError);
583
+ }
584
+ }
585
+ _noOverride(functionName) {
586
+ const thisFunc = this[functionName];
587
+ const rootFunc = this._getRootFunction(functionName);
588
+ assertEx2(thisFunc === rootFunc, () => `Override not allowed for [${functionName}] - override ${functionName}Handler instead`);
589
+ }
555
590
  bindHashes(hashes, schema, account) {
556
591
  const promise = new PromiseEx((resolve) => {
557
592
  const result = this.bindHashesInternal(hashes, schema, account);
@@ -836,6 +871,24 @@ var _AbstractModule = class _AbstractModule extends BaseEmitter {
836
871
  }
837
872
  }, true);
838
873
  }
874
+ validateRequiredResolve(required, result, idOrFilter) {
875
+ if (required && (result === void 0 || Array.isArray(result) && result.length > 0)) {
876
+ switch (required) {
877
+ case "warn": {
878
+ this.logger.warn("resolve failed", idOrFilter);
879
+ break;
880
+ }
881
+ case "log": {
882
+ this.logger.log("resolve failed", idOrFilter);
883
+ break;
884
+ }
885
+ default: {
886
+ this.logger.error("resolve failed", idOrFilter);
887
+ break;
888
+ }
889
+ }
890
+ }
891
+ }
839
892
  };
840
893
  __name(_AbstractModule, "AbstractModule");
841
894
  __publicField(_AbstractModule, "allowRandomAccount", true);
@@ -849,7 +902,7 @@ var AbstractModule = _AbstractModule;
849
902
  import { assertEx as assertEx3 } from "@xylabs/assert";
850
903
  var _AbstractModuleInstance = class _AbstractModuleInstance extends AbstractModule {
851
904
  constructor(privateConstructorKey, params, account) {
852
- assertEx3(AbstractModule.privateConstructorKey === privateConstructorKey, "Use create function instead of constructor");
905
+ assertEx3(AbstractModule.privateConstructorKey === privateConstructorKey, () => "Use create function instead of constructor");
853
906
  const mutatedParams = {
854
907
  ...params
855
908
  };
@@ -858,31 +911,37 @@ var _AbstractModuleInstance = class _AbstractModuleInstance extends AbstractModu
858
911
  this.downResolver.add(this);
859
912
  }
860
913
  describe() {
914
+ this._checkDead();
861
915
  return this.busy(async () => {
862
916
  return await this.describeHandler();
863
917
  });
864
918
  }
865
919
  discover() {
920
+ this._checkDead();
866
921
  return this.busy(async () => {
867
922
  return await this.discoverHandler();
868
923
  });
869
924
  }
870
925
  manifest(maxDepth, ignoreAddresses) {
926
+ this._checkDead();
871
927
  return this.busy(async () => {
872
928
  return await this.manifestHandler(maxDepth, ignoreAddresses);
873
929
  });
874
930
  }
875
931
  moduleAddress() {
932
+ this._checkDead();
876
933
  return this.busy(async () => {
877
934
  return await this.moduleAddressHandler();
878
935
  });
879
936
  }
880
937
  state() {
938
+ this._checkDead();
881
939
  return this.busy(async () => {
882
940
  return await this.stateHandler();
883
941
  });
884
942
  }
885
943
  subscribe(_queryAccount) {
944
+ this._checkDead();
886
945
  return this.subscribeHandler();
887
946
  }
888
947
  };