@keetanetwork/anchor 0.0.39 → 0.0.41

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 (95) hide show
  1. package/client/index.d.ts +6 -0
  2. package/client/index.d.ts.map +1 -1
  3. package/client/index.js +7 -0
  4. package/client/index.js.map +1 -1
  5. package/lib/block-listener.d.ts +93 -0
  6. package/lib/block-listener.d.ts.map +1 -0
  7. package/lib/block-listener.js +259 -0
  8. package/lib/block-listener.js.map +1 -0
  9. package/lib/error.d.ts.map +1 -1
  10. package/lib/error.js +3 -1
  11. package/lib/error.js.map +1 -1
  12. package/lib/http-server/index.d.ts +14 -1
  13. package/lib/http-server/index.d.ts.map +1 -1
  14. package/lib/http-server/index.js +86 -7
  15. package/lib/http-server/index.js.map +1 -1
  16. package/lib/queue/index.d.ts +20 -5
  17. package/lib/queue/index.d.ts.map +1 -1
  18. package/lib/queue/index.js +52 -17
  19. package/lib/queue/index.js.map +1 -1
  20. package/lib/resolver.d.ts +57 -0
  21. package/lib/resolver.d.ts.map +1 -1
  22. package/lib/resolver.js +864 -250
  23. package/lib/resolver.js.map +1 -1
  24. package/npm-shrinkwrap.json +4 -4
  25. package/package.json +1 -1
  26. package/services/asset-movement/client.d.ts +9 -2
  27. package/services/asset-movement/client.d.ts.map +1 -1
  28. package/services/asset-movement/client.js +35 -2
  29. package/services/asset-movement/client.js.map +1 -1
  30. package/services/asset-movement/common.d.ts +1 -0
  31. package/services/asset-movement/common.d.ts.map +1 -1
  32. package/services/asset-movement/common.js +75 -0
  33. package/services/asset-movement/common.js.map +1 -1
  34. package/services/asset-movement/server.d.ts +0 -10
  35. package/services/asset-movement/server.d.ts.map +1 -1
  36. package/services/asset-movement/server.js +0 -2
  37. package/services/asset-movement/server.js.map +1 -1
  38. package/services/fx/common.d.ts +1 -1
  39. package/services/fx/common.js.map +1 -1
  40. package/services/fx/server.d.ts +37 -6
  41. package/services/fx/server.d.ts.map +1 -1
  42. package/services/fx/server.js +207 -66
  43. package/services/fx/server.js.map +1 -1
  44. package/services/storage/client.d.ts +332 -0
  45. package/services/storage/client.d.ts.map +1 -0
  46. package/services/storage/client.js +1078 -0
  47. package/services/storage/client.js.map +1 -0
  48. package/services/storage/clients/contacts.d.ts +94 -0
  49. package/services/storage/clients/contacts.d.ts.map +1 -0
  50. package/services/storage/clients/contacts.generated.d.ts +3 -0
  51. package/services/storage/clients/contacts.generated.d.ts.map +1 -0
  52. package/services/storage/clients/contacts.generated.js +1197 -0
  53. package/services/storage/clients/contacts.generated.js.map +1 -0
  54. package/services/storage/clients/contacts.js +141 -0
  55. package/services/storage/clients/contacts.js.map +1 -0
  56. package/services/storage/common.d.ts +667 -0
  57. package/services/storage/common.d.ts.map +1 -0
  58. package/services/storage/common.generated.d.ts +17 -0
  59. package/services/storage/common.generated.d.ts.map +1 -0
  60. package/services/storage/common.generated.js +863 -0
  61. package/services/storage/common.generated.js.map +1 -0
  62. package/services/storage/common.js +587 -0
  63. package/services/storage/common.js.map +1 -0
  64. package/services/storage/lib/validators.d.ts +64 -0
  65. package/services/storage/lib/validators.d.ts.map +1 -0
  66. package/services/storage/lib/validators.js +82 -0
  67. package/services/storage/lib/validators.js.map +1 -0
  68. package/services/storage/server.d.ts +127 -0
  69. package/services/storage/server.d.ts.map +1 -0
  70. package/services/storage/server.js +626 -0
  71. package/services/storage/server.js.map +1 -0
  72. package/services/storage/test-utils.d.ts +70 -0
  73. package/services/storage/test-utils.d.ts.map +1 -0
  74. package/services/storage/test-utils.js +347 -0
  75. package/services/storage/test-utils.js.map +1 -0
  76. package/services/storage/utils.d.ts +3 -0
  77. package/services/storage/utils.d.ts.map +1 -0
  78. package/services/storage/utils.js +10 -0
  79. package/services/storage/utils.js.map +1 -0
  80. package/services/username/client.d.ts +145 -0
  81. package/services/username/client.d.ts.map +1 -0
  82. package/services/username/client.js +681 -0
  83. package/services/username/client.js.map +1 -0
  84. package/services/username/common.d.ts +136 -0
  85. package/services/username/common.d.ts.map +1 -0
  86. package/services/username/common.generated.d.ts +13 -0
  87. package/services/username/common.generated.d.ts.map +1 -0
  88. package/services/username/common.generated.js +256 -0
  89. package/services/username/common.generated.js.map +1 -0
  90. package/services/username/common.js +226 -0
  91. package/services/username/common.js.map +1 -0
  92. package/services/username/server.d.ts +49 -0
  93. package/services/username/server.d.ts.map +1 -0
  94. package/services/username/server.js +262 -0
  95. package/services/username/server.js.map +1 -0
package/client/index.d.ts CHANGED
@@ -6,6 +6,8 @@ import * as lib from '../lib/index.js';
6
6
  import * as KeetaNet from '@keetanetwork/keetanet-client';
7
7
  import type { KeetaAssetMovementClientConfig } from '../services/asset-movement/client.ts';
8
8
  import KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';
