@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.
Files changed (247) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +353 -0
  3. package/dist/cjs/index.js +6811 -0
  4. package/dist/cjs/package.json +1 -0
  5. package/dist/esm/src/config.d.ts +55 -0
  6. package/dist/esm/src/config.d.ts.map +1 -0
  7. package/dist/esm/src/config.js +60 -0
  8. package/dist/esm/src/config.js.map +1 -0
  9. package/dist/esm/src/connection/connection-manager.d.ts +25 -0
  10. package/dist/esm/src/connection/connection-manager.d.ts.map +1 -0
  11. package/dist/esm/src/connection/connection-manager.js +26 -0
  12. package/dist/esm/src/connection/connection-manager.js.map +1 -0
  13. package/dist/esm/src/connection/socket-connection.d.ts +65 -0
  14. package/dist/esm/src/connection/socket-connection.d.ts.map +1 -0
  15. package/dist/esm/src/connection/socket-connection.js +180 -0
  16. package/dist/esm/src/connection/socket-connection.js.map +1 -0
  17. package/dist/esm/src/dwn-error.d.ts +29 -0
  18. package/dist/esm/src/dwn-error.d.ts.map +1 -0
  19. package/dist/esm/src/dwn-error.js +36 -0
  20. package/dist/esm/src/dwn-error.js.map +1 -0
  21. package/dist/esm/src/dwn-server.d.ts +60 -0
  22. package/dist/esm/src/dwn-server.d.ts.map +1 -0
  23. package/dist/esm/src/dwn-server.js +130 -0
  24. package/dist/esm/src/dwn-server.js.map +1 -0
  25. package/dist/esm/src/http-api.d.ts +26 -0
  26. package/dist/esm/src/http-api.d.ts.map +1 -0
  27. package/dist/esm/src/http-api.js +474 -0
  28. package/dist/esm/src/http-api.js.map +1 -0
  29. package/dist/esm/src/index.d.ts +7 -0
  30. package/dist/esm/src/index.d.ts.map +1 -0
  31. package/dist/esm/src/index.js +6 -0
  32. package/dist/esm/src/index.js.map +1 -0
  33. package/dist/esm/src/json-rpc-api.d.ts +3 -0
  34. package/dist/esm/src/json-rpc-api.d.ts.map +1 -0
  35. package/dist/esm/src/json-rpc-api.js +8 -0
  36. package/dist/esm/src/json-rpc-api.js.map +1 -0
  37. package/dist/esm/src/json-rpc-handlers/dwn/index.d.ts +2 -0
  38. package/dist/esm/src/json-rpc-handlers/dwn/index.d.ts.map +1 -0
  39. package/dist/esm/src/json-rpc-handlers/dwn/index.js +2 -0
  40. package/dist/esm/src/json-rpc-handlers/dwn/index.js.map +1 -0
  41. package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts +3 -0
  42. package/dist/esm/src/json-rpc-handlers/dwn/process-message.d.ts.map +1 -0
  43. package/dist/esm/src/json-rpc-handlers/dwn/process-message.js +73 -0
  44. package/dist/esm/src/json-rpc-handlers/dwn/process-message.js.map +1 -0
  45. package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts +10 -0
  46. package/dist/esm/src/json-rpc-handlers/subscription/close.d.ts.map +1 -0
  47. package/dist/esm/src/json-rpc-handlers/subscription/close.js +39 -0
  48. package/dist/esm/src/json-rpc-handlers/subscription/close.js.map +1 -0
  49. package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts +2 -0
  50. package/dist/esm/src/json-rpc-handlers/subscription/index.d.ts.map +1 -0
  51. package/dist/esm/src/json-rpc-handlers/subscription/index.js +2 -0
  52. package/dist/esm/src/json-rpc-handlers/subscription/index.js.map +1 -0
  53. package/dist/esm/src/json-rpc-socket.d.ts +39 -0
  54. package/dist/esm/src/json-rpc-socket.d.ts.map +1 -0
  55. package/dist/esm/src/json-rpc-socket.js +125 -0
  56. package/dist/esm/src/json-rpc-socket.js.map +1 -0
  57. package/dist/esm/src/lib/http-server-shutdown-handler.d.ts +10 -0
  58. package/dist/esm/src/lib/http-server-shutdown-handler.d.ts.map +1 -0
  59. package/dist/esm/src/lib/http-server-shutdown-handler.js +65 -0
  60. package/dist/esm/src/lib/http-server-shutdown-handler.js.map +1 -0
  61. package/dist/esm/src/lib/json-rpc-router.d.ts +30 -0
  62. package/dist/esm/src/lib/json-rpc-router.d.ts.map +1 -0
  63. package/dist/esm/src/lib/json-rpc-router.js +14 -0
  64. package/dist/esm/src/lib/json-rpc-router.js.map +1 -0
  65. package/dist/esm/src/lib/json-rpc.d.ts +54 -0
  66. package/dist/esm/src/lib/json-rpc.d.ts.map +1 -0
  67. package/dist/esm/src/lib/json-rpc.js +60 -0
  68. package/dist/esm/src/lib/json-rpc.js.map +1 -0
  69. package/dist/esm/src/main.d.ts +3 -0
  70. package/dist/esm/src/main.d.ts.map +1 -0
  71. package/dist/esm/src/main.js +11 -0
  72. package/dist/esm/src/main.js.map +1 -0
  73. package/dist/esm/src/metrics.d.ts +4 -0
  74. package/dist/esm/src/metrics.d.ts.map +1 -0
  75. package/dist/esm/src/metrics.js +13 -0
  76. package/dist/esm/src/metrics.js.map +1 -0
  77. package/dist/esm/src/plugin-loader.d.ts +10 -0
  78. package/dist/esm/src/plugin-loader.d.ts.map +1 -0
  79. package/dist/esm/src/plugin-loader.js +19 -0
  80. package/dist/esm/src/plugin-loader.js.map +1 -0
  81. package/dist/esm/src/process-handlers.d.ts +11 -0
  82. package/dist/esm/src/process-handlers.d.ts.map +1 -0
  83. package/dist/esm/src/process-handlers.js +40 -0
  84. package/dist/esm/src/process-handlers.js.map +1 -0
  85. package/dist/esm/src/registration/proof-of-work-manager.d.ts +93 -0
  86. package/dist/esm/src/registration/proof-of-work-manager.d.ts.map +1 -0
  87. package/dist/esm/src/registration/proof-of-work-manager.js +243 -0
  88. package/dist/esm/src/registration/proof-of-work-manager.js.map +1 -0
  89. package/dist/esm/src/registration/proof-of-work-types.d.ts +8 -0
  90. package/dist/esm/src/registration/proof-of-work-types.d.ts.map +1 -0
  91. package/dist/esm/src/registration/proof-of-work-types.js +2 -0
  92. package/dist/esm/src/registration/proof-of-work-types.js.map +1 -0
  93. package/dist/esm/src/registration/proof-of-work.d.ts +41 -0
  94. package/dist/esm/src/registration/proof-of-work.d.ts.map +1 -0
  95. package/dist/esm/src/registration/proof-of-work.js +69 -0
  96. package/dist/esm/src/registration/proof-of-work.js.map +1 -0
  97. package/dist/esm/src/registration/registration-manager.d.ts +55 -0
  98. package/dist/esm/src/registration/registration-manager.d.ts.map +1 -0
  99. package/dist/esm/src/registration/registration-manager.js +121 -0
  100. package/dist/esm/src/registration/registration-manager.js.map +1 -0
  101. package/dist/esm/src/registration/registration-store.d.ts +24 -0
  102. package/dist/esm/src/registration/registration-store.d.ts.map +1 -0
  103. package/dist/esm/src/registration/registration-store.js +56 -0
  104. package/dist/esm/src/registration/registration-store.js.map +1 -0
  105. package/dist/esm/src/registration/registration-types.d.ts +18 -0
  106. package/dist/esm/src/registration/registration-types.d.ts.map +1 -0
  107. package/dist/esm/src/registration/registration-types.js +2 -0
  108. package/dist/esm/src/registration/registration-types.js.map +1 -0
  109. package/dist/esm/src/storage.d.ts +24 -0
  110. package/dist/esm/src/storage.d.ts.map +1 -0
  111. package/dist/esm/src/storage.js +146 -0
  112. package/dist/esm/src/storage.js.map +1 -0
  113. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts +39 -0
  114. package/dist/esm/src/web5-connect/sql-ttl-cache.d.ts.map +1 -0
  115. package/dist/esm/src/web5-connect/sql-ttl-cache.js +106 -0
  116. package/dist/esm/src/web5-connect/sql-ttl-cache.js.map +1 -0
  117. package/dist/esm/src/web5-connect/web5-connect-server.d.ts +58 -0
  118. package/dist/esm/src/web5-connect/web5-connect-server.d.ts.map +1 -0
  119. package/dist/esm/src/web5-connect/web5-connect-server.js +77 -0
  120. package/dist/esm/src/web5-connect/web5-connect-server.js.map +1 -0
  121. package/dist/esm/src/ws-api.d.ts +13 -0
  122. package/dist/esm/src/ws-api.d.ts.map +1 -0
  123. package/dist/esm/src/ws-api.js +31 -0
  124. package/dist/esm/src/ws-api.js.map +1 -0
  125. package/dist/esm/tests/common-scenario-validator.d.ts +11 -0
  126. package/dist/esm/tests/common-scenario-validator.d.ts.map +1 -0
  127. package/dist/esm/tests/common-scenario-validator.js +114 -0
  128. package/dist/esm/tests/common-scenario-validator.js.map +1 -0
  129. package/dist/esm/tests/connection/connection-manager.spec.d.ts +2 -0
  130. package/dist/esm/tests/connection/connection-manager.spec.d.ts.map +1 -0
  131. package/dist/esm/tests/connection/connection-manager.spec.js +47 -0
  132. package/dist/esm/tests/connection/connection-manager.spec.js.map +1 -0
  133. package/dist/esm/tests/connection/socket-connection.spec.d.ts +2 -0
  134. package/dist/esm/tests/connection/socket-connection.spec.d.ts.map +1 -0
  135. package/dist/esm/tests/connection/socket-connection.spec.js +125 -0
  136. package/dist/esm/tests/connection/socket-connection.spec.js.map +1 -0
  137. package/dist/esm/tests/cors/http-api.browser.d.ts +2 -0
  138. package/dist/esm/tests/cors/http-api.browser.d.ts.map +1 -0
  139. package/dist/esm/tests/cors/http-api.browser.js +60 -0
  140. package/dist/esm/tests/cors/http-api.browser.js.map +1 -0
  141. package/dist/esm/tests/cors/ping.browser.d.ts +2 -0
  142. package/dist/esm/tests/cors/ping.browser.d.ts.map +1 -0
  143. package/dist/esm/tests/cors/ping.browser.js +7 -0
  144. package/dist/esm/tests/cors/ping.browser.js.map +1 -0
  145. package/dist/esm/tests/dwn-process-message.spec.d.ts +2 -0
  146. package/dist/esm/tests/dwn-process-message.spec.d.ts.map +1 -0
  147. package/dist/esm/tests/dwn-process-message.spec.js +172 -0
  148. package/dist/esm/tests/dwn-process-message.spec.js.map +1 -0
  149. package/dist/esm/tests/dwn-server.spec.d.ts +2 -0
  150. package/dist/esm/tests/dwn-server.spec.d.ts.map +1 -0
  151. package/dist/esm/tests/dwn-server.spec.js +49 -0
  152. package/dist/esm/tests/dwn-server.spec.js.map +1 -0
  153. package/dist/esm/tests/http-api.spec.d.ts +2 -0
  154. package/dist/esm/tests/http-api.spec.d.ts.map +1 -0
  155. package/dist/esm/tests/http-api.spec.js +775 -0
  156. package/dist/esm/tests/http-api.spec.js.map +1 -0
  157. package/dist/esm/tests/json-rpc-socket.spec.d.ts +2 -0
  158. package/dist/esm/tests/json-rpc-socket.spec.d.ts.map +1 -0
  159. package/dist/esm/tests/json-rpc-socket.spec.js +225 -0
  160. package/dist/esm/tests/json-rpc-socket.spec.js.map +1 -0
  161. package/dist/esm/tests/plugins/data-store-sqlite.d.ts +17 -0
  162. package/dist/esm/tests/plugins/data-store-sqlite.d.ts.map +1 -0
  163. package/dist/esm/tests/plugins/data-store-sqlite.js +23 -0
  164. package/dist/esm/tests/plugins/data-store-sqlite.js.map +1 -0
  165. package/dist/esm/tests/plugins/event-log-sqlite.d.ts +17 -0
  166. package/dist/esm/tests/plugins/event-log-sqlite.d.ts.map +1 -0
  167. package/dist/esm/tests/plugins/event-log-sqlite.js +23 -0
  168. package/dist/esm/tests/plugins/event-log-sqlite.js.map +1 -0
  169. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts +17 -0
  170. package/dist/esm/tests/plugins/event-stream-in-memory.d.ts.map +1 -0
  171. package/dist/esm/tests/plugins/event-stream-in-memory.js +21 -0
  172. package/dist/esm/tests/plugins/event-stream-in-memory.js.map +1 -0
  173. package/dist/esm/tests/plugins/message-store-sqlite.d.ts +17 -0
  174. package/dist/esm/tests/plugins/message-store-sqlite.d.ts.map +1 -0
  175. package/dist/esm/tests/plugins/message-store-sqlite.js +23 -0
  176. package/dist/esm/tests/plugins/message-store-sqlite.js.map +1 -0
  177. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts +17 -0
  178. package/dist/esm/tests/plugins/resumable-task-store-sqlite.d.ts.map +1 -0
  179. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js +23 -0
  180. package/dist/esm/tests/plugins/resumable-task-store-sqlite.js.map +1 -0
  181. package/dist/esm/tests/process-handler.spec.d.ts +2 -0
  182. package/dist/esm/tests/process-handler.spec.d.ts.map +1 -0
  183. package/dist/esm/tests/process-handler.spec.js +60 -0
  184. package/dist/esm/tests/process-handler.spec.js.map +1 -0
  185. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts +2 -0
  186. package/dist/esm/tests/registration/proof-of-work-manager.spec.d.ts.map +1 -0
  187. package/dist/esm/tests/registration/proof-of-work-manager.spec.js +157 -0
  188. package/dist/esm/tests/registration/proof-of-work-manager.spec.js.map +1 -0
  189. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts +2 -0
  190. package/dist/esm/tests/rpc-subscribe-close.spec.d.ts.map +1 -0
  191. package/dist/esm/tests/rpc-subscribe-close.spec.js +81 -0
  192. package/dist/esm/tests/rpc-subscribe-close.spec.js.map +1 -0
  193. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts +2 -0
  194. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.d.ts.map +1 -0
  195. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js +73 -0
  196. package/dist/esm/tests/scenarios/dynamic-plugin-loading.spec.js.map +1 -0
  197. package/dist/esm/tests/scenarios/registration.spec.d.ts +2 -0
  198. package/dist/esm/tests/scenarios/registration.spec.d.ts.map +1 -0
  199. package/dist/esm/tests/scenarios/registration.spec.js +507 -0
  200. package/dist/esm/tests/scenarios/registration.spec.js.map +1 -0
  201. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts +2 -0
  202. package/dist/esm/tests/scenarios/web5-connect.spec.d.ts.map +1 -0
  203. package/dist/esm/tests/scenarios/web5-connect.spec.js +137 -0
  204. package/dist/esm/tests/scenarios/web5-connect.spec.js.map +1 -0
  205. package/dist/esm/tests/test-dwn.d.ts +7 -0
  206. package/dist/esm/tests/test-dwn.d.ts.map +1 -0
  207. package/dist/esm/tests/test-dwn.js +34 -0
  208. package/dist/esm/tests/test-dwn.js.map +1 -0
  209. package/dist/esm/tests/utils.d.ts +46 -0
  210. package/dist/esm/tests/utils.d.ts.map +1 -0
  211. package/dist/esm/tests/utils.js +116 -0
  212. package/dist/esm/tests/utils.js.map +1 -0
  213. package/dist/esm/tests/ws-api.spec.d.ts +2 -0
  214. package/dist/esm/tests/ws-api.spec.d.ts.map +1 -0
  215. package/dist/esm/tests/ws-api.spec.js +327 -0
  216. package/dist/esm/tests/ws-api.spec.js.map +1 -0
  217. package/package.json +119 -0
  218. package/src/config.ts +71 -0
  219. package/src/connection/connection-manager.ts +39 -0
  220. package/src/connection/socket-connection.ts +221 -0
  221. package/src/dwn-error.ts +38 -0
  222. package/src/dwn-server.ts +178 -0
  223. package/src/http-api.ts +541 -0
  224. package/src/index.ts +6 -0
  225. package/src/json-rpc-api.ts +11 -0
  226. package/src/json-rpc-handlers/dwn/index.ts +1 -0
  227. package/src/json-rpc-handlers/dwn/process-message.ts +123 -0
  228. package/src/json-rpc-handlers/subscription/close.ts +59 -0
  229. package/src/json-rpc-handlers/subscription/index.ts +1 -0
  230. package/src/json-rpc-socket.ts +155 -0
  231. package/src/lib/http-server-shutdown-handler.ts +79 -0
  232. package/src/lib/json-rpc-router.ts +52 -0
  233. package/src/lib/json-rpc.ts +126 -0
  234. package/src/main.ts +14 -0
  235. package/src/metrics.ts +14 -0
  236. package/src/plugin-loader.ts +17 -0
  237. package/src/process-handlers.ts +65 -0
  238. package/src/registration/proof-of-work-manager.ts +317 -0
  239. package/src/registration/proof-of-work-types.ts +7 -0
  240. package/src/registration/proof-of-work.ts +100 -0
  241. package/src/registration/registration-manager.ts +153 -0
  242. package/src/registration/registration-store.ts +79 -0
  243. package/src/registration/registration-types.ts +18 -0
  244. package/src/storage.ts +213 -0
  245. package/src/web5-connect/sql-ttl-cache.ts +137 -0
  246. package/src/web5-connect/web5-connect-server.ts +122 -0
  247. package/src/ws-api.ts +45 -0
