@enbox/dwn-server 0.0.2 → 0.0.4
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 +3 -2
- package/README.md +115 -215
- package/dist/esm/src/admin/activity-log.d.ts +44 -0
- package/dist/esm/src/admin/activity-log.d.ts.map +1 -0
- package/dist/esm/src/admin/activity-log.js +85 -0
- package/dist/esm/src/admin/activity-log.js.map +1 -0
- package/dist/esm/src/admin/admin-api.d.ts +61 -0
- package/dist/esm/src/admin/admin-api.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-api.js +1047 -0
- package/dist/esm/src/admin/admin-api.js.map +1 -0
- package/dist/esm/src/admin/admin-auth.d.ts +9 -0
- package/dist/esm/src/admin/admin-auth.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-auth.js +45 -0
- package/dist/esm/src/admin/admin-auth.js.map +1 -0
- package/dist/esm/src/admin/admin-store.d.ts +111 -0
- package/dist/esm/src/admin/admin-store.d.ts.map +1 -0
- package/dist/esm/src/admin/admin-store.js +376 -0
- package/dist/esm/src/admin/admin-store.js.map +1 -0
- package/dist/esm/src/admin/audit-log.d.ts +94 -0
- package/dist/esm/src/admin/audit-log.d.ts.map +1 -0
- package/dist/esm/src/admin/audit-log.js +220 -0
- package/dist/esm/src/admin/audit-log.js.map +1 -0
- package/dist/esm/src/admin/index.d.ts +10 -0
- package/dist/esm/src/admin/index.d.ts.map +1 -0
- package/dist/esm/src/admin/index.js +7 -0
- package/dist/esm/src/admin/index.js.map +1 -0
- package/dist/esm/src/admin/types.d.ts +306 -0
- package/dist/esm/src/admin/types.d.ts.map +1 -0
- package/dist/esm/src/admin/types.js +2 -0
- package/dist/esm/src/admin/types.js.map +1 -0
- package/dist/esm/src/admin/webhook-manager.d.ts +55 -0
- package/dist/esm/src/admin/webhook-manager.d.ts.map +1 -0
- package/dist/esm/src/admin/webhook-manager.js +184 -0
- package/dist/esm/src/admin/webhook-manager.js.map +1 -0
- package/dist/esm/src/config.d.ts +124 -9
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +155 -13
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/connection/connection-manager.d.ts +32 -9
- package/dist/esm/src/connection/connection-manager.d.ts.map +1 -1
- package/dist/esm/src/connection/connection-manager.js +38 -5
- package/dist/esm/src/connection/connection-manager.js.map +1 -1
- package/dist/esm/src/connection/flow-controller.d.ts +53 -0
- package/dist/esm/src/connection/flow-controller.d.ts.map +1 -0
- package/dist/esm/src/connection/flow-controller.js +101 -0
- package/dist/esm/src/connection/flow-controller.js.map +1 -0
- package/dist/esm/src/connection/socket-connection.d.ts +54 -18
- package/dist/esm/src/connection/socket-connection.d.ts.map +1 -1
- package/dist/esm/src/connection/socket-connection.js +102 -40
- package/dist/esm/src/connection/socket-connection.js.map +1 -1
- package/dist/esm/src/delivery-service.d.ts +43 -0
- package/dist/esm/src/delivery-service.d.ts.map +1 -0
- package/dist/esm/src/delivery-service.js +574 -0
- package/dist/esm/src/delivery-service.js.map +1 -0
- package/dist/esm/src/dwn-error.d.ts +10 -1
- package/dist/esm/src/dwn-error.d.ts.map +1 -1
- package/dist/esm/src/dwn-error.js +9 -0
- package/dist/esm/src/dwn-error.js.map +1 -1
- package/dist/esm/src/dwn-server.d.ts +13 -6
- package/dist/esm/src/dwn-server.d.ts.map +1 -1
- package/dist/esm/src/dwn-server.js +199 -24
- package/dist/esm/src/dwn-server.js.map +1 -1
- package/dist/esm/src/http-api.d.ts +28 -13
- package/dist/esm/src/http-api.d.ts.map +1 -1
- package/dist/esm/src/http-api.js +649 -374
- package/dist/esm/src/http-api.js.map +1 -1
- package/dist/esm/src/index.d.ts +6 -2
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +4 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/json-rpc-api.js +2 -1
- package/dist/esm/src/json-rpc-api.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js +109 -7
- package/dist/esm/src/json-rpc-handlers/dwn/process-message.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts +20 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.d.ts.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js +41 -0
- package/dist/esm/src/json-rpc-handlers/subscription/ack.js.map +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/close.js +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/close.js.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts.map +1 -1
- package/dist/esm/src/json-rpc-handlers/subscription/index.js +1 -0
- package/dist/esm/src/json-rpc-handlers/subscription/index.js.map +1 -1
- package/dist/esm/src/lib/json-rpc-router.d.ts +25 -8
- package/dist/esm/src/lib/json-rpc-router.d.ts.map +1 -1
- package/dist/esm/src/lib/json-rpc-router.js.map +1 -1
- package/dist/esm/src/lib/sql-utils.d.ts +6 -0
- package/dist/esm/src/lib/sql-utils.d.ts.map +1 -0
- package/dist/esm/src/lib/sql-utils.js +8 -0
- package/dist/esm/src/lib/sql-utils.js.map +1 -0
- package/dist/esm/src/main.js +0 -6
- package/dist/esm/src/main.js.map +1 -1
- package/dist/esm/src/message-processed-hook.d.ts +35 -0
- package/dist/esm/src/message-processed-hook.d.ts.map +1 -0
- package/dist/esm/src/message-processed-hook.js +2 -0
- package/dist/esm/src/message-processed-hook.js.map +1 -0
- package/dist/esm/src/metrics.d.ts +14 -2
- package/dist/esm/src/metrics.d.ts.map +1 -1
- package/dist/esm/src/metrics.js +41 -1
- package/dist/esm/src/metrics.js.map +1 -1
- package/dist/esm/src/plugins/event-log-nats.d.ts +25 -0
- package/dist/esm/src/plugins/event-log-nats.d.ts.map +1 -0
- package/dist/esm/src/plugins/event-log-nats.js +379 -0
- package/dist/esm/src/plugins/event-log-nats.js.map +1 -0
- package/dist/esm/src/rate-limiter.d.ts +60 -0
- package/dist/esm/src/rate-limiter.d.ts.map +1 -0
- package/dist/esm/src/rate-limiter.js +116 -0
- package/dist/esm/src/rate-limiter.js.map +1 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts +53 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.d.ts.map +1 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.js +90 -0
- package/dist/esm/src/registration/jwt-provider-auth-plugin.js.map +1 -0
- package/dist/esm/src/registration/open-auth-handler.d.ts +37 -0
- package/dist/esm/src/registration/open-auth-handler.d.ts.map +1 -0
- package/dist/esm/src/registration/open-auth-handler.js +214 -0
- package/dist/esm/src/registration/open-auth-handler.js.map +1 -0
- package/dist/esm/src/registration/proof-of-work-manager.d.ts +1 -1
- package/dist/esm/src/registration/proof-of-work-manager.d.ts.map +1 -1
- package/dist/esm/src/registration/proof-of-work-manager.js +3 -3
- package/dist/esm/src/registration/proof-of-work-manager.js.map +1 -1
- package/dist/esm/src/registration/provider-auth-plugin.d.ts +46 -0
- package/dist/esm/src/registration/provider-auth-plugin.d.ts.map +1 -0
- package/dist/esm/src/registration/provider-auth-plugin.js +29 -0
- package/dist/esm/src/registration/provider-auth-plugin.js.map +1 -0
- package/dist/esm/src/registration/registration-manager.d.ts +28 -5
- package/dist/esm/src/registration/registration-manager.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-manager.js +83 -12
- package/dist/esm/src/registration/registration-manager.js.map +1 -1
- package/dist/esm/src/registration/registration-store.d.ts +83 -3
- package/dist/esm/src/registration/registration-store.d.ts.map +1 -1
- package/dist/esm/src/registration/registration-store.js +248 -11
- package/dist/esm/src/registration/registration-store.js.map +1 -1
- package/dist/esm/src/storage.d.ts +5 -5
- package/dist/esm/src/storage.d.ts.map +1 -1
- package/dist/esm/src/storage.js +105 -24
- package/dist/esm/src/storage.js.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/sql-ttl-cache.js +11 -3
- package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -1
- package/dist/esm/src/web5-connect/web5-connect-server.js +2 -2
- package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -1
- package/dist/esm/src/ws-api.d.ts +18 -4
- package/dist/esm/src/ws-api.d.ts.map +1 -1
- package/dist/esm/src/ws-api.js +12 -16
- package/dist/esm/src/ws-api.js.map +1 -1
- package/package.json +34 -53
- package/src/admin/activity-log.ts +100 -0
- package/src/admin/admin-api.ts +1308 -0
- package/src/admin/admin-auth.ts +56 -0
- package/src/admin/admin-store.ts +515 -0
- package/src/admin/audit-log.ts +327 -0
- package/src/admin/index.ts +34 -0
- package/src/admin/types.ts +352 -0
- package/src/admin/webhook-manager.ts +245 -0
- package/src/config.ts +190 -22
- package/src/connection/connection-manager.ts +67 -17
- package/src/connection/flow-controller.ts +117 -0
- package/src/connection/socket-connection.ts +144 -67
- package/src/delivery-service.ts +740 -0
- package/src/dwn-error.ts +11 -2
- package/src/dwn-server.ts +254 -39
- package/src/http-api.ts +736 -392
- package/src/index.ts +13 -2
- package/src/json-rpc-api.ts +2 -1
- package/src/json-rpc-handlers/dwn/process-message.ts +149 -15
- package/src/json-rpc-handlers/subscription/ack.ts +63 -0
- package/src/json-rpc-handlers/subscription/close.ts +5 -9
- package/src/json-rpc-handlers/subscription/index.ts +1 -0
- package/src/lib/json-rpc-router.ts +26 -11
- package/src/lib/sql-utils.ts +7 -0
- package/src/main.ts +0 -8
- package/src/message-processed-hook.ts +33 -0
- package/src/metrics.ts +57 -8
- package/src/plugins/event-log-nats.ts +466 -0
- package/src/process-handlers.ts +5 -5
- package/src/rate-limiter.ts +143 -0
- package/src/registration/jwt-provider-auth-plugin.ts +119 -0
- package/src/registration/open-auth-handler.ts +263 -0
- package/src/registration/proof-of-work-manager.ts +11 -10
- package/src/registration/provider-auth-plugin.ts +84 -0
- package/src/registration/registration-manager.ts +129 -31
- package/src/registration/registration-store.ts +332 -22
- package/src/storage.ts +136 -40
- package/src/web5-connect/sql-ttl-cache.ts +12 -5
- package/src/web5-connect/web5-connect-server.ts +9 -8
- package/src/ws-api.ts +39 -26
- package/dist/cjs/index.js +0 -6811
- package/dist/cjs/package.json +0 -1
- package/dist/esm/src/json-rpc-socket.d.ts +0 -39
- package/dist/esm/src/json-rpc-socket.d.ts.map +0 -1
- package/dist/esm/src/json-rpc-socket.js +0 -125
- package/dist/esm/src/json-rpc-socket.js.map +0 -1
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts +0 -10
- package/dist/esm/src/lib/http-server-shutdown-handler.d.ts.map +0 -1
- package/dist/esm/src/lib/http-server-shutdown-handler.js +0 -65
- package/dist/esm/src/lib/http-server-shutdown-handler.js.map +0 -1
- package/dist/esm/src/lib/json-rpc.d.ts +0 -54
- package/dist/esm/src/lib/json-rpc.d.ts.map +0 -1
- package/dist/esm/src/lib/json-rpc.js +0 -60
- package/dist/esm/src/lib/json-rpc.js.map +0 -1
- package/dist/esm/src/registration/proof-of-work-types.d.ts +0 -8
- package/dist/esm/src/registration/proof-of-work-types.d.ts.map +0 -1
- package/dist/esm/src/registration/proof-of-work-types.js +0 -2
- package/dist/esm/src/registration/proof-of-work-types.js.map +0 -1
- package/dist/esm/src/registration/registration-types.d.ts +0 -18
- package/dist/esm/src/registration/registration-types.d.ts.map +0 -1
- package/dist/esm/src/registration/registration-types.js +0 -2
- package/dist/esm/src/registration/registration-types.js.map +0 -1
- package/dist/esm/tests/common-scenario-validator.d.ts +0 -11
- package/dist/esm/tests/common-scenario-validator.d.ts.map +0 -1
- package/dist/esm/tests/common-scenario-validator.js +0 -114
- package/dist/esm/tests/common-scenario-validator.js.map +0 -1
- package/dist/esm/tests/connection/connection-manager.spec.d.ts +0 -2
- package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +0 -1
- package/dist/esm/tests/connection/connection-manager.spec.js +0 -47
- package/dist/esm/tests/connection/connection-manager.spec.js.map +0 -1
- package/dist/esm/tests/connection/socket-connection.spec.d.ts +0 -2
- package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +0 -1
- package/dist/esm/tests/connection/socket-connection.spec.js +0 -125
- package/dist/esm/tests/connection/socket-connection.spec.js.map +0 -1
- package/dist/esm/tests/cors/http-api.browser.d.ts +0 -2
- package/dist/esm/tests/cors/http-api.browser.d.ts.map +0 -1
- package/dist/esm/tests/cors/http-api.browser.js +0 -60
- package/dist/esm/tests/cors/http-api.browser.js.map +0 -1
- package/dist/esm/tests/cors/ping.browser.d.ts +0 -2
- package/dist/esm/tests/cors/ping.browser.d.ts.map +0 -1
- package/dist/esm/tests/cors/ping.browser.js +0 -7
- package/dist/esm/tests/cors/ping.browser.js.map +0 -1
- package/dist/esm/tests/dwn-process-message.spec.d.ts +0 -2
- package/dist/esm/tests/dwn-process-message.spec.d.ts.map +0 -1
- package/dist/esm/tests/dwn-process-message.spec.js +0 -172
- package/dist/esm/tests/dwn-process-message.spec.js.map +0 -1
- package/dist/esm/tests/dwn-server.spec.d.ts +0 -2
- package/dist/esm/tests/dwn-server.spec.d.ts.map +0 -1
- package/dist/esm/tests/dwn-server.spec.js +0 -49
- package/dist/esm/tests/dwn-server.spec.js.map +0 -1
- package/dist/esm/tests/http-api.spec.d.ts +0 -2
- package/dist/esm/tests/http-api.spec.d.ts.map +0 -1
- package/dist/esm/tests/http-api.spec.js +0 -775
- package/dist/esm/tests/http-api.spec.js.map +0 -1
- package/dist/esm/tests/json-rpc-socket.spec.d.ts +0 -2
- package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +0 -1
- package/dist/esm/tests/json-rpc-socket.spec.js +0 -225
- package/dist/esm/tests/json-rpc-socket.spec.js.map +0 -1
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/data-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/data-store-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/event-log-sqlite.js +0 -23
- package/dist/esm/tests/plugins/event-log-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +0 -17
- package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +0 -1
- package/dist/esm/tests/plugins/event-stream-in-memory.js +0 -21
- package/dist/esm/tests/plugins/event-stream-in-memory.js.map +0 -1
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/message-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/message-store-sqlite.js.map +0 -1
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +0 -17
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +0 -1
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +0 -23
- package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +0 -1
- package/dist/esm/tests/process-handler.spec.d.ts +0 -2
- package/dist/esm/tests/process-handler.spec.d.ts.map +0 -1
- package/dist/esm/tests/process-handler.spec.js +0 -60
- package/dist/esm/tests/process-handler.spec.js.map +0 -1
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +0 -2
- package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +0 -1
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js +0 -157
- package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +0 -1
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +0 -2
- package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +0 -1
- package/dist/esm/tests/rpc-subscribe-close.spec.js +0 -81
- package/dist/esm/tests/rpc-subscribe-close.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +0 -73
- package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/registration.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/registration.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/registration.spec.js +0 -507
- package/dist/esm/tests/scenarios/registration.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +0 -2
- package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +0 -1
- package/dist/esm/tests/scenarios/web5-connect.spec.js +0 -137
- package/dist/esm/tests/scenarios/web5-connect.spec.js.map +0 -1
- package/dist/esm/tests/test-dwn.d.ts +0 -7
- package/dist/esm/tests/test-dwn.d.ts.map +0 -1
- package/dist/esm/tests/test-dwn.js +0 -34
- package/dist/esm/tests/test-dwn.js.map +0 -1
- package/dist/esm/tests/utils.d.ts +0 -46
- package/dist/esm/tests/utils.d.ts.map +0 -1
- package/dist/esm/tests/utils.js +0 -116
- package/dist/esm/tests/utils.js.map +0 -1
- package/dist/esm/tests/ws-api.spec.d.ts +0 -2
- package/dist/esm/tests/ws-api.spec.d.ts.map +0 -1
- package/dist/esm/tests/ws-api.spec.js +0 -327
- package/dist/esm/tests/ws-api.spec.js.map +0 -1
- package/src/json-rpc-socket.ts +0 -155
- package/src/lib/http-server-shutdown-handler.ts +0 -79
- package/src/lib/json-rpc.ts +0 -126
- package/src/registration/proof-of-work-types.ts +0 -7
- package/src/registration/registration-types.ts +0 -18
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import { DataStream, Message, TestDataGenerator } from '@enbox/dwn-sdk-js';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
|
-
import { base64url } from 'multiformats/bases/base64';
|
|
4
|
-
import { useFakeTimers } from 'sinon';
|
|
5
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
-
import { createJsonRpcRequest, createJsonRpcSubscriptionRequest, JsonRpcErrorCodes, } from '../src/lib/json-rpc.js';
|
|
7
|
-
import { config } from '../src/config.js';
|
|
8
|
-
import { WsApi } from '../src/ws-api.js';
|
|
9
|
-
import { getTestDwn } from './test-dwn.js';
|
|
10
|
-
import { createRecordsWriteMessage, sendWsMessage, sendHttpMessage } from './utils.js';
|
|
11
|
-
import { HttpApi } from '../src/http-api.js';
|
|
12
|
-
import { JsonRpcSocket } from '../src/json-rpc-socket.js';
|
|
13
|
-
describe('websocket api', function () {
|
|
14
|
-
let httpApi;
|
|
15
|
-
let wsApi;
|
|
16
|
-
let dwn;
|
|
17
|
-
let clock;
|
|
18
|
-
before(() => {
|
|
19
|
-
clock = useFakeTimers({ shouldAdvanceTime: true });
|
|
20
|
-
});
|
|
21
|
-
after(() => {
|
|
22
|
-
clock.restore();
|
|
23
|
-
});
|
|
24
|
-
beforeEach(async function () {
|
|
25
|
-
dwn = await getTestDwn({ withEvents: true });
|
|
26
|
-
httpApi = await HttpApi.create(config, dwn);
|
|
27
|
-
await httpApi.start(9002);
|
|
28
|
-
wsApi = new WsApi(httpApi.server, dwn);
|
|
29
|
-
wsApi.start();
|
|
30
|
-
});
|
|
31
|
-
afterEach(async function () {
|
|
32
|
-
await wsApi.close();
|
|
33
|
-
await httpApi.close();
|
|
34
|
-
await dwn.close();
|
|
35
|
-
});
|
|
36
|
-
it('returns an error response if no request payload is provided', async function () {
|
|
37
|
-
const data = await sendWsMessage('ws://127.0.0.1:9002', Buffer.from(''));
|
|
38
|
-
const resp = JSON.parse(data.toString());
|
|
39
|
-
expect(resp.error.code).to.equal(JsonRpcErrorCodes.BadRequest);
|
|
40
|
-
expect(resp.error.message).to.equal('request payload required.');
|
|
41
|
-
});
|
|
42
|
-
it('returns an error response if parsing dwn request fails', async function () {
|
|
43
|
-
const data = await sendWsMessage('ws://127.0.0.1:9002', Buffer.from('@#$%^&*&%$#'));
|
|
44
|
-
const resp = JSON.parse(data.toString());
|
|
45
|
-
expect(resp.error.code).to.equal(JsonRpcErrorCodes.BadRequest);
|
|
46
|
-
expect(resp.error.message).to.include('JSON');
|
|
47
|
-
});
|
|
48
|
-
it('RecordsWrite messages are not supported', async function () {
|
|
49
|
-
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
50
|
-
const { recordsWrite, dataStream } = await createRecordsWriteMessage(alice);
|
|
51
|
-
const dataBytes = await DataStream.toBytes(dataStream);
|
|
52
|
-
const encodedData = base64url.baseEncode(dataBytes);
|
|
53
|
-
const requestId = uuidv4();
|
|
54
|
-
const dwnRequest = createJsonRpcRequest(requestId, 'dwn.processMessage', {
|
|
55
|
-
message: recordsWrite.toJSON(),
|
|
56
|
-
target: alice.did,
|
|
57
|
-
encodedData,
|
|
58
|
-
});
|
|
59
|
-
const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
|
|
60
|
-
const response = await connection.request(dwnRequest);
|
|
61
|
-
expect(response.id).to.equal(requestId);
|
|
62
|
-
expect(response.error).to.not.be.undefined;
|
|
63
|
-
expect(response.error.code).to.equal(JsonRpcErrorCodes.InvalidParams);
|
|
64
|
-
expect(response.error.message).to.include('RecordsWrite is not supported via ws');
|
|
65
|
-
});
|
|
66
|
-
it('subscribes to records and receives updates', async () => {
|
|
67
|
-
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
68
|
-
const { message } = await TestDataGenerator.generateRecordsSubscribe({
|
|
69
|
-
author: alice,
|
|
70
|
-
filter: {
|
|
71
|
-
schema: 'foo/bar'
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
const records = [];
|
|
75
|
-
const subscriptionHandler = async (event) => {
|
|
76
|
-
const { message } = event;
|
|
77
|
-
records.push(await Message.getCid(message));
|
|
78
|
-
};
|
|
79
|
-
const requestId = uuidv4();
|
|
80
|
-
const dwnRequest = createJsonRpcSubscriptionRequest(requestId, 'rpc.subscribe.dwn.processMessage', {
|
|
81
|
-
message: message,
|
|
82
|
-
target: alice.did,
|
|
83
|
-
});
|
|
84
|
-
const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
|
|
85
|
-
const { response, close } = await connection.subscribe(dwnRequest, (response) => {
|
|
86
|
-
const { event } = response.result;
|
|
87
|
-
subscriptionHandler(event);
|
|
88
|
-
});
|
|
89
|
-
expect(response.error).to.be.undefined;
|
|
90
|
-
expect(response.result.reply.status.code).to.equal(200);
|
|
91
|
-
expect(close).to.not.be.undefined;
|
|
92
|
-
const write1Message = await TestDataGenerator.generateRecordsWrite({
|
|
93
|
-
author: alice,
|
|
94
|
-
schema: 'foo/bar',
|
|
95
|
-
dataFormat: 'text/plain'
|
|
96
|
-
});
|
|
97
|
-
const writeResult1 = await sendHttpMessage({
|
|
98
|
-
url: 'http://localhost:9002',
|
|
99
|
-
target: alice.did,
|
|
100
|
-
message: write1Message.message,
|
|
101
|
-
data: write1Message.dataBytes,
|
|
102
|
-
});
|
|
103
|
-
expect(writeResult1.status.code).to.equal(202);
|
|
104
|
-
const write2Message = await TestDataGenerator.generateRecordsWrite({
|
|
105
|
-
author: alice,
|
|
106
|
-
schema: 'foo/bar',
|
|
107
|
-
dataFormat: 'text/plain'
|
|
108
|
-
});
|
|
109
|
-
const writeResult2 = await sendHttpMessage({
|
|
110
|
-
url: 'http://localhost:9002',
|
|
111
|
-
target: alice.did,
|
|
112
|
-
message: write2Message.message,
|
|
113
|
-
data: write2Message.dataBytes,
|
|
114
|
-
});
|
|
115
|
-
expect(writeResult2.status.code).to.equal(202);
|
|
116
|
-
// close the subscription
|
|
117
|
-
await close();
|
|
118
|
-
await new Promise(resolve => setTimeout(resolve, 5)); // wait for records to be processed
|
|
119
|
-
expect(records).to.have.members([
|
|
120
|
-
await Message.getCid(write1Message.message),
|
|
121
|
-
await Message.getCid(write2Message.message)
|
|
122
|
-
]);
|
|
123
|
-
});
|
|
124
|
-
it('stops receiving updates when subscription is closed', async () => {
|
|
125
|
-
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
126
|
-
const { message } = await TestDataGenerator.generateRecordsSubscribe({
|
|
127
|
-
author: alice,
|
|
128
|
-
filter: {
|
|
129
|
-
schema: 'foo/bar'
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
const records = [];
|
|
133
|
-
const subscriptionHandler = async (event) => {
|
|
134
|
-
const { message } = event;
|
|
135
|
-
records.push(await Message.getCid(message));
|
|
136
|
-
};
|
|
137
|
-
const requestId = uuidv4();
|
|
138
|
-
const subscribeId = uuidv4();
|
|
139
|
-
const dwnRequest = createJsonRpcSubscriptionRequest(requestId, 'rpc.subscribe.dwn.processMessage', {
|
|
140
|
-
message: message,
|
|
141
|
-
target: alice.did,
|
|
142
|
-
}, subscribeId);
|
|
143
|
-
const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
|
|
144
|
-
const { response, close } = await connection.subscribe(dwnRequest, (response) => {
|
|
145
|
-
const { event } = response.result;
|
|
146
|
-
subscriptionHandler(event);
|
|
147
|
-
});
|
|
148
|
-
expect(response.error).to.be.undefined;
|
|
149
|
-
expect(response.result.reply.status.code).to.equal(200);
|
|
150
|
-
expect(close).to.not.be.undefined;
|
|
151
|
-
const write1Message = await TestDataGenerator.generateRecordsWrite({
|
|
152
|
-
author: alice,
|
|
153
|
-
schema: 'foo/bar',
|
|
154
|
-
dataFormat: 'text/plain'
|
|
155
|
-
});
|
|
156
|
-
const writeResult1 = await sendHttpMessage({
|
|
157
|
-
url: 'http://localhost:9002',
|
|
158
|
-
target: alice.did,
|
|
159
|
-
message: write1Message.message,
|
|
160
|
-
data: write1Message.dataBytes,
|
|
161
|
-
});
|
|
162
|
-
expect(writeResult1.status.code).to.equal(202);
|
|
163
|
-
// close the subscription after only 1 message
|
|
164
|
-
await close();
|
|
165
|
-
// write more messages that won't show up in the subscription
|
|
166
|
-
const write2Message = await TestDataGenerator.generateRecordsWrite({
|
|
167
|
-
author: alice,
|
|
168
|
-
schema: 'foo/bar',
|
|
169
|
-
dataFormat: 'text/plain'
|
|
170
|
-
});
|
|
171
|
-
const writeResult2 = await sendHttpMessage({
|
|
172
|
-
url: 'http://localhost:9002',
|
|
173
|
-
target: alice.did,
|
|
174
|
-
message: write2Message.message,
|
|
175
|
-
data: write2Message.dataBytes,
|
|
176
|
-
});
|
|
177
|
-
expect(writeResult2.status.code).to.equal(202);
|
|
178
|
-
const write3Message = await TestDataGenerator.generateRecordsWrite({
|
|
179
|
-
author: alice,
|
|
180
|
-
schema: 'foo/bar',
|
|
181
|
-
dataFormat: 'text/plain'
|
|
182
|
-
});
|
|
183
|
-
const writeResult3 = await sendHttpMessage({
|
|
184
|
-
url: 'http://localhost:9002',
|
|
185
|
-
target: alice.did,
|
|
186
|
-
message: write3Message.message,
|
|
187
|
-
data: write3Message.dataBytes,
|
|
188
|
-
});
|
|
189
|
-
expect(writeResult3.status.code).to.equal(202);
|
|
190
|
-
await new Promise(resolve => setTimeout(resolve, 5)); // wait for records to be processed
|
|
191
|
-
expect(records).to.have.members([await Message.getCid(write1Message.message)]);
|
|
192
|
-
});
|
|
193
|
-
it('should fail to add subscription using a `JsonRpcId` that already exists for a subscription in that socket', async () => {
|
|
194
|
-
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
195
|
-
const { message } = await TestDataGenerator.generateRecordsSubscribe({
|
|
196
|
-
author: alice,
|
|
197
|
-
filter: {
|
|
198
|
-
schema: 'foo/bar'
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
const records = [];
|
|
202
|
-
const subscriptionHandler = async (event) => {
|
|
203
|
-
const { message } = event;
|
|
204
|
-
records.push(await Message.getCid(message));
|
|
205
|
-
};
|
|
206
|
-
const requestId = uuidv4();
|
|
207
|
-
const subscribeId = uuidv4();
|
|
208
|
-
const dwnRequest = createJsonRpcSubscriptionRequest(requestId, 'rpc.subscribe.dwn.processMessage', {
|
|
209
|
-
message: message,
|
|
210
|
-
target: alice.did
|
|
211
|
-
}, subscribeId);
|
|
212
|
-
const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
|
|
213
|
-
const { close } = await connection.subscribe(dwnRequest, (response) => {
|
|
214
|
-
const { event } = response.result;
|
|
215
|
-
subscriptionHandler(event);
|
|
216
|
-
});
|
|
217
|
-
const { message: message2 } = await TestDataGenerator.generateRecordsSubscribe({ filter: { schema: 'bar/baz' }, author: alice });
|
|
218
|
-
// We are checking for the subscription Id not the request Id
|
|
219
|
-
const request2Id = uuidv4();
|
|
220
|
-
const dwnRequest2 = createJsonRpcSubscriptionRequest(request2Id, 'rpc.subscribe.dwn.processMessage', {
|
|
221
|
-
message: message2,
|
|
222
|
-
target: alice.did
|
|
223
|
-
}, subscribeId);
|
|
224
|
-
const { response: response2 } = await connection.subscribe(dwnRequest2, (response) => {
|
|
225
|
-
const { event } = response.result;
|
|
226
|
-
subscriptionHandler(event);
|
|
227
|
-
});
|
|
228
|
-
expect(response2.error.code).to.equal(JsonRpcErrorCodes.InvalidParams);
|
|
229
|
-
expect(response2.error.message).to.contain(`${subscribeId} is in use by an active subscription`);
|
|
230
|
-
const write1Message = await TestDataGenerator.generateRecordsWrite({
|
|
231
|
-
author: alice,
|
|
232
|
-
schema: 'foo/bar',
|
|
233
|
-
dataFormat: 'text/plain'
|
|
234
|
-
});
|
|
235
|
-
const writeResult1 = await sendHttpMessage({
|
|
236
|
-
url: 'http://localhost:9002',
|
|
237
|
-
target: alice.did,
|
|
238
|
-
message: write1Message.message,
|
|
239
|
-
data: write1Message.dataBytes,
|
|
240
|
-
});
|
|
241
|
-
expect(writeResult1.status.code).to.equal(202);
|
|
242
|
-
const write2Message = await TestDataGenerator.generateRecordsWrite({
|
|
243
|
-
author: alice,
|
|
244
|
-
schema: 'foo/bar',
|
|
245
|
-
dataFormat: 'text/plain'
|
|
246
|
-
});
|
|
247
|
-
const writeResult2 = await sendHttpMessage({
|
|
248
|
-
url: 'http://localhost:9002',
|
|
249
|
-
target: alice.did,
|
|
250
|
-
message: write2Message.message,
|
|
251
|
-
data: write2Message.dataBytes,
|
|
252
|
-
});
|
|
253
|
-
expect(writeResult2.status.code).to.equal(202);
|
|
254
|
-
// close the subscription
|
|
255
|
-
await close();
|
|
256
|
-
await new Promise(resolve => setTimeout(resolve, 5)); // wait for records to be processed
|
|
257
|
-
expect(records).to.have.members([
|
|
258
|
-
await Message.getCid(write1Message.message),
|
|
259
|
-
await Message.getCid(write2Message.message)
|
|
260
|
-
]);
|
|
261
|
-
});
|
|
262
|
-
it('should receive an updated message as well as the initial write when subscribing to a record', async () => {
|
|
263
|
-
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
264
|
-
// write an initial message
|
|
265
|
-
const initialWrite = await TestDataGenerator.generateRecordsWrite({
|
|
266
|
-
author: alice,
|
|
267
|
-
schema: 'foo/bar',
|
|
268
|
-
dataFormat: 'text/plain'
|
|
269
|
-
});
|
|
270
|
-
const writeResult1 = await sendHttpMessage({
|
|
271
|
-
url: 'http://localhost:9002',
|
|
272
|
-
target: alice.did,
|
|
273
|
-
message: initialWrite.message,
|
|
274
|
-
data: initialWrite.dataBytes,
|
|
275
|
-
});
|
|
276
|
-
expect(writeResult1.status.code).to.equal(202);
|
|
277
|
-
// subscribe to 'foo/bar' messages
|
|
278
|
-
const { message } = await TestDataGenerator.generateRecordsSubscribe({
|
|
279
|
-
author: alice,
|
|
280
|
-
filter: {
|
|
281
|
-
schema: 'foo/bar'
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
const records = [];
|
|
285
|
-
const subscriptionHandler = async (event) => {
|
|
286
|
-
const { message, initialWrite } = event;
|
|
287
|
-
if (initialWrite) {
|
|
288
|
-
records.push(await Message.getCid(initialWrite));
|
|
289
|
-
}
|
|
290
|
-
records.push(await Message.getCid(message));
|
|
291
|
-
};
|
|
292
|
-
const requestId = uuidv4();
|
|
293
|
-
const subscribeId = uuidv4();
|
|
294
|
-
const dwnRequest = createJsonRpcSubscriptionRequest(requestId, 'rpc.subscribe.dwn.processMessage', {
|
|
295
|
-
message: message,
|
|
296
|
-
target: alice.did
|
|
297
|
-
}, subscribeId);
|
|
298
|
-
const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
|
|
299
|
-
const { close } = await connection.subscribe(dwnRequest, (response) => {
|
|
300
|
-
const { event } = response.result;
|
|
301
|
-
subscriptionHandler(event);
|
|
302
|
-
});
|
|
303
|
-
// wait for potential records to process and confirm that initial write has not been processed
|
|
304
|
-
await new Promise(resolve => setTimeout(resolve, 5));
|
|
305
|
-
expect(records.length).length.to.equal(0);
|
|
306
|
-
// update the initial message
|
|
307
|
-
const updatedMessage = await TestDataGenerator.generateFromRecordsWrite({
|
|
308
|
-
author: alice,
|
|
309
|
-
existingWrite: initialWrite.recordsWrite,
|
|
310
|
-
});
|
|
311
|
-
const updateResult = await sendHttpMessage({
|
|
312
|
-
url: 'http://localhost:9002',
|
|
313
|
-
target: alice.did,
|
|
314
|
-
message: updatedMessage.message,
|
|
315
|
-
data: updatedMessage.dataBytes,
|
|
316
|
-
});
|
|
317
|
-
expect(updateResult.status.code).to.equal(202);
|
|
318
|
-
await close();
|
|
319
|
-
await new Promise(resolve => setTimeout(resolve, 5)); // wait for records to be processed
|
|
320
|
-
// both initial and update should exist now
|
|
321
|
-
expect(records).to.have.members([
|
|
322
|
-
await Message.getCid(initialWrite.message),
|
|
323
|
-
await Message.getCid(updatedMessage.message)
|
|
324
|
-
]);
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
//# sourceMappingURL=ws-api.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-api.spec.js","sourceRoot":"","sources":["../../../tests/ws-api.spec.ts"],"names":[],"mappings":"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"}
|
package/src/json-rpc-socket.ts
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import log from 'loglevel';
|
|
2
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
-
import WebSocket from 'ws';
|
|
4
|
-
|
|
5
|
-
import type { JsonRpcId, JsonRpcRequest, JsonRpcResponse } from "./lib/json-rpc.js";
|
|
6
|
-
import { createJsonRpcSubscriptionRequest } from "./lib/json-rpc.js";
|
|
7
|
-
|
|
8
|
-
// These were arbitrarily chosen, but can be modified via connect options
|
|
9
|
-
const CONNECT_TIMEOUT = 3_000;
|
|
10
|
-
const RESPONSE_TIMEOUT = 30_000;
|
|
11
|
-
|
|
12
|
-
export interface JsonRpcSocketOptions {
|
|
13
|
-
/** socket connection timeout in milliseconds */
|
|
14
|
-
connectTimeout?: number;
|
|
15
|
-
/** response timeout for rpc requests in milliseconds */
|
|
16
|
-
responseTimeout?: number;
|
|
17
|
-
/** optional connection close handler */
|
|
18
|
-
onclose?: () => void;
|
|
19
|
-
/** optional socket error handler */
|
|
20
|
-
onerror?: (error?: any) => void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* JSON RPC Socket Client for WebSocket request/response and long-running subscriptions.
|
|
25
|
-
*/
|
|
26
|
-
export class JsonRpcSocket {
|
|
27
|
-
private constructor(private socket: WebSocket, private responseTimeout: number) {}
|
|
28
|
-
|
|
29
|
-
static async connect(url: string, options: JsonRpcSocketOptions = {}): Promise<JsonRpcSocket> {
|
|
30
|
-
const { connectTimeout = CONNECT_TIMEOUT, responseTimeout = RESPONSE_TIMEOUT, onclose, onerror } = options;
|
|
31
|
-
|
|
32
|
-
const socket = new WebSocket(url);
|
|
33
|
-
|
|
34
|
-
if (!onclose) {
|
|
35
|
-
socket.onclose = ():void => {
|
|
36
|
-
log.info(`JSON RPC Socket close ${url}`);
|
|
37
|
-
};
|
|
38
|
-
} else {
|
|
39
|
-
socket.onclose = onclose;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (!onerror) {
|
|
43
|
-
socket.onerror = (error?: any):void => {
|
|
44
|
-
log.error(`JSON RPC Socket error ${url}`, error);
|
|
45
|
-
};
|
|
46
|
-
} else {
|
|
47
|
-
socket.onerror = onerror;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return new Promise<JsonRpcSocket>((resolve, reject) => {
|
|
51
|
-
socket.addEventListener('open', () => {
|
|
52
|
-
resolve(new JsonRpcSocket(socket, responseTimeout));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
socket.addEventListener('error', (error) => {
|
|
56
|
-
reject(error);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
setTimeout(() => reject, connectTimeout);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
close(): void {
|
|
64
|
-
this.socket.close();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Sends a JSON-RPC request through the socket and waits for a single response.
|
|
69
|
-
*/
|
|
70
|
-
async request(request: JsonRpcRequest): Promise<JsonRpcResponse> {
|
|
71
|
-
return new Promise((resolve, reject) => {
|
|
72
|
-
request.id ??= uuidv4();
|
|
73
|
-
|
|
74
|
-
const handleResponse = (event: { data: any }):void => {
|
|
75
|
-
const jsonRpsResponse = JSON.parse(event.data) as JsonRpcResponse;
|
|
76
|
-
if (jsonRpsResponse.id === request.id) {
|
|
77
|
-
// if the incoming response id matches the request id, we will remove the listener and resolve the response
|
|
78
|
-
this.socket.removeEventListener('message', handleResponse);
|
|
79
|
-
return resolve(jsonRpsResponse);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
// subscribe to the listener before sending the request
|
|
83
|
-
this.socket.addEventListener('message', handleResponse);
|
|
84
|
-
this.send(request);
|
|
85
|
-
|
|
86
|
-
// reject this promise if we don't receive any response back within the timeout period
|
|
87
|
-
setTimeout(() => {
|
|
88
|
-
this.socket.removeEventListener('message', handleResponse);
|
|
89
|
-
reject(new Error('request timed out'));
|
|
90
|
-
}, this.responseTimeout);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Sends a JSON-RPC request through the socket and keeps a listener open to read associated responses as they arrive.
|
|
96
|
-
* Returns a close method to clean up the listener.
|
|
97
|
-
*/
|
|
98
|
-
async subscribe(request: JsonRpcRequest, listener: (response: JsonRpcResponse) => void): Promise<{
|
|
99
|
-
response: JsonRpcResponse;
|
|
100
|
-
close?: () => Promise<void>;
|
|
101
|
-
}> {
|
|
102
|
-
|
|
103
|
-
if (!request.method.startsWith('rpc.subscribe.')) {
|
|
104
|
-
throw new Error('subscribe rpc requests must include the `rpc.subscribe` prefix');
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (!request.subscription) {
|
|
108
|
-
throw new Error('subscribe rpc requests must include subscribe options');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const subscriptionId = request.subscription.id;
|
|
112
|
-
const socketEventListener = (event: { data: any }):void => {
|
|
113
|
-
const jsonRpcResponse = JSON.parse(event.data.toString()) as JsonRpcResponse;
|
|
114
|
-
if (jsonRpcResponse.id === subscriptionId) {
|
|
115
|
-
if (jsonRpcResponse.error !== undefined) {
|
|
116
|
-
// remove the event listener upon receipt of a JSON RPC Error.
|
|
117
|
-
this.socket.removeEventListener('message', socketEventListener);
|
|
118
|
-
this.closeSubscription(subscriptionId);
|
|
119
|
-
}
|
|
120
|
-
listener(jsonRpcResponse);
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
this.socket.addEventListener('message', socketEventListener);
|
|
124
|
-
|
|
125
|
-
const response = await this.request(request);
|
|
126
|
-
if (response.error) {
|
|
127
|
-
this.socket.removeEventListener('message', socketEventListener);
|
|
128
|
-
return { response };
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// clean up listener and create a `rpc.subscribe.close` message to use when closing this JSON RPC subscription
|
|
132
|
-
const close = async (): Promise<void> => {
|
|
133
|
-
this.socket.removeEventListener('message', socketEventListener);
|
|
134
|
-
await this.closeSubscription(subscriptionId);
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
response,
|
|
139
|
-
close
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
private closeSubscription(id: JsonRpcId): Promise<JsonRpcResponse> {
|
|
144
|
-
const requestId = uuidv4();
|
|
145
|
-
const request = createJsonRpcSubscriptionRequest(requestId, 'rpc.subscribe.close', {}, id);
|
|
146
|
-
return this.request(request);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Sends a JSON-RPC request through the socket. You must subscribe to a message listener separately to capture the response.
|
|
151
|
-
*/
|
|
152
|
-
send(request: JsonRpcRequest):void {
|
|
153
|
-
this.socket.send(JSON.stringify(request));
|
|
154
|
-
}
|
|
155
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import type { Server } from 'http';
|
|
2
|
-
import type { Socket } from 'net';
|
|
3
|
-
|
|
4
|
-
const SOCKET_IDLE_SYMBOL = Symbol('idle');
|
|
5
|
-
|
|
6
|
-
export class HttpServerShutdownHandler {
|
|
7
|
-
private tcpSockets: { [socketId: number]: Socket };
|
|
8
|
-
private tcpSocketId: number;
|
|
9
|
-
private server: Server;
|
|
10
|
-
private stopping: boolean;
|
|
11
|
-
|
|
12
|
-
constructor(server: Server) {
|
|
13
|
-
this.tcpSockets = {};
|
|
14
|
-
this.tcpSocketId = 1;
|
|
15
|
-
this.server = server;
|
|
16
|
-
this.stopping = false;
|
|
17
|
-
|
|
18
|
-
// This event is emitted when a new TCP stream is established
|
|
19
|
-
this.server.on('connection', (socket) => {
|
|
20
|
-
// set socket to idle. this same socket will be accessible within the `http.on('request', (req, res))` event listener
|
|
21
|
-
// as `request.connection`
|
|
22
|
-
socket[SOCKET_IDLE_SYMBOL] = true;
|
|
23
|
-
const tcpSocketId = this.tcpSocketId++;
|
|
24
|
-
this.tcpSockets[tcpSocketId] = socket;
|
|
25
|
-
|
|
26
|
-
// This event is emitted when a tcp stream is `destroy`ed
|
|
27
|
-
socket.on('close', () => {
|
|
28
|
-
delete this.tcpSockets[tcpSocketId];
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
// Emitted each time there is a request. There may be multiple requests
|
|
33
|
-
// per connection (in the case of HTTP Keep-Alive connections).
|
|
34
|
-
this.server.on('request', (request, response) => {
|
|
35
|
-
const { socket } = request;
|
|
36
|
-
|
|
37
|
-
// set __idle to false because this socket is being used for an incoming request
|
|
38
|
-
socket[SOCKET_IDLE_SYMBOL] = false;
|
|
39
|
-
|
|
40
|
-
// Emitted when the response has been sent. More specifically, this event is emitted
|
|
41
|
-
// when the last segment of the response headers and body have been handed off to the
|
|
42
|
-
// operating system for transmission over the network.
|
|
43
|
-
// It does not imply that the client has received anything yet.
|
|
44
|
-
response.on('finish', () => {
|
|
45
|
-
// set __idle back to true because the socket has finished facilitating a request. This socket may be used again without being
|
|
46
|
-
// destroyed if keep-alive is being leveraged
|
|
47
|
-
socket[SOCKET_IDLE_SYMBOL] = true;
|
|
48
|
-
|
|
49
|
-
if (this.stopping) {
|
|
50
|
-
socket.destroy();
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
stop(callback): void {
|
|
57
|
-
this.stopping = true;
|
|
58
|
-
|
|
59
|
-
// Stops the server from accepting new connections and keeps existing connections. This function is asynchronous,
|
|
60
|
-
// the server is finally closed when all connections are ended and the server emits a 'close' event.
|
|
61
|
-
// The optional callback will be called once the 'close' event occurs.
|
|
62
|
-
// The callback will be called with an Error as its only argument if the server was not open when close is called.
|
|
63
|
-
this.server.close(() => {
|
|
64
|
-
this.tcpSocketId = 0;
|
|
65
|
-
this.stopping = false;
|
|
66
|
-
callback();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// close all idle sockets. the remaining sockets facilitating active requests
|
|
70
|
-
// will be closed after they've served responses back.
|
|
71
|
-
for (const tcpSocketId in this.tcpSockets) {
|
|
72
|
-
const socket = this.tcpSockets[tcpSocketId];
|
|
73
|
-
|
|
74
|
-
if (socket[SOCKET_IDLE_SYMBOL]) {
|
|
75
|
-
socket.destroy();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|