9
+ import type { KeetaUsernameAnchorClientConfig } from '../services/username/client.ts';
10
+ import KeetaUsernameAnchorClient from '../services/username/client.js';
9
11
  export declare namespace KYC {
10
12
  type ClientConfig = KeetaKYCAnchorClientConfig;
11
13
  const Client: typeof KeetaKYCAnchorClient;
@@ -18,5 +20,9 @@ export declare namespace AssetMovement {
18
20
  type ClientConfig = KeetaAssetMovementClientConfig;
19
21
  const Client: typeof KeetaAssetMovementAnchorClient;
20
22
  }
23
+ export declare namespace Username {
24
+ type ClientConfig = KeetaUsernameAnchorClientConfig;
25
+ const Client: typeof KeetaUsernameAnchorClient;
26
+ }
21
27
  export { lib, KeetaNet };
22
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,0BAA0B,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACX,yBAAyB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAC1D,OAAO,KAAK,EACX,8BAA8B,EAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAIlF,yBAAiB,GAAG,CAAC;IACpB,KAAY,YAAY,GAAG,0BAA0B,CAAC;IAC/C,MAAM,MAAM,EAAE,OAAO,oBAA2C,CAAC;CACxE;AAGD,yBAAiB,EAAE,CAAC;IACnB,KAAY,YAAY,GAAG,yBAAyB,CAAC;IAC9C,MAAM,MAAM,EAAE,OAAO,mBAAyC,CAAC;CACtE;AAGD,yBAAiB,aAAa,CAAC;IAC9B,KAAY,YAAY,GAAG,8BAA8B,CAAC;IACnD,MAAM,MAAM,EAAE,OAAO,8BAA+D,CAAC;CAC5F;AAED,OAAO,EACN,GAAG,EACH,QAAQ,EACR,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,0BAA0B,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACX,yBAAyB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAC1D,OAAO,KAAK,EACX,8BAA8B,EAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EACX,+BAA+B,EAC/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAIvE,yBAAiB,GAAG,CAAC;IACpB,KAAY,YAAY,GAAG,0BAA0B,CAAC;IAC/C,MAAM,MAAM,EAAE,OAAO,oBAA2C,CAAC;CACxE;AAGD,yBAAiB,EAAE,CAAC;IACnB,KAAY,YAAY,GAAG,yBAAyB,CAAC;IAC9C,MAAM,MAAM,EAAE,OAAO,mBAAyC,CAAC;CACtE;AAGD,yBAAiB,aAAa,CAAC;IAC9B,KAAY,YAAY,GAAG,8BAA8B,CAAC;IACnD,MAAM,MAAM,EAAE,OAAO,8BAA+D,CAAC;CAC5F;AAGD,yBAAiB,QAAQ,CAAC;IACzB,KAAY,YAAY,GAAG,+BAA+B,CAAC;IACpD,MAAM,MAAM,EAAE,OAAO,yBAAqD,CAAC;CAClF;AAED,OAAO,EACN,GAAG,EACH,QAAQ,EACR,CAAC"}
package/client/index.js CHANGED
@@ -3,6 +3,7 @@ import KeetaFXAnchorClient from '../services/fx/client.js';
3
3
  import * as lib from '../lib/index.js';
4
4
  import * as KeetaNet from '@keetanetwork/keetanet-client';
5
5
  import KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';
6
+ import KeetaUsernameAnchorClient from '../services/username/client.js';
6
7
  // TODO: Determine how we want to export the client
7
8
  // eslint-disable-next-line @typescript-eslint/no-namespace
8
9
  export var KYC;
@@ -21,5 +22,11 @@ export var AssetMovement;
21
22
  (function (AssetMovement) {
22
23
  AssetMovement.Client = KeetaAssetMovementAnchorClient;
23
24
  })(AssetMovement || (AssetMovement = {}));
25
+ // TODO: Determine how we want to export the client
26
+ // eslint-disable-next-line @typescript-eslint/no-namespace
27
+ export var Username;
28
+ (function (Username) {
29
+ Username.Client = KeetaUsernameAnchorClient;
30
+ })(Username || (Username = {}));
24
31
  export { lib, KeetaNet };
25
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAMA,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAI1D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAElF,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,GAAG,CAGnB;AAHD,WAAiB,GAAG;IAEN,UAAM,GAAgC,oBAAoB,CAAC;AACzE,CAAC,EAHgB,GAAG,KAAH,GAAG,QAGnB;AACD,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,EAAE,CAGlB;AAHD,WAAiB,EAAE;IAEL,SAAM,GAA+B,mBAAmB,CAAC;AACvE,CAAC,EAHgB,EAAE,KAAF,EAAE,QAGlB;AACD,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,aAAa,CAG7B;AAHD,WAAiB,aAAa;IAEhB,oBAAM,GAA0C,8BAA8B,CAAC;AAC7F,CAAC,EAHgB,aAAa,KAAb,aAAa,QAG7B;AAED,OAAO,EACN,GAAG,EACH,QAAQ,EACR,CAAC","sourcesContent":["import type {\n\tKeetaKYCAnchorClientConfig\n} from '../services/kyc/client.ts';\nimport type {\n\tKeetaFXAnchorClientConfig\n} from '../services/fx/client.ts';\nimport KeetaKYCAnchorClient from '../services/kyc/client.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport * as lib from '../lib/index.js';\nimport * as KeetaNet from '@keetanetwork/keetanet-client';\nimport type {\n\tKeetaAssetMovementClientConfig\n} from '../services/asset-movement/client.ts';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\n\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace KYC {\n\texport type ClientConfig = KeetaKYCAnchorClientConfig;\n\texport const Client: typeof KeetaKYCAnchorClient = KeetaKYCAnchorClient;\n}\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace FX {\n\texport type ClientConfig = KeetaFXAnchorClientConfig;\n\texport const Client: typeof KeetaFXAnchorClient = KeetaFXAnchorClient;\n}\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace AssetMovement {\n\texport type ClientConfig = KeetaAssetMovementClientConfig;\n\texport const Client: typeof KeetaAssetMovementAnchorClient = KeetaAssetMovementAnchorClient;\n}\n\nexport {\n\tlib,\n\tKeetaNet\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAMA,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAC;AAI1D,OAAO,8BAA8B,MAAM,sCAAsC,CAAC;AAIlF,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAEvE,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,GAAG,CAGnB;AAHD,WAAiB,GAAG;IAEN,UAAM,GAAgC,oBAAoB,CAAC;AACzE,CAAC,EAHgB,GAAG,KAAH,GAAG,QAGnB;AACD,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,EAAE,CAGlB;AAHD,WAAiB,EAAE;IAEL,SAAM,GAA+B,mBAAmB,CAAC;AACvE,CAAC,EAHgB,EAAE,KAAF,EAAE,QAGlB;AACD,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,aAAa,CAG7B;AAHD,WAAiB,aAAa;IAEhB,oBAAM,GAA0C,8BAA8B,CAAC;AAC7F,CAAC,EAHgB,aAAa,KAAb,aAAa,QAG7B;AACD,mDAAmD;AACnD,2DAA2D;AAC3D,MAAM,KAAW,QAAQ,CAGxB;AAHD,WAAiB,QAAQ;IAEX,eAAM,GAAqC,yBAAyB,CAAC;AACnF,CAAC,EAHgB,QAAQ,KAAR,QAAQ,QAGxB;AAED,OAAO,EACN,GAAG,EACH,QAAQ,EACR,CAAC","sourcesContent":["import type {\n\tKeetaKYCAnchorClientConfig\n} from '../services/kyc/client.ts';\nimport type {\n\tKeetaFXAnchorClientConfig\n} from '../services/fx/client.ts';\nimport KeetaKYCAnchorClient from '../services/kyc/client.js';\nimport KeetaFXAnchorClient from '../services/fx/client.js';\nimport * as lib from '../lib/index.js';\nimport * as KeetaNet from '@keetanetwork/keetanet-client';\nimport type {\n\tKeetaAssetMovementClientConfig\n} from '../services/asset-movement/client.ts';\nimport KeetaAssetMovementAnchorClient from '../services/asset-movement/client.js';\nimport type {\n\tKeetaUsernameAnchorClientConfig\n} from '../services/username/client.ts';\nimport KeetaUsernameAnchorClient from '../services/username/client.js';\n\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace KYC {\n\texport type ClientConfig = KeetaKYCAnchorClientConfig;\n\texport const Client: typeof KeetaKYCAnchorClient = KeetaKYCAnchorClient;\n}\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace FX {\n\texport type ClientConfig = KeetaFXAnchorClientConfig;\n\texport const Client: typeof KeetaFXAnchorClient = KeetaFXAnchorClient;\n}\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace AssetMovement {\n\texport type ClientConfig = KeetaAssetMovementClientConfig;\n\texport const Client: typeof KeetaAssetMovementAnchorClient = KeetaAssetMovementAnchorClient;\n}\n// TODO: Determine how we want to export the client\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Username {\n\texport type ClientConfig = KeetaUsernameAnchorClientConfig;\n\texport const Client: typeof KeetaUsernameAnchorClient = KeetaUsernameAnchorClient;\n}\n\nexport {\n\tlib,\n\tKeetaNet\n};\n"]}
@@ -0,0 +1,93 @@
1
+ import type { Client } from "@keetanetwork/keetanet-client";
2
+ import type { Logger } from "./log/index.js";
3
+ import type { Block, BlockHash } from "@keetanetwork/keetanet-client/lib/block/index.js";
4
+ import type { BlockOperations } from "@keetanetwork/keetanet-client/lib/block/operations.js";
5
+ import { KeetaAnchorQueueRunner } from "./queue/index.js";
6
+ import type { KeetaAnchorQueueEntryExtra, KeetaAnchorQueueRequestID } from "./queue/index.js";
7
+ import type { JSONSerializable } from "./utils/json.js";
8
+ import type { KeetaAnchorQueueRunOptions } from "./queue/common.js";
9
+ interface BlockListenerConfig {
10
+ client: Client;
11
+ logger?: Logger;
12
+ }
13
+ interface BlockListenerContext {
14
+ block: Block;
15
+ }
16
+ interface NetworkListenerArguments {
17
+ 'block': {
18
+ callback: (data: BlockListenerContext) => (Promise<{
19
+ requiresWork?: boolean;
20
+ }> | {
21
+ requiresWork?: boolean;
22
+ });
23
+ };
24
+ }
25
+ interface BlockListenerScanOptions {
26
+ searchTo?: {
27
+ extended: true;
28
+ } | number | undefined;
29
+ }
30
+ export declare class BlockListener {
31
+ #private;
32
+ constructor(config: BlockListenerConfig);
33
+ get logger(): Logger | undefined;
34
+ scan(options?: BlockListenerScanOptions): Promise<{
35
+ listenersHaveWork: boolean;
36
+ }>;
37
+ on<K extends keyof NetworkListenerArguments>(_ignore_type: K, args: NetworkListenerArguments[K]): {
38
+ remove: () => void;
39
+ };
40
+ }
41
+ type BlockQueueRunnerRequest = {
42
+ blockHash: BlockHash;
43
+ };
44
+ type BlockQueueRunnerRequestSerialized = {
45
+ blockHash: string;
46
+ };
47
+ interface BaseBlockOperationQueueRunnerScanOptionsRequired {
48
+ scanWhenRunning: true;
49
+ extendedScanIntervalMs: number;
50
+ regularScanIntervalMs: number;
51
+ }
52
+ type BlockOperationQueueRunnerConfig<Request, Result, RequestSerialized extends JSONSerializable, ResultSerialized extends JSONSerializable | null> = ConstructorParameters<typeof KeetaAnchorQueueRunner<Request, Result, RequestSerialized, ResultSerialized>>[0] & {
53
+ listener: BlockListener | BlockListenerConfig;
54
+ scanOptions?: Partial<BaseBlockOperationQueueRunnerScanOptionsRequired> | {
55
+ scanWhenRunning: false;
56
+ };
57
+ };
58
+ declare abstract class BaseBlockOperationQueueRunner<Request, Result = null, RequestSerialized extends JSONSerializable = JSONSerializable, ResultSerialized extends JSONSerializable = null> extends KeetaAnchorQueueRunner<Request, Result, RequestSerialized, ResultSerialized> {
59
+ #private;
60
+ constructor(config: BlockOperationQueueRunnerConfig<Request, Result, RequestSerialized, ResultSerialized>);
61
+ protected abstract onBlockSeen(block: Block): Promise<boolean>;
62
+ protected decodeResponse(response: ResultSerialized): Result | null;
63
+ protected encodeResponse(response: Result): ResultSerialized;
64
+ run(options?: KeetaAnchorQueueRunOptions): Promise<boolean>;
65
+ [Symbol.dispose](): void;
66
+ }
67
+ export declare abstract class BlockQueueRunner<UserResult = null, QueueResult extends JSONSerializable = null> extends BaseBlockOperationQueueRunner<BlockQueueRunnerRequest, UserResult, BlockQueueRunnerRequestSerialized, QueueResult> {
68
+ protected abstract filterBlock(block: Block): (boolean | Promise<boolean>);
69
+ protected decodeRequest(request: BlockQueueRunnerRequestSerialized): BlockQueueRunnerRequest;
70
+ protected encodeRequest(request: BlockQueueRunnerRequest): BlockQueueRunnerRequestSerialized;
71
+ protected onBlockSeen(block: Block): Promise<boolean>;
72
+ add(request: BlockQueueRunnerRequest, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID>;
73
+ }
74
+ type OperationQueueRunnerRequest = {
75
+ blockHash: BlockHash;
76
+ operationIndex: number;
77
+ };
78
+ type OperationQueueRunnerRequestSerialized = {
79
+ blockHash: string;
80
+ operationIndex: number;
81
+ };
82
+ export declare abstract class OperationQueueRunner<UserResult = null, QueueResult extends JSONSerializable = null> extends BaseBlockOperationQueueRunner<OperationQueueRunnerRequest, UserResult, OperationQueueRunnerRequestSerialized, QueueResult> {
83
+ protected abstract filterOperation(operation: BlockOperations, context: {
84
+ block: Block;
85
+ operationIndex: number;
86
+ }): (boolean | Promise<boolean>);
87
+ protected decodeRequest(request: OperationQueueRunnerRequestSerialized): OperationQueueRunnerRequest;
88
+ protected encodeRequest(request: OperationQueueRunnerRequest): OperationQueueRunnerRequestSerialized;
89
+ protected onBlockSeen(block: Block): Promise<boolean>;
90
+ add(request: OperationQueueRunnerRequest, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID>;
91
+ }
92
+ export {};
93
+ //# sourceMappingURL=block-listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-listener.d.ts","sourceRoot":"","sources":["../../src/lib/block-listener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,259 @@
1
+ import { KeetaAnchorQueueRunner } from "./queue/index.js";
2
+ import { KeetaNet } from "../client/index.js";
3
+ import { ConvertStringToRequestID } from "./queue/internal.js";
4
+ export class BlockListener {
5
+ #config;
6
+ #blockListeners = [];
7
+ constructor(config) {
8
+ this.#config = config;
9
+ }
10
+ get #client() {
11
+ return (this.#config.client);
12
+ }
13
+ get logger() {
14
+ return (this.#config.logger);
15
+ }
16
+ async #runWithLog(label, func) {
17
+ try {
18
+ await func();
19
+ }
20
+ catch (error) {
21
+ this.logger?.error(`BlockListener::${label}`, `Received Error running`, error);
22
+ }
23
+ }
24
+ async #processBlockListeners(block) {
25
+ let listenersHaveWork = false;
26
+ const promises = [];
27
+ for (const listener of this.#blockListeners) {
28
+ promises.push(this.#runWithLog('block callback', async function () {
29
+ const response = await listener.callback({ block });
30
+ if (response.requiresWork) {
31
+ listenersHaveWork = true;
32
+ }
33
+ }));
34
+ }
35
+ await Promise.allSettled(promises);
36
+ return ({ listenersHaveWork });
37
+ }
38
+ async scan(options) {
39
+ let listenersHaveWork = false;
40
+ try {
41
+ let reachedEndOfTime = false;
42
+ let startBlocksHash;
43
+ let pageCount = 0;
44
+ /*
45
+ * Either perform an extended
46
+ * scan (30 days) or a short
47
+ * scan (4 hours) to find
48
+ * relevant operations
49
+ */
50
+ const now = Date.now();
51
+ let oldestVoteStapleToCheck = now - (4 * 60 * 60 * 1000); // 4 hours ago
52
+ if (options?.searchTo) {
53
+ if (typeof options.searchTo === 'number') {
54
+ if (options.searchTo >= now || options.searchTo <= 0) {
55
+ throw (new Error('BlockListener::scan: When providing searchTo as a number, it must be a timestamp in the past'));
56
+ }
57
+ oldestVoteStapleToCheck = options.searchTo;
58
+ }
59
+ else if ('extended' in options.searchTo) {
60
+ oldestVoteStapleToCheck = now - (30 * 24 * 60 * 60 * 1000); // 30 days ago
61
+ }
62
+ else {
63
+ throw (new Error('BlockListener::scan: Invalid searchTo option provided'));
64
+ }
65
+ }
66
+ while (!reachedEndOfTime) {
67
+ pageCount++;
68
+ const historyOptions = { depth: 20, ...(startBlocksHash ? { startBlocksHash } : {}) };
69
+ this.logger?.debug('BlockListener::poll', `Fetching history page ${pageCount}`, { ...historyOptions });
70
+ const history = await this.#client.getHistory(null, historyOptions);
71
+ if (history.length === 0) {
72
+ this.logger?.debug('BlockListener::poll', `No more history found, ending discovery`);
73
+ break;
74
+ }
75
+ const processBlocksPromises = [];
76
+ for (const { voteStaple } of history) {
77
+ if (voteStaple.timestamp().valueOf() < oldestVoteStapleToCheck) {
78
+ this.logger?.debug('BlockListener::poll', 'Reached vote staple older than scanning time, ending discovery for this run', { voteStapleTime: voteStaple.timestamp(), oldestVoteStapleToCheck: new Date(oldestVoteStapleToCheck) });
79
+ reachedEndOfTime = true;
80
+ break;
81
+ }
82
+ for (const block of voteStaple.blocks) {
83
+ processBlocksPromises.push(this.#processBlockListeners(block));
84
+ }
85
+ }
86
+ const processBlockPromiseResults = await Promise.all(processBlocksPromises);
87
+ if (processBlockPromiseResults.some(result => result.listenersHaveWork)) {
88
+ listenersHaveWork = true;
89
+ }
90
+ // Set up for next page
91
+ const lastVoteStaple = history[history.length - 1]?.voteStaple;
92
+ if (lastVoteStaple) {
93
+ startBlocksHash = lastVoteStaple.blocksHash;
94
+ }
95
+ else {
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ catch (error) {
101
+ this.logger?.error('BlockListener::poll', 'Error during discovery:', error);
102
+ }
103
+ return ({ listenersHaveWork });
104
+ }
105
+ on(_ignore_type, args) {
106
+ const id = String(Math.random());
107
+ this.#blockListeners.push({ ...args, id });
108
+ return ({
109
+ remove: () => {
110
+ const index = this.#blockListeners.findIndex(listener => listener.id === id);
111
+ if (index !== -1) {
112
+ this.#blockListeners.splice(index, 1);
113
+ }
114
+ }
115
+ });
116
+ }
117
+ }
118
+ class BaseBlockOperationQueueRunner extends KeetaAnchorQueueRunner {
119
+ #listener;
120
+ #lastExtendedScanTime = null;
121
+ #lastScanTime = null;
122
+ #scanOptions;
123
+ #removeListenerCallback;
124
+ constructor(config) {
125
+ const { listener, ...restConfig } = config;
126
+ super(restConfig);
127
+ if (listener instanceof BlockListener) {
128
+ this.#listener = listener;
129
+ }
130
+ else {
131
+ this.#listener = new BlockListener(listener);
132
+ }
133
+ const addedListener = this.#listener.on('block', {
134
+ callback: async ({ block }) => {
135
+ return ({ requiresWork: await this.onBlockSeen(block) });
136
+ }
137
+ });
138
+ this.#removeListenerCallback = addedListener.remove;
139
+ if (!config.scanOptions || config.scanOptions?.scanWhenRunning || config.scanOptions?.scanWhenRunning === undefined) {
140
+ this.#scanOptions = {
141
+ scanWhenRunning: true,
142
+ extendedScanIntervalMs: 60 * 60 * 1000, // 1 hour
143
+ regularScanIntervalMs: 5 * 60 * 1000, // 5 minutes
144
+ ...config.scanOptions
145
+ };
146
+ }
147
+ else {
148
+ this.#scanOptions = { scanWhenRunning: false };
149
+ }
150
+ }
151
+ decodeResponse(response) {
152
+ if (response === null) {
153
+ return (null);
154
+ }
155
+ else {
156
+ throw (new Error('BlockQueueRunner::decodeResponse: Not implemented when response is not null, you must override this method in your subclass'));
157
+ }
158
+ }
159
+ encodeResponse(response) {
160
+ if (response === null) {
161
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
162
+ return null;
163
+ }
164
+ else {
165
+ throw (new Error('BlockQueueRunner::encodeResponse: Not implemented when response is not null, you must override this method in your subclass'));
166
+ }
167
+ }
168
+ async run(options) {
169
+ let scanYieldedWork = false;
170
+ if (this.#scanOptions.scanWhenRunning) {
171
+ const now = Date.now();
172
+ let extendedScanDue = false;
173
+ let dueForScan = false;
174
+ if (!this.#lastScanTime || (now - this.#lastScanTime > this.#scanOptions.regularScanIntervalMs)) {
175
+ dueForScan = true;
176
+ }
177
+ if (!this.#lastExtendedScanTime || (now - this.#lastExtendedScanTime > this.#scanOptions.extendedScanIntervalMs)) {
178
+ extendedScanDue = true;
179
+ }
180
+ if (extendedScanDue || dueForScan) {
181
+ let searchTo;
182
+ if (extendedScanDue) {
183
+ searchTo = { extended: true };
184
+ }
185
+ else if (this.#lastScanTime) {
186
+ searchTo = this.#lastScanTime;
187
+ }
188
+ const scanResult = await this.#listener.scan({ searchTo });
189
+ this.#lastScanTime = now;
190
+ if (extendedScanDue) {
191
+ this.#lastExtendedScanTime = now;
192
+ }
193
+ scanYieldedWork = scanResult.listenersHaveWork;
194
+ }
195
+ }
196
+ const moreRunWork = await super.run(options);
197
+ return (moreRunWork || scanYieldedWork);
198
+ }
199
+ [Symbol.dispose]() {
200
+ this.#removeListenerCallback();
201
+ }
202
+ }
203
+ export class BlockQueueRunner extends BaseBlockOperationQueueRunner {
204
+ decodeRequest(request) {
205
+ return ({ blockHash: new KeetaNet.lib.Block.Hash(request.blockHash) });
206
+ }
207
+ encodeRequest(request) {
208
+ return ({ blockHash: request.blockHash.toString() });
209
+ }
210
+ async onBlockSeen(block) {
211
+ const shouldInclude = await this.filterBlock(block);
212
+ if (shouldInclude) {
213
+ await this.add({ blockHash: block.hash });
214
+ }
215
+ return (shouldInclude);
216
+ }
217
+ add(request, info) {
218
+ const requestIdString = ConvertStringToRequestID(request.blockHash.toString().toLowerCase());
219
+ if (info?.id && String(info.id) !== String(requestIdString)) {
220
+ throw (new Error(`OperationQueueRunner::add: When providing an "id" in info, it must match the blockHash of the request. Expected ${String(requestIdString)}, got ${String(info.id)}`));
221
+ }
222
+ return (super.add(request, { ...info, id: requestIdString }));
223
+ }
224
+ }
225
+ export class OperationQueueRunner extends BaseBlockOperationQueueRunner {
226
+ decodeRequest(request) {
227
+ return ({ blockHash: new KeetaNet.lib.Block.Hash(request.blockHash), operationIndex: request.operationIndex });
228
+ }
229
+ encodeRequest(request) {
230
+ return ({ blockHash: request.blockHash.toString(), operationIndex: Number(request.operationIndex) });
231
+ }
232
+ async onBlockSeen(block) {
233
+ const addPromises = [];
234
+ let anyShouldInclude = false;
235
+ for (let operationIndex = 0; operationIndex < block.operations.length; operationIndex++) {
236
+ const operation = block.operations[operationIndex];
237
+ if (!operation) {
238
+ continue;
239
+ }
240
+ addPromises.push((async () => {
241
+ const shouldInclude = await this.filterOperation(operation, { block, operationIndex });
242
+ if (shouldInclude) {
243
+ anyShouldInclude = true;
244
+ await this.add({ blockHash: block.hash, operationIndex });
245
+ }
246
+ })());
247
+ }
248
+ await Promise.all(addPromises);
249
+ return (anyShouldInclude);
250
+ }
251
+ add(request, info) {
252
+ const requestIdString = ConvertStringToRequestID(`${request.blockHash.toString()}-${String(request.operationIndex)}`.toLowerCase());
253
+ if (info?.id && String(info.id) !== String(requestIdString)) {
254
+ throw (new Error(`OperationQueueRunner::add: When providing an "id" in info, it must match the blockHash and operationIndex of the request. Expected ${String(requestIdString)}, got ${String(info.id)}`));
255
+ }
256
+ return (super.add(request, { ...info, id: requestIdString }));
257
+ }
258
+ }
259
+ //# sourceMappingURL=block-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-listener.js","sourceRoot":"","sources":["../../src/lib/block-listener.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client } from \"@keetanetwork/keetanet-client\";\nimport type { Logger } from \"./log/index.js\";\nimport type { Block, BlockHash } from \"@keetanetwork/keetanet-client/lib/block/index.js\";\nimport type { BlockOperations } from \"@keetanetwork/keetanet-client/lib/block/operations.js\";\nimport type { VoteBlockHash } from \"@keetanetwork/keetanet-client/lib/vote.js\";\nimport { KeetaAnchorQueueRunner } from \"./queue/index.js\";\nimport type { KeetaAnchorQueueEntryExtra, KeetaAnchorQueueRequestID } from \"./queue/index.js\";\nimport type { JSONSerializable } from \"./utils/json.js\";\nimport { KeetaNet } from \"../client/index.js\";\nimport { ConvertStringToRequestID } from \"./queue/internal.js\";\nimport type { KeetaAnchorQueueRunOptions } from \"./queue/common.js\";\n\ninterface BlockListenerConfig {\n\tclient: Client;\n\n\tlogger?: Logger;\n}\n\ninterface BlockListenerContext {\n\tblock: Block;\n}\n\ninterface NetworkListenerArguments {\n\t'block': {\n\t\tcallback: (data: BlockListenerContext) => (Promise<{ requiresWork?: boolean; }> | { requiresWork?: boolean; });\n\t}\n}\n\ninterface BlockListenerScanOptions {\n\tsearchTo?: { extended: true; } | number | undefined;\n}\n\nexport class BlockListener {\n\t#config: BlockListenerConfig;\n\n\t#blockListeners: (NetworkListenerArguments['block'] & { id: string; })[] = [];\n\n\tconstructor(config: BlockListenerConfig) {\n\t\tthis.#config = config;\n\t}\n\n\tget #client(): Client {\n\t\treturn(this.#config.client);\n\t}\n\n\tget logger(): Logger | undefined {\n\t\treturn(this.#config.logger);\n\t}\n\n\tasync #runWithLog(label: string, func: () => Promise<void>) {\n\t\ttry {\n\t\t\tawait func();\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(`BlockListener::${label}`, `Received Error running`, error);\n\t\t}\n\t}\n\n\tasync #processBlockListeners(block: Block) {\n\t\tlet listenersHaveWork = false;\n\n\t\tconst promises = [];\n\t\tfor (const listener of this.#blockListeners) {\n\t\t\tpromises.push(this.#runWithLog('block callback', async function() {\n\t\t\t\tconst response = await listener.callback({ block });\n\t\t\t\tif (response.requiresWork) {\n\t\t\t\t\tlistenersHaveWork = true;\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\tawait Promise.allSettled(promises);\n\n\t\treturn({ listenersHaveWork });\n\t}\n\n\tasync scan(options?: BlockListenerScanOptions): Promise<{ listenersHaveWork: boolean; }> {\n\t\tlet listenersHaveWork = false;\n\n\t\ttry {\n\t\t\tlet reachedEndOfTime = false;\n\t\t\tlet startBlocksHash: VoteBlockHash | undefined;\n\t\t\tlet pageCount = 0;\n\n\t\t\t/*\n\t\t\t * Either perform an extended\n\t\t\t * scan (30 days) or a short\n\t\t\t * scan (4 hours) to find\n\t\t\t * relevant operations\n\t\t\t */\n\t\t\tconst now = Date.now();\n\n\t\t\tlet oldestVoteStapleToCheck = now - (4 * 60 * 60 * 1000); // 4 hours ago\n\n\t\t\tif (options?.searchTo) {\n\t\t\t\tif (typeof options.searchTo === 'number') {\n\t\t\t\t\tif (options.searchTo >= now || options.searchTo <= 0) {\n\t\t\t\t\t\tthrow(new Error('BlockListener::scan: When providing searchTo as a number, it must be a timestamp in the past'));\n\t\t\t\t\t}\n\n\t\t\t\t\toldestVoteStapleToCheck = options.searchTo;\n\t\t\t\t} else if ('extended' in options.searchTo) {\n\t\t\t\t\toldestVoteStapleToCheck = now - (30 * 24 * 60 * 60 * 1000); // 30 days ago\n\t\t\t\t} else {\n\t\t\t\t\tthrow(new Error('BlockListener::scan: Invalid searchTo option provided'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (!reachedEndOfTime) {\n\t\t\t\tpageCount++;\n\n\t\t\t\tconst historyOptions = { depth: 20, ...(startBlocksHash ? { startBlocksHash } : {}) };\n\n\t\t\t\tthis.logger?.debug('BlockListener::poll', `Fetching history page ${pageCount}`, { ...historyOptions });\n\n\t\t\t\tconst history = await this.#client.getHistory(null, historyOptions);\n\n\t\t\t\tif (history.length === 0) {\n\t\t\t\t\tthis.logger?.debug('BlockListener::poll', `No more history found, ending discovery`);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst processBlocksPromises = [];\n\t\t\t\tfor (const { voteStaple } of history) {\n\t\t\t\t\tif (voteStaple.timestamp().valueOf() < oldestVoteStapleToCheck) {\n\t\t\t\t\t\tthis.logger?.debug('BlockListener::poll', 'Reached vote staple older than scanning time, ending discovery for this run', { voteStapleTime: voteStaple.timestamp(), oldestVoteStapleToCheck: new Date(oldestVoteStapleToCheck) });\n\t\t\t\t\t\treachedEndOfTime = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const block of voteStaple.blocks) {\n\t\t\t\t\t\tprocessBlocksPromises.push(this.#processBlockListeners(block));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst processBlockPromiseResults = await Promise.all(processBlocksPromises);\n\n\t\t\t\tif (processBlockPromiseResults.some(result => result.listenersHaveWork)) {\n\t\t\t\t\tlistenersHaveWork = true;\n\t\t\t\t}\n\n\t\t\t\t// Set up for next page\n\t\t\t\tconst lastVoteStaple = history[history.length - 1]?.voteStaple;\n\t\t\t\tif (lastVoteStaple) {\n\t\t\t\t\tstartBlocksHash = lastVoteStaple.blocksHash;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger?.error('BlockListener::poll', 'Error during discovery:', error);\n\t\t}\n\n\t\treturn({ listenersHaveWork });\n\t}\n\n\ton<K extends keyof NetworkListenerArguments>(_ignore_type: K, args: NetworkListenerArguments[K]): { remove: () => void; } {\n\t\tconst id = String(Math.random());\n\n\t\tthis.#blockListeners.push({ ...args, id });\n\n\t\treturn({\n\t\t\tremove: () => {\n\t\t\t\tconst index = this.#blockListeners.findIndex(listener => listener.id === id);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tthis.#blockListeners.splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype BlockQueueRunnerRequest = { blockHash: BlockHash; };\ntype BlockQueueRunnerRequestSerialized = { blockHash: string; };\n\ninterface BaseBlockOperationQueueRunnerScanOptionsRequired {\n\tscanWhenRunning: true;\n\textendedScanIntervalMs: number;\n\tregularScanIntervalMs: number;\n}\n\ntype BlockOperationQueueRunnerConfig<Request, Result, RequestSerialized extends JSONSerializable, ResultSerialized extends JSONSerializable | null> =\n\tConstructorParameters<typeof KeetaAnchorQueueRunner<Request, Result, RequestSerialized, ResultSerialized>>[0] &\n\t{\n\t\tlistener: BlockListener | BlockListenerConfig;\n\n\t\tscanOptions?: Partial<BaseBlockOperationQueueRunnerScanOptionsRequired> | {\n\t\t\tscanWhenRunning: false;\n\t\t}\n\t};\n\nabstract class BaseBlockOperationQueueRunner<\n\tRequest,\n\tResult = null,\n\tRequestSerialized extends JSONSerializable = JSONSerializable,\n\tResultSerialized extends JSONSerializable = null\n> extends KeetaAnchorQueueRunner<Request, Result, RequestSerialized, ResultSerialized> {\n\t#listener: BlockListener;\n\n\t#lastExtendedScanTime: number | null = null;\n\t#lastScanTime: number | null = null;\n\n\t#scanOptions: BaseBlockOperationQueueRunnerScanOptionsRequired | { scanWhenRunning: false; };\n\n\t#removeListenerCallback: (() => void);\n\n\tconstructor(config: BlockOperationQueueRunnerConfig<Request, Result, RequestSerialized, ResultSerialized>) {\n\t\tconst { listener, ...restConfig } = config;\n\n\t\tsuper(restConfig);\n\n\t\tif (listener instanceof BlockListener) {\n\t\t\tthis.#listener = listener;\n\t\t} else {\n\t\t\tthis.#listener = new BlockListener(listener);\n\t\t}\n\n\t\tconst addedListener = this.#listener.on('block', {\n\t\t\tcallback: async ({ block }) => {\n\t\t\t\treturn({ requiresWork: await this.onBlockSeen(block) });\n\t\t\t}\n\t\t});\n\n\t\tthis.#removeListenerCallback = addedListener.remove;\n\n\t\tif (!config.scanOptions || config.scanOptions?.scanWhenRunning || config.scanOptions?.scanWhenRunning === undefined) {\n\t\t\tthis.#scanOptions = {\n\t\t\t\tscanWhenRunning: true,\n\t\t\t\textendedScanIntervalMs: 60 * 60 * 1000, // 1 hour\n\t\t\t\tregularScanIntervalMs: 5 * 60 * 1000, // 5 minutes\n\t\t\t\t...config.scanOptions\n\t\t\t};\n\t\t} else {\n\t\t\tthis.#scanOptions = { scanWhenRunning: false };\n\t\t}\n\n\t}\n\n\tprotected abstract onBlockSeen(block: Block): Promise<boolean>;\n\n\tprotected decodeResponse(response: ResultSerialized): Result | null {\n\t\tif (response === null) {\n\t\t\treturn(null);\n\t\t} else {\n\t\t\tthrow(new Error('BlockQueueRunner::decodeResponse: Not implemented when response is not null, you must override this method in your subclass'));\n\t\t}\n\t}\n\n\tprotected encodeResponse(response: Result): ResultSerialized {\n\t\tif (response === null) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\treturn(null as ResultSerialized);\n\t\t} else {\n\t\t\tthrow(new Error('BlockQueueRunner::encodeResponse: Not implemented when response is not null, you must override this method in your subclass'));\n\t\t}\n\t}\n\n\toverride async run(options?: KeetaAnchorQueueRunOptions): Promise<boolean> {\n\t\tlet scanYieldedWork = false;\n\t\tif (this.#scanOptions.scanWhenRunning) {\n\t\t\tconst now = Date.now();\n\n\t\t\tlet extendedScanDue = false;\n\t\t\tlet dueForScan = false;\n\t\t\tif (!this.#lastScanTime || (now - this.#lastScanTime > this.#scanOptions.regularScanIntervalMs)) {\n\t\t\t\tdueForScan = true;\n\t\t\t}\n\n\t\t\tif (!this.#lastExtendedScanTime || (now - this.#lastExtendedScanTime > this.#scanOptions.extendedScanIntervalMs)) {\n\t\t\t\textendedScanDue = true;\n\t\t\t}\n\n\n\t\t\tif (extendedScanDue || dueForScan) {\n\t\t\t\tlet searchTo: BlockListenerScanOptions['searchTo'];\n\t\t\t\tif (extendedScanDue) {\n\t\t\t\t\tsearchTo = { extended: true };\n\t\t\t\t} else if (this.#lastScanTime) {\n\t\t\t\t\tsearchTo = this.#lastScanTime;\n\t\t\t\t}\n\n\t\t\t\tconst scanResult = await this.#listener.scan({ searchTo });\n\n\t\t\t\tthis.#lastScanTime = now;\n\t\t\t\tif (extendedScanDue) {\n\t\t\t\t\tthis.#lastExtendedScanTime = now;\n\t\t\t\t}\n\n\t\t\t\tscanYieldedWork = scanResult.listenersHaveWork;\n\t\t\t}\n\t\t}\n\n\t\tconst moreRunWork = await super.run(options);\n\n\t\treturn(moreRunWork || scanYieldedWork);\n\t}\n\n\t[Symbol.dispose](): void {\n\t\tthis.#removeListenerCallback();\n\t}\n}\n\nexport abstract class BlockQueueRunner<UserResult = null, QueueResult extends JSONSerializable = null> extends BaseBlockOperationQueueRunner<BlockQueueRunnerRequest, UserResult, BlockQueueRunnerRequestSerialized, QueueResult> {\n\tprotected abstract filterBlock(block: Block): (boolean | Promise<boolean>);\n\n\tprotected decodeRequest(request: BlockQueueRunnerRequestSerialized): BlockQueueRunnerRequest {\n\t\treturn({ blockHash: new KeetaNet.lib.Block.Hash(request.blockHash) });\n\t}\n\n\tprotected encodeRequest(request: BlockQueueRunnerRequest): BlockQueueRunnerRequestSerialized {\n\t\treturn({ blockHash: request.blockHash.toString() });\n\t}\n\n\tprotected async onBlockSeen(block: Block): Promise<boolean> {\n\t\tconst shouldInclude = await this.filterBlock(block);\n\t\tif (shouldInclude) {\n\t\t\tawait this.add({ blockHash: block.hash });\n\t\t}\n\t\treturn(shouldInclude);\n\t}\n\n\toverride add(request: BlockQueueRunnerRequest, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID> {\n\t\tconst requestIdString = ConvertStringToRequestID(request.blockHash.toString().toLowerCase())\n\n\t\tif (info?.id && String(info.id) !== String(requestIdString)) {\n\t\t\tthrow(new Error(`OperationQueueRunner::add: When providing an \"id\" in info, it must match the blockHash of the request. Expected ${String(requestIdString)}, got ${String(info.id)}`));\n\t\t}\n\n\t\treturn(super.add(request, { ...info, id: requestIdString }));\n\t}\n}\n\ntype OperationQueueRunnerRequest = { blockHash: BlockHash; operationIndex: number; };\ntype OperationQueueRunnerRequestSerialized = { blockHash: string; operationIndex: number; };\n\nexport abstract class OperationQueueRunner<UserResult = null, QueueResult extends JSONSerializable = null> extends BaseBlockOperationQueueRunner<OperationQueueRunnerRequest, UserResult, OperationQueueRunnerRequestSerialized, QueueResult> {\n\tprotected abstract filterOperation(operation: BlockOperations, context: { block: Block; operationIndex: number; }): (boolean | Promise<boolean>);\n\n\tprotected decodeRequest(request: OperationQueueRunnerRequestSerialized): OperationQueueRunnerRequest {\n\t\treturn({ blockHash: new KeetaNet.lib.Block.Hash(request.blockHash), operationIndex: request.operationIndex });\n\t}\n\n\tprotected encodeRequest(request: OperationQueueRunnerRequest): OperationQueueRunnerRequestSerialized {\n\t\treturn({ blockHash: request.blockHash.toString(), operationIndex: Number(request.operationIndex) });\n\t}\n\n\tprotected async onBlockSeen(block: Block): Promise<boolean> {\n\t\tconst addPromises = [];\n\n\t\tlet anyShouldInclude = false;\n\t\tfor (let operationIndex = 0; operationIndex < block.operations.length; operationIndex++) {\n\t\t\tconst operation = block.operations[operationIndex];\n\n\t\t\tif (!operation) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taddPromises.push((async () => {\n\t\t\t\tconst shouldInclude = await this.filterOperation(operation, { block, operationIndex });\n\t\t\t\tif (shouldInclude) {\n\t\t\t\t\tanyShouldInclude = true;\n\t\t\t\t\tawait this.add({ blockHash: block.hash, operationIndex });\n\t\t\t\t}\n\t\t\t})());\n\t\t}\n\n\t\tawait Promise.all(addPromises);\n\n\t\treturn(anyShouldInclude);\n\t}\n\n\toverride add(request: OperationQueueRunnerRequest, info?: KeetaAnchorQueueEntryExtra): Promise<KeetaAnchorQueueRequestID> {\n\t\tconst requestIdString = ConvertStringToRequestID(`${request.blockHash.toString()}-${String(request.operationIndex)}`.toLowerCase());\n\n\t\tif (info?.id && String(info.id) !== String(requestIdString)) {\n\t\t\tthrow(new Error(`OperationQueueRunner::add: When providing an \"id\" in info, it must match the blockHash and operationIndex of the request. Expected ${String(requestIdString)}, got ${String(info.id)}`));\n\t\t}\n\n\t\treturn(super.add(request, { ...info, id: requestIdString }))\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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"}
package/lib/error.js CHANGED
@@ -22,7 +22,9 @@ async function getErrorClassMapping() {
22
22
  const importPromises = await Promise.all([
23
23
  import('../services/kyc/common.js'),
24
24
  import('../services/fx/common.js'),
25
- import('../services/asset-movement/common.js')
25
+ import('../services/asset-movement/common.js'),
26
+ import('../services/storage/common.js'),
27
+ import('../services/username/common.js')
26
28
  ]);
27
29
  for (const module of importPromises) {
28
30
  const classes = Object.values(module.Errors);
package/lib/error.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IValidation, TypeGuardError } from 'typia';\nimport { createAssertEquals, createIs } from 'typia';\nimport type { LogLevel } from './log/index.ts';\n/**\n * Type for error classes that can be deserialized\n */\ninterface DeserializableErrorClass {\n\treadonly name: string;\n\tfromJSON: (input: unknown) => Promise<KeetaAnchorError>;\n}\n\n/**\n * Lazy-loaded error classes to avoid circular dependencies\n * The classes are loaded on first use\n */\nlet ERROR_CLASS_MAPPING: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } | null = null;\n\nasync function getErrorClassMapping(): Promise<{ [key: string]: (input: unknown) => Promise<KeetaAnchorError> }> {\n\tif (ERROR_CLASS_MAPPING) {\n\t\treturn(ERROR_CLASS_MAPPING);\n\t}\n\n\tconst ERROR_CLASSES: DeserializableErrorClass[] = [\n\t\t/*\n\t\t * We purposefully leave out KeetaAnchorError here since it\n\t\t * is the base error class and could cause circular resolution\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tKeetaAnchorUserError, KeetaAnchorUserValidationError\n\t];\n\n\t// Dynamically import errors to avoid circular dependencies\n\tconst importPromises: { Errors: { [key: string]: DeserializableErrorClass }}[] = await Promise.all([\n\t\timport('../services/kyc/common.js'),\n\t\timport('../services/fx/common.js'),\n\t\timport('../services/asset-movement/common.js')\n\t]);\n\n\tfor (const module of importPromises) {\n\t\tconst classes = Object.values(module.Errors);\n\t\tERROR_CLASSES.push(...classes);\n\t}\n\n\tconst mapping: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } = {};\n\tfor (const errorClass of ERROR_CLASSES) {\n\t\tmapping[errorClass.name] = errorClass.fromJSON.bind(errorClass);\n\t}\n\n\tERROR_CLASS_MAPPING = mapping;\n\treturn(mapping);\n}\n\n/**\n * Base error class for all Keeta Anchor errors\n */\nexport class KeetaAnchorError extends Error {\n\tstatic override readonly name: string = 'KeetaAnchorError';\n\t#name: string;\n\t#statusCode = 400;\n\t#retryable = false;\n\tprivate readonly keetaAnchorErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorErrorObjectTypeID = '5d7f1578-e887-4104-bab0-4115ae33b08f';\n\tprotected userError = false;\n\treadonly logLevel: LogLevel = 'ERROR';\n\n\tget name(): string {\n\t\treturn(this.#name);\n\t}\n\n\tprotected set name(value: string) {\n\t\tthis.#name = value;\n\t}\n\n\tget statusCode(): number {\n\t\treturn(this.#statusCode);\n\t}\n\n\tprotected set statusCode(value: number) {\n\t\tthis.#statusCode = value;\n\t}\n\n\tget retryable(): boolean {\n\t\treturn(this.#retryable);\n\t}\n\n\tprotected set retryable(value: boolean) {\n\t\tthis.#retryable = value;\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\t// Need to cast to access the static name property from the constructor\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.#name = (this.constructor as typeof KeetaAnchorError).name;\n\n\t\tObject.defineProperty(this, 'keetaAnchorErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorError.keetaAnchorErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\t/**\n\t * Protected method to restore error properties from JSON\n\t * This allows subclasses to properly restore properties without using any\n\t */\n\tprotected restoreFromJSON(other: { [key: string]: unknown }): void {\n\t\t// Restore statusCode if present\n\t\tif ('statusCode' in other) {\n\t\t\tif (typeof other.statusCode !== 'number') {\n\t\t\t\tthrow(new TypeError('Invalid statusCode: expected number'));\n\t\t\t}\n\t\t\tthis.statusCode = other.statusCode;\n\t\t}\n\n\t\t// Restore retryable if present\n\t\tif ('retryable' in other) {\n\t\t\tif (typeof other.retryable !== 'boolean') {\n\t\t\t\tthrow(new TypeError('Invalid retryable: expected boolean'));\n\t\t\t}\n\t\t\tthis.retryable = other.retryable;\n\t\t}\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorErrorObjectTypeID', KeetaAnchorError.keetaAnchorErrorObjectTypeID));\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json', message?: string): { error: string; statusCode: number; contentType: string } {\n\t\tmessage ??= 'Internal error';\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\t...this.toJSON(),\n\t\t\t\tstatusCode: undefined\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): { ok: false; retryable: boolean; error: string; name: string; statusCode: number } {\n\t\tlet message = 'Internal error';\n\t\tif (this.userError) {\n\t\t\tmessage = this.message;\n\t\t}\n\n\t\treturn({\n\t\t\tok: false,\n\t\t\tretryable: this.retryable,\n\t\t\terror: message,\n\t\t\tname: this.#name,\n\t\t\tstatusCode: this.statusCode\n\t\t});\n\t}\n\n\tprotected static hasPropWithValue<PROP extends string, VALUE extends string | number | boolean>(input: unknown, prop: PROP, value: VALUE): input is { [key in PROP]: VALUE } {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (!(prop in input)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst inputValue = input[prop as keyof typeof input] as unknown;\n\t\tif (inputValue !== value) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(true);\n\t}\n\n\t/**\n\t * Extract common error properties from JSON input\n\t * This validates the structure and extracts properties needed for construction\n\t */\n\tprotected static extractErrorProperties(input: unknown, expectedClass?: { name: string }): { message: string; other: { [key: string]: unknown }} {\n\t\tif (!this.hasPropWithValue(input, 'ok', false)) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\t// Verify the name matches if an expected class is provided\n\t\tif (expectedClass && 'name' in input && input.name !== expectedClass.name) {\n\t\t\tthrow(new Error(`Error name mismatch: expected ${expectedClass.name}, got ${input.name}`));\n\t\t}\n\n\t\t// Extract error message\n\t\tlet message = 'Internal error';\n\t\tif ('error' in input && typeof input.error === 'string') {\n\t\t\tmessage = input.error;\n\t\t}\n\n\t\t// Extract other properties\n\t\tconst other: { [key: string]: unknown } = {};\n\t\tfor (const key in input) {\n\t\t\tif (key !== 'error' && key !== 'ok') {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tother[key] = input[key as keyof typeof input];\n\t\t\t}\n\t\t}\n\n\t\treturn({ message, other });\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorError> {\n\t\t// Try to use the deserializer mapping if available for subclasses\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (!('ok' in input) || input.ok !== false) {\n\t\t\tthrow(new Error('Invalid error JSON object: expected ok: false'));\n\t\t}\n\n\t\t// Check if there's a specific error class name\n\t\tif ('name' in input && typeof input.name === 'string') {\n\t\t\tif (input.name === 'KeetaAnchorError') {\n\t\t\t\tconst { message, other } = KeetaAnchorError.extractErrorProperties(input, this);\n\t\t\t\tconst error = new this(message);\n\t\t\t\terror.restoreFromJSON(other);\n\t\t\t\treturn(error);\n\t\t\t}\n\t\t\tconst mapping = await getErrorClassMapping();\n\t\t\tconst deserializer = mapping[input.name];\n\t\t\tif (deserializer) {\n\t\t\t\treturn(await deserializer(input));\n\t\t\t}\n\t\t}\n\n\t\tthrow(new Error('Invalid error JSON object: unknown error class'));\n\t}\n}\n\n/**\n * User-facing error class that extends KeetaAnchorError\n */\nexport class KeetaAnchorUserError extends KeetaAnchorError {\n\tstatic readonly name: string = 'KeetaAnchorUserError';\n\tprivate readonly keetaAnchorUserErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorUserErrorObjectTypeID = 'a1e64819-14b6-45ac-a1ec-b9c0bdd51e7b';\n\tprotected override userError = true;\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorUserErrorObjectTypeID', KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID));\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\tObject.defineProperty(this, 'keetaAnchorUserErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\treturn(super.asErrorResponse(contentType, this.message));\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<InstanceType<typeof this>> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\t\tconst error = new this(message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\ninterface KeetaAnchorUserValidationErrorDetails {\n\tfields: {\n\t\tpath?: string | undefined;\n\t\tmessage: string;\n\t\tallowedValues?: string[];\n\t\texpected?: string;\n\t\treceivedValue?: unknown;\n\t\tvalueRules?: { minimum?: string | undefined; maximum?: string | undefined };\n\t}[];\n}\n\nconst assertKeetaAnchorUserValidationErrorDetails: (input: unknown) => KeetaAnchorUserValidationErrorDetails = createAssertEquals<KeetaAnchorUserValidationErrorDetails>();\ntype KeetaAnchorUserValidationErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaAnchorUserValidationErrorDetails;\n\ntype TypeGuardErrorLike = Pick<TypeGuardError.IProps | IValidation.IError, 'path' | 'expected' | 'value'>;\n\nconst isTypeGuardErrorLike: (error: unknown) => error is TypeGuardErrorLike = createIs<TypeGuardErrorLike>();\n\nexport class KeetaAnchorUserValidationError extends KeetaAnchorUserError implements KeetaAnchorUserValidationErrorDetails {\n\tstatic readonly isTypeGuardErrorLike: typeof isTypeGuardErrorLike = isTypeGuardErrorLike;\n\n\tstatic override readonly name: string = 'KeetaAnchorUserValidationError';\n\tprivate readonly KeetaAnchorUserValidationErrorObjectTypeID!: string;\n\tprivate static readonly KeetaAnchorUserValidationErrorObjectTypeID = '5fa46799-48b8-4cf2-a3de-9c01418d3ba0';\n\tprotected override userError = true;\n\n\treadonly fields: KeetaAnchorUserValidationErrorDetails['fields'];\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserValidationError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaAnchorUserValidationErrorObjectTypeID', KeetaAnchorUserValidationError.KeetaAnchorUserValidationErrorObjectTypeID));\n\t}\n\n\tconstructor(args: KeetaAnchorUserValidationErrorDetails, message?: string) {\n\t\tsuper(message ?? `Validation error on fields ${args.fields.map((f) => f.path).join(', ')}`);\n\n\t\tObject.defineProperty(this, 'KeetaAnchorUserValidationErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserValidationError.KeetaAnchorUserValidationErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.fields = args.fields;\n\t}\n\n\toverride get statusCode() {\n\t\treturn(400);\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\tlet message = this.message;\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\tok: false,\n\t\t\t\tname: this.name,\n\t\t\t\tdata: { fields: this.fields },\n\t\t\t\terror: this.message\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): KeetaAnchorUserValidationErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tfields: this.fields\n\t\t});\n\t}\n\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorUserValidationError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tif (!('data' in other)) {\n\t\t\tthrow(new Error('Invalid KeetaAnchorUserValidationError JSON: missing data property'));\n\t\t}\n\n\t\tconst parsed = assertKeetaAnchorUserValidationErrorDetails(other.data);\n\n\t\tconst error = new this(\n\t\t\t{ fields: parsed.fields },\n\t\t\tmessage\n\t\t);\n\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n\n\tstatic fromTypeGuardError(input: TypeGuardErrorLike | TypeGuardErrorLike[], message?: string): KeetaAnchorUserValidationError {\n\t\tlet asArr;\n\n\t\tif (Array.isArray(input)) {\n\t\t\tasArr = input;\n\t\t} else {\n\t\t\tasArr = [ input ];\n\t\t}\n\n\t\treturn(new this({\n\t\t\tfields: asArr.map(function(single) {\n\t\t\t\tlet path;\n\t\t\t\tif (single.path !== undefined) {\n\t\t\t\t\tconst split = single.path.split('.');\n\n\t\t\t\t\tif (split[0] === '$input') {\n\t\t\t\t\t\tsplit.shift();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (split.length > 0) {\n\t\t\t\t\t\tpath = split.join('.');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\tpath,\n\t\t\t\t\tmessage: message ?? 'Invalid value',\n\t\t\t\t\texpected: single.expected,\n\t\t\t\t\treceivedValue: single.value\n\t\t\t\t});\n\t\t\t})\n\t\t}, message))\n\t}\n}\n"]}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/lib/error.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IValidation, TypeGuardError } from 'typia';\nimport { createAssertEquals, createIs } from 'typia';\nimport type { LogLevel } from './log/index.ts';\n/**\n * Type for error classes that can be deserialized\n */\ninterface DeserializableErrorClass {\n\treadonly name: string;\n\tfromJSON: (input: unknown) => Promise<KeetaAnchorError>;\n}\n\n/**\n * Lazy-loaded error classes to avoid circular dependencies\n * The classes are loaded on first use\n */\nlet ERROR_CLASS_MAPPING: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } | null = null;\n\nasync function getErrorClassMapping(): Promise<{ [key: string]: (input: unknown) => Promise<KeetaAnchorError> }> {\n\tif (ERROR_CLASS_MAPPING) {\n\t\treturn(ERROR_CLASS_MAPPING);\n\t}\n\n\tconst ERROR_CLASSES: DeserializableErrorClass[] = [\n\t\t/*\n\t\t * We purposefully leave out KeetaAnchorError here since it\n\t\t * is the base error class and could cause circular resolution\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tKeetaAnchorUserError, KeetaAnchorUserValidationError\n\t];\n\n\t// Dynamically import errors to avoid circular dependencies\n\tconst importPromises: { Errors: { [key: string]: DeserializableErrorClass }}[] = await Promise.all([\n\t\timport('../services/kyc/common.js'),\n\t\timport('../services/fx/common.js'),\n\t\timport('../services/asset-movement/common.js'),\n\t\timport('../services/storage/common.js'),\n\t\timport('../services/username/common.js')\n\t]);\n\n\tfor (const module of importPromises) {\n\t\tconst classes = Object.values(module.Errors);\n\t\tERROR_CLASSES.push(...classes);\n\t}\n\n\tconst mapping: { [key: string]: (input: unknown) => Promise<KeetaAnchorError> } = {};\n\tfor (const errorClass of ERROR_CLASSES) {\n\t\tmapping[errorClass.name] = errorClass.fromJSON.bind(errorClass);\n\t}\n\n\tERROR_CLASS_MAPPING = mapping;\n\treturn(mapping);\n}\n\n/**\n * Base error class for all Keeta Anchor errors\n */\nexport class KeetaAnchorError extends Error {\n\tstatic override readonly name: string = 'KeetaAnchorError';\n\t#name: string;\n\t#statusCode = 400;\n\t#retryable = false;\n\tprivate readonly keetaAnchorErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorErrorObjectTypeID = '5d7f1578-e887-4104-bab0-4115ae33b08f';\n\tprotected userError = false;\n\treadonly logLevel: LogLevel = 'ERROR';\n\n\tget name(): string {\n\t\treturn(this.#name);\n\t}\n\n\tprotected set name(value: string) {\n\t\tthis.#name = value;\n\t}\n\n\tget statusCode(): number {\n\t\treturn(this.#statusCode);\n\t}\n\n\tprotected set statusCode(value: number) {\n\t\tthis.#statusCode = value;\n\t}\n\n\tget retryable(): boolean {\n\t\treturn(this.#retryable);\n\t}\n\n\tprotected set retryable(value: boolean) {\n\t\tthis.#retryable = value;\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\t// Need to cast to access the static name property from the constructor\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.#name = (this.constructor as typeof KeetaAnchorError).name;\n\n\t\tObject.defineProperty(this, 'keetaAnchorErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorError.keetaAnchorErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\t/**\n\t * Protected method to restore error properties from JSON\n\t * This allows subclasses to properly restore properties without using any\n\t */\n\tprotected restoreFromJSON(other: { [key: string]: unknown }): void {\n\t\t// Restore statusCode if present\n\t\tif ('statusCode' in other) {\n\t\t\tif (typeof other.statusCode !== 'number') {\n\t\t\t\tthrow(new TypeError('Invalid statusCode: expected number'));\n\t\t\t}\n\t\t\tthis.statusCode = other.statusCode;\n\t\t}\n\n\t\t// Restore retryable if present\n\t\tif ('retryable' in other) {\n\t\t\tif (typeof other.retryable !== 'boolean') {\n\t\t\t\tthrow(new TypeError('Invalid retryable: expected boolean'));\n\t\t\t}\n\t\t\tthis.retryable = other.retryable;\n\t\t}\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorErrorObjectTypeID', KeetaAnchorError.keetaAnchorErrorObjectTypeID));\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json', message?: string): { error: string; statusCode: number; contentType: string } {\n\t\tmessage ??= 'Internal error';\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\t...this.toJSON(),\n\t\t\t\tstatusCode: undefined\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): { ok: false; retryable: boolean; error: string; name: string; statusCode: number } {\n\t\tlet message = 'Internal error';\n\t\tif (this.userError) {\n\t\t\tmessage = this.message;\n\t\t}\n\n\t\treturn({\n\t\t\tok: false,\n\t\t\tretryable: this.retryable,\n\t\t\terror: message,\n\t\t\tname: this.#name,\n\t\t\tstatusCode: this.statusCode\n\t\t});\n\t}\n\n\tprotected static hasPropWithValue<PROP extends string, VALUE extends string | number | boolean>(input: unknown, prop: PROP, value: VALUE): input is { [key in PROP]: VALUE } {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (!(prop in input)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst inputValue = input[prop as keyof typeof input] as unknown;\n\t\tif (inputValue !== value) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(true);\n\t}\n\n\t/**\n\t * Extract common error properties from JSON input\n\t * This validates the structure and extracts properties needed for construction\n\t */\n\tprotected static extractErrorProperties(input: unknown, expectedClass?: { name: string }): { message: string; other: { [key: string]: unknown }} {\n\t\tif (!this.hasPropWithValue(input, 'ok', false)) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\t// Verify the name matches if an expected class is provided\n\t\tif (expectedClass && 'name' in input && input.name !== expectedClass.name) {\n\t\t\tthrow(new Error(`Error name mismatch: expected ${expectedClass.name}, got ${input.name}`));\n\t\t}\n\n\t\t// Extract error message\n\t\tlet message = 'Internal error';\n\t\tif ('error' in input && typeof input.error === 'string') {\n\t\t\tmessage = input.error;\n\t\t}\n\n\t\t// Extract other properties\n\t\tconst other: { [key: string]: unknown } = {};\n\t\tfor (const key in input) {\n\t\t\tif (key !== 'error' && key !== 'ok') {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\tother[key] = input[key as keyof typeof input];\n\t\t\t}\n\t\t}\n\n\t\treturn({ message, other });\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorError> {\n\t\t// Try to use the deserializer mapping if available for subclasses\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\tthrow(new Error('Invalid error JSON object'));\n\t\t}\n\n\t\tif (!('ok' in input) || input.ok !== false) {\n\t\t\tthrow(new Error('Invalid error JSON object: expected ok: false'));\n\t\t}\n\n\t\t// Check if there's a specific error class name\n\t\tif ('name' in input && typeof input.name === 'string') {\n\t\t\tif (input.name === 'KeetaAnchorError') {\n\t\t\t\tconst { message, other } = KeetaAnchorError.extractErrorProperties(input, this);\n\t\t\t\tconst error = new this(message);\n\t\t\t\terror.restoreFromJSON(other);\n\t\t\t\treturn(error);\n\t\t\t}\n\t\t\tconst mapping = await getErrorClassMapping();\n\t\t\tconst deserializer = mapping[input.name];\n\t\t\tif (deserializer) {\n\t\t\t\treturn(await deserializer(input));\n\t\t\t}\n\t\t}\n\n\t\tthrow(new Error('Invalid error JSON object: unknown error class'));\n\t}\n}\n\n/**\n * User-facing error class that extends KeetaAnchorError\n */\nexport class KeetaAnchorUserError extends KeetaAnchorError {\n\tstatic readonly name: string = 'KeetaAnchorUserError';\n\tprivate readonly keetaAnchorUserErrorObjectTypeID!: string;\n\tprivate static readonly keetaAnchorUserErrorObjectTypeID = 'a1e64819-14b6-45ac-a1ec-b9c0bdd51e7b';\n\tprotected override userError = true;\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserError {\n\t\treturn(this.hasPropWithValue(input, 'keetaAnchorUserErrorObjectTypeID', KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID));\n\t}\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\tObject.defineProperty(this, 'keetaAnchorUserErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserError.keetaAnchorUserErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\treturn(super.asErrorResponse(contentType, this.message));\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<InstanceType<typeof this>> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\t\tconst error = new this(message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\ninterface KeetaAnchorUserValidationErrorDetails {\n\tfields: {\n\t\tpath?: string | undefined;\n\t\tmessage: string;\n\t\tallowedValues?: string[];\n\t\texpected?: string;\n\t\treceivedValue?: unknown;\n\t\tvalueRules?: { minimum?: string | undefined; maximum?: string | undefined };\n\t}[];\n}\n\nconst assertKeetaAnchorUserValidationErrorDetails: (input: unknown) => KeetaAnchorUserValidationErrorDetails = createAssertEquals<KeetaAnchorUserValidationErrorDetails>();\ntype KeetaAnchorUserValidationErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaAnchorUserValidationErrorDetails;\n\ntype TypeGuardErrorLike = Pick<TypeGuardError.IProps | IValidation.IError, 'path' | 'expected' | 'value'>;\n\nconst isTypeGuardErrorLike: (error: unknown) => error is TypeGuardErrorLike = createIs<TypeGuardErrorLike>();\n\nexport class KeetaAnchorUserValidationError extends KeetaAnchorUserError implements KeetaAnchorUserValidationErrorDetails {\n\tstatic readonly isTypeGuardErrorLike: typeof isTypeGuardErrorLike = isTypeGuardErrorLike;\n\n\tstatic override readonly name: string = 'KeetaAnchorUserValidationError';\n\tprivate readonly KeetaAnchorUserValidationErrorObjectTypeID!: string;\n\tprivate static readonly KeetaAnchorUserValidationErrorObjectTypeID = '5fa46799-48b8-4cf2-a3de-9c01418d3ba0';\n\tprotected override userError = true;\n\n\treadonly fields: KeetaAnchorUserValidationErrorDetails['fields'];\n\n\tstatic isInstance(input: unknown): input is KeetaAnchorUserValidationError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaAnchorUserValidationErrorObjectTypeID', KeetaAnchorUserValidationError.KeetaAnchorUserValidationErrorObjectTypeID));\n\t}\n\n\tconstructor(args: KeetaAnchorUserValidationErrorDetails, message?: string) {\n\t\tsuper(message ?? `Validation error on fields ${args.fields.map((f) => f.path).join(', ')}`);\n\n\t\tObject.defineProperty(this, 'KeetaAnchorUserValidationErrorObjectTypeID', {\n\t\t\tvalue: KeetaAnchorUserValidationError.KeetaAnchorUserValidationErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.fields = args.fields;\n\t}\n\n\toverride get statusCode() {\n\t\treturn(400);\n\t}\n\n\tasErrorResponse(contentType: 'text/plain' | 'application/json'): { error: string; statusCode: number; contentType: string } {\n\t\tlet message = this.message;\n\t\tif (contentType === 'application/json') {\n\t\t\tmessage = JSON.stringify({\n\t\t\t\tok: false,\n\t\t\t\tname: this.name,\n\t\t\t\tdata: { fields: this.fields },\n\t\t\t\terror: this.message\n\t\t\t});\n\t\t}\n\n\t\treturn({\n\t\t\terror: message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tcontentType: contentType\n\t\t});\n\t}\n\n\ttoJSON(): KeetaAnchorUserValidationErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tfields: this.fields\n\t\t});\n\t}\n\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaAnchorUserValidationError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tif (!('data' in other)) {\n\t\t\tthrow(new Error('Invalid KeetaAnchorUserValidationError JSON: missing data property'));\n\t\t}\n\n\t\tconst parsed = assertKeetaAnchorUserValidationErrorDetails(other.data);\n\n\t\tconst error = new this(\n\t\t\t{ fields: parsed.fields },\n\t\t\tmessage\n\t\t);\n\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n\n\tstatic fromTypeGuardError(input: TypeGuardErrorLike | TypeGuardErrorLike[], message?: string): KeetaAnchorUserValidationError {\n\t\tlet asArr;\n\n\t\tif (Array.isArray(input)) {\n\t\t\tasArr = input;\n\t\t} else {\n\t\t\tasArr = [ input ];\n\t\t}\n\n\t\treturn(new this({\n\t\t\tfields: asArr.map(function(single) {\n\t\t\t\tlet path;\n\t\t\t\tif (single.path !== undefined) {\n\t\t\t\t\tconst split = single.path.split('.');\n\n\t\t\t\t\tif (split[0] === '$input') {\n\t\t\t\t\t\tsplit.shift();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (split.length > 0) {\n\t\t\t\t\t\tpath = split.join('.');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\tpath,\n\t\t\t\t\tmessage: message ?? 'Invalid value',\n\t\t\t\t\texpected: single.expected,\n\t\t\t\t\treceivedValue: single.value\n\t\t\t\t});\n\t\t\t})\n\t\t}, message))\n\t}\n}\n"]}