@@ -0,0 +1,327 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-api.spec.js","sourceRoot":"","sources":["../../../tests/ws-api.spec.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "@enbox/dwn-server",
3
+ "type": "module",
4
+ "version": "0.0.1",
5
+ "files": [
6
+ "dist",
7
+ "src"
8
+ ],
9
+ "main": "./dist/cjs/index.js",
10
+ "module": "./dist/esm/src/index.js",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/esm/src/index.js",
14
+ "require": "./dist/cjs/index.js"
15
+ }
16
+ },
17
+ "bin": {
18
+ "dwn-server": "./dist/esm/src/main.js"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/enboxorg/enbox.git",
23
+ "directory": "packages/dwn-server"
24
+ },
25
+ "homepage": "https://github.com/enboxorg/enbox/tree/main/packages/dwn-server#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/enboxorg/enbox/issues"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@enbox/common": "workspace:*",
34
+ "@enbox/crypto": "workspace:*",
35
+ "@enbox/dids": "workspace:*",
36
+ "@enbox/dwn-sdk-js": "workspace:*",
37
+ "@enbox/dwn-sql-store": "workspace:*",
38
+ "better-sqlite3": "^8.5.0",
39
+ "body-parser": "^1.20.2",
40
+ "bytes": "3.1.2",
41
+ "cors": "2.8.5",
42
+ "express": "^4.20.0",
43
+ "kysely": "^0.26.3",
44
+ "loglevel": "^1.8.1",
45
+ "loglevel-plugin-prefix": "^0.8.4",
46
+ "multiformats": "11.0.2",
47
+ "mysql2": "^3.9.7",
48
+ "node-fetch": "3.3.1",
49
+ "pg": "^8.11.2",
50
+ "pg-cursor": "^2.10.2",
51
+ "prom-client": "14.2.0",
52
+ "readable-stream": "4.4.2",
53
+ "response-time": "2.3.2",
54
+ "uuid": "9.0.0",
55
+ "ws": "8.18.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/bytes": "3.1.1",
59
+ "@types/chai": "4.3.4",
60
+ "@types/chai-as-promised": "7.1.5",
61
+ "@types/express": "4.17.21",
62
+ "@types/mocha": "10.0.1",
63
+ "@types/node": "18.11.18",
64
+ "@types/readable-stream": "4.0.6",
65
+ "@types/sinon": "17.0.3",
66
+ "@types/supertest": "2.0.12",
67
+ "@types/ws": "8.5.10",
68
+ "@typescript-eslint/eslint-plugin": "^7.8.0",
69
+ "@typescript-eslint/parser": "^7.8.0",
70
+ "c8": "8.0.1",
71
+ "chai": "4.3.6",
72
+ "chai-as-promised": "7.1.1",
73
+ "crypto-browserify": "^3.12.0",
74
+ "esbuild": "0.16.17",
75
+ "eslint": "8.56.0",
76
+ "eslint-plugin-import": "^2.29.1",
77
+ "eslint-plugin-mocha": "^10.4.3",
78
+ "eslint-plugin-todo-plz": "^1.3.0",
79
+ "http-proxy": "^1.18.1",
80
+ "husky": "^8.0.0",
81
+ "karma": "^6.4.2",
82
+ "karma-chrome-launcher": "^3.2.0",
83
+ "karma-esbuild": "2.2.5",
84
+ "karma-mocha": "^2.0.1",
85
+ "lint-staged": "^15.2.9",
86
+ "mocha": "^10.2.0",
87
+ "puppeteer": "^22.11.2",
88
+ "rimraf": "^5.0.0",
89
+ "sinon": "17.0.1",
90
+ "stream-browserify": "^3.0.0",
91
+ "supertest": "6.3.3",
92
+ "typescript": "^5.1.6"
93
+ },
94
+ "scripts": {
95
+ "build:esm": "pnpm clean & tsc",
96
+ "build:cjs": "pnpm build:esm && node build/create-cjs-bundle.cjs && echo '{\"type\": \"commonjs\"}' > ./dist/cjs/package.json",
97
+ "build": "pnpm clean && pnpm build:esm && pnpm build:cjs",
98
+ "clean": "rimraf dist && rimraf generated/*",
99
+ "lint": "eslint . --ext .ts --max-warnings 0",
100
+ "lint:fix": "eslint . --ext .ts --fix",
101
+ "test": "pnpm build:esm && cp -R tests/fixtures dist/esm/tests && c8 mocha",
102
+ "server": "pnpm build:esm && node dist/esm/src/main.js"
103
+ },
104
+ "husky": {
105
+ "hooks": {
106
+ "pre-commit": "lint-staged"
107
+ }
108
+ },
109
+ "lint-staged": {
110
+ "*.{js,ts}": [
111
+ "eslint --fix"
112
+ ]
113
+ },
114
+ "overrides": {
115
+ "express": {
116
+ "serve-static": "^1.16.2"
117
+ }
118
+ }
119
+ }
package/src/config.ts ADDED
@@ -0,0 +1,71 @@
1
+ import bytes from 'bytes';
2
+
3
+ export type DwnServerConfig = typeof config;
4
+
5
+ export const config = {
6
+ /**
7
+ * Used to populate the `server` property returned by the `/info` endpoint.
8
+ *
9
+ * If running using `npm` the `process.env.npm_package_name` variable exists and we use that,
10
+ * otherwise we fall back on the use defined `DWN_SERVER_PACKAGE_NAME` or `@enbox/dwn-server`.
11
+ */
12
+ serverName: process.env.npm_package_name || process.env.DWN_SERVER_PACKAGE_NAME || '@enbox/dwn-server',
13
+
14
+ /**
15
+ * The base external URL of this DWN.
16
+ * This is used to construct URL paths such as the `Request URI` in the Web5 Connect flow.
17
+ * Should NOT be pointing to `localhost` for production use.
18
+ */
19
+ baseUrl: process.env.DWN_BASE_URL || 'http://localhost:3000',
20
+
21
+ /**
22
+ * Port that server listens on.
23
+ */
24
+ port: parseInt(process.env.DS_PORT || '3000'),
25
+
26
+ /**
27
+ * The URL of the TTL cache used by the DWN.
28
+ * NOTE: Used for session/state keeping, thus requires the cache to be commonly addressable by nodes in a cloud cluster environment.
29
+ *
30
+ * Currently only supports SQL databases, e.g.
31
+ * Postgres: 'postgres://root:dwn@localhost:5432/dwn'
32
+ * MySQL: 'mysql://root:dwn@localhost:3306/dwn'
33
+ */
34
+ ttlCacheUrl: process.env.DWN_TTL_CACHE_URL || 'sqlite://',
35
+
36
+ /**
37
+ * Used to populate the `version` and `sdkVersion` properties returned by the `/info` endpoint.
38
+ *
39
+ * The `version` and `sdkVersion` are pulled from `package.json` at runtime.
40
+ * If running using `npm` the `process.env.npm_package_json` variable exists as the filepath, so we use that.
41
+ * Otherwise we check to see if a specific `DWN_SERVER_PACKAGE_JSON` exists, if it does we use that.
42
+ * Finally if both of those options don't exist we resort to the path within the docker server image, located at `/dwn-server/package.json`
43
+ */
44
+ packageJsonPath: process.env.npm_package_json || process.env.DWN_SERVER_PACKAGE_JSON || '/dwn-server/package.json',
45
+ // max size of data that can be provided with a RecordsWrite
46
+ maxRecordDataSize: bytes(process.env.MAX_RECORD_DATA_SIZE || '1gb'),
47
+
48
+ // whether to enable 'ws:'
49
+ webSocketSupport: { on: true, off: false }[process.env.DS_WEBSOCKET_SERVER] ?? true,
50
+
51
+ /**
52
+ * Path to DWN Event Stream plugin to use. Default single-node implementation will be used if left empty.
53
+ */
54
+ eventStreamPluginPath: process.env.DWN_EVENT_STREAM_PLUGIN_PATH,
55
+
56
+ // where to store persistent data
57
+ messageStore: process.env.DWN_STORAGE_MESSAGES || process.env.DWN_STORAGE || 'level://data',
58
+ dataStore: process.env.DWN_STORAGE_DATA || process.env.DWN_STORAGE || 'level://data',
59
+ eventLog: process.env.DWN_STORAGE_EVENTS || process.env.DWN_STORAGE || 'level://data',
60
+ resumableTaskStore: process.env.DWN_STORAGE_RESUMABLE_TASKS || process.env.DWN_STORAGE || 'level://data',
61
+
62
+ // tenant registration feature configuration
63
+ registrationStoreUrl: process.env.DWN_REGISTRATION_STORE_URL || process.env.DWN_STORAGE,
64
+ registrationProofOfWorkSeed: process.env.DWN_REGISTRATION_PROOF_OF_WORK_SEED,
65
+ registrationProofOfWorkEnabled: process.env.DWN_REGISTRATION_PROOF_OF_WORK_ENABLED === 'true',
66
+ registrationProofOfWorkInitialMaxHash: process.env.DWN_REGISTRATION_PROOF_OF_WORK_INITIAL_MAX_HASH,
67
+ termsOfServiceFilePath: process.env.DWN_TERMS_OF_SERVICE_FILE_PATH,
68
+
69
+ // log level - trace/debug/info/warn/error
70
+ logLevel: process.env.DWN_SERVER_LOG_LEVEL || 'INFO',
71
+ };
@@ -0,0 +1,39 @@
1
+ import type { Dwn } from "@enbox/dwn-sdk-js";
2
+
3
+ import type { IncomingMessage } from "http";
4
+ import type { WebSocket } from 'ws';
5
+
6
+ import { SocketConnection } from "./socket-connection.js";
7
+
8
+ /**
9
+ * Interface for managing `WebSocket` connections as they arrive.
10
+ */
11
+ export interface ConnectionManager {
12
+ /** connect handler used for the `WebSockets` `'connection'` event. */
13
+ connect(socket: WebSocket, request?: IncomingMessage): Promise<void>;
14
+ /** closes all of the connections */
15
+ closeAll(): Promise<void>
16
+ }
17
+
18
+ /**
19
+ * A Simple In Memory ConnectionManager implementation.
20
+ * It uses a `Map<WebSocket, SocketConnection>` to manage connections.
21
+ */
22
+ export class InMemoryConnectionManager implements ConnectionManager {
23
+ constructor(private dwn: Dwn, private connections: Map<WebSocket, SocketConnection> = new Map()) {}
24
+
25
+ async connect(socket: WebSocket): Promise<void> {
26
+ const connection = new SocketConnection(socket, this.dwn, () => {
27
+ // this is the onClose handler to clean up any closed connections.
28
+ this.connections.delete(socket);
29
+ });
30
+
31
+ this.connections.set(socket, connection);
32
+ }
33
+
34
+ async closeAll(): Promise<void> {
35
+ const closePromises = [];
36
+ this.connections.forEach(connection => closePromises.push(connection.close()));
37
+ await Promise.all(closePromises);
38
+ }
39
+ }