@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,39 @@
1
+ import type { Dialect } from '@enbox/dwn-sql-store';
2
+ /**
3
+ * The SqlTtlCache is responsible for storing and retrieving cache data with TTL (Time-to-Live).
4
+ */
5
+ export declare class SqlTtlCache {
6
+ private static readonly cacheTableName;
7
+ private static readonly cleanupIntervalInSeconds;
8
+ private sqlDialect;
9
+ private db;
10
+ private cleanupTimer;
11
+ private constructor();
12
+ /**
13
+ * Creates a new SqlTtlCache instance.
14
+ */
15
+ static create(sqlDialect: Dialect): Promise<SqlTtlCache>;
16
+ private initialize;
17
+ /**
18
+ * Starts a timer to periodically clean up expired cache entries.
19
+ */
20
+ private startCleanupTimer;
21
+ /**
22
+ * Inserts a cache entry.
23
+ * @param ttl The time-to-live in seconds.
24
+ */
25
+ insert(key: string, value: object, ttl: number): Promise<void>;
26
+ /**
27
+ * Retrieves a cache entry if it is not expired and cleans up expired entries.
28
+ */
29
+ get(key: string): Promise<object | undefined>;
30
+ /**
31
+ * Deletes a cache entry.
32
+ */
33
+ delete(key: string): Promise<void>;
34
+ /**
35
+ * Cleans up expired cache entries.
36
+ */
37
+ cleanUpExpiredEntries(): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=sql-ttl-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-ttl-cache.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAEtD,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,YAAY,CAAiB;IAErC,OAAO;IAKP;;OAEG;WACiB,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;YAQvD,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E;;OAEG;IACU,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAwB1D;;OAEG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpD"}
@@ -0,0 +1,106 @@
1
+ import { Kysely } from 'kysely';
2
+ /**
3
+ * The SqlTtlCache is responsible for storing and retrieving cache data with TTL (Time-to-Live).
4
+ */
5
+ export class SqlTtlCache {
6
+ static cacheTableName = 'cacheEntries';
7
+ static cleanupIntervalInSeconds = 60;
8
+ sqlDialect;
9
+ db;
10
+ cleanupTimer;
11
+ constructor(sqlDialect) {
12
+ this.db = new Kysely({ dialect: sqlDialect });
13
+ this.sqlDialect = sqlDialect;
14
+ }
15
+ /**
16
+ * Creates a new SqlTtlCache instance.
17
+ */
18
+ static async create(sqlDialect) {
19
+ const cacheManager = new SqlTtlCache(sqlDialect);
20
+ await cacheManager.initialize();
21
+ return cacheManager;
22
+ }
23
+ async initialize() {
24
+ // create table if it doesn't exist
25
+ const tableExists = await this.sqlDialect.hasTable(this.db, SqlTtlCache.cacheTableName);
26
+ if (!tableExists) {
27
+ await this.db.schema
28
+ .createTable(SqlTtlCache.cacheTableName)
29
+ .ifNotExists() // kept to show supported by all dialects in contrast to ifNotExists() below, though not needed due to tableExists check above
30
+ // 512 chars to accommodate potentially large `state` in Web5 Connect flow
31
+ .addColumn('key', 'varchar(512)', (column) => column.primaryKey())
32
+ .addColumn('value', 'text', (column) => column.notNull())
33
+ .addColumn('expiry', 'integer', (column) => column.notNull())
34
+ .execute();
35
+ await this.db.schema
36
+ .createIndex('index_expiry')
37
+ // .ifNotExists() // intentionally kept commented out code to show that it is not supported by all dialects (ie. MySQL)
38
+ .on(SqlTtlCache.cacheTableName)
39
+ .column('expiry')
40
+ .execute();
41
+ }
42
+ // Start the cleanup timer
43
+ this.startCleanupTimer();
44
+ }
45
+ /**
46
+ * Starts a timer to periodically clean up expired cache entries.
47
+ */
48
+ startCleanupTimer() {
49
+ this.cleanupTimer = setInterval(async () => {
50
+ await this.cleanUpExpiredEntries();
51
+ }, SqlTtlCache.cleanupIntervalInSeconds * 1000);
52
+ }
53
+ /**
54
+ * Inserts a cache entry.
55
+ * @param ttl The time-to-live in seconds.
56
+ */
57
+ async insert(key, value, ttl) {
58
+ const expiry = Date.now() + (ttl * 1000);
59
+ const objectString = JSON.stringify(value);
60
+ await this.db
61
+ .insertInto(SqlTtlCache.cacheTableName)
62
+ .values({ key, value: objectString, expiry })
63
+ .execute();
64
+ }
65
+ /**
66
+ * Retrieves a cache entry if it is not expired and cleans up expired entries.
67
+ */
68
+ async get(key) {
69
+ const result = await this.db
70
+ .selectFrom(SqlTtlCache.cacheTableName)
71
+ .select('key')
72
+ .select('value')
73
+ .select('expiry')
74
+ .where('key', '=', key)
75
+ .execute();
76
+ if (result.length === 0) {
77
+ return undefined;
78
+ }
79
+ const entry = result[0];
80
+ // if the entry is expired, don't return it and delete it
81
+ if (Date.now() >= entry.expiry) {
82
+ this.delete(key); // no need to await
83
+ return undefined;
84
+ }
85
+ return JSON.parse(entry.value);
86
+ }
87
+ /**
88
+ * Deletes a cache entry.
89
+ */
90
+ async delete(key) {
91
+ await this.db
92
+ .deleteFrom(SqlTtlCache.cacheTableName)
93
+ .where('key', '=', key)
94
+ .execute();
95
+ }
96
+ /**
97
+ * Cleans up expired cache entries.
98
+ */
99
+ async cleanUpExpiredEntries() {
100
+ await this.db
101
+ .deleteFrom(SqlTtlCache.cacheTableName)
102
+ .where('expiry', '<', Date.now())
103
+ .execute();
104
+ }
105
+ }
106
+ //# sourceMappingURL=sql-ttl-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-ttl-cache.js","sourceRoot":"","sources":["../../../../src/web5-connect/sql-ttl-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The Web5 Connect Request object.
3
+ */
4
+ export type Web5ConnectRequest = any;
5
+ /**
6
+ * The Web5 Connect Response object, which is also an OIDC ID token
7
+ */
8
+ export type Web5ConnectResponse = any;
9
+ /**
10
+ * The result of the setWeb5ConnectRequest() method.
11
+ */
12
+ export type SetWeb5ConnectRequestResult = {
13
+ /**
14
+ * The Request URI that the wallet should use to retrieve the request object.
15
+ */
16
+ request_uri: string;
17
+ /**
18
+ * The time in seconds that the Request URI is valid for.
19
+ */
20
+ expires_in: number;
21
+ };
22
+ /**
23
+ * The Web5 Connect Server is responsible for handling the Web5 Connect flow.
24
+ */
25
+ export declare class Web5ConnectServer {
26
+ static readonly ttlInSeconds = 600;
27
+ private baseUrl;
28
+ private cache;
29
+ /**
30
+ * Creates a new instance of the Web5 Connect Server.
31
+ * @param params.baseUrl The the base URL of the connect server including the port.
32
+ * This is given to the Identity Provider (wallet) to fetch the Web5 Connect Request object.
33
+ * @param params.sqlTtlCacheUrl The URL of the SQL database to use as the TTL cache.
34
+ */
35
+ static create({ baseUrl, sqlTtlCacheUrl }: {
36
+ baseUrl: string;
37
+ sqlTtlCacheUrl: string;
38
+ }): Promise<Web5ConnectServer>;
39
+ private constructor();
40
+ /**
41
+ * Stores the given Web5 Connect Request object, which is also an OAuth 2 Pushed Authorization Request (PAR) object.
42
+ * This is the initial call to the connect server to start the Web5 Connect flow.
43
+ */
44
+ setWeb5ConnectRequest(request: Web5ConnectRequest): Promise<SetWeb5ConnectRequestResult>;
45
+ /**
46
+ * Returns the Web5 Connect Request object. The request ID can only be used once.
47
+ */
48
+ getWeb5ConnectRequest(requestId: string): Promise<Web5ConnectRequest | undefined>;
49
+ /**
50
+ * Sets the Web5 Connect Response object, which is also an OIDC ID token.
51
+ */
52
+ setWeb5ConnectResponse(state: string, response: Web5ConnectResponse): Promise<any>;
53
+ /**
54
+ * Gets the Web5 Connect Response object. The `state` string can only be used once.
55
+ */
56
+ getWeb5ConnectResponse(state: string): Promise<Web5ConnectResponse | undefined>;
57
+ }
58
+ //# sourceMappingURL=web5-connect-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web5-connect-server.d.ts","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAA;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,gBAAuB,YAAY,OAAO;IAE1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAc;IAE3B;;;;;OAKG;WACiB,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE;QACtD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU9B,OAAO;IAMP;;;OAGG;IACU,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAcrG;;OAEG;IACU,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAc9F;;OAEG;IACU,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC;IAI/F;;OAEG;IACU,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;CAa7F"}
@@ -0,0 +1,77 @@
1
+ import { getDialectFromUrl } from "../storage.js";
2
+ import { CryptoUtils } from '@enbox/crypto';
3
+ import { SqlTtlCache } from "./sql-ttl-cache.js";
4
+ /**
5
+ * The Web5 Connect Server is responsible for handling the Web5 Connect flow.
6
+ */
7
+ export class Web5ConnectServer {
8
+ static ttlInSeconds = 600;
9
+ baseUrl;
10
+ cache;
11
+ /**
12
+ * Creates a new instance of the Web5 Connect Server.
13
+ * @param params.baseUrl The the base URL of the connect server including the port.
14
+ * This is given to the Identity Provider (wallet) to fetch the Web5 Connect Request object.
15
+ * @param params.sqlTtlCacheUrl The URL of the SQL database to use as the TTL cache.
16
+ */
17
+ static async create({ baseUrl, sqlTtlCacheUrl }) {
18
+ const web5ConnectServer = new Web5ConnectServer({ baseUrl });
19
+ // Initialize TTL cache.
20
+ const sqlDialect = getDialectFromUrl(new URL(sqlTtlCacheUrl));
21
+ web5ConnectServer.cache = await SqlTtlCache.create(sqlDialect);
22
+ return web5ConnectServer;
23
+ }
24
+ constructor({ baseUrl }) {
25
+ this.baseUrl = baseUrl;
26
+ }
27
+ /**
28
+ * Stores the given Web5 Connect Request object, which is also an OAuth 2 Pushed Authorization Request (PAR) object.
29
+ * This is the initial call to the connect server to start the Web5 Connect flow.
30
+ */
31
+ async setWeb5ConnectRequest(request) {
32
+ // Generate a request URI
33
+ const requestId = CryptoUtils.randomUuid();
34
+ const request_uri = `${this.baseUrl}/connect/authorize/${requestId}.jwt`;
35
+ // Store the Request Object.
36
+ this.cache.insert(`request:${requestId}`, request, Web5ConnectServer.ttlInSeconds);
37
+ return {
38
+ request_uri,
39
+ expires_in: Web5ConnectServer.ttlInSeconds,
40
+ };
41
+ }
42
+ /**
43
+ * Returns the Web5 Connect Request object. The request ID can only be used once.
44
+ */
45
+ async getWeb5ConnectRequest(requestId) {
46
+ const request = await this.cache.get(`request:${requestId}`);
47
+ // Delete the Request Object from cache once it has been retrieved.
48
+ // IMPORTANT: only delete if the object exists, otherwise there could be a race condition
49
+ // where the object does not exist in this call but becomes available immediately after,
50
+ // we would end up deleting it before it is successfully retrieved.
51
+ if (request !== undefined) {
52
+ this.cache.delete(`request:${requestId}`);
53
+ }
54
+ return request;
55
+ }
56
+ /**
57
+ * Sets the Web5 Connect Response object, which is also an OIDC ID token.
58
+ */
59
+ async setWeb5ConnectResponse(state, response) {
60
+ this.cache.insert(`response:${state}`, response, Web5ConnectServer.ttlInSeconds);
61
+ }
62
+ /**
63
+ * Gets the Web5 Connect Response object. The `state` string can only be used once.
64
+ */
65
+ async getWeb5ConnectResponse(state) {
66
+ const response = await this.cache.get(`response:${state}`);
67
+ // Delete the Response object from the cache once it has been retrieved.
68
+ // IMPORTANT: only delete if the object exists, otherwise there could be a race condition
69
+ // where the object does not exist in this call but becomes available immediately after,
70
+ // we would end up deleting it before it is successfully retrieved.
71
+ if (response !== undefined) {
72
+ this.cache.delete(`response:${state}`);
73
+ }
74
+ return response;
75
+ }
76
+ }
77
+ //# sourceMappingURL=web5-connect-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web5-connect-server.js","sourceRoot":"","sources":["../../../../src/web5-connect/web5-connect-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2BjD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACrB,MAAM,CAAU,YAAY,GAAG,GAAG,CAAC;IAElC,OAAO,CAAS;IAChB,KAAK,CAAc;IAE3B;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAGnD;QACC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE7D,wBAAwB;QACxB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,iBAAiB,CAAC,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/D,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,YAAoB,EAAE,OAAO,EAE5B;QACC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,qBAAqB,CAAC,OAA2B;QAC5D,yBAAyB;QACzB,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,OAAO,sBAAsB,SAAS,MAAM,CAAC;QAEzE,4BAA4B;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,SAAS,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEnF,OAAO;YACL,WAAW;YACX,UAAU,EAAI,iBAAiB,CAAC,YAAY;SAC7C,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAE7D,mEAAmE;QACnE,yFAAyF;QACzF,wFAAwF;QACxF,mEAAmE;QACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CAAC,KAAa,EAAE,QAA6B;QAC9E,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,EAAE,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CAAC,KAAa;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QAE3D,wEAAwE;QACxE,yFAAyF;QACzF,wFAAwF;QACxF,mEAAmE;QACnE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Dwn } from '@enbox/dwn-sdk-js';
2
+ import type { Server } from 'http';
3
+ import { WebSocketServer } from 'ws';
4
+ import type { ConnectionManager } from './connection/connection-manager.js';
5
+ export declare class WsApi {
6
+ #private;
7
+ dwn: Dwn;
8
+ constructor(server: Server, dwn: Dwn, connectionManager?: ConnectionManager);
9
+ get server(): WebSocketServer;
10
+ start(): void;
11
+ close(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=ws-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-api.d.ts","sourceRoot":"","sources":["../../../src/ws-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,GAAG,EACJ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAG5E,qBAAa,KAAK;;IAEhB,GAAG,EAAE,GAAG,CAAC;gBAGG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,EAAE,iBAAiB;IAM3E,IAAI,MAAM,IAAI,eAAe,CAE5B;IAWD,KAAK,IAAI,IAAI;IAIP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -0,0 +1,31 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { InMemoryConnectionManager } from './connection/connection-manager.js';
3
+ export class WsApi {
4
+ #wsServer;
5
+ dwn;
6
+ #connectionManager;
7
+ constructor(server, dwn, connectionManager) {
8
+ this.dwn = dwn;
9
+ this.#connectionManager = connectionManager || new InMemoryConnectionManager(dwn);
10
+ this.#wsServer = new WebSocketServer({ server });
11
+ }
12
+ get server() {
13
+ return this.#wsServer;
14
+ }
15
+ /**
16
+ * Handler for starting a WebSocket.
17
+ * Sets listeners for `connection`, `close` events.
18
+ */
19
+ #setupWebSocket() {
20
+ this.#wsServer.on('connection', (socket, request) => this.#connectionManager.connect(socket, request));
21
+ this.#wsServer.on('close', () => this.#connectionManager.closeAll());
22
+ }
23
+ start() {
24
+ this.#setupWebSocket();
25
+ }
26
+ async close() {
27
+ this.#wsServer.close();
28
+ await this.#connectionManager.closeAll();
29
+ }
30
+ }
31
+ //# sourceMappingURL=ws-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-api.js","sourceRoot":"","sources":["../../../src/ws-api.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAGrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,MAAM,OAAO,KAAK;IAChB,SAAS,CAAkB;IAC3B,GAAG,CAAM;IACT,kBAAkB,CAAmB;IAErC,YAAY,MAAc,EAAE,GAAQ,EAAE,iBAAqC;QACzE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,IAAI,IAAI,yBAAyB,CAAC,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { Persona } from '@enbox/dwn-sdk-js';
2
+ /**
3
+ * Validator of common scenarios.
4
+ */
5
+ export default class CommonScenarioValidator {
6
+ /**
7
+ * Sanity test RecordsWrite and RecordsRead on the DWN instance.
8
+ */
9
+ static sanityTestDwnReadWrite(dwnUrl: string, persona?: Persona): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=common-scenario-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-scenario-validator.d.ts","sourceRoot":"","sources":["../../../tests/common-scenario-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAsBjD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C;;OAEG;WACiB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA+G7F"}
@@ -0,0 +1,114 @@
1
+ import chaiAsPromised from 'chai-as-promised';
2
+ import chai, { expect } from 'chai';
3
+ import fetch from 'node-fetch';
4
+ import { createJsonRpcRequest } from '../src/lib/json-rpc.js';
5
+ import { getFileAsReadStream } from './utils.js';
6
+ import { v4 as uuidv4 } from 'uuid';
7
+ import { webcrypto } from 'node:crypto';
8
+ import { Cid, DwnConstant, Jws, ProtocolsConfigure, RecordsRead, RecordsWrite, TestDataGenerator } from '@enbox/dwn-sdk-js';
9
+ // node.js 18 and earlier needs globalThis.crypto polyfill
10
+ if (!globalThis.crypto) {
11
+ // @ts-ignore
12
+ globalThis.crypto = webcrypto;
13
+ }
14
+ chai.use(chaiAsPromised);
15
+ /**
16
+ * Validator of common scenarios.
17
+ */
18
+ export default class CommonScenarioValidator {
19
+ /**
20
+ * Sanity test RecordsWrite and RecordsRead on the DWN instance.
21
+ */
22
+ static async sanityTestDwnReadWrite(dwnUrl, persona) {
23
+ const alice = persona || await TestDataGenerator.generateDidKeyPersona();
24
+ const aliceSigner = Jws.createSigner(alice);
25
+ // install minimal protocol on Alice's DWN
26
+ const protocolDefinition = {
27
+ protocol: 'http://minimal.xyz',
28
+ published: false,
29
+ types: {
30
+ foo: {}
31
+ },
32
+ structure: {
33
+ foo: {}
34
+ }
35
+ };
36
+ const protocolsConfig = await ProtocolsConfigure.create({
37
+ signer: aliceSigner,
38
+ definition: protocolDefinition
39
+ });
40
+ const protocolConfigureRequestId = uuidv4();
41
+ const protocolConfigureRequest = createJsonRpcRequest(protocolConfigureRequestId, 'dwn.processMessage', {
42
+ target: alice.did,
43
+ message: protocolsConfig.message,
44
+ });
45
+ const protocolConfigureResponse = await fetch(dwnUrl, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'dwn-request': JSON.stringify(protocolConfigureRequest),
49
+ }
50
+ });
51
+ const protocolConfigureResponseBody = await protocolConfigureResponse.json();
52
+ expect(protocolConfigureResponse.status).to.equal(200);
53
+ expect(protocolConfigureResponseBody.result.reply.status.code).to.equal(202);
54
+ // Alice writing a file larger than max data size allowed to be encoded directly in the DWN Message Store.
55
+ const filePath = './fixtures/test.jpeg';
56
+ const { cid: dataCid, size: dataSize, stream } = await getFileAsReadStream(filePath);
57
+ expect(dataSize).to.be.greaterThan(DwnConstant.maxDataSizeAllowedToBeEncoded);
58
+ const recordsWrite = await RecordsWrite.create({
59
+ signer: aliceSigner,
60
+ dataFormat: 'image/jpeg',
61
+ dataCid,
62
+ dataSize
63
+ });
64
+ const recordsWriteRequestId = uuidv4();
65
+ const recordsWriteRequest = createJsonRpcRequest(recordsWriteRequestId, 'dwn.processMessage', {
66
+ target: alice.did,
67
+ message: recordsWrite.message,
68
+ });
69
+ const recordsWriteResponse = await fetch(dwnUrl, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'dwn-request': JSON.stringify(recordsWriteRequest),
73
+ },
74
+ body: stream
75
+ });
76
+ const recordsWriteResponseBody = await recordsWriteResponse.json();
77
+ expect(recordsWriteResponse.status).to.equal(200);
78
+ expect(recordsWriteResponseBody.result.reply.status.code).to.equal(202);
79
+ // Alice reading the file back out.
80
+ const recordsRead = await RecordsRead.create({
81
+ signer: aliceSigner,
82
+ filter: {
83
+ recordId: recordsWrite.message.recordId,
84
+ },
85
+ });
86
+ const recordsReadRequestId = uuidv4();
87
+ const recordsReadRequest = createJsonRpcRequest(recordsReadRequestId, 'dwn.processMessage', {
88
+ target: alice.did,
89
+ message: recordsRead.message
90
+ });
91
+ const recordsReadResponse = await fetch(dwnUrl, {
92
+ method: 'POST',
93
+ headers: {
94
+ 'dwn-request': JSON.stringify(recordsReadRequest),
95
+ },
96
+ });
97
+ expect(recordsReadResponse.status).to.equal(200);
98
+ const { headers } = recordsReadResponse;
99
+ const contentType = headers.get('content-type');
100
+ expect(contentType).to.not.be.undefined;
101
+ expect(contentType).to.equal('application/octet-stream');
102
+ const recordsReadDwnResponse = headers.get('dwn-response');
103
+ expect(recordsReadDwnResponse).to.not.be.undefined;
104
+ const recordsReadJsonRpcResponse = JSON.parse(recordsReadDwnResponse);
105
+ expect(recordsReadJsonRpcResponse.id).to.equal(recordsReadRequestId);
106
+ expect(recordsReadJsonRpcResponse.error).to.not.exist;
107
+ expect(recordsReadJsonRpcResponse.result.reply.status.code).to.equal(200);
108
+ expect(recordsReadJsonRpcResponse.result.reply.entry.recordsWrite).to.exist;
109
+ // can't get response as stream from supertest :(
110
+ const cid = await Cid.computeDagPbCidFromStream(recordsReadResponse.body);
111
+ expect(cid).to.equal(dataCid);
112
+ }
113
+ }
114
+ //# sourceMappingURL=common-scenario-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-scenario-validator.js","sourceRoot":"","sources":["../../../tests/common-scenario-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connection-manager.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.spec.d.ts","sourceRoot":"","sources":["../../../../tests/connection/connection-manager.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import chaiAsPromised from 'chai-as-promised';
2
+ import chai, { expect } from 'chai';
3
+ import sinon from 'sinon';
4
+ import { getTestDwn } from '../test-dwn.js';
5
+ import { InMemoryConnectionManager } from '../../src/connection/connection-manager.js';
6
+ import { config } from '../../src/config.js';
7
+ import { WsApi } from '../../src/ws-api.js';
8
+ import { HttpApi } from '../../src/http-api.js';
9
+ import { JsonRpcSocket } from '../../src/json-rpc-socket.js';
10
+ chai.use(chaiAsPromised);
11
+ describe('InMemoryConnectionManager', () => {
12
+ let dwn;
13
+ let connectionManager;
14
+ let httpApi;
15
+ let wsApi;
16
+ beforeEach(async () => {
17
+ dwn = await getTestDwn({ withEvents: true });
18
+ connectionManager = new InMemoryConnectionManager(dwn);
19
+ httpApi = await HttpApi.create(config, dwn);
20
+ await httpApi.start(9002);
21
+ wsApi = new WsApi(httpApi.server, dwn, connectionManager);
22
+ wsApi.start();
23
+ });
24
+ afterEach(async () => {
25
+ await connectionManager.closeAll();
26
+ await dwn.close();
27
+ await httpApi.close();
28
+ await wsApi.close();
29
+ sinon.restore();
30
+ });
31
+ it('adds connection to the connections and removes it if that connection is closed', async () => {
32
+ const connection = await JsonRpcSocket.connect('ws://127.0.0.1:9002');
33
+ expect(connectionManager.connections.size).to.equal(1);
34
+ connection.close();
35
+ await new Promise((resolve) => setTimeout(resolve, 5)); // wait for close event to be fired
36
+ expect(connectionManager.connections.size).to.equal(0);
37
+ });
38
+ it('closes all connections on `closeAll`', async () => {
39
+ await JsonRpcSocket.connect('ws://127.0.0.1:9002');
40
+ expect(connectionManager.connections.size).to.equal(1);
41
+ await JsonRpcSocket.connect('ws://127.0.0.1:9002');
42
+ expect(connectionManager.connections.size).to.equal(2);
43
+ await connectionManager.closeAll();
44
+ expect(connectionManager.connections.size).to.equal(0);
45
+ });
46
+ });
47
+ //# sourceMappingURL=connection-manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.spec.js","sourceRoot":"","sources":["../../../../tests/connection/connection-manager.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=socket-connection.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-connection.spec.d.ts","sourceRoot":"","sources":["../../../../tests/connection/socket-connection.spec.ts"],"names":[],"mappings":""}