@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 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work-types.d.ts","sourceRoot":"","sources":["../../../../src/registration/proof-of-work-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work-types.js","sourceRoot":"","sources":["../../../../src/registration/proof-of-work-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility methods related to proof-of-work.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ProofOfWork {
|
|
5
|
+
/**
|
|
6
|
+
* Computes the resulting hash of the given proof-of-work input.
|
|
7
|
+
*/
|
|
8
|
+
static computeHash(input: {
|
|
9
|
+
challengeNonce: string;
|
|
10
|
+
responseNonce: string;
|
|
11
|
+
requestData: string;
|
|
12
|
+
}): string;
|
|
13
|
+
/**
|
|
14
|
+
* Computes the hash of the given array of strings.
|
|
15
|
+
*/
|
|
16
|
+
static hashAsHexString(input: string[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* Verifies that the response nonce meets the proof-of-work difficulty requirement.
|
|
19
|
+
*/
|
|
20
|
+
static verifyResponseNonce(input: {
|
|
21
|
+
maximumAllowedHashValue: bigint;
|
|
22
|
+
challengeNonce: string;
|
|
23
|
+
responseNonce: string;
|
|
24
|
+
requestData: string;
|
|
25
|
+
}): void;
|
|
26
|
+
/**
|
|
27
|
+
* Finds a response nonce that qualifies the difficulty requirement for the given proof-of-work challenge and request data.
|
|
28
|
+
* NOTE: mainly for demonstrating the procedure to find a qualified response nonce.
|
|
29
|
+
* Will need to artificially introduce asynchrony to allow other tasks to run if this method is to be used in a real-world client.
|
|
30
|
+
*/
|
|
31
|
+
static findQualifiedResponseNonce(input: {
|
|
32
|
+
maximumAllowedHashValue: string;
|
|
33
|
+
challengeNonce: string;
|
|
34
|
+
requestData: string;
|
|
35
|
+
}): string;
|
|
36
|
+
/**
|
|
37
|
+
* Generates 32 random bytes expressed as a HEX string.
|
|
38
|
+
*/
|
|
39
|
+
static generateNonce(): string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=proof-of-work.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work.d.ts","sourceRoot":"","sources":["../../../../src/registration/proof-of-work.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;WACW,WAAW,CAAC,KAAK,EAAE;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IAKV;;OAEG;WACW,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAStD;;OAEG;WACW,mBAAmB,CAAC,KAAK,EAAE;QACvC,uBAAuB,EAAE,MAAM,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI;IAYR;;;;OAIG;WACW,0BAA0B,CAAC,KAAK,EAAE;QAC9C,uBAAuB,EAAE,MAAM,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IA+BV;;OAEG;WACW,aAAa,IAAI,MAAM;CAItC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'crypto';
|
|
2
|
+
import { DwnServerError, DwnServerErrorCode } from '../dwn-error.js';
|
|
3
|
+
/**
|
|
4
|
+
* Utility methods related to proof-of-work.
|
|
5
|
+
*/
|
|
6
|
+
export class ProofOfWork {
|
|
7
|
+
/**
|
|
8
|
+
* Computes the resulting hash of the given proof-of-work input.
|
|
9
|
+
*/
|
|
10
|
+
static computeHash(input) {
|
|
11
|
+
const hashInput = [input.challengeNonce, input.responseNonce, input.requestData];
|
|
12
|
+
return this.hashAsHexString(hashInput);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Computes the hash of the given array of strings.
|
|
16
|
+
*/
|
|
17
|
+
static hashAsHexString(input) {
|
|
18
|
+
const hash = createHash('sha256');
|
|
19
|
+
for (const item of input) {
|
|
20
|
+
hash.update(item);
|
|
21
|
+
}
|
|
22
|
+
return hash.digest('hex');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Verifies that the response nonce meets the proof-of-work difficulty requirement.
|
|
26
|
+
*/
|
|
27
|
+
static verifyResponseNonce(input) {
|
|
28
|
+
const computedHash = this.computeHash(input);
|
|
29
|
+
const computedHashAsBigInt = BigInt(`0x${computedHash}`);
|
|
30
|
+
if (computedHashAsBigInt > input.maximumAllowedHashValue) {
|
|
31
|
+
throw new DwnServerError(DwnServerErrorCode.ProofOfWorkInsufficientSolutionNonce, `Insufficient computed hash ${computedHashAsBigInt}, needs to be <= ${input.maximumAllowedHashValue}.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Finds a response nonce that qualifies the difficulty requirement for the given proof-of-work challenge and request data.
|
|
36
|
+
* NOTE: mainly for demonstrating the procedure to find a qualified response nonce.
|
|
37
|
+
* Will need to artificially introduce asynchrony to allow other tasks to run if this method is to be used in a real-world client.
|
|
38
|
+
*/
|
|
39
|
+
static findQualifiedResponseNonce(input) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
const { maximumAllowedHashValue, challengeNonce, requestData } = input;
|
|
42
|
+
const maximumAllowedHashValueAsBigInt = BigInt(`0x${maximumAllowedHashValue}`);
|
|
43
|
+
let iterations = 1;
|
|
44
|
+
let randomNonce;
|
|
45
|
+
let qualifiedSolutionNonceFound = false;
|
|
46
|
+
do {
|
|
47
|
+
randomNonce = this.generateNonce();
|
|
48
|
+
const computedHash = this.computeHash({
|
|
49
|
+
challengeNonce,
|
|
50
|
+
responseNonce: randomNonce,
|
|
51
|
+
requestData,
|
|
52
|
+
});
|
|
53
|
+
const computedHashAsBigInt = BigInt(`0x${computedHash}`);
|
|
54
|
+
qualifiedSolutionNonceFound = computedHashAsBigInt <= maximumAllowedHashValueAsBigInt;
|
|
55
|
+
iterations++;
|
|
56
|
+
} while (!qualifiedSolutionNonceFound);
|
|
57
|
+
// Log final/successful iteration.
|
|
58
|
+
console.log(`iterations: ${iterations}, time lapsed: ${Date.now() - startTime} ms`);
|
|
59
|
+
return randomNonce;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generates 32 random bytes expressed as a HEX string.
|
|
63
|
+
*/
|
|
64
|
+
static generateNonce() {
|
|
65
|
+
const hexString = randomBytes(32).toString('hex').toUpperCase();
|
|
66
|
+
return hexString;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=proof-of-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-of-work.js","sourceRoot":"","sources":["../../../../src/registration/proof-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE;;GAEG;AACH,MAAM,OAAO,WAAW;IACtB;;OAEG;IACI,MAAM,CAAC,WAAW,CAAC,KAIzB;QACC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,eAAe,CAAC,KAAe;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,mBAAmB,CAAC,KAKjC;QACC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;QAEzD,IAAI,oBAAoB,GAAG,KAAK,CAAC,uBAAuB,EAAE,CAAC;YACzD,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,oCAAoC,EACvD,8BAA8B,oBAAoB,oBAAoB,KAAK,CAAC,uBAAuB,GAAG,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,0BAA0B,CAAC,KAIxC;QACC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,EAAE,uBAAuB,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QACvE,MAAM,+BAA+B,GAAG,MAAM,CAAC,KAAK,uBAAuB,EAAE,CAAC,CAAC;QAE/E,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,CAAC;QAChB,IAAI,2BAA2B,GAAG,KAAK,CAAC;QACxC,GAAG,CAAC;YACF,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;gBACpC,cAAc;gBACd,aAAa,EAAE,WAAW;gBAC1B,WAAW;aACZ,CAAC,CAAC;YACH,MAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;YAEzD,2BAA2B,GAAG,oBAAoB,IAAI,+BAA+B,CAAC;YAEtF,UAAU,EAAE,CAAC;QACf,CAAC,QAAQ,CAAC,2BAA2B,EAAE;QAEvC,kCAAkC;QAClC,OAAO,CAAC,GAAG,CACT,eAAe,UAAU,kBAAkB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,KAAK,CACvE,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,aAAa;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { RegistrationData, RegistrationRequest } from "./registration-types.js";
|
|
2
|
+
import type { ProofOfWorkChallengeModel } from "./proof-of-work-types.js";
|
|
3
|
+
import type { ActiveTenantCheckResult, TenantGate } from "@enbox/dwn-sdk-js";
|
|
4
|
+
/**
|
|
5
|
+
* The RegistrationManager is responsible for managing the registration of tenants.
|
|
6
|
+
* It handles tenant registration requests and provides the corresponding `TenantGate` implementation.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RegistrationManager implements TenantGate {
|
|
9
|
+
private proofOfWorkManager;
|
|
10
|
+
private registrationStore;
|
|
11
|
+
private termsOfServiceHash?;
|
|
12
|
+
private termsOfService?;
|
|
13
|
+
/**
|
|
14
|
+
* The terms-of-service.
|
|
15
|
+
*/
|
|
16
|
+
getTermsOfService(): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The terms-of-service hash.
|
|
19
|
+
*/
|
|
20
|
+
getTermsOfServiceHash(): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Updates the terms-of-service. Exposed for testing purposes.
|
|
23
|
+
*/
|
|
24
|
+
updateTermsOfService(termsOfService: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new RegistrationManager instance.
|
|
27
|
+
* @param input.registrationStoreUrl - The URL of the registration store.
|
|
28
|
+
* Set to `undefined` or empty string if tenant registration is not required (ie. DWN is open for all).
|
|
29
|
+
*
|
|
30
|
+
*/
|
|
31
|
+
static create(input: {
|
|
32
|
+
registrationStoreUrl?: string;
|
|
33
|
+
termsOfServiceFilePath?: string;
|
|
34
|
+
proofOfWorkChallengeNonceSeed?: string;
|
|
35
|
+
proofOfWorkInitialMaximumAllowedHash?: string;
|
|
36
|
+
}): Promise<RegistrationManager>;
|
|
37
|
+
/**
|
|
38
|
+
* Gets the proof-of-work challenge.
|
|
39
|
+
*/
|
|
40
|
+
getProofOfWorkChallenge(): ProofOfWorkChallengeModel;
|
|
41
|
+
/**
|
|
42
|
+
* Handles a registration request.
|
|
43
|
+
*/
|
|
44
|
+
handleRegistrationRequest(registrationRequest: RegistrationRequest): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Records the given registration data in the database.
|
|
47
|
+
* Exposed as a public method for testing purposes.
|
|
48
|
+
*/
|
|
49
|
+
recordTenantRegistration(registrationData: RegistrationData): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* The TenantGate implementation.
|
|
52
|
+
*/
|
|
53
|
+
isActiveTenant(tenant: string): Promise<ActiveTenantCheckResult>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=registration-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-manager.d.ts","sourceRoot":"","sources":["../../../../src/registration/registration-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI7E;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IACpD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,cAAc,CAAC,CAAS;IAEhC;;OAEG;IACI,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACI,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAIlD;;OAEG;IACI,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAKzD;;;;;OAKG;WACiB,MAAM,CAAC,KAAK,EAAE;QAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;QAC/B,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,oCAAoC,CAAC,EAAE,MAAM,CAAC;KAC/C,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAgChC;;OAEG;IACI,uBAAuB,IAAI,yBAAyB;IAK3D;;OAEG;IACU,yBAAyB,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB/F;;;OAGG;IACU,wBAAwB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF;;OAEG;IACU,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAwB9E"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ProofOfWorkManager } from "./proof-of-work-manager.js";
|
|
2
|
+
import { ProofOfWork } from "./proof-of-work.js";
|
|
3
|
+
import { RegistrationStore } from "./registration-store.js";
|
|
4
|
+
import { DwnServerError, DwnServerErrorCode } from "../dwn-error.js";
|
|
5
|
+
import { getDialectFromUrl } from "../storage.js";
|
|
6
|
+
import { readFileSync } from "fs";
|
|
7
|
+
/**
|
|
8
|
+
* The RegistrationManager is responsible for managing the registration of tenants.
|
|
9
|
+
* It handles tenant registration requests and provides the corresponding `TenantGate` implementation.
|
|
10
|
+
*/
|
|
11
|
+
export class RegistrationManager {
|
|
12
|
+
proofOfWorkManager;
|
|
13
|
+
registrationStore;
|
|
14
|
+
termsOfServiceHash;
|
|
15
|
+
termsOfService;
|
|
16
|
+
/**
|
|
17
|
+
* The terms-of-service.
|
|
18
|
+
*/
|
|
19
|
+
getTermsOfService() {
|
|
20
|
+
return this.termsOfService;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The terms-of-service hash.
|
|
24
|
+
*/
|
|
25
|
+
getTermsOfServiceHash() {
|
|
26
|
+
return this.termsOfServiceHash;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Updates the terms-of-service. Exposed for testing purposes.
|
|
30
|
+
*/
|
|
31
|
+
updateTermsOfService(termsOfService) {
|
|
32
|
+
this.termsOfServiceHash = ProofOfWork.hashAsHexString([termsOfService]);
|
|
33
|
+
this.termsOfService = termsOfService;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates a new RegistrationManager instance.
|
|
37
|
+
* @param input.registrationStoreUrl - The URL of the registration store.
|
|
38
|
+
* Set to `undefined` or empty string if tenant registration is not required (ie. DWN is open for all).
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
static async create(input) {
|
|
42
|
+
const { termsOfServiceFilePath, registrationStoreUrl } = input;
|
|
43
|
+
const registrationManager = new RegistrationManager();
|
|
44
|
+
// short-circuit if tenant registration is not required.
|
|
45
|
+
if (!registrationStoreUrl) {
|
|
46
|
+
return registrationManager;
|
|
47
|
+
}
|
|
48
|
+
// Initialize terms-of-service.
|
|
49
|
+
if (termsOfServiceFilePath !== undefined) {
|
|
50
|
+
const termsOfService = readFileSync(termsOfServiceFilePath).toString();
|
|
51
|
+
registrationManager.updateTermsOfService(termsOfService);
|
|
52
|
+
}
|
|
53
|
+
// Initialize and start ProofOfWorkManager.
|
|
54
|
+
registrationManager.proofOfWorkManager = await ProofOfWorkManager.create({
|
|
55
|
+
autoStart: true,
|
|
56
|
+
desiredSolveCountPerMinute: 10,
|
|
57
|
+
initialMaximumAllowedHashValue: input.proofOfWorkInitialMaximumAllowedHash,
|
|
58
|
+
challengeSeed: input.proofOfWorkChallengeNonceSeed,
|
|
59
|
+
});
|
|
60
|
+
// Initialize RegistrationStore.
|
|
61
|
+
const sqlDialect = getDialectFromUrl(new URL(registrationStoreUrl));
|
|
62
|
+
const registrationStore = await RegistrationStore.create(sqlDialect);
|
|
63
|
+
registrationManager.registrationStore = registrationStore;
|
|
64
|
+
return registrationManager;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gets the proof-of-work challenge.
|
|
68
|
+
*/
|
|
69
|
+
getProofOfWorkChallenge() {
|
|
70
|
+
const proofOfWorkChallenge = this.proofOfWorkManager.getProofOfWorkChallenge();
|
|
71
|
+
return proofOfWorkChallenge;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handles a registration request.
|
|
75
|
+
*/
|
|
76
|
+
async handleRegistrationRequest(registrationRequest) {
|
|
77
|
+
// Ensure the supplied terms of service hash matches the one we require.
|
|
78
|
+
if (registrationRequest.registrationData.termsOfServiceHash !== this.termsOfServiceHash) {
|
|
79
|
+
throw new DwnServerError(DwnServerErrorCode.RegistrationManagerInvalidOrOutdatedTermsOfServiceHash, `Expecting terms-of-service hash ${this.termsOfServiceHash}, but got ${registrationRequest.registrationData.termsOfServiceHash}.`);
|
|
80
|
+
}
|
|
81
|
+
const { challengeNonce, responseNonce } = registrationRequest.proofOfWork;
|
|
82
|
+
await this.proofOfWorkManager.verifyProofOfWork({
|
|
83
|
+
challengeNonce,
|
|
84
|
+
responseNonce,
|
|
85
|
+
requestData: JSON.stringify(registrationRequest.registrationData),
|
|
86
|
+
});
|
|
87
|
+
// Store tenant registration data in database.
|
|
88
|
+
await this.recordTenantRegistration(registrationRequest.registrationData);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Records the given registration data in the database.
|
|
92
|
+
* Exposed as a public method for testing purposes.
|
|
93
|
+
*/
|
|
94
|
+
async recordTenantRegistration(registrationData) {
|
|
95
|
+
await this.registrationStore.insertOrUpdateTenantRegistration(registrationData);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The TenantGate implementation.
|
|
99
|
+
*/
|
|
100
|
+
async isActiveTenant(tenant) {
|
|
101
|
+
// If there is no registration store initialized, then DWN is open for all.
|
|
102
|
+
if (this.registrationStore === undefined) {
|
|
103
|
+
return { isActiveTenant: true };
|
|
104
|
+
}
|
|
105
|
+
const tenantRegistration = await this.registrationStore.getTenantRegistration(tenant);
|
|
106
|
+
if (tenantRegistration === undefined) {
|
|
107
|
+
return {
|
|
108
|
+
isActiveTenant: false,
|
|
109
|
+
detail: 'Not a registered tenant.'
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (tenantRegistration.termsOfServiceHash !== this.termsOfServiceHash) {
|
|
113
|
+
return {
|
|
114
|
+
isActiveTenant: false,
|
|
115
|
+
detail: 'Agreed terms-of-service is outdated.'
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return { isActiveTenant: true };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=registration-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-manager.js","sourceRoot":"","sources":["../../../../src/registration/registration-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RegistrationData } from './registration-types.js';
|
|
2
|
+
import type { Dialect } from '@enbox/dwn-sql-store';
|
|
3
|
+
/**
|
|
4
|
+
* The RegistrationStore is responsible for storing and retrieving tenant registration information.
|
|
5
|
+
*/
|
|
6
|
+
export declare class RegistrationStore {
|
|
7
|
+
private static readonly registeredTenantTableName;
|
|
8
|
+
private db;
|
|
9
|
+
private constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new RegistrationStore instance.
|
|
12
|
+
*/
|
|
13
|
+
static create(sqlDialect: Dialect): Promise<RegistrationStore>;
|
|
14
|
+
private initialize;
|
|
15
|
+
/**
|
|
16
|
+
* Inserts or updates the tenant registration information.
|
|
17
|
+
*/
|
|
18
|
+
insertOrUpdateTenantRegistration(registrationData: RegistrationData): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Retrieves the tenant registration information.
|
|
21
|
+
*/
|
|
22
|
+
getTenantRegistration(tenantDid: string): Promise<RegistrationData | undefined>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registration-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-store.d.ts","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAuB;IAExE,OAAO,CAAC,EAAE,CAA+B;IAEzC,OAAO;IAIP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAQ7D,UAAU;IASxB;;OAEG;IACU,gCAAgC,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAahG;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;CAc7F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Kysely } from 'kysely';
|
|
2
|
+
/**
|
|
3
|
+
* The RegistrationStore is responsible for storing and retrieving tenant registration information.
|
|
4
|
+
*/
|
|
5
|
+
export class RegistrationStore {
|
|
6
|
+
static registeredTenantTableName = 'registeredTenants';
|
|
7
|
+
db;
|
|
8
|
+
constructor(sqlDialect) {
|
|
9
|
+
this.db = new Kysely({ dialect: sqlDialect });
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new RegistrationStore instance.
|
|
13
|
+
*/
|
|
14
|
+
static async create(sqlDialect) {
|
|
15
|
+
const proofOfWorkManager = new RegistrationStore(sqlDialect);
|
|
16
|
+
await proofOfWorkManager.initialize();
|
|
17
|
+
return proofOfWorkManager;
|
|
18
|
+
}
|
|
19
|
+
async initialize() {
|
|
20
|
+
await this.db.schema
|
|
21
|
+
.createTable(RegistrationStore.registeredTenantTableName)
|
|
22
|
+
.ifNotExists()
|
|
23
|
+
.addColumn('did', 'text', (column) => column.primaryKey())
|
|
24
|
+
.addColumn('termsOfServiceHash', 'text')
|
|
25
|
+
.execute();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Inserts or updates the tenant registration information.
|
|
29
|
+
*/
|
|
30
|
+
async insertOrUpdateTenantRegistration(registrationData) {
|
|
31
|
+
await this.db
|
|
32
|
+
.insertInto(RegistrationStore.registeredTenantTableName)
|
|
33
|
+
.values(registrationData)
|
|
34
|
+
.onConflict((oc) => oc.column('did').doUpdateSet((eb) => ({
|
|
35
|
+
termsOfServiceHash: eb.ref('excluded.termsOfServiceHash'),
|
|
36
|
+
})))
|
|
37
|
+
// Executes the query. No error is thrown if the query doesn’t affect any rows (ie. if the insert or update didn’t change anything).
|
|
38
|
+
.executeTakeFirst();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Retrieves the tenant registration information.
|
|
42
|
+
*/
|
|
43
|
+
async getTenantRegistration(tenantDid) {
|
|
44
|
+
const result = await this.db
|
|
45
|
+
.selectFrom(RegistrationStore.registeredTenantTableName)
|
|
46
|
+
.select('did')
|
|
47
|
+
.select('termsOfServiceHash')
|
|
48
|
+
.where('did', '=', tenantDid)
|
|
49
|
+
.execute();
|
|
50
|
+
if (result.length === 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return result[0];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=registration-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-store.js","sourceRoot":"","sources":["../../../../src/registration/registration-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAU,yBAAyB,GAAG,mBAAmB,CAAC;IAEhE,EAAE,CAA+B;IAEzC,YAAqB,UAAmB;QACtC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAuB,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC5C,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAE7D,MAAM,kBAAkB,CAAC,UAAU,EAAE,CAAC;QAEtC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;aACnB,WAAW,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;aACxD,WAAW,EAAE;aACb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;aACzD,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC;aACvC,OAAO,EAAE,CAAC;IACb,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gCAAgC,CAAC,gBAAkC;QAC9E,MAAM,IAAI,CAAC,EAAE;aACV,UAAU,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;aACvD,MAAM,CAAC,gBAAgB,CAAC;aACxB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACpC,kBAAkB,EAAE,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC;SAC1D,CAAC,CAAC,CACJ;YACD,oIAAoI;aACnI,gBAAgB,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aACzB,UAAU,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;aACvD,MAAM,CAAC,KAAK,CAAC;aACb,MAAM,CAAC,oBAAoB,CAAC;aAC5B,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC;aAC5B,OAAO,EAAE,CAAC;QAEb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration data model to be included as a parameter in the /registration POST request.
|
|
3
|
+
*/
|
|
4
|
+
export type RegistrationData = {
|
|
5
|
+
did: string;
|
|
6
|
+
termsOfServiceHash: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Registration request model of the /registration POST API.
|
|
10
|
+
*/
|
|
11
|
+
export type RegistrationRequest = {
|
|
12
|
+
proofOfWork: {
|
|
13
|
+
challengeNonce: string;
|
|
14
|
+
responseNonce: string;
|
|
15
|
+
};
|
|
16
|
+
registrationData: RegistrationData;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=registration-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-types.d.ts","sourceRoot":"","sources":["../../../../src/registration/registration-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,gBAAgB,EAAE,gBAAgB,CAAA;CACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-types.js","sourceRoot":"","sources":["../../../../src/registration/registration-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DidResolver } from '@enbox/dids';
|
|
2
|
+
import type { DataStore, DwnConfig, EventLog, EventStream, MessageStore, ResumableTaskStore, TenantGate } from '@enbox/dwn-sdk-js';
|
|
3
|
+
import type { Dialect } from '@enbox/dwn-sql-store';
|
|
4
|
+
import type { DwnServerConfig } from './config.js';
|
|
5
|
+
export declare enum StoreType {
|
|
6
|
+
DataStore = 0,
|
|
7
|
+
MessageStore = 1,
|
|
8
|
+
EventLog = 2,
|
|
9
|
+
ResumableTaskStore = 3
|
|
10
|
+
}
|
|
11
|
+
export declare enum BackendTypes {
|
|
12
|
+
LEVEL = "level",
|
|
13
|
+
SQLITE = "sqlite",
|
|
14
|
+
MYSQL = "mysql",
|
|
15
|
+
POSTGRES = "postgres"
|
|
16
|
+
}
|
|
17
|
+
export type DwnStore = DataStore | EventLog | MessageStore | ResumableTaskStore;
|
|
18
|
+
export declare function getDwnConfig(config: DwnServerConfig, options: {
|
|
19
|
+
didResolver?: DidResolver;
|
|
20
|
+
tenantGate?: TenantGate;
|
|
21
|
+
eventStream?: EventStream;
|
|
22
|
+
}): Promise<DwnConfig>;
|
|
23
|
+
export declare function getDialectFromUrl(connectionUrl: URL): Dialect;
|
|
24
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAyBnD,oBAAY,SAAS;IACnB,SAAS,IAAA;IACT,YAAY,IAAA;IACZ,QAAQ,IAAA;IACR,kBAAkB,IAAA;CACnB;AAED,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,kBAAkB,CAAC;AAEhF,wBAAsB,YAAY,CAChC,MAAM,EAAI,eAAe,EACzB,OAAO,EAAG;IACR,WAAW,CAAC,EAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAI,UAAU,CAAC;IAC1B,WAAW,CAAC,EAAG,WAAW,CAAC;CAC5B,GACA,OAAO,CAAC,SAAS,CAAC,CAQpB;AAwGD,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,CA2B7D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import Cursor from 'pg-cursor';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import pg from 'pg';
|
|
5
|
+
import { createPool as MySQLCreatePool } from 'mysql2';
|
|
6
|
+
import { PluginLoader } from './plugin-loader.js';
|
|
7
|
+
import { DataStoreLevel, EventLogLevel, MessageStoreLevel, ResumableTaskStoreLevel, } from '@enbox/dwn-sdk-js';
|
|
8
|
+
import { DataStoreSql, EventLogSql, MessageStoreSql, MysqlDialect, PostgresDialect, ResumableTaskStoreSql, SqliteDialect, } from '@enbox/dwn-sql-store';
|
|
9
|
+
export var StoreType;
|
|
10
|
+
(function (StoreType) {
|
|
11
|
+
StoreType[StoreType["DataStore"] = 0] = "DataStore";
|
|
12
|
+
StoreType[StoreType["MessageStore"] = 1] = "MessageStore";
|
|
13
|
+
StoreType[StoreType["EventLog"] = 2] = "EventLog";
|
|
14
|
+
StoreType[StoreType["ResumableTaskStore"] = 3] = "ResumableTaskStore";
|
|
15
|
+
})(StoreType || (StoreType = {}));
|
|
16
|
+
export var BackendTypes;
|
|
17
|
+
(function (BackendTypes) {
|
|
18
|
+
BackendTypes["LEVEL"] = "level";
|
|
19
|
+
BackendTypes["SQLITE"] = "sqlite";
|
|
20
|
+
BackendTypes["MYSQL"] = "mysql";
|
|
21
|
+
BackendTypes["POSTGRES"] = "postgres";
|
|
22
|
+
})(BackendTypes || (BackendTypes = {}));
|
|
23
|
+
export async function getDwnConfig(config, options) {
|
|
24
|
+
const { tenantGate, eventStream, didResolver } = options;
|
|
25
|
+
const dataStore = await getStore(config.dataStore, StoreType.DataStore);
|
|
26
|
+
const eventLog = await getStore(config.eventLog, StoreType.EventLog);
|
|
27
|
+
const messageStore = await getStore(config.messageStore, StoreType.MessageStore);
|
|
28
|
+
const resumableTaskStore = await getStore(config.resumableTaskStore, StoreType.ResumableTaskStore);
|
|
29
|
+
return { didResolver, eventStream, eventLog, dataStore, messageStore, resumableTaskStore, tenantGate };
|
|
30
|
+
}
|
|
31
|
+
function getLevelStore(storeURI, storeType) {
|
|
32
|
+
switch (storeType) {
|
|
33
|
+
case StoreType.DataStore:
|
|
34
|
+
return new DataStoreLevel({
|
|
35
|
+
blockstoreLocation: storeURI.host + storeURI.pathname + '/DATASTORE',
|
|
36
|
+
});
|
|
37
|
+
case StoreType.MessageStore:
|
|
38
|
+
return new MessageStoreLevel({
|
|
39
|
+
blockstoreLocation: storeURI.host + storeURI.pathname + '/MESSAGESTORE',
|
|
40
|
+
indexLocation: storeURI.host + storeURI.pathname + '/INDEX',
|
|
41
|
+
});
|
|
42
|
+
case StoreType.EventLog:
|
|
43
|
+
return new EventLogLevel({
|
|
44
|
+
location: storeURI.host + storeURI.pathname + '/EVENTLOG',
|
|
45
|
+
});
|
|
46
|
+
case StoreType.ResumableTaskStore:
|
|
47
|
+
return new ResumableTaskStoreLevel({
|
|
48
|
+
location: storeURI.host + storeURI.pathname + '/RESUMABLE-TASK-STORE',
|
|
49
|
+
});
|
|
50
|
+
default:
|
|
51
|
+
throw new Error('Unexpected level store type');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function getSqlStore(connectionUrl, storeType) {
|
|
55
|
+
const dialect = getDialectFromUrl(connectionUrl);
|
|
56
|
+
switch (storeType) {
|
|
57
|
+
case StoreType.DataStore:
|
|
58
|
+
return new DataStoreSql(dialect);
|
|
59
|
+
case StoreType.MessageStore:
|
|
60
|
+
return new MessageStoreSql(dialect);
|
|
61
|
+
case StoreType.EventLog:
|
|
62
|
+
return new EventLogSql(dialect);
|
|
63
|
+
case StoreType.ResumableTaskStore:
|
|
64
|
+
return new ResumableTaskStoreSql(dialect);
|
|
65
|
+
default:
|
|
66
|
+
throw new Error(`Unsupported store type ${storeType} for SQL store.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if the given string is a file path.
|
|
71
|
+
*/
|
|
72
|
+
function isFilePath(configString) {
|
|
73
|
+
const filePathPrefixes = ['/', './', '../'];
|
|
74
|
+
return filePathPrefixes.some(prefix => configString.startsWith(prefix));
|
|
75
|
+
}
|
|
76
|
+
async function getStore(storeConfigString, storeType) {
|
|
77
|
+
if (isFilePath(storeConfigString)) {
|
|
78
|
+
return await loadStoreFromFilePath(storeConfigString, storeType);
|
|
79
|
+
}
|
|
80
|
+
// else treat the `storeConfigString` as a connection string
|
|
81
|
+
const storeURI = new URL(storeConfigString);
|
|
82
|
+
switch (storeURI.protocol.slice(0, -1)) {
|
|
83
|
+
case BackendTypes.LEVEL:
|
|
84
|
+
return getLevelStore(storeURI, storeType);
|
|
85
|
+
case BackendTypes.SQLITE:
|
|
86
|
+
case BackendTypes.MYSQL:
|
|
87
|
+
case BackendTypes.POSTGRES:
|
|
88
|
+
return getSqlStore(storeURI, storeType);
|
|
89
|
+
default:
|
|
90
|
+
throw invalidStorageSchemeMessage(storeURI.protocol);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Loads a DWN store plugin of the given type from the given file path.
|
|
95
|
+
*/
|
|
96
|
+
async function loadStoreFromFilePath(filePath, storeType) {
|
|
97
|
+
switch (storeType) {
|
|
98
|
+
case StoreType.DataStore:
|
|
99
|
+
return await PluginLoader.loadPlugin(filePath);
|
|
100
|
+
case StoreType.EventLog:
|
|
101
|
+
return await PluginLoader.loadPlugin(filePath);
|
|
102
|
+
case StoreType.MessageStore:
|
|
103
|
+
return await PluginLoader.loadPlugin(filePath);
|
|
104
|
+
case StoreType.ResumableTaskStore:
|
|
105
|
+
return await PluginLoader.loadPlugin(filePath);
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Loading store for unsupported store type ${storeType} from path ${filePath}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function getDialectFromUrl(connectionUrl) {
|
|
111
|
+
switch (connectionUrl.protocol.slice(0, -1)) {
|
|
112
|
+
case BackendTypes.SQLITE:
|
|
113
|
+
const path = connectionUrl.host + connectionUrl.pathname;
|
|
114
|
+
console.log('SQL-lite relative path:', path ? path : undefined); // NOTE, using ? for lose equality comparison
|
|
115
|
+
if (connectionUrl.host && !fs.existsSync(connectionUrl.host)) {
|
|
116
|
+
console.log('SQL-lite directory does not exist, creating:', connectionUrl.host);
|
|
117
|
+
fs.mkdirSync(connectionUrl.host, { recursive: true });
|
|
118
|
+
}
|
|
119
|
+
// Use in-memory database if no path is provided (for tests)
|
|
120
|
+
const dbPath = path || ':memory:';
|
|
121
|
+
return new SqliteDialect({
|
|
122
|
+
database: async () => new Database(dbPath),
|
|
123
|
+
});
|
|
124
|
+
case BackendTypes.MYSQL:
|
|
125
|
+
return new MysqlDialect({
|
|
126
|
+
pool: async () => MySQLCreatePool(connectionUrl.toString()),
|
|
127
|
+
});
|
|
128
|
+
case BackendTypes.POSTGRES:
|
|
129
|
+
return new PostgresDialect({
|
|
130
|
+
pool: async () => new pg.Pool({ connectionString: connectionUrl.toString() }),
|
|
131
|
+
cursor: Cursor,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function invalidStorageSchemeMessage(protocol) {
|
|
136
|
+
const schemes = [];
|
|
137
|
+
for (const [_, value] of Object.entries(BackendTypes)) {
|
|
138
|
+
schemes.push(value);
|
|
139
|
+
}
|
|
140
|
+
return ('Unknown storage protocol ' +
|
|
141
|
+
protocol.slice(0, 1) +
|
|
142
|
+
'! Please use one of: ' +
|
|
143
|
+
schemes.join(', ') +
|
|
144
|
+
'. For details, see README');
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage.ts"],"names":[],"mappings":"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"}
|