@powerhousedao/reactor-api 6.0.0-dev.15 → 6.0.0-dev.150

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 (367) hide show
  1. package/README.md +6 -0
  2. package/dist/codegen.js +1 -1
  3. package/dist/codegen.js.map +1 -1
  4. package/dist/index.d.ts +4 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +4 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/config.d.ts +1 -2
  9. package/dist/src/config.d.ts.map +1 -1
  10. package/dist/src/config.js +1 -5
  11. package/dist/src/config.js.map +1 -1
  12. package/dist/src/dev.d.ts +2 -0
  13. package/dist/src/dev.d.ts.map +1 -0
  14. package/dist/src/dev.js +51 -0
  15. package/dist/src/dev.js.map +1 -0
  16. package/dist/src/graphql/auth/resolvers.d.ts +17 -0
  17. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
  18. package/dist/src/graphql/auth/resolvers.js +54 -0
  19. package/dist/src/graphql/auth/resolvers.js.map +1 -1
  20. package/dist/src/graphql/auth/schema.graphql +27 -5
  21. package/dist/src/graphql/auth/subgraph.d.ts +25 -0
  22. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
  23. package/dist/src/graphql/auth/subgraph.js +46 -2
  24. package/dist/src/graphql/auth/subgraph.js.map +1 -1
  25. package/dist/src/graphql/base-subgraph.d.ts +11 -4
  26. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  27. package/dist/src/graphql/base-subgraph.js +94 -2
  28. package/dist/src/graphql/base-subgraph.js.map +1 -1
  29. package/dist/src/graphql/document-model-subgraph.d.ts +104 -45
  30. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  31. package/dist/src/graphql/document-model-subgraph.js +323 -91
  32. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  33. package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts +23 -0
  34. package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts.map +1 -0
  35. package/dist/src/graphql/gateway/adapter-gateway-apollo.js +156 -0
  36. package/dist/src/graphql/gateway/adapter-gateway-apollo.js.map +1 -0
  37. package/dist/src/graphql/gateway/adapter-gateway-mercurius.d.ts +17 -0
  38. package/dist/src/graphql/gateway/adapter-gateway-mercurius.d.ts.map +1 -0
  39. package/dist/src/graphql/gateway/adapter-gateway-mercurius.js +154 -0
  40. package/dist/src/graphql/gateway/adapter-gateway-mercurius.js.map +1 -0
  41. package/dist/src/graphql/gateway/adapter-http-express.d.ts +25 -0
  42. package/dist/src/graphql/gateway/adapter-http-express.d.ts.map +1 -0
  43. package/dist/src/graphql/gateway/adapter-http-express.js +163 -0
  44. package/dist/src/graphql/gateway/adapter-http-express.js.map +1 -0
  45. package/dist/src/graphql/gateway/adapter-http-fastify.d.ts +23 -0
  46. package/dist/src/graphql/gateway/adapter-http-fastify.d.ts.map +1 -0
  47. package/dist/src/graphql/gateway/adapter-http-fastify.js +228 -0
  48. package/dist/src/graphql/gateway/adapter-http-fastify.js.map +1 -0
  49. package/dist/src/graphql/gateway/auth-middleware.d.ts +7 -0
  50. package/dist/src/graphql/gateway/auth-middleware.d.ts.map +1 -0
  51. package/dist/src/graphql/gateway/auth-middleware.js +15 -0
  52. package/dist/src/graphql/gateway/auth-middleware.js.map +1 -0
  53. package/dist/src/graphql/gateway/factory.d.ts +11 -0
  54. package/dist/src/graphql/gateway/factory.d.ts.map +1 -0
  55. package/dist/src/graphql/gateway/factory.js +21 -0
  56. package/dist/src/graphql/gateway/factory.js.map +1 -0
  57. package/dist/src/graphql/gateway/types.d.ts +100 -0
  58. package/dist/src/graphql/gateway/types.d.ts.map +1 -0
  59. package/dist/src/{sync → graphql/gateway}/types.js.map +1 -1
  60. package/dist/src/graphql/graphql-manager.d.ts +30 -12
  61. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  62. package/dist/src/graphql/graphql-manager.js +282 -232
  63. package/dist/src/graphql/graphql-manager.js.map +1 -1
  64. package/dist/src/graphql/index.d.ts +5 -1
  65. package/dist/src/graphql/index.d.ts.map +1 -1
  66. package/dist/src/graphql/index.js +5 -1
  67. package/dist/src/graphql/index.js.map +1 -1
  68. package/dist/src/graphql/packages/index.d.ts +2 -0
  69. package/dist/src/graphql/packages/index.d.ts.map +1 -0
  70. package/dist/src/graphql/packages/index.js +2 -0
  71. package/dist/src/graphql/packages/index.js.map +1 -0
  72. package/dist/src/graphql/packages/resolvers.d.ts +31 -0
  73. package/dist/src/graphql/packages/resolvers.d.ts.map +1 -0
  74. package/dist/src/graphql/packages/resolvers.js +37 -0
  75. package/dist/src/graphql/packages/resolvers.js.map +1 -0
  76. package/dist/src/graphql/packages/schema.graphql +50 -0
  77. package/dist/src/graphql/packages/subgraph.d.ts +55 -0
  78. package/dist/src/graphql/packages/subgraph.d.ts.map +1 -0
  79. package/dist/src/graphql/packages/subgraph.js +73 -0
  80. package/dist/src/graphql/packages/subgraph.js.map +1 -0
  81. package/dist/src/graphql/playground.d.ts.map +1 -1
  82. package/dist/src/graphql/playground.js +19 -12
  83. package/dist/src/graphql/playground.js.map +1 -1
  84. package/dist/src/graphql/reactor/adapters.d.ts +10 -2
  85. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
  86. package/dist/src/graphql/reactor/adapters.js +36 -1
  87. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  88. package/dist/src/graphql/reactor/factory.d.ts +28 -7
  89. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  90. package/dist/src/graphql/reactor/factory.js +1 -1
  91. package/dist/src/graphql/reactor/factory.js.map +1 -1
  92. package/dist/src/graphql/reactor/gen/graphql.d.ts +363 -84
  93. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  94. package/dist/src/graphql/reactor/gen/graphql.js +247 -12
  95. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  96. package/dist/src/graphql/reactor/index.d.ts +1 -1
  97. package/dist/src/graphql/reactor/index.d.ts.map +1 -1
  98. package/dist/src/graphql/reactor/index.js +1 -1
  99. package/dist/src/graphql/reactor/index.js.map +1 -1
  100. package/dist/src/graphql/reactor/operations.graphql +193 -3
  101. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
  102. package/dist/src/graphql/reactor/requester.with-zod.js +114 -38
  103. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
  104. package/dist/src/graphql/reactor/resolvers.d.ts +90 -26
  105. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  106. package/dist/src/graphql/reactor/resolvers.js +258 -77
  107. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  108. package/dist/src/graphql/reactor/schema.graphql +78 -32
  109. package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
  110. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  111. package/dist/src/graphql/reactor/subgraph.js +139 -213
  112. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  113. package/dist/src/graphql/reactor/validation.d.ts +266 -20
  114. package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
  115. package/dist/src/graphql/reactor/validation.js +98 -4
  116. package/dist/src/graphql/reactor/validation.js.map +1 -1
  117. package/dist/src/graphql/sse.d.ts +35 -0
  118. package/dist/src/graphql/sse.d.ts.map +1 -0
  119. package/dist/src/graphql/sse.js +29 -0
  120. package/dist/src/graphql/sse.js.map +1 -0
  121. package/dist/src/graphql/system/index.d.ts +0 -1
  122. package/dist/src/graphql/system/index.d.ts.map +1 -1
  123. package/dist/src/graphql/system/index.js +0 -1
  124. package/dist/src/graphql/system/index.js.map +1 -1
  125. package/dist/src/graphql/types.d.ts +7 -8
  126. package/dist/src/graphql/types.d.ts.map +1 -1
  127. package/dist/src/graphql/utils.d.ts +3 -20
  128. package/dist/src/graphql/utils.d.ts.map +1 -1
  129. package/dist/src/graphql/utils.js +7 -35
  130. package/dist/src/graphql/utils.js.map +1 -1
  131. package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
  132. package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
  133. package/dist/src/migrations/002_add_document_protection.js +18 -0
  134. package/dist/src/migrations/002_add_document_protection.js.map +1 -0
  135. package/dist/src/migrations/index.d.ts.map +1 -1
  136. package/dist/src/migrations/index.js +2 -0
  137. package/dist/src/migrations/index.js.map +1 -1
  138. package/dist/src/packages/http-loader.d.ts +59 -0
  139. package/dist/src/packages/http-loader.d.ts.map +1 -0
  140. package/dist/src/packages/http-loader.js +203 -0
  141. package/dist/src/packages/http-loader.js.map +1 -0
  142. package/dist/src/packages/https-hooks.d.mts +37 -0
  143. package/dist/src/packages/https-hooks.d.mts.map +1 -0
  144. package/dist/src/packages/https-hooks.mjs +95 -0
  145. package/dist/src/packages/https-hooks.mjs.map +1 -0
  146. package/dist/src/packages/import-loader.d.ts +4 -6
  147. package/dist/src/packages/import-loader.d.ts.map +1 -1
  148. package/dist/src/packages/import-loader.js +4 -18
  149. package/dist/src/packages/import-loader.js.map +1 -1
  150. package/dist/src/packages/package-manager.d.ts +3 -4
  151. package/dist/src/packages/package-manager.d.ts.map +1 -1
  152. package/dist/src/packages/package-manager.js +10 -7
  153. package/dist/src/packages/package-manager.js.map +1 -1
  154. package/dist/src/packages/types.d.ts +8 -8
  155. package/dist/src/packages/types.d.ts.map +1 -1
  156. package/dist/src/packages/util.d.ts +4 -5
  157. package/dist/src/packages/util.d.ts.map +1 -1
  158. package/dist/src/packages/util.js +2 -14
  159. package/dist/src/packages/util.js.map +1 -1
  160. package/dist/src/packages/vite-loader.d.ts +12 -11
  161. package/dist/src/packages/vite-loader.d.ts.map +1 -1
  162. package/dist/src/packages/vite-loader.js +20 -21
  163. package/dist/src/packages/vite-loader.js.map +1 -1
  164. package/dist/src/server.d.ts +15 -33
  165. package/dist/src/server.d.ts.map +1 -1
  166. package/dist/src/server.js +164 -244
  167. package/dist/src/server.js.map +1 -1
  168. package/dist/src/services/auth.service.d.ts +3 -18
  169. package/dist/src/services/auth.service.d.ts.map +1 -1
  170. package/dist/src/services/auth.service.js +38 -72
  171. package/dist/src/services/auth.service.js.map +1 -1
  172. package/dist/src/services/authorization.service.d.ts +70 -0
  173. package/dist/src/services/authorization.service.d.ts.map +1 -0
  174. package/dist/src/services/authorization.service.js +155 -0
  175. package/dist/src/services/authorization.service.js.map +1 -0
  176. package/dist/src/services/document-permission.service.d.ts +47 -7
  177. package/dist/src/services/document-permission.service.d.ts.map +1 -1
  178. package/dist/src/services/document-permission.service.js +162 -7
  179. package/dist/src/services/document-permission.service.js.map +1 -1
  180. package/dist/src/services/package-management.service.d.ts +32 -0
  181. package/dist/src/services/package-management.service.d.ts.map +1 -0
  182. package/dist/src/services/package-management.service.js +95 -0
  183. package/dist/src/services/package-management.service.js.map +1 -0
  184. package/dist/src/services/package-storage.d.ts +23 -0
  185. package/dist/src/services/package-storage.d.ts.map +1 -0
  186. package/dist/src/services/package-storage.js +19 -0
  187. package/dist/src/services/package-storage.js.map +1 -0
  188. package/dist/src/tracing.d.ts.map +1 -1
  189. package/dist/src/tracing.js +25 -1
  190. package/dist/src/tracing.js.map +1 -1
  191. package/dist/src/types.d.ts +13 -5
  192. package/dist/src/types.d.ts.map +1 -1
  193. package/dist/src/utils/create-schema.d.ts +31 -6
  194. package/dist/src/utils/create-schema.d.ts.map +1 -1
  195. package/dist/src/utils/create-schema.js +446 -40
  196. package/dist/src/utils/create-schema.js.map +1 -1
  197. package/dist/src/utils/db.d.ts +8 -0
  198. package/dist/src/utils/db.d.ts.map +1 -1
  199. package/dist/src/utils/db.js.map +1 -1
  200. package/dist/test/auth-chain.test.d.ts +12 -0
  201. package/dist/test/auth-chain.test.d.ts.map +1 -0
  202. package/dist/test/auth-chain.test.js +157 -0
  203. package/dist/test/auth-chain.test.js.map +1 -0
  204. package/dist/test/auth.service.test.d.ts +10 -0
  205. package/dist/test/auth.service.test.d.ts.map +1 -0
  206. package/dist/test/auth.service.test.js +141 -0
  207. package/dist/test/auth.service.test.js.map +1 -0
  208. package/dist/test/authorization.service.test.d.ts +2 -0
  209. package/dist/test/authorization.service.test.d.ts.map +1 -0
  210. package/dist/test/authorization.service.test.js +252 -0
  211. package/dist/test/authorization.service.test.js.map +1 -0
  212. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
  213. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
  214. package/dist/test/connect-switchboard-reshuffle-convergence.test.js +204 -0
  215. package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
  216. package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
  217. package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
  218. package/dist/test/connect-switchboard-sync.test.js +633 -0
  219. package/dist/test/connect-switchboard-sync.test.js.map +1 -0
  220. package/dist/test/document-drive-subgraph.test.d.ts +2 -0
  221. package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
  222. package/dist/test/document-drive-subgraph.test.js +244 -0
  223. package/dist/test/document-drive-subgraph.test.js.map +1 -0
  224. package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
  225. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
  226. package/dist/test/document-model-subgraph-permissions.test.js +587 -0
  227. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
  228. package/dist/test/drive-info-endpoint.test.d.ts +2 -0
  229. package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
  230. package/dist/test/drive-info-endpoint.test.js +123 -0
  231. package/dist/test/drive-info-endpoint.test.js.map +1 -0
  232. package/dist/test/fault-injection-sync.test.d.ts +2 -0
  233. package/dist/test/fault-injection-sync.test.d.ts.map +1 -0
  234. package/dist/test/fault-injection-sync.test.js +197 -0
  235. package/dist/test/fault-injection-sync.test.js.map +1 -0
  236. package/dist/test/gateway/adapter-gateway-apollo.test.d.ts +2 -0
  237. package/dist/test/gateway/adapter-gateway-apollo.test.d.ts.map +1 -0
  238. package/dist/test/gateway/adapter-gateway-apollo.test.js +206 -0
  239. package/dist/test/gateway/adapter-gateway-apollo.test.js.map +1 -0
  240. package/dist/test/gateway/adapter-gateway-mercurius.test.d.ts +2 -0
  241. package/dist/test/gateway/adapter-gateway-mercurius.test.d.ts.map +1 -0
  242. package/dist/test/gateway/adapter-gateway-mercurius.test.js +23 -0
  243. package/dist/test/gateway/adapter-gateway-mercurius.test.js.map +1 -0
  244. package/dist/test/gateway/adapter-http-express.test.d.ts +2 -0
  245. package/dist/test/gateway/adapter-http-express.test.d.ts.map +1 -0
  246. package/dist/test/gateway/adapter-http-express.test.js +17 -0
  247. package/dist/test/gateway/adapter-http-express.test.js.map +1 -0
  248. package/dist/test/gateway/adapter-http-fastify.test.d.ts +2 -0
  249. package/dist/test/gateway/adapter-http-fastify.test.d.ts.map +1 -0
  250. package/dist/test/gateway/adapter-http-fastify.test.js +17 -0
  251. package/dist/test/gateway/adapter-http-fastify.test.js.map +1 -0
  252. package/dist/test/gateway/auth-middleware.test.d.ts +8 -0
  253. package/dist/test/gateway/auth-middleware.test.d.ts.map +1 -0
  254. package/dist/test/gateway/auth-middleware.test.js +73 -0
  255. package/dist/test/gateway/auth-middleware.test.js.map +1 -0
  256. package/dist/test/gateway/gateway-adapter-contract.d.ts +30 -0
  257. package/dist/test/gateway/gateway-adapter-contract.d.ts.map +1 -0
  258. package/dist/test/gateway/gateway-adapter-contract.js +347 -0
  259. package/dist/test/gateway/gateway-adapter-contract.js.map +1 -0
  260. package/dist/test/gateway/http-adapter-contract.d.ts +30 -0
  261. package/dist/test/gateway/http-adapter-contract.d.ts.map +1 -0
  262. package/dist/test/gateway/http-adapter-contract.js +277 -0
  263. package/dist/test/gateway/http-adapter-contract.js.map +1 -0
  264. package/dist/test/graphql-manager.test.d.ts +12 -0
  265. package/dist/test/graphql-manager.test.d.ts.map +1 -0
  266. package/dist/test/graphql-manager.test.js +576 -0
  267. package/dist/test/graphql-manager.test.js.map +1 -0
  268. package/dist/test/index.d.ts +0 -1
  269. package/dist/test/index.d.ts.map +1 -1
  270. package/dist/test/index.js +0 -1
  271. package/dist/test/index.js.map +1 -1
  272. package/dist/test/permissions-integration.test.js +6 -20
  273. package/dist/test/permissions-integration.test.js.map +1 -1
  274. package/dist/test/push-backfill.test.d.ts +2 -0
  275. package/dist/test/push-backfill.test.d.ts.map +1 -0
  276. package/dist/test/push-backfill.test.js +299 -0
  277. package/dist/test/push-backfill.test.js.map +1 -0
  278. package/dist/test/reactor-adapters.test.js +3 -2
  279. package/dist/test/reactor-adapters.test.js.map +1 -1
  280. package/dist/test/reactor-client.test.js +172 -13
  281. package/dist/test/reactor-client.test.js.map +1 -1
  282. package/dist/test/reactor-resolvers.test.js +11 -13
  283. package/dist/test/reactor-resolvers.test.js.map +1 -1
  284. package/dist/test/reactor-subgraph-permissions.test.js +7 -36
  285. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  286. package/dist/test/subscriptions-sse.test.d.ts +2 -0
  287. package/dist/test/subscriptions-sse.test.d.ts.map +1 -0
  288. package/dist/test/subscriptions-sse.test.js +264 -0
  289. package/dist/test/subscriptions-sse.test.js.map +1 -0
  290. package/dist/test/subscriptions.test.js +2 -0
  291. package/dist/test/subscriptions.test.js.map +1 -1
  292. package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
  293. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
  294. package/dist/test/utils/gql-resolver-bridge.js +36 -7
  295. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  296. package/dist/test/utils.d.ts +1 -5
  297. package/dist/test/utils.d.ts.map +1 -1
  298. package/dist/test/utils.js +0 -10
  299. package/dist/test/utils.js.map +1 -1
  300. package/dist/tsconfig.tsbuildinfo +1 -1
  301. package/dist/vitest.config.d.ts.map +1 -1
  302. package/dist/vitest.config.js +1 -0
  303. package/dist/vitest.config.js.map +1 -1
  304. package/package.json +64 -59
  305. package/dist/src/graphql/drive-subgraph.d.ts +0 -25
  306. package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
  307. package/dist/src/graphql/drive-subgraph.js +0 -487
  308. package/dist/src/graphql/drive-subgraph.js.map +0 -1
  309. package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
  310. package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
  311. package/dist/src/graphql/system/system-subgraph.js +0 -130
  312. package/dist/src/graphql/system/system-subgraph.js.map +0 -1
  313. package/dist/src/sync/types.d.ts +0 -10
  314. package/dist/src/sync/types.d.ts.map +0 -1
  315. package/dist/src/sync/utils.d.ts +0 -7
  316. package/dist/src/sync/utils.d.ts.map +0 -1
  317. package/dist/src/sync/utils.js +0 -78
  318. package/dist/src/sync/utils.js.map +0 -1
  319. package/dist/src/utils/auth.d.ts +0 -3
  320. package/dist/src/utils/auth.d.ts.map +0 -1
  321. package/dist/src/utils/auth.js +0 -19
  322. package/dist/src/utils/auth.js.map +0 -1
  323. package/dist/test/benchmarks/load.bench.d.ts +0 -2
  324. package/dist/test/benchmarks/load.bench.d.ts.map +0 -1
  325. package/dist/test/benchmarks/load.bench.js +0 -73
  326. package/dist/test/benchmarks/load.bench.js.map +0 -1
  327. package/dist/test/benchmarks/sync.bench.d.ts +0 -2
  328. package/dist/test/benchmarks/sync.bench.d.ts.map +0 -1
  329. package/dist/test/benchmarks/sync.bench.js +0 -119
  330. package/dist/test/benchmarks/sync.bench.js.map +0 -1
  331. package/dist/test/drive-handlers.d.ts +0 -4
  332. package/dist/test/drive-handlers.d.ts.map +0 -1
  333. package/dist/test/drive-handlers.js +0 -39
  334. package/dist/test/drive-handlers.js.map +0 -1
  335. package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
  336. package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
  337. package/dist/test/drive-subgraph-permissions.test.js +0 -195
  338. package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
  339. package/dist/test/drive.test.d.ts +0 -2
  340. package/dist/test/drive.test.d.ts.map +0 -1
  341. package/dist/test/drive.test.js +0 -142
  342. package/dist/test/drive.test.js.map +0 -1
  343. package/dist/test/identity-integration.test.d.ts +0 -2
  344. package/dist/test/identity-integration.test.d.ts.map +0 -1
  345. package/dist/test/identity-integration.test.js +0 -349
  346. package/dist/test/identity-integration.test.js.map +0 -1
  347. package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
  348. package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
  349. package/dist/test/pull-responder-transmitter.test.js +0 -220
  350. package/dist/test/pull-responder-transmitter.test.js.map +0 -1
  351. package/dist/test/push-transmitter.test.d.ts +0 -2
  352. package/dist/test/push-transmitter.test.d.ts.map +0 -1
  353. package/dist/test/push-transmitter.test.js +0 -179
  354. package/dist/test/push-transmitter.test.js.map +0 -1
  355. package/dist/test/system.test.d.ts +0 -2
  356. package/dist/test/system.test.d.ts.map +0 -1
  357. package/dist/test/system.test.js +0 -211
  358. package/dist/test/system.test.js.map +0 -1
  359. package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
  360. package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
  361. package/dist/test/three-reactor-gql-sync.test.js +0 -368
  362. package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
  363. package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
  364. package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
  365. package/dist/test/two-reactor-gql-sync.test.js +0 -348
  366. package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
  367. /package/dist/src/{sync → graphql/gateway}/types.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/utils/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AA8E7B,SAAS,IAAI,CAAC,gBAAwB;IACpC,IACE,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC;QAC5C,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,EAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,mBAAuC,SAAS;IAI1E,MAAM,IAAI,GAAG,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,YAAmC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC,EAAE,gBAAgB,EAAE;QACtB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAE7C,wDAAwD;IACxD,uCAAuC;IACvC,IAAI,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC;QACxB,MAAM;QACN,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC;QAChC,OAAO,EAAE,IAAI,iBAAiB,CAAC;YAC7B,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,IAAI,aAAa,EAAE;SACtC,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;;;;;;;;;;KAWG;IACH;+BAC6B;IAC7B;oCACkC;IAClC;iCAC+B;IAC/B;qCACmC;IACnC;qCACmC;IACnC;oCACkC;IAClC;mCACiC;IACjC;oCACkC;IAClC;;;;;;;;KAQG;IACH;kCACgC;IAChC;2CACyC;IACzC;sCACoC;IACpC;;;;;;;;;;KAUG;IACH;6DAC2D;IAC3D;4DAC0D;CAC3D,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/utils/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAuF7B,SAAS,IAAI,CAAC,gBAAwB;IACpC,IACE,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC;QAC5C,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,EAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,mBAAuC,SAAS;IAI1E,MAAM,IAAI,GAAG,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,YAAmC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC,EAAE,gBAAgB,EAAE;QACtB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAE7C,wDAAwD;IACxD,uCAAuC;IACvC,IAAI,gBAAgB,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC;QACxB,MAAM;QACN,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC;QAChC,OAAO,EAAE,IAAI,iBAAiB,CAAC;YAC7B,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,IAAI,aAAa,EAAE;SACtC,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;;;;;;;;;;KAWG;IACH;+BAC6B;IAC7B;oCACkC;IAClC;iCAC+B;IAC/B;qCACmC;IACnC;qCACmC;IACnC;oCACkC;IAClC;mCACiC;IACjC;oCACkC;IAClC;;;;;;;;KAQG;IACH;kCACgC;IAChC;2CACyC;IACzC;sCACoC;IACpC;;;;;;;;;;KAUG;IACH;6DAC2D;IAC3D;4DAC0D;CAC3D,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Integration tests for the full authentication chain:
3
+ * AuthService → createAuthFetchMiddleware → downstream handler
4
+ *
5
+ * These tests wire together the real AuthService and the real auth middleware
6
+ * to verify the end-to-end authentication contract that was previously
7
+ * implemented as Express middleware mutating req.user/req.admins/req.auth_enabled.
8
+ *
9
+ * @renown/sdk is mocked to avoid real JWT verification and network calls.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=auth-chain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-chain.test.d.ts","sourceRoot":"","sources":["../../test/auth-chain.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Integration tests for the full authentication chain:
3
+ * AuthService → createAuthFetchMiddleware → downstream handler
4
+ *
5
+ * These tests wire together the real AuthService and the real auth middleware
6
+ * to verify the end-to-end authentication contract that was previously
7
+ * implemented as Express middleware mutating req.user/req.admins/req.auth_enabled.
8
+ *
9
+ * @renown/sdk is mocked to avoid real JWT verification and network calls.
10
+ */
11
+ import { beforeEach, describe, expect, it, vi } from "vitest";
12
+ import { createAuthFetchMiddleware, getAuthContext, } from "../src/graphql/gateway/auth-middleware.js";
13
+ import { AuthService } from "../src/services/auth.service.js";
14
+ // ── mock @renown/sdk ───────────────────────────────────────────────────────────
15
+ const mockVerifyAuthBearerToken = vi.fn();
16
+ vi.mock("@renown/sdk", () => ({
17
+ verifyAuthBearerToken: (...args) => mockVerifyAuthBearerToken(...args),
18
+ }));
19
+ // ── fixtures ──────────────────────────────────────────────────────────────────
20
+ const ADMINS = ["0xadmin"];
21
+ function makeVerified(address = "0xuser", chainId = 1, networkId = "eip155") {
22
+ return {
23
+ verifiableCredential: {
24
+ credentialSubject: { address, chainId, networkId },
25
+ },
26
+ issuer: "did:ethr:0xapp",
27
+ };
28
+ }
29
+ function makeRequest(method = "POST", headers = {}) {
30
+ return new Request("http://localhost/graphql", { method, headers });
31
+ }
32
+ // ── tests ─────────────────────────────────────────────────────────────────────
33
+ describe("Auth chain integration (AuthService → authFetchMiddleware → handler)", () => {
34
+ beforeEach(() => {
35
+ vi.clearAllMocks();
36
+ });
37
+ // ── auth enabled ─────────────────────────────────────────────────────────────
38
+ describe("when auth is enabled", () => {
39
+ const service = new AuthService({
40
+ enabled: true,
41
+ admins: ADMINS,
42
+ skipCredentialVerification: true,
43
+ });
44
+ function buildChain() {
45
+ const intercepted = [];
46
+ const next = vi.fn(async (req) => {
47
+ intercepted.push(req);
48
+ return new Response("handler ok", { status: 200 });
49
+ });
50
+ const handler = createAuthFetchMiddleware(service)(next);
51
+ return { handler, next, intercepted };
52
+ }
53
+ it("returns 401 without calling the handler when the token fails verification", async () => {
54
+ mockVerifyAuthBearerToken.mockResolvedValue(false);
55
+ const { handler, next } = buildChain();
56
+ const res = await handler(makeRequest("POST", { authorization: "Bearer bad-token" }));
57
+ expect(res.status).toBe(401);
58
+ expect(next).not.toHaveBeenCalled();
59
+ });
60
+ it("returns 401 without calling the handler when verifyToken throws", async () => {
61
+ mockVerifyAuthBearerToken.mockRejectedValue(new Error("SDK error"));
62
+ const { handler, next } = buildChain();
63
+ const res = await handler(makeRequest("POST", { authorization: "Bearer broken" }));
64
+ expect(res.status).toBe(401);
65
+ expect(next).not.toHaveBeenCalled();
66
+ });
67
+ it("returns 401 without calling the handler when the verified credential is missing user fields", async () => {
68
+ mockVerifyAuthBearerToken.mockResolvedValue({
69
+ verifiableCredential: { credentialSubject: {} }, // no address/chainId/networkId
70
+ issuer: "did:ethr:0xapp",
71
+ });
72
+ const { handler, next } = buildChain();
73
+ const res = await handler(makeRequest("POST", { authorization: "Bearer incomplete" }));
74
+ expect(res.status).toBe(401);
75
+ expect(next).not.toHaveBeenCalled();
76
+ });
77
+ it("calls the handler and stores AuthContext with the authenticated user for a valid token", async () => {
78
+ mockVerifyAuthBearerToken.mockResolvedValue(makeVerified("0xuser", 1, "eip155"));
79
+ const { handler, intercepted } = buildChain();
80
+ const req = makeRequest("POST", { authorization: "Bearer valid" });
81
+ const res = await handler(req);
82
+ expect(res.status).toBe(200);
83
+ expect(intercepted).toContain(req);
84
+ const ctx = getAuthContext(req);
85
+ expect(ctx?.user).toEqual({
86
+ address: "0xuser",
87
+ chainId: 1,
88
+ networkId: "eip155",
89
+ });
90
+ expect(ctx?.auth_enabled).toBe(true);
91
+ expect(ctx?.admins).toEqual(ADMINS);
92
+ });
93
+ it("passes OPTIONS requests through to the handler without token verification", async () => {
94
+ const { handler, intercepted } = buildChain();
95
+ const req = makeRequest("OPTIONS");
96
+ await handler(req);
97
+ expect(intercepted).toContain(req);
98
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
99
+ const ctx = getAuthContext(req);
100
+ expect(ctx?.user).toBeUndefined();
101
+ expect(ctx?.auth_enabled).toBe(true);
102
+ });
103
+ it("passes GET requests through to the handler without token verification", async () => {
104
+ const { handler, intercepted } = buildChain();
105
+ const req = makeRequest("GET");
106
+ await handler(req);
107
+ expect(intercepted).toContain(req);
108
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
109
+ });
110
+ it("passes anonymous POST requests through to the handler (no Authorization header)", async () => {
111
+ const { handler, intercepted } = buildChain();
112
+ const req = makeRequest("POST"); // no auth header
113
+ await handler(req);
114
+ expect(intercepted).toContain(req);
115
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
116
+ const ctx = getAuthContext(req);
117
+ expect(ctx?.user).toBeUndefined();
118
+ expect(ctx?.auth_enabled).toBe(true);
119
+ });
120
+ it("stores the admin list in the AuthContext so callers can perform admin checks", async () => {
121
+ mockVerifyAuthBearerToken.mockResolvedValue(makeVerified());
122
+ const { handler } = buildChain();
123
+ const req = makeRequest("POST", { authorization: "Bearer valid" });
124
+ await handler(req);
125
+ const ctx = getAuthContext(req);
126
+ expect(ctx?.admins).toContain("0xadmin");
127
+ expect(ctx?.admins).not.toContain("0xother");
128
+ });
129
+ it("does not store AuthContext when authentication fails (no WeakMap leak)", async () => {
130
+ mockVerifyAuthBearerToken.mockResolvedValue(false);
131
+ const { handler } = buildChain();
132
+ const req = makeRequest("POST", { authorization: "Bearer bad" });
133
+ await handler(req);
134
+ expect(getAuthContext(req)).toBeUndefined();
135
+ });
136
+ });
137
+ // ── auth disabled ─────────────────────────────────────────────────────────────
138
+ describe("when auth is disabled", () => {
139
+ const service = new AuthService({ enabled: false, admins: ADMINS });
140
+ it("always calls the handler and sets auth_enabled=false, regardless of token", async () => {
141
+ const intercepted = [];
142
+ const next = vi.fn(async (req) => {
143
+ intercepted.push(req);
144
+ return new Response("ok");
145
+ });
146
+ const handler = createAuthFetchMiddleware(service)(next);
147
+ const req = makeRequest("POST", { authorization: "Bearer anything" });
148
+ await handler(req);
149
+ expect(intercepted).toContain(req);
150
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
151
+ const ctx = getAuthContext(req);
152
+ expect(ctx?.auth_enabled).toBe(false);
153
+ expect(ctx?.user).toBeUndefined();
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=auth-chain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-chain.test.js","sourceRoot":"","sources":["../../test/auth-chain.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Unit tests for AuthService.authenticateRequest().
3
+ *
4
+ * verifyAuthBearerToken is mocked at the module level so tests run without
5
+ * real JWT verification or network calls. skipCredentialVerification=true is
6
+ * used on tests that only care about token verification, to avoid the Renown
7
+ * API fetch inside verifyCredentialExists().
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=auth.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.test.d.ts","sourceRoot":"","sources":["../../test/auth.service.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Unit tests for AuthService.authenticateRequest().
3
+ *
4
+ * verifyAuthBearerToken is mocked at the module level so tests run without
5
+ * real JWT verification or network calls. skipCredentialVerification=true is
6
+ * used on tests that only care about token verification, to avoid the Renown
7
+ * API fetch inside verifyCredentialExists().
8
+ */
9
+ import { beforeEach, describe, expect, it, vi } from "vitest";
10
+ import { AuthService } from "../src/services/auth.service.js";
11
+ // ─── mock @renown/sdk ─────────────────────────────────────────────────────────
12
+ const mockVerifyAuthBearerToken = vi.fn();
13
+ vi.mock("@renown/sdk", () => ({
14
+ verifyAuthBearerToken: (...args) => mockVerifyAuthBearerToken(...args),
15
+ }));
16
+ // ─── fixtures ─────────────────────────────────────────────────────────────────
17
+ const ADMINS = ["0xadmin1", "0xadmin2"];
18
+ /** A minimal verified-credential shape that AuthService.extractUserFromVerification() accepts. */
19
+ function makeVerified(address = "0xuser", chainId = 1, networkId = "eip155") {
20
+ return {
21
+ verifiableCredential: {
22
+ credentialSubject: { address, chainId, networkId },
23
+ },
24
+ issuer: "did:ethr:0xapp",
25
+ };
26
+ }
27
+ function makeRequest(method = "POST", headers = {}) {
28
+ return new Request("http://localhost/graphql", { method, headers });
29
+ }
30
+ // ─── tests ────────────────────────────────────────────────────────────────────
31
+ describe("AuthService.authenticateRequest()", () => {
32
+ beforeEach(() => {
33
+ vi.clearAllMocks();
34
+ });
35
+ // ── auth disabled ───────────────────────────────────────────────────────────
36
+ describe("when auth is disabled", () => {
37
+ it("returns an AuthContext with auth_enabled=false regardless of method or token", async () => {
38
+ const service = new AuthService({ enabled: false, admins: ADMINS });
39
+ const ctx = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer token" }));
40
+ expect(ctx).toEqual({ user: undefined, admins: [], auth_enabled: false });
41
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
42
+ });
43
+ });
44
+ // ── passthrough methods ─────────────────────────────────────────────────────
45
+ describe("when auth is enabled", () => {
46
+ const service = new AuthService({
47
+ enabled: true,
48
+ admins: ADMINS,
49
+ skipCredentialVerification: true,
50
+ });
51
+ it("passes OPTIONS requests through without verification", async () => {
52
+ const result = await service.authenticateRequest(makeRequest("OPTIONS"));
53
+ expect(result).toEqual({
54
+ user: undefined,
55
+ admins: ADMINS,
56
+ auth_enabled: true,
57
+ });
58
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
59
+ });
60
+ it("passes GET requests through without verification", async () => {
61
+ const result = await service.authenticateRequest(makeRequest("GET"));
62
+ expect(result).toEqual({
63
+ user: undefined,
64
+ admins: ADMINS,
65
+ auth_enabled: true,
66
+ });
67
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
68
+ });
69
+ it("passes POST requests with no Authorization header through (anonymous reads allowed)", async () => {
70
+ const result = await service.authenticateRequest(makeRequest("POST"));
71
+ expect(result).toEqual({
72
+ user: undefined,
73
+ admins: ADMINS,
74
+ auth_enabled: true,
75
+ });
76
+ expect(mockVerifyAuthBearerToken).not.toHaveBeenCalled();
77
+ });
78
+ // ── token verification ──────────────────────────────────────────────────
79
+ it("returns a 401 Response when token verification returns false", async () => {
80
+ mockVerifyAuthBearerToken.mockResolvedValue(false);
81
+ const result = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer bad-token" }));
82
+ expect(result).toBeInstanceOf(Response);
83
+ expect(result.status).toBe(401);
84
+ const body = (await result.json());
85
+ expect(body.error).toBe("Verification failed");
86
+ });
87
+ it("returns a 401 Response when the verified credential has missing fields", async () => {
88
+ mockVerifyAuthBearerToken.mockResolvedValue({
89
+ verifiableCredential: { credentialSubject: {} }, // no address/chainId/networkId
90
+ issuer: "did:ethr:0xapp",
91
+ });
92
+ const result = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer incomplete-token" }));
93
+ expect(result).toBeInstanceOf(Response);
94
+ expect(result.status).toBe(401);
95
+ const body = (await result.json());
96
+ expect(body.error).toBe("Missing credentials");
97
+ });
98
+ it("returns a 401 Response when verifyToken throws", async () => {
99
+ mockVerifyAuthBearerToken.mockRejectedValue(new Error("SDK failure"));
100
+ const result = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer broken-token" }));
101
+ expect(result).toBeInstanceOf(Response);
102
+ expect(result.status).toBe(401);
103
+ const body = (await result.json());
104
+ expect(body.error).toBe("Authentication failed");
105
+ });
106
+ it("returns an AuthContext with the authenticated user when token is valid", async () => {
107
+ mockVerifyAuthBearerToken.mockResolvedValue(makeVerified("0xuser", 1, "eip155"));
108
+ const result = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer valid-token" }));
109
+ expect(result).toEqual({
110
+ user: { address: "0xuser", chainId: 1, networkId: "eip155" },
111
+ admins: ADMINS,
112
+ auth_enabled: true,
113
+ });
114
+ });
115
+ it("extracts the Bearer token from the Authorization header", async () => {
116
+ mockVerifyAuthBearerToken.mockResolvedValue(makeVerified());
117
+ await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer my-secret-token" }));
118
+ expect(mockVerifyAuthBearerToken).toHaveBeenCalledWith("my-secret-token");
119
+ });
120
+ });
121
+ // ── credential verification (Renown API) ────────────────────────────────────
122
+ describe("credential existence check", () => {
123
+ it("returns 401 when the credential no longer exists on the Renown API", async () => {
124
+ mockVerifyAuthBearerToken.mockResolvedValue(makeVerified("0xuser", 1));
125
+ // Mock global fetch to simulate Renown API returning a non-200 or bad body
126
+ const fetchSpy = vi
127
+ .spyOn(globalThis, "fetch")
128
+ .mockRejectedValue(new Error("network error"));
129
+ const service = new AuthService({
130
+ enabled: true,
131
+ admins: ADMINS,
132
+ skipCredentialVerification: false,
133
+ });
134
+ const result = await service.authenticateRequest(makeRequest("POST", { authorization: "Bearer token" }));
135
+ expect(result).toBeInstanceOf(Response);
136
+ expect(result.status).toBe(401);
137
+ fetchSpy.mockRestore();
138
+ });
139
+ });
140
+ });
141
+ //# sourceMappingURL=auth.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.test.js","sourceRoot":"","sources":["../../test/auth.service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authorization.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.service.test.d.ts","sourceRoot":"","sources":["../../test/authorization.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,252 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { AuthorizationService } from "../src/services/authorization.service.js";
3
+ describe("AuthorizationService", () => {
4
+ let service;
5
+ let mockPermissionService;
6
+ const getParentIds = vi.fn().mockResolvedValue([]);
7
+ beforeEach(() => {
8
+ vi.clearAllMocks();
9
+ mockPermissionService = {
10
+ isDocumentProtected: vi.fn().mockResolvedValue(false),
11
+ isProtectedWithAncestors: vi.fn().mockResolvedValue(false),
12
+ getDocumentOwner: vi.fn().mockResolvedValue(null),
13
+ canRead: vi.fn().mockResolvedValue(false),
14
+ canWrite: vi.fn().mockResolvedValue(false),
15
+ canReadDocument: vi.fn().mockResolvedValue(false),
16
+ canWriteDocument: vi.fn().mockResolvedValue(false),
17
+ canManageDocument: vi.fn().mockResolvedValue(false),
18
+ isOperationRestricted: vi.fn().mockResolvedValue(false),
19
+ canExecuteOperation: vi.fn().mockResolvedValue(false),
20
+ };
21
+ service = new AuthorizationService(mockPermissionService, { admins: ["0xadmin"], defaultProtection: false });
22
+ });
23
+ describe("isSupremeAdmin", () => {
24
+ it("should return true for admin address", () => {
25
+ expect(service.isSupremeAdmin("0xadmin")).toBe(true);
26
+ });
27
+ it("should return true case-insensitively", () => {
28
+ expect(service.isSupremeAdmin("0xADMIN")).toBe(true);
29
+ });
30
+ it("should return false for non-admin", () => {
31
+ expect(service.isSupremeAdmin("0xuser")).toBe(false);
32
+ });
33
+ it("should return false for undefined", () => {
34
+ expect(service.isSupremeAdmin(undefined)).toBe(false);
35
+ });
36
+ });
37
+ describe("canRead", () => {
38
+ it("should allow supreme admin", async () => {
39
+ const result = await service.canRead("doc-1", "0xadmin");
40
+ expect(result).toBe(true);
41
+ expect(mockPermissionService.isDocumentProtected).not.toHaveBeenCalled();
42
+ });
43
+ it("should allow anonymous read on unprotected document", async () => {
44
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
45
+ const result = await service.canRead("doc-1", undefined);
46
+ expect(result).toBe(true);
47
+ });
48
+ it("should allow authenticated read on unprotected document", async () => {
49
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
50
+ const result = await service.canRead("doc-1", "0xuser");
51
+ expect(result).toBe(true);
52
+ });
53
+ it("should deny anonymous read on protected document", async () => {
54
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
55
+ const result = await service.canRead("doc-1", undefined);
56
+ expect(result).toBe(false);
57
+ });
58
+ it("should allow owner read on protected document", async () => {
59
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
60
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue("0xowner");
61
+ const result = await service.canRead("doc-1", "0xowner");
62
+ expect(result).toBe(true);
63
+ });
64
+ it("should check grants for protected document when user is not owner", async () => {
65
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
66
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue("0xother");
67
+ vi.mocked(mockPermissionService.canReadDocument).mockResolvedValue(true);
68
+ const result = await service.canRead("doc-1", "0xuser");
69
+ expect(result).toBe(true);
70
+ expect(mockPermissionService.canReadDocument).toHaveBeenCalledWith("doc-1", "0xuser");
71
+ });
72
+ it("should deny read when no grant on protected document", async () => {
73
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
74
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
75
+ vi.mocked(mockPermissionService.canReadDocument).mockResolvedValue(false);
76
+ const result = await service.canRead("doc-1", "0xuser");
77
+ expect(result).toBe(false);
78
+ });
79
+ it("should use hierarchy check when getParentIds is provided", async () => {
80
+ vi.mocked(mockPermissionService.isProtectedWithAncestors).mockResolvedValue(true);
81
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
82
+ vi.mocked(mockPermissionService.canRead).mockResolvedValue(true);
83
+ const result = await service.canRead("doc-1", "0xuser", getParentIds);
84
+ expect(result).toBe(true);
85
+ expect(mockPermissionService.isProtectedWithAncestors).toHaveBeenCalledWith("doc-1", getParentIds);
86
+ expect(mockPermissionService.canRead).toHaveBeenCalledWith("doc-1", "0xuser", getParentIds);
87
+ });
88
+ });
89
+ describe("canWrite", () => {
90
+ it("should allow supreme admin", async () => {
91
+ const result = await service.canWrite("doc-1", "0xadmin");
92
+ expect(result).toBe(true);
93
+ });
94
+ it("should allow anonymous write on unprotected document", async () => {
95
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
96
+ const result = await service.canWrite("doc-1", undefined);
97
+ expect(result).toBe(true);
98
+ });
99
+ it("should allow authenticated write on unprotected document", async () => {
100
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
101
+ const result = await service.canWrite("doc-1", "0xuser");
102
+ expect(result).toBe(true);
103
+ });
104
+ it("should deny anonymous write on protected document", async () => {
105
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
106
+ const result = await service.canWrite("doc-1", undefined);
107
+ expect(result).toBe(false);
108
+ });
109
+ it("should deny authenticated write on protected document without grant", async () => {
110
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
111
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
112
+ vi.mocked(mockPermissionService.canWriteDocument).mockResolvedValue(false);
113
+ const result = await service.canWrite("doc-1", "0xuser");
114
+ expect(result).toBe(false);
115
+ });
116
+ it("should allow owner write on protected document", async () => {
117
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
118
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue("0xowner");
119
+ const result = await service.canWrite("doc-1", "0xowner");
120
+ expect(result).toBe(true);
121
+ });
122
+ it("should allow write with WRITE grant on protected document", async () => {
123
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
124
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
125
+ vi.mocked(mockPermissionService.canWriteDocument).mockResolvedValue(true);
126
+ const result = await service.canWrite("doc-1", "0xuser");
127
+ expect(result).toBe(true);
128
+ });
129
+ });
130
+ describe("canManage", () => {
131
+ it("should allow supreme admin", async () => {
132
+ const result = await service.canManage("doc-1", "0xadmin");
133
+ expect(result).toBe(true);
134
+ });
135
+ it("should deny unauthenticated", async () => {
136
+ const result = await service.canManage("doc-1", undefined);
137
+ expect(result).toBe(false);
138
+ });
139
+ it("should allow owner", async () => {
140
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue("0xowner");
141
+ const result = await service.canManage("doc-1", "0xowner");
142
+ expect(result).toBe(true);
143
+ });
144
+ it("should allow user with ADMIN grant", async () => {
145
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
146
+ vi.mocked(mockPermissionService.canManageDocument).mockResolvedValue(true);
147
+ const result = await service.canManage("doc-1", "0xuser");
148
+ expect(result).toBe(true);
149
+ });
150
+ it("should deny user without ADMIN grant", async () => {
151
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
152
+ vi.mocked(mockPermissionService.canManageDocument).mockResolvedValue(false);
153
+ const result = await service.canManage("doc-1", "0xuser");
154
+ expect(result).toBe(false);
155
+ });
156
+ });
157
+ describe("canExecuteOperation", () => {
158
+ it("should allow supreme admin", async () => {
159
+ const result = await service.canExecuteOperation("doc-1", "SET_NAME", "0xadmin");
160
+ expect(result).toBe(true);
161
+ });
162
+ it("should fall through to write check for unrestricted operations", async () => {
163
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(false);
164
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
165
+ const result = await service.canExecuteOperation("doc-1", "SET_NAME", "0xuser");
166
+ expect(result).toBe(true); // unprotected + authenticated = write allowed
167
+ });
168
+ it("should check operation grant for restricted operations", async () => {
169
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
170
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(true);
171
+ const result = await service.canExecuteOperation("doc-1", "SPECIAL_OP", "0xuser");
172
+ expect(result).toBe(true);
173
+ expect(mockPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-1", "SPECIAL_OP", "0xuser");
174
+ });
175
+ it("should deny when restricted and no operation grant", async () => {
176
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
177
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(false);
178
+ const result = await service.canExecuteOperation("doc-1", "SPECIAL_OP", "0xuser");
179
+ expect(result).toBe(false);
180
+ });
181
+ });
182
+ describe("canMutate", () => {
183
+ it("should allow supreme admin", async () => {
184
+ const result = await service.canMutate("doc-1", "SET_NAME", "0xadmin");
185
+ expect(result).toBe(true);
186
+ });
187
+ it("should allow write for unrestricted operations", async () => {
188
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(false);
189
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
190
+ const result = await service.canMutate("doc-1", "SET_NAME", "0xuser");
191
+ expect(result).toBe(true);
192
+ });
193
+ it("should allow READ-only user with operation grant for restricted ops", async () => {
194
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
195
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(true);
196
+ // Even if user only has READ permission, the operation grant should suffice
197
+ const result = await service.canMutate("doc-1", "SPECIAL_OP", "0xreadonly");
198
+ expect(result).toBe(true);
199
+ });
200
+ it("should deny when restricted and no operation grant", async () => {
201
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
202
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(false);
203
+ const result = await service.canMutate("doc-1", "SPECIAL_OP", "0xuser");
204
+ expect(result).toBe(false);
205
+ });
206
+ it("should allow anonymous for unrestricted operations on unprotected doc", async () => {
207
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(false);
208
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(false);
209
+ const result = await service.canMutate("doc-1", "SET_NAME", undefined);
210
+ expect(result).toBe(true);
211
+ });
212
+ it("should deny anonymous for unrestricted operations on protected doc", async () => {
213
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(false);
214
+ vi.mocked(mockPermissionService.isDocumentProtected).mockResolvedValue(true);
215
+ const result = await service.canMutate("doc-1", "SET_NAME", undefined);
216
+ expect(result).toBe(false);
217
+ });
218
+ });
219
+ describe("Address normalization", () => {
220
+ it("should normalize address in canExecuteOperation for restricted ops", async () => {
221
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
222
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(true);
223
+ await service.canExecuteOperation("doc-1", "SPECIAL_OP", "0xMixedCase");
224
+ expect(mockPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-1", "SPECIAL_OP", "0xmixedcase");
225
+ });
226
+ it("should normalize address in canMutate for restricted ops", async () => {
227
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
228
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(true);
229
+ await service.canMutate("doc-1", "SPECIAL_OP", "0xMixedCase");
230
+ expect(mockPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-1", "SPECIAL_OP", "0xmixedcase");
231
+ });
232
+ it("should handle undefined address in canExecuteOperation", async () => {
233
+ vi.mocked(mockPermissionService.isOperationRestricted).mockResolvedValue(true);
234
+ vi.mocked(mockPermissionService.canExecuteOperation).mockResolvedValue(false);
235
+ const result = await service.canExecuteOperation("doc-1", "SPECIAL_OP", undefined);
236
+ expect(result).toBe(false);
237
+ expect(mockPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-1", "SPECIAL_OP", undefined);
238
+ });
239
+ });
240
+ describe("Protection inheritance", () => {
241
+ it("should treat document as protected when parent is protected", async () => {
242
+ // Document itself is not protected, but parent is
243
+ vi.mocked(mockPermissionService.isProtectedWithAncestors).mockResolvedValue(true);
244
+ vi.mocked(mockPermissionService.getDocumentOwner).mockResolvedValue(null);
245
+ vi.mocked(mockPermissionService.canRead).mockResolvedValue(false);
246
+ const result = await service.canRead("doc-1", "0xuser", getParentIds);
247
+ expect(result).toBe(false);
248
+ expect(mockPermissionService.isProtectedWithAncestors).toHaveBeenCalledWith("doc-1", getParentIds);
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=authorization.service.test.js.map