@enbox/dwn-server 0.0.1
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/LICENSE +201 -0
- package/README.md +353 -0
- package/dist/cjs/index.js +6811 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/src/config.d.ts +55 -0
- package/dist/esm/src/config.d.ts.map +1 -0
- package/dist/esm/src/config.js +60 -0
- package/dist/esm/src/config.js.map +1 -0
- package/dist/esm/src/connection/connection-manager.d.ts +25 -0
- package/dist/esm/src/connection/connection-manager.d.ts.map +1 -0
- package/dist/esm/src/connection/connection-manager.js +26 -0
- package/dist/esm/src/connection/connection-manager.js.map +1 -0
- package/dist/esm/src/connection/socket-connection.d.ts +65 -0
- package/dist/esm/src/connection/socket-connection.d.ts.map +1 -0
- package/dist/esm/src/connection/socket-connection.js +180 -0
- package/dist/esm/src/connection/socket-connection.js.map +1 -0
- package/dist/esm/src/dwn-error.d.ts +29 -0
- package/dist/esm/src/dwn-error.d.ts.map +1 -0
- package/dist/esm/src/dwn-error.js +36 -0
- package/dist/esm/src/dwn-error.js.map +1 -0
- package/dist/esm/src/dwn-server.d.ts +60 -0
- package/dist/esm/src/dwn-server.d.ts.map +1 -0
- package/dist/esm/src/dwn-server.js +130 -0
- package/dist/esm/src/dwn-server.js.map +1 -0
- package/dist/esm/src/http-api.d.ts +26 -0
- package/dist/esm/src/http-api.d.ts.map +1 -0
- package/dist/esm/src/http-api.js +474 -0
- package/dist/esm/src/http-api.js.map +1 -0
- package/dist/esm/src/index.d.ts +7 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js +6 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/json-rpc-api.d.ts +3 -0
- package/dist/esm/src/json-rpc-api.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-api.js +8 -0
- package/dist/esm/src/json-rpc-api.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/dwn/index.d.ts +2 -0
- package/dist/esm/src/json-rpc-handlers/dwn/index.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/dwn/index.js +2 -0
- package/dist/esm/src/json-rpc-handlers/dwn/index.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts +3 -0
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js +73 -0
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts +10 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.js +39 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts +2 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.js +2 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.js.map +1 -0
- package/dist/esm/src/json-rpc-socket.d.ts +39 -0
- package/dist/esm/src/json-rpc-socket.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-socket.js +125 -0
- package/dist/esm/src/json-rpc-socket.js.map +1 -0
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts +10 -0
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts.map +1 -0
- package/dist/esm/src/lib/http-server-shutdown-handler.js +65 -0
- package/dist/esm/src/lib/http-server-shutdown-handler.js.map +1 -0
- package/dist/esm/src/lib/json-rpc-router.d.ts +30 -0
- package/dist/esm/src/lib/json-rpc-router.d.ts.map +1 -0
- package/dist/esm/src/lib/json-rpc-router.js +14 -0
- package/dist/esm/src/lib/json-rpc-router.js.map +1 -0
- package/dist/esm/src/lib/json-rpc.d.ts +54 -0
- package/dist/esm/src/lib/json-rpc.d.ts.map +1 -0
- package/dist/esm/src/lib/json-rpc.js +60 -0
- package/dist/esm/src/lib/json-rpc.js.map +1 -0
- package/dist/esm/src/main.d.ts +3 -0
- package/dist/esm/src/main.d.ts.map +1 -0
- package/dist/esm/src/main.js +11 -0
- package/dist/esm/src/main.js.map +1 -0
- package/dist/esm/src/metrics.d.ts +4 -0
- package/dist/esm/src/metrics.d.ts.map +1 -0
- package/dist/esm/src/metrics.js +13 -0
- package/dist/esm/src/metrics.js.map +1 -0
- package/dist/esm/src/plugin-loader.d.ts +10 -0
- package/dist/esm/src/plugin-loader.d.ts.map +1 -0
- package/dist/esm/src/plugin-loader.js +19 -0
- package/dist/esm/src/plugin-loader.js.map +1 -0
- package/dist/esm/src/process-handlers.d.ts +11 -0
- package/dist/esm/src/process-handlers.d.ts.map +1 -0
- package/dist/esm/src/process-handlers.js +40 -0
- package/dist/esm/src/process-handlers.js.map +1 -0
- package/dist/esm/src/registration/proof-of-work-manager.d.ts +93 -0
- package/dist/esm/src/registration/proof-of-work-manager.d.ts.map +1 -0
- package/dist/esm/src/registration/proof-of-work-manager.js +243 -0
- package/dist/esm/src/registration/proof-of-work-manager.js.map +1 -0
- package/dist/esm/src/registration/proof-of-work-types.d.ts +8 -0
- package/dist/esm/src/registration/proof-of-work-types.d.ts.map +1 -0
- package/dist/esm/src/registration/proof-of-work-types.js +2 -0
- package/dist/esm/src/registration/proof-of-work-types.js.map +1 -0
- package/dist/esm/src/registration/proof-of-work.d.ts +41 -0
- package/dist/esm/src/registration/proof-of-work.d.ts.map +1 -0
- package/dist/esm/src/registration/proof-of-work.js +69 -0
- package/dist/esm/src/registration/proof-of-work.js.map +1 -0
- package/dist/esm/src/registration/registration-manager.d.ts +55 -0
- package/dist/esm/src/registration/registration-manager.d.ts.map +1 -0
- package/dist/esm/src/registration/registration-manager.js +121 -0
- package/dist/esm/src/registration/registration-manager.js.map +1 -0
- package/dist/esm/src/registration/registration-store.d.ts +24 -0
- package/dist/esm/src/registration/registration-store.d.ts.map +1 -0
- package/dist/esm/src/registration/registration-store.js +56 -0
- package/dist/esm/src/registration/registration-store.js.map +1 -0
- package/dist/esm/src/registration/registration-types.d.ts +18 -0
- package/dist/esm/src/registration/registration-types.d.ts.map +1 -0
- package/dist/esm/src/registration/registration-types.js +2 -0
- package/dist/esm/src/registration/registration-types.js.map +1 -0
- package/dist/esm/src/storage.d.ts +24 -0
- package/dist/esm/src/storage.d.ts.map +1 -0
- package/dist/esm/src/storage.js +146 -0
- package/dist/esm/src/storage.js.map +1 -0
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts +39 -0
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -0
- package/dist/esm/src/web5-connect/sql-ttl-cache.js +106 -0
- package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -0
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts +58 -0
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -0
- package/dist/esm/src/web5-connect/web5-connect-server.js +77 -0
- package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -0
- package/dist/esm/src/ws-api.d.ts +13 -0
- package/dist/esm/src/ws-api.d.ts.map +1 -0
- package/dist/esm/src/ws-api.js +31 -0
- package/dist/esm/src/ws-api.js.map +1 -0
- package/dist/esm/tests/common-scenario-validator.d.ts +11 -0
- package/dist/esm/tests/common-scenario-validator.d.ts.map +1 -0
- package/dist/esm/tests/common-scenario-validator.js +114 -0
- package/dist/esm/tests/common-scenario-validator.js.map +1 -0
- package/dist/esm/tests/connection/connection-manager.spec.d.ts +2 -0
- package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +1 -0
- package/dist/esm/tests/connection/connection-manager.spec.js +47 -0
- package/dist/esm/tests/connection/connection-manager.spec.js.map +1 -0
- package/dist/esm/tests/connection/socket-connection.spec.d.ts +2 -0
- package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +1 -0
- package/dist/esm/tests/connection/socket-connection.spec.js +125 -0
- package/dist/esm/tests/connection/socket-connection.spec.js.map +1 -0
- package/dist/esm/tests/cors/http-api.browser.d.ts +2 -0
- package/dist/esm/tests/cors/http-api.browser.d.ts.map +1 -0
- package/dist/esm/tests/cors/http-api.browser.js +60 -0
- package/dist/esm/tests/cors/http-api.browser.js.map +1 -0
- package/dist/esm/tests/cors/ping.browser.d.ts +2 -0
- package/dist/esm/tests/cors/ping.browser.d.ts.map +1 -0
- package/dist/esm/tests/cors/ping.browser.js +7 -0
- package/dist/esm/tests/cors/ping.browser.js.map +1 -0
- package/dist/esm/tests/dwn-process-message.spec.d.ts +2 -0
- package/dist/esm/tests/dwn-process-message.spec.d.ts.map +1 -0
- package/dist/esm/tests/dwn-process-message.spec.js +172 -0
- package/dist/esm/tests/dwn-process-message.spec.js.map +1 -0
- package/dist/esm/tests/dwn-server.spec.d.ts +2 -0
- package/dist/esm/tests/dwn-server.spec.d.ts.map +1 -0
- package/dist/esm/tests/dwn-server.spec.js +49 -0
- package/dist/esm/tests/dwn-server.spec.js.map +1 -0
- package/dist/esm/tests/http-api.spec.d.ts +2 -0
- package/dist/esm/tests/http-api.spec.d.ts.map +1 -0
- package/dist/esm/tests/http-api.spec.js +775 -0
- package/dist/esm/tests/http-api.spec.js.map +1 -0
- package/dist/esm/tests/json-rpc-socket.spec.d.ts +2 -0
- package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +1 -0
- package/dist/esm/tests/json-rpc-socket.spec.js +225 -0
- package/dist/esm/tests/json-rpc-socket.spec.js.map +1 -0
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts +17 -0
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +1 -0
- package/dist/esm/tests/plugins/data-store-sqlite.js +23 -0
- package/dist/esm/tests/plugins/data-store-sqlite.js.map +1 -0
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts +17 -0
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +1 -0
- package/dist/esm/tests/plugins/event-log-sqlite.js +23 -0
- package/dist/esm/tests/plugins/event-log-sqlite.js.map +1 -0
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +17 -0
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +1 -0
- package/dist/esm/tests/plugins/event-stream-in-memory.js +21 -0
- package/dist/esm/tests/plugins/event-stream-in-memory.js.map +1 -0
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts +17 -0
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +1 -0
- package/dist/esm/tests/plugins/message-store-sqlite.js +23 -0
- package/dist/esm/tests/plugins/message-store-sqlite.js.map +1 -0
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +17 -0
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +1 -0
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +23 -0
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +1 -0
- package/dist/esm/tests/process-handler.spec.d.ts +2 -0
- package/dist/esm/tests/process-handler.spec.d.ts.map +1 -0
- package/dist/esm/tests/process-handler.spec.js +60 -0
- package/dist/esm/tests/process-handler.spec.js.map +1 -0
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +2 -0
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +1 -0
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js +157 -0
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +1 -0
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +2 -0
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +1 -0
- package/dist/esm/tests/rpc-subscribe-close.spec.js +81 -0
- package/dist/esm/tests/rpc-subscribe-close.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +2 -0
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +1 -0
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +73 -0
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/registration.spec.d.ts +2 -0
- package/dist/esm/tests/scenarios/registration.spec.d.ts.map +1 -0
- package/dist/esm/tests/scenarios/registration.spec.js +507 -0
- package/dist/esm/tests/scenarios/registration.spec.js.map +1 -0
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +2 -0
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +1 -0
- package/dist/esm/tests/scenarios/web5-connect.spec.js +137 -0
- package/dist/esm/tests/scenarios/web5-connect.spec.js.map +1 -0
- package/dist/esm/tests/test-dwn.d.ts +7 -0
- package/dist/esm/tests/test-dwn.d.ts.map +1 -0
- package/dist/esm/tests/test-dwn.js +34 -0
- package/dist/esm/tests/test-dwn.js.map +1 -0
- package/dist/esm/tests/utils.d.ts +46 -0
- package/dist/esm/tests/utils.d.ts.map +1 -0
- package/dist/esm/tests/utils.js +116 -0
- package/dist/esm/tests/utils.js.map +1 -0
- package/dist/esm/tests/ws-api.spec.d.ts +2 -0
- package/dist/esm/tests/ws-api.spec.d.ts.map +1 -0
- package/dist/esm/tests/ws-api.spec.js +327 -0
- package/dist/esm/tests/ws-api.spec.js.map +1 -0
- package/package.json +119 -0
- package/src/config.ts +71 -0
- package/src/connection/connection-manager.ts +39 -0
- package/src/connection/socket-connection.ts +221 -0
- package/src/dwn-error.ts +38 -0
- package/src/dwn-server.ts +178 -0
- package/src/http-api.ts +541 -0
- package/src/index.ts +6 -0
- package/src/json-rpc-api.ts +11 -0
- package/src/json-rpc-handlers/dwn/index.ts +1 -0
- package/src/json-rpc-handlers/dwn/process-message.ts +123 -0
- package/src/json-rpc-handlers/subscription/close.ts +59 -0
- package/src/json-rpc-handlers/subscription/index.ts +1 -0
- package/src/json-rpc-socket.ts +155 -0
- package/src/lib/http-server-shutdown-handler.ts +79 -0
- package/src/lib/json-rpc-router.ts +52 -0
- package/src/lib/json-rpc.ts +126 -0
- package/src/main.ts +14 -0
- package/src/metrics.ts +14 -0
- package/src/plugin-loader.ts +17 -0
- package/src/process-handlers.ts +65 -0
- package/src/registration/proof-of-work-manager.ts +317 -0
- package/src/registration/proof-of-work-types.ts +7 -0
- package/src/registration/proof-of-work.ts +100 -0
- package/src/registration/registration-manager.ts +153 -0
- package/src/registration/registration-store.ts +79 -0
- package/src/registration/registration-types.ts +18 -0
- package/src/storage.ts +213 -0
- package/src/web5-connect/sql-ttl-cache.ts +137 -0
- package/src/web5-connect/web5-connect-server.ts +122 -0
- package/src/ws-api.ts +45 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type JsonRpcId = string | number | null;
|
|
2
|
+
export type JsonRpcVersion = '2.0';
|
|
3
|
+
export interface JsonRpcRequest {
|
|
4
|
+
jsonrpc: JsonRpcVersion;
|
|
5
|
+
id?: JsonRpcId;
|
|
6
|
+
method: string;
|
|
7
|
+
params?: any;
|
|
8
|
+
/** JSON RPC Subscription Extension Parameters */
|
|
9
|
+
subscription?: {
|
|
10
|
+
id: JsonRpcId;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface JsonRpcError {
|
|
14
|
+
code: JsonRpcErrorCodes;
|
|
15
|
+
message: string;
|
|
16
|
+
data?: any;
|
|
17
|
+
}
|
|
18
|
+
export interface JsonRpcSubscription {
|
|
19
|
+
/** JSON RPC Id of the Subscription Request */
|
|
20
|
+
id: JsonRpcId;
|
|
21
|
+
close: () => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare enum JsonRpcErrorCodes {
|
|
24
|
+
InvalidRequest = -32600,
|
|
25
|
+
MethodNotFound = -32601,
|
|
26
|
+
InvalidParams = -32602,
|
|
27
|
+
InternalError = -32603,
|
|
28
|
+
ParseError = -32700,
|
|
29
|
+
/** App defined error equivalent to HTTP Status 400 */
|
|
30
|
+
BadRequest = -50400,
|
|
31
|
+
/** App defined error equivalent to HTTP Status 401 */
|
|
32
|
+
Unauthorized = -50401,
|
|
33
|
+
/** App defined error equivalent to HTTP Status 403 */
|
|
34
|
+
Forbidden = -50403
|
|
35
|
+
}
|
|
36
|
+
export type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;
|
|
37
|
+
export interface JsonRpcSuccessResponse {
|
|
38
|
+
jsonrpc: JsonRpcVersion;
|
|
39
|
+
id: JsonRpcId;
|
|
40
|
+
result: any;
|
|
41
|
+
error?: never;
|
|
42
|
+
}
|
|
43
|
+
export interface JsonRpcErrorResponse {
|
|
44
|
+
jsonrpc: JsonRpcVersion;
|
|
45
|
+
id: JsonRpcId;
|
|
46
|
+
result?: never;
|
|
47
|
+
error: JsonRpcError;
|
|
48
|
+
}
|
|
49
|
+
export declare const createJsonRpcErrorResponse: (id: JsonRpcId, code: JsonRpcErrorCodes, message: string, data?: any) => JsonRpcErrorResponse;
|
|
50
|
+
export declare const createJsonRpcNotification: (method: string, params?: any) => JsonRpcRequest;
|
|
51
|
+
export declare const createJsonRpcSubscriptionRequest: (id: JsonRpcId, method: string, params?: any, subscriptionId?: JsonRpcId) => JsonRpcRequest;
|
|
52
|
+
export declare const createJsonRpcRequest: (id: JsonRpcId, method: string, params?: any) => JsonRpcRequest;
|
|
53
|
+
export declare const createJsonRpcSuccessResponse: (id: JsonRpcId, result?: any) => JsonRpcSuccessResponse;
|
|
54
|
+
//# sourceMappingURL=json-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.d.ts","sourceRoot":"","sources":["../../../../src/lib/json-rpc.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAC/C,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC;AAEnC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,iDAAiD;IACjD,YAAY,CAAC,EAAE;QACb,EAAE,EAAE,SAAS,CAAA;KACd,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,oBAAY,iBAAiB;IAE3B,cAAc,SAAS;IACvB,cAAc,SAAS;IACvB,aAAa,SAAS;IACtB,aAAa,SAAS;IACtB,UAAU,SAAS;IAEnB,sDAAsD;IACtD,UAAU,SAAS;IACnB,sDAAsD;IACtD,YAAY,SAAS;IACrB,sDAAsD;IACtD,SAAS,SAAS;CACnB;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAE5E,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,eAAO,MAAM,0BAA0B,OACjC,SAAS,QACP,iBAAiB,WACd,MAAM,SACR,GAAG,KACT,oBAUF,CAAC;AAEF,eAAO,MAAM,yBAAyB,WAC5B,MAAM,WACL,GAAG,KACX,cAMF,CAAC;AAEF,eAAO,MAAM,gCAAgC,OACvC,SAAS,UACL,MAAM,WACL,GAAG,mBACK,SAAS,KACzB,cAUF,CAAA;AAED,eAAO,MAAM,oBAAoB,OAC3B,SAAS,UACL,MAAM,WACL,GAAG,KACX,cAOF,CAAC;AAEF,eAAO,MAAM,4BAA4B,OACnC,SAAS,WACJ,GAAG,KACX,sBAMF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export var JsonRpcErrorCodes;
|
|
2
|
+
(function (JsonRpcErrorCodes) {
|
|
3
|
+
// JSON-RPC 2.0 pre-defined errors
|
|
4
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["InvalidRequest"] = -32600] = "InvalidRequest";
|
|
5
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["MethodNotFound"] = -32601] = "MethodNotFound";
|
|
6
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["InvalidParams"] = -32602] = "InvalidParams";
|
|
7
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["InternalError"] = -32603] = "InternalError";
|
|
8
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["ParseError"] = -32700] = "ParseError";
|
|
9
|
+
/** App defined error equivalent to HTTP Status 400 */
|
|
10
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["BadRequest"] = -50400] = "BadRequest";
|
|
11
|
+
/** App defined error equivalent to HTTP Status 401 */
|
|
12
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["Unauthorized"] = -50401] = "Unauthorized";
|
|
13
|
+
/** App defined error equivalent to HTTP Status 403 */
|
|
14
|
+
JsonRpcErrorCodes[JsonRpcErrorCodes["Forbidden"] = -50403] = "Forbidden";
|
|
15
|
+
})(JsonRpcErrorCodes || (JsonRpcErrorCodes = {}));
|
|
16
|
+
export const createJsonRpcErrorResponse = (id, code, message, data) => {
|
|
17
|
+
const error = { code, message };
|
|
18
|
+
if (data != undefined) {
|
|
19
|
+
error.data = data;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
jsonrpc: '2.0',
|
|
23
|
+
id,
|
|
24
|
+
error,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export const createJsonRpcNotification = (method, params) => {
|
|
28
|
+
return {
|
|
29
|
+
jsonrpc: '2.0',
|
|
30
|
+
method,
|
|
31
|
+
params,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export const createJsonRpcSubscriptionRequest = (id, method, params, subscriptionId) => {
|
|
35
|
+
return {
|
|
36
|
+
jsonrpc: '2.0',
|
|
37
|
+
id,
|
|
38
|
+
method,
|
|
39
|
+
params,
|
|
40
|
+
subscription: {
|
|
41
|
+
id: subscriptionId,
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export const createJsonRpcRequest = (id, method, params) => {
|
|
46
|
+
return {
|
|
47
|
+
jsonrpc: '2.0',
|
|
48
|
+
id,
|
|
49
|
+
method,
|
|
50
|
+
params,
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export const createJsonRpcSuccessResponse = (id, result) => {
|
|
54
|
+
return {
|
|
55
|
+
jsonrpc: '2.0',
|
|
56
|
+
id,
|
|
57
|
+
result: result ?? null,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=json-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.js","sourceRoot":"","sources":["../../../../src/lib/json-rpc.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAN,IAAY,iBAcX;AAdD,WAAY,iBAAiB;IAC3B,kCAAkC;IAClC,kFAAuB,CAAA;IACvB,kFAAuB,CAAA;IACvB,gFAAsB,CAAA;IACtB,gFAAsB,CAAA;IACtB,0EAAmB,CAAA;IAEnB,sDAAsD;IACtD,0EAAmB,CAAA;IACnB,sDAAsD;IACtD,8EAAqB,CAAA;IACrB,sDAAsD;IACtD,wEAAkB,CAAA;AACpB,CAAC,EAdW,iBAAiB,KAAjB,iBAAiB,QAc5B;AAkBD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,EAAa,EACb,IAAuB,EACvB,OAAe,EACf,IAAU,EACY,EAAE;IACxB,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,EAAE;QACF,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,MAAc,EACd,MAAY,EACI,EAAE;IAClB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,EAAa,EACb,MAAc,EACd,MAAY,EACZ,cAA0B,EACV,EAAE;IAClB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,EAAE;QACF,MAAM;QACN,MAAM;QACN,YAAY,EAAE;YACZ,EAAE,EAAE,cAAc;SACnB;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,EAAa,EACb,MAAc,EACd,MAAY,EACI,EAAE;IAClB,OAAO;QACL,OAAO,EAAE,KAAK;QACd,EAAE;QACF,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,EAAa,EACb,MAAY,EACY,EAAE;IAC1B,OAAO;QACL,OAAO,EAAE,KAAK;QACd,EAAE;QACF,MAAM,EAAE,MAAM,IAAI,IAAI;KACvB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// node.js 18 and earlier, needs globalThis.crypto polyfill. needed for dwn-sdk-js
|
|
3
|
+
import { webcrypto } from 'node:crypto';
|
|
4
|
+
import { DwnServer } from './dwn-server.js';
|
|
5
|
+
if (!globalThis.crypto) {
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
globalThis.crypto = webcrypto;
|
|
8
|
+
}
|
|
9
|
+
const dwnServer = new DwnServer();
|
|
10
|
+
await dwnServer.start();
|
|
11
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":";AACA,kFAAkF;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IACvB,aAAa;IACb,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAElC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,cAAc,wCAIzB,CAAC;AAEH,eAAO,MAAM,iBAAiB,6BAK5B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Counter, Histogram } from 'prom-client';
|
|
2
|
+
export const requestCounter = new Counter({
|
|
3
|
+
name: 'dwn_requests_total',
|
|
4
|
+
help: 'all dwn requests processed',
|
|
5
|
+
labelNames: ['method', 'status', 'error'],
|
|
6
|
+
});
|
|
7
|
+
export const responseHistogram = new Histogram({
|
|
8
|
+
name: 'http_response',
|
|
9
|
+
help: 'response histogram',
|
|
10
|
+
buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],
|
|
11
|
+
labelNames: ['route', 'code'],
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;IACxC,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,4BAA4B;IAClC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC;IAC7C,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;CAC9B,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A utility class for dynamically loading plugins from file paths.
|
|
3
|
+
*/
|
|
4
|
+
export declare class PluginLoader {
|
|
5
|
+
/**
|
|
6
|
+
* Dynamically loads a plugin from a file path by invoking the argument-less constructor of the default exported class.
|
|
7
|
+
*/
|
|
8
|
+
static loadPlugin<T>(filePath: string): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=plugin-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../src/plugin-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;WACiB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAShE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A utility class for dynamically loading plugins from file paths.
|
|
3
|
+
*/
|
|
4
|
+
export class PluginLoader {
|
|
5
|
+
/**
|
|
6
|
+
* Dynamically loads a plugin from a file path by invoking the argument-less constructor of the default exported class.
|
|
7
|
+
*/
|
|
8
|
+
static async loadPlugin(filePath) {
|
|
9
|
+
try {
|
|
10
|
+
const module = await import(filePath);
|
|
11
|
+
const instance = new module.default();
|
|
12
|
+
return instance;
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new Error(`Failed to load component at ${filePath}: ${error.message}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../../src/plugin-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAI,QAAgB;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAM,IAAI,MAAM,CAAC,OAAO,EAAO,CAAC;YAC9C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DwnServer } from './dwn-server.js';
|
|
2
|
+
export declare const gracefulShutdown: (dwnServer: DwnServer) => Promise<void>;
|
|
3
|
+
export type ProcessHandlers = {
|
|
4
|
+
unhandledRejectionHandler: (reason: any, promise: Promise<any>) => void;
|
|
5
|
+
uncaughtExceptionHandler: (err: Error) => void;
|
|
6
|
+
sigintHandler: () => Promise<void>;
|
|
7
|
+
sigtermHandler: () => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
export declare const setProcessHandlers: (dwnServer: DwnServer) => ProcessHandlers;
|
|
10
|
+
export declare const removeProcessHandlers: (handlers: ProcessHandlers) => void;
|
|
11
|
+
//# sourceMappingURL=process-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-handlers.d.ts","sourceRoot":"","sources":["../../../src/process-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAO,MAAM,gBAAgB,cAAqB,SAAS,KAAG,OAAO,CAAC,IAAI,CAIzE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,yBAAyB,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IACxE,wBAAwB,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,cAAe,SAAS,KAAG,eAmCzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,aAAc,eAAe,KAAG,IAYjE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const gracefulShutdown = async (dwnServer) => {
|
|
2
|
+
await dwnServer.stop();
|
|
3
|
+
console.log('http server stopped.. exiting');
|
|
4
|
+
process.exit(0);
|
|
5
|
+
};
|
|
6
|
+
export const setProcessHandlers = (dwnServer) => {
|
|
7
|
+
const unhandledRejectionHandler = (reason, promise) => {
|
|
8
|
+
console.error(`Unhandled promise rejection. Reason: ${reason}. Promise: ${JSON.stringify(promise)}`);
|
|
9
|
+
};
|
|
10
|
+
const uncaughtExceptionHandler = (err) => {
|
|
11
|
+
console.error('Uncaught exception:', err.stack || err);
|
|
12
|
+
};
|
|
13
|
+
const sigintHandler = async () => {
|
|
14
|
+
console.log('exit signal received [SIGINT]. starting graceful shutdown');
|
|
15
|
+
await gracefulShutdown(dwnServer);
|
|
16
|
+
};
|
|
17
|
+
const sigtermHandler = async () => {
|
|
18
|
+
console.log('exit signal received [SIGTERM]. starting graceful shutdown');
|
|
19
|
+
await gracefulShutdown(dwnServer);
|
|
20
|
+
};
|
|
21
|
+
process.on('unhandledRejection', unhandledRejectionHandler);
|
|
22
|
+
process.on('uncaughtException', uncaughtExceptionHandler);
|
|
23
|
+
process.on('SIGINT', sigintHandler);
|
|
24
|
+
process.on('SIGTERM', sigtermHandler);
|
|
25
|
+
// Store handlers to be able to remove them later
|
|
26
|
+
return {
|
|
27
|
+
unhandledRejectionHandler,
|
|
28
|
+
uncaughtExceptionHandler,
|
|
29
|
+
sigintHandler,
|
|
30
|
+
sigtermHandler
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export const removeProcessHandlers = (handlers) => {
|
|
34
|
+
const { unhandledRejectionHandler, uncaughtExceptionHandler, sigintHandler, sigtermHandler } = handlers;
|
|
35
|
+
process.removeListener('unhandledRejection', unhandledRejectionHandler);
|
|
36
|
+
process.removeListener('uncaughtException', uncaughtExceptionHandler);
|
|
37
|
+
process.removeListener('SIGINT', sigintHandler);
|
|
38
|
+
process.removeListener('SIGTERM', sigtermHandler);
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=process-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-handlers.js","sourceRoot":"","sources":["../../../src/process-handlers.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,SAAoB,EAAiB,EAAE;IAC5E,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAAmB,EAAE;IAC1E,MAAM,yBAAyB,GAAG,CAAC,MAAW,EAAE,OAAqB,EAAQ,EAAE;QAC7E,OAAO,CAAC,KAAK,CACX,wCAAwC,MAAM,cAAc,IAAI,CAAC,SAAS,CACxE,OAAO,CACR,EAAE,CACJ,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,wBAAwB,GAAG,CAAC,GAAU,EAAQ,EAAE;QACpD,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;QAC9C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;QAC/C,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtC,iDAAiD;IACjD,OAAO;QACL,yBAAyB;QACzB,wBAAwB;QACxB,aAAa;QACb,cAAc;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAyB,EAAQ,EAAE;IACvE,MAAM,EACJ,yBAAyB,EACzB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACf,GAAG,QAAQ,CAAC;IAEb,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;IACxE,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;IACtE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChD,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ProofOfWorkChallengeModel } from "./proof-of-work-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages proof-of-work challenge difficulty and lifecycle based on solve rate.
|
|
4
|
+
* Can have multiple instances each having their own desired solve rate and difficulty.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProofOfWorkManager {
|
|
7
|
+
static readonly defaultMaximumAllowedHashValue = "000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
|
|
8
|
+
private challengeNonces;
|
|
9
|
+
private proofOfWorkOfLastMinute;
|
|
10
|
+
private challengeSeed?;
|
|
11
|
+
private difficultyIncreaseMultiplier;
|
|
12
|
+
private currentMaximumAllowedHashValueAsBigInt;
|
|
13
|
+
private initialMaximumAllowedHashValueAsBigInt;
|
|
14
|
+
private desiredSolveCountPerMinute;
|
|
15
|
+
/**
|
|
16
|
+
* How often the challenge nonce is refreshed.
|
|
17
|
+
*/
|
|
18
|
+
challengeRefreshFrequencyInSeconds: number;
|
|
19
|
+
/**
|
|
20
|
+
* How often the difficulty is reevaluated.
|
|
21
|
+
*/
|
|
22
|
+
difficultyReevaluationFrequencyInSeconds: number;
|
|
23
|
+
/**
|
|
24
|
+
* The current maximum allowed hash value.
|
|
25
|
+
*/
|
|
26
|
+
get currentMaximumAllowedHashValue(): bigint;
|
|
27
|
+
/**
|
|
28
|
+
* The current proof-of-work solve rate.
|
|
29
|
+
*/
|
|
30
|
+
get currentSolveCountPerMinute(): number;
|
|
31
|
+
private constructor();
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new ProofOfWorkManager instance.
|
|
34
|
+
* @param input.difficultyIncreaseMultiplier How fast to increase difficulty when solve rate is higher than desired. Must be >= 1.
|
|
35
|
+
* Defaults to 1 which means if the solve rate is 2x the desired solve rate, the difficulty will increase by 2x.
|
|
36
|
+
* If set to 2, it means if the solve rate is 2x the desired solve rate, the difficulty will increase by 4x.
|
|
37
|
+
* @param input.challengeRefreshFrequencyInSeconds How often the challenge nonce is refreshed. Defaults to 10 minutes.
|
|
38
|
+
* @param input.difficultyReevaluationFrequencyInSeconds How often the difficulty is reevaluated. Defaults to 10 seconds.
|
|
39
|
+
*/
|
|
40
|
+
static create(input: {
|
|
41
|
+
desiredSolveCountPerMinute: number;
|
|
42
|
+
autoStart: boolean;
|
|
43
|
+
initialMaximumAllowedHashValue?: string;
|
|
44
|
+
difficultyIncreaseMultiplier?: number;
|
|
45
|
+
challengeSeed?: string;
|
|
46
|
+
challengeRefreshFrequencyInSeconds?: number;
|
|
47
|
+
difficultyReevaluationFrequencyInSeconds?: number;
|
|
48
|
+
}): Promise<ProofOfWorkManager>;
|
|
49
|
+
/**
|
|
50
|
+
* Starts the proof-of-work manager by starting the challenge nonce and difficulty refresh timers.
|
|
51
|
+
*/
|
|
52
|
+
start(): void;
|
|
53
|
+
getProofOfWorkChallenge(): ProofOfWorkChallengeModel;
|
|
54
|
+
/**
|
|
55
|
+
* Verifies the proof-of-work meets the difficulty requirement.
|
|
56
|
+
*/
|
|
57
|
+
verifyProofOfWork(proofOfWork: {
|
|
58
|
+
challengeNonce: string;
|
|
59
|
+
responseNonce: string;
|
|
60
|
+
requestData: string;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Records a successful proof-of-work.
|
|
64
|
+
* Exposed for testing purposes.
|
|
65
|
+
*/
|
|
66
|
+
recordProofOfWork(proofOfWorkId: string): Promise<void>;
|
|
67
|
+
private periodicallyRefreshChallengeNonce;
|
|
68
|
+
private periodicallyRefreshProofOfWorkDifficulty;
|
|
69
|
+
private removeProofOfWorkOlderThanOneMinute;
|
|
70
|
+
private refreshChallengeNonce;
|
|
71
|
+
/**
|
|
72
|
+
* Refreshes the difficulty by changing the max hash value.
|
|
73
|
+
* The higher the number, the easier. Scale 1 (hardest) to 2^256 (easiest), represented in HEX.
|
|
74
|
+
*
|
|
75
|
+
* If solve rate rate is higher than expected, the difficulty will increase rapidly.
|
|
76
|
+
* If solve rate is lower than expected, the difficulty will decrease gradually.
|
|
77
|
+
* The difficulty will never be lower than the initial difficulty.
|
|
78
|
+
*/
|
|
79
|
+
private refreshMaximumAllowedHashValue;
|
|
80
|
+
/**
|
|
81
|
+
* Only used by refreshMaximumAllowedHashValue() to reduce the challenge difficulty gradually.
|
|
82
|
+
*/
|
|
83
|
+
private hashValueIncrementPerEvaluation;
|
|
84
|
+
/**
|
|
85
|
+
* Verifies that the supplied string is a HEX string.
|
|
86
|
+
*/
|
|
87
|
+
static isHexString(str: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Converts a BigInt to a 256 bit HEX string with padded preceding zeros (64 characters).
|
|
90
|
+
*/
|
|
91
|
+
private static bigIntToHexString;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=proof-of-work-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work-manager.d.ts","sourceRoot":"","sources":["../../../../src/registration/proof-of-work-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAG1E;;;GAGG;AACH,qBAAa,kBAAkB;IAE7B,gBAAuB,8BAA8B,sEAAsE;IAG3H,OAAO,CAAC,eAAe,CAIrB;IAIF,OAAO,CAAC,uBAAuB,CAAkC;IAGjE,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,sCAAsC,CAAS;IACvD,OAAO,CAAC,sCAAsC,CAAS;IACvD,OAAO,CAAC,0BAA0B,CAAS;IAE3C;;OAEG;IACI,kCAAkC,EAAE,MAAM,CAAC;IAElD;;OAEG;IACI,wCAAwC,EAAE,MAAM,CAAC;IAExD;;OAEG;IACH,IAAW,8BAA8B,IAAI,MAAM,CAElD;IAED;;OAEG;IACH,IAAW,0BAA0B,IAAI,MAAM,CAE9C;IAED,OAAO;IAoBP;;;;;;;OAOG;WACiB,MAAM,CAAC,KAAK,EAAE;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,SAAS,EAAE,OAAO,CAAC;QACnB,8BAA8B,CAAC,EAAE,MAAM,CAAC;QACxC,4BAA4B,CAAC,EAAE,MAAM,CAAC;QACtC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kCAAkC,CAAC,EAAE,MAAM,CAAC;QAC5C,wCAAwC,CAAC,EAAE,MAAM,CAAA;KAClD,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwB/B;;OAEG;IACI,KAAK,IAAI,IAAI;IAKb,uBAAuB,IAAI,yBAAyB;IAO3D;;OAEG;IACU,iBAAiB,CAAC,WAAW,EAAE;QAC1C,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjB;;;OAGG;IACU,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,OAAO,CAAC,iCAAiC;IAUzC,OAAO,CAAC,wCAAwC;IAUhD,OAAO,CAAC,mCAAmC;IAS3C,OAAO,CAAC,qBAAqB;IAoB7B;;;;;;;OAOG;YACW,8BAA8B;IAyD5C;;OAEG;IACH,OAAO,CAAC,+BAA+B,CAAa;IAEpD;;OAEG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK/C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAQjC"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { DwnServerError, DwnServerErrorCode } from "../dwn-error.js";
|
|
2
|
+
import { ProofOfWork } from "./proof-of-work.js";
|
|
3
|
+
/**
|
|
4
|
+
* Manages proof-of-work challenge difficulty and lifecycle based on solve rate.
|
|
5
|
+
* Can have multiple instances each having their own desired solve rate and difficulty.
|
|
6
|
+
*/
|
|
7
|
+
export class ProofOfWorkManager {
|
|
8
|
+
// Takes from seconds to ~1 minute to solve on an M1 MacBook.
|
|
9
|
+
static defaultMaximumAllowedHashValue = '000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
|
|
10
|
+
// Challenge nonces that can be used for proof-of-work.
|
|
11
|
+
challengeNonces;
|
|
12
|
+
// There is opportunity to improve implementation here.
|
|
13
|
+
// TODO: https://github.com/TBD54566975/dwn-server/issues/101
|
|
14
|
+
proofOfWorkOfLastMinute = new Map(); // proofOfWorkId -> timestamp of proof-of-work
|
|
15
|
+
// Seed to generate the challenge nonce from, this allows all DWN instances in a cluster to generate the same challenge.
|
|
16
|
+
challengeSeed;
|
|
17
|
+
difficultyIncreaseMultiplier;
|
|
18
|
+
currentMaximumAllowedHashValueAsBigInt;
|
|
19
|
+
initialMaximumAllowedHashValueAsBigInt;
|
|
20
|
+
desiredSolveCountPerMinute;
|
|
21
|
+
/**
|
|
22
|
+
* How often the challenge nonce is refreshed.
|
|
23
|
+
*/
|
|
24
|
+
challengeRefreshFrequencyInSeconds;
|
|
25
|
+
/**
|
|
26
|
+
* How often the difficulty is reevaluated.
|
|
27
|
+
*/
|
|
28
|
+
difficultyReevaluationFrequencyInSeconds;
|
|
29
|
+
/**
|
|
30
|
+
* The current maximum allowed hash value.
|
|
31
|
+
*/
|
|
32
|
+
get currentMaximumAllowedHashValue() {
|
|
33
|
+
return this.currentMaximumAllowedHashValueAsBigInt;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The current proof-of-work solve rate.
|
|
37
|
+
*/
|
|
38
|
+
get currentSolveCountPerMinute() {
|
|
39
|
+
return this.proofOfWorkOfLastMinute.size;
|
|
40
|
+
}
|
|
41
|
+
constructor(input) {
|
|
42
|
+
const { desiredSolveCountPerMinute, initialMaximumAllowedHashValue } = input;
|
|
43
|
+
this.challengeSeed = input.challengeSeed;
|
|
44
|
+
this.challengeNonces = { currentChallengeNonce: ProofOfWork.generateNonce() };
|
|
45
|
+
this.currentMaximumAllowedHashValueAsBigInt = BigInt(`0x${initialMaximumAllowedHashValue}`);
|
|
46
|
+
this.initialMaximumAllowedHashValueAsBigInt = BigInt(`0x${initialMaximumAllowedHashValue}`);
|
|
47
|
+
this.desiredSolveCountPerMinute = desiredSolveCountPerMinute;
|
|
48
|
+
this.difficultyIncreaseMultiplier = input.difficultyIncreaseMultiplier;
|
|
49
|
+
this.challengeRefreshFrequencyInSeconds = input.challengeRefreshFrequencyInSeconds;
|
|
50
|
+
this.difficultyReevaluationFrequencyInSeconds = input.difficultyReevaluationFrequencyInSeconds;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a new ProofOfWorkManager instance.
|
|
54
|
+
* @param input.difficultyIncreaseMultiplier How fast to increase difficulty when solve rate is higher than desired. Must be >= 1.
|
|
55
|
+
* Defaults to 1 which means if the solve rate is 2x the desired solve rate, the difficulty will increase by 2x.
|
|
56
|
+
* If set to 2, it means if the solve rate is 2x the desired solve rate, the difficulty will increase by 4x.
|
|
57
|
+
* @param input.challengeRefreshFrequencyInSeconds How often the challenge nonce is refreshed. Defaults to 10 minutes.
|
|
58
|
+
* @param input.difficultyReevaluationFrequencyInSeconds How often the difficulty is reevaluated. Defaults to 10 seconds.
|
|
59
|
+
*/
|
|
60
|
+
static async create(input) {
|
|
61
|
+
const { desiredSolveCountPerMinute } = input;
|
|
62
|
+
const initialMaximumAllowedHashValue = input.initialMaximumAllowedHashValue ?? ProofOfWorkManager.defaultMaximumAllowedHashValue;
|
|
63
|
+
const difficultyIncreaseMultiplier = input.difficultyIncreaseMultiplier ?? 1; // 1x default
|
|
64
|
+
const challengeRefreshFrequencyInSeconds = input.challengeRefreshFrequencyInSeconds ?? 10 * 60; // 10 minutes default
|
|
65
|
+
const difficultyReevaluationFrequencyInSeconds = input.difficultyReevaluationFrequencyInSeconds ?? 10; // 10 seconds default
|
|
66
|
+
const proofOfWorkManager = new ProofOfWorkManager({
|
|
67
|
+
desiredSolveCountPerMinute,
|
|
68
|
+
initialMaximumAllowedHashValue,
|
|
69
|
+
difficultyIncreaseMultiplier,
|
|
70
|
+
challengeSeed: input.challengeSeed,
|
|
71
|
+
challengeRefreshFrequencyInSeconds,
|
|
72
|
+
difficultyReevaluationFrequencyInSeconds
|
|
73
|
+
});
|
|
74
|
+
if (input.autoStart) {
|
|
75
|
+
proofOfWorkManager.start();
|
|
76
|
+
}
|
|
77
|
+
return proofOfWorkManager;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Starts the proof-of-work manager by starting the challenge nonce and difficulty refresh timers.
|
|
81
|
+
*/
|
|
82
|
+
start() {
|
|
83
|
+
this.periodicallyRefreshChallengeNonce();
|
|
84
|
+
this.periodicallyRefreshProofOfWorkDifficulty();
|
|
85
|
+
}
|
|
86
|
+
getProofOfWorkChallenge() {
|
|
87
|
+
return {
|
|
88
|
+
challengeNonce: this.challengeNonces.currentChallengeNonce,
|
|
89
|
+
maximumAllowedHashValue: ProofOfWorkManager.bigIntToHexString(this.currentMaximumAllowedHashValue),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Verifies the proof-of-work meets the difficulty requirement.
|
|
94
|
+
*/
|
|
95
|
+
async verifyProofOfWork(proofOfWork) {
|
|
96
|
+
const { challengeNonce, responseNonce, requestData } = proofOfWork;
|
|
97
|
+
if (this.proofOfWorkOfLastMinute.has(responseNonce)) {
|
|
98
|
+
throw new DwnServerError(DwnServerErrorCode.ProofOfWorkManagerResponseNonceReused, `Not allowed to reused response nonce: ${responseNonce}.`);
|
|
99
|
+
}
|
|
100
|
+
// Verify response nonce is a HEX string that represents a 256 bit value.
|
|
101
|
+
if (!ProofOfWorkManager.isHexString(responseNonce) || responseNonce.length !== 64) {
|
|
102
|
+
throw new DwnServerError(DwnServerErrorCode.ProofOfWorkManagerInvalidResponseNonceFormat, `Response nonce not a HEX string representing a 256 bit value: ${responseNonce}.`);
|
|
103
|
+
}
|
|
104
|
+
// Verify challenge nonce is valid.
|
|
105
|
+
const { previousChallengeNonce, currentChallengeNonce, nextChallengeNonce } = this.challengeNonces;
|
|
106
|
+
const acceptableChallengeNonces = [previousChallengeNonce, currentChallengeNonce, nextChallengeNonce].filter(nonce => nonce !== undefined && nonce !== '');
|
|
107
|
+
if (!acceptableChallengeNonces.includes(challengeNonce)) {
|
|
108
|
+
throw new DwnServerError(DwnServerErrorCode.ProofOfWorkManagerInvalidChallengeNonce, `Unknown or expired challenge nonce: ${challengeNonce}.`);
|
|
109
|
+
}
|
|
110
|
+
const maximumAllowedHashValue = this.currentMaximumAllowedHashValue;
|
|
111
|
+
ProofOfWork.verifyResponseNonce({ challengeNonce, responseNonce, requestData, maximumAllowedHashValue });
|
|
112
|
+
this.recordProofOfWork(responseNonce);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Records a successful proof-of-work.
|
|
116
|
+
* Exposed for testing purposes.
|
|
117
|
+
*/
|
|
118
|
+
async recordProofOfWork(proofOfWorkId) {
|
|
119
|
+
this.proofOfWorkOfLastMinute.set(proofOfWorkId, Date.now());
|
|
120
|
+
}
|
|
121
|
+
periodicallyRefreshChallengeNonce() {
|
|
122
|
+
try {
|
|
123
|
+
this.refreshChallengeNonce();
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`Encountered error while refreshing challenge nonce: ${error}`);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
setTimeout(async () => this.periodicallyRefreshChallengeNonce(), this.challengeRefreshFrequencyInSeconds * 1000);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
periodicallyRefreshProofOfWorkDifficulty() {
|
|
133
|
+
try {
|
|
134
|
+
this.refreshMaximumAllowedHashValue();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error(`Encountered error while updating proof of work difficulty: ${error}`);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
setTimeout(async () => this.periodicallyRefreshProofOfWorkDifficulty(), this.difficultyReevaluationFrequencyInSeconds * 1000);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
removeProofOfWorkOlderThanOneMinute() {
|
|
144
|
+
const oneMinuteAgo = Date.now() - 60 * 1000;
|
|
145
|
+
for (const proofOfWorkId of this.proofOfWorkOfLastMinute.keys()) {
|
|
146
|
+
if (this.proofOfWorkOfLastMinute.get(proofOfWorkId) < oneMinuteAgo) {
|
|
147
|
+
this.proofOfWorkOfLastMinute.delete(proofOfWorkId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
refreshChallengeNonce() {
|
|
152
|
+
// If challenge seed is supplied, use it to deterministically generate the challenge nonces.
|
|
153
|
+
if (this.challengeSeed !== undefined) {
|
|
154
|
+
const currentRefreshIntervalId = Math.floor(Date.now() / (this.challengeRefreshFrequencyInSeconds * 1000));
|
|
155
|
+
const previousRefreshIntervalId = currentRefreshIntervalId - 1;
|
|
156
|
+
const nextRefreshIntervalId = currentRefreshIntervalId + 1;
|
|
157
|
+
const previousChallengeNonce = ProofOfWork.hashAsHexString([this.challengeSeed, previousRefreshIntervalId.toString(), this.challengeSeed]);
|
|
158
|
+
const currentChallengeNonce = ProofOfWork.hashAsHexString([this.challengeSeed, currentRefreshIntervalId.toString(), this.challengeSeed]);
|
|
159
|
+
const nextChallengeNonce = ProofOfWork.hashAsHexString([this.challengeSeed, nextRefreshIntervalId.toString(), this.challengeSeed]);
|
|
160
|
+
this.challengeNonces = { previousChallengeNonce, currentChallengeNonce, nextChallengeNonce };
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const newChallengeNonce = ProofOfWork.generateNonce();
|
|
164
|
+
this.challengeNonces.previousChallengeNonce = this.challengeNonces.currentChallengeNonce;
|
|
165
|
+
this.challengeNonces.currentChallengeNonce = newChallengeNonce;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Refreshes the difficulty by changing the max hash value.
|
|
170
|
+
* The higher the number, the easier. Scale 1 (hardest) to 2^256 (easiest), represented in HEX.
|
|
171
|
+
*
|
|
172
|
+
* If solve rate rate is higher than expected, the difficulty will increase rapidly.
|
|
173
|
+
* If solve rate is lower than expected, the difficulty will decrease gradually.
|
|
174
|
+
* The difficulty will never be lower than the initial difficulty.
|
|
175
|
+
*/
|
|
176
|
+
async refreshMaximumAllowedHashValue() {
|
|
177
|
+
// Cleanup proof-of-work cache and update solve rate.
|
|
178
|
+
this.removeProofOfWorkOlderThanOneMinute();
|
|
179
|
+
const latestSolveCountPerMinute = this.proofOfWorkOfLastMinute.size;
|
|
180
|
+
// NOTE: bigint arithmetic does NOT work with decimals, so we work with "full numbers" by multiplying by a scale factor.
|
|
181
|
+
const scaleFactor = 1_000_000;
|
|
182
|
+
const difficultyEvaluationsPerMinute = 60000 / (this.difficultyReevaluationFrequencyInSeconds * 1000); // assumed to be >= 1;
|
|
183
|
+
// NOTE: easier difficulty is represented by a larger max allowed hash value
|
|
184
|
+
// and harder difficulty is represented by a smaller max allowed hash value.
|
|
185
|
+
if (latestSolveCountPerMinute > this.desiredSolveCountPerMinute) {
|
|
186
|
+
// if solve rate is higher than desired, make difficulty harder by making the max allowed hash value smaller
|
|
187
|
+
const currentSolveRateInFractionOfDesiredSolveRate = latestSolveCountPerMinute / this.desiredSolveCountPerMinute;
|
|
188
|
+
const newMaximumAllowedHashValueAsBigIntPriorToMultiplierAdjustment = (this.currentMaximumAllowedHashValueAsBigInt * BigInt(scaleFactor)) /
|
|
189
|
+
(BigInt(Math.floor(currentSolveRateInFractionOfDesiredSolveRate * this.difficultyIncreaseMultiplier * scaleFactor)));
|
|
190
|
+
const hashValueDecreaseAmountPriorToEvaluationFrequencyAdjustment = (this.currentMaximumAllowedHashValueAsBigInt - newMaximumAllowedHashValueAsBigIntPriorToMultiplierAdjustment) *
|
|
191
|
+
(BigInt(Math.floor(this.difficultyIncreaseMultiplier * scaleFactor)) / BigInt(scaleFactor));
|
|
192
|
+
// Adjustment based on the reevaluation frequency to provide more-or-less consistent behavior regardless of the reevaluation frequency.
|
|
193
|
+
const hashValueDecreaseAmount = hashValueDecreaseAmountPriorToEvaluationFrequencyAdjustment / BigInt(difficultyEvaluationsPerMinute);
|
|
194
|
+
this.currentMaximumAllowedHashValueAsBigInt -= hashValueDecreaseAmount;
|
|
195
|
+
// Resetting to allow hash increment to be recalculated when difficulty needs to be reduced (in `else` block below)
|
|
196
|
+
this.hashValueIncrementPerEvaluation = undefined;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// if solve rate is lower than desired, make difficulty easier by making the max allowed hash value larger
|
|
200
|
+
if (this.currentMaximumAllowedHashValueAsBigInt === this.initialMaximumAllowedHashValueAsBigInt) {
|
|
201
|
+
// if current difficulty is already at initial difficulty, nothing to do
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (this.hashValueIncrementPerEvaluation === undefined) {
|
|
205
|
+
const backToInitialDifficultyInMinutes = 10;
|
|
206
|
+
const differenceBetweenInitialAndCurrentDifficulty = this.initialMaximumAllowedHashValueAsBigInt - this.currentMaximumAllowedHashValueAsBigInt;
|
|
207
|
+
this.hashValueIncrementPerEvaluation
|
|
208
|
+
= differenceBetweenInitialAndCurrentDifficulty / BigInt(backToInitialDifficultyInMinutes * difficultyEvaluationsPerMinute);
|
|
209
|
+
}
|
|
210
|
+
// if newly calculated difficulty is lower than initial difficulty, just use the initial difficulty
|
|
211
|
+
const newMaximumAllowedHashValueAsBigInt = this.currentMaximumAllowedHashValueAsBigInt + this.hashValueIncrementPerEvaluation;
|
|
212
|
+
if (newMaximumAllowedHashValueAsBigInt >= this.initialMaximumAllowedHashValueAsBigInt) {
|
|
213
|
+
this.currentMaximumAllowedHashValueAsBigInt = this.initialMaximumAllowedHashValueAsBigInt;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
this.currentMaximumAllowedHashValueAsBigInt = newMaximumAllowedHashValueAsBigInt;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Only used by refreshMaximumAllowedHashValue() to reduce the challenge difficulty gradually.
|
|
222
|
+
*/
|
|
223
|
+
hashValueIncrementPerEvaluation = BigInt(1);
|
|
224
|
+
/**
|
|
225
|
+
* Verifies that the supplied string is a HEX string.
|
|
226
|
+
*/
|
|
227
|
+
static isHexString(str) {
|
|
228
|
+
const regexp = /^[0-9a-fA-F]+$/;
|
|
229
|
+
return regexp.test(str);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Converts a BigInt to a 256 bit HEX string with padded preceding zeros (64 characters).
|
|
233
|
+
*/
|
|
234
|
+
static bigIntToHexString(int) {
|
|
235
|
+
let hex = int.toString(16).toUpperCase();
|
|
236
|
+
const stringLength = hex.length;
|
|
237
|
+
for (let pad = stringLength; pad < 64; pad++) {
|
|
238
|
+
hex = '0' + hex;
|
|
239
|
+
}
|
|
240
|
+
return hex;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=proof-of-work-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work-manager.js","sourceRoot":"","sources":["../../../../src/registration/proof-of-work-manager.ts"],"names":[],"mappings":"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"}
|