equipped 5.1.10 → 5.2.0

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 (230) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/dbs/mongo/changes.cjs +5 -1
  3. package/dist/cjs/dbs/mongo/changes.cjs.map +1 -1
  4. package/dist/cjs/dbs/mongo/changes.min.cjs +1 -1
  5. package/dist/cjs/dbs/mongo/changes.min.cjs.map +1 -1
  6. package/dist/cjs/errors/index.cjs +1 -2
  7. package/dist/cjs/errors/index.cjs.map +1 -1
  8. package/dist/cjs/errors/index.min.cjs +1 -1
  9. package/dist/cjs/errors/index.min.cjs.map +1 -1
  10. package/dist/cjs/errors/types/tokenExpired.cjs +12 -0
  11. package/dist/cjs/errors/types/tokenExpired.cjs.map +1 -0
  12. package/dist/cjs/errors/types/{refreshTokenMisusedError.min.cjs → tokenExpired.min.cjs} +2 -2
  13. package/dist/cjs/errors/types/tokenExpired.min.cjs.map +1 -0
  14. package/dist/cjs/events/types/kafka.cjs +13 -16
  15. package/dist/cjs/events/types/kafka.cjs.map +1 -1
  16. package/dist/cjs/events/types/kafka.min.cjs +1 -1
  17. package/dist/cjs/events/types/kafka.min.cjs.map +1 -1
  18. package/dist/cjs/instance/index.cjs.map +1 -1
  19. package/dist/cjs/instance/index.min.cjs.map +1 -1
  20. package/dist/cjs/server/impls/base.cjs +17 -17
  21. package/dist/cjs/server/impls/base.cjs.map +1 -1
  22. package/dist/cjs/server/impls/base.min.cjs +1 -1
  23. package/dist/cjs/server/impls/base.min.cjs.map +1 -1
  24. package/dist/cjs/server/impls/express.cjs +2 -13
  25. package/dist/cjs/server/impls/express.cjs.map +1 -1
  26. package/dist/cjs/server/impls/express.min.cjs +1 -1
  27. package/dist/cjs/server/impls/express.min.cjs.map +1 -1
  28. package/dist/cjs/server/impls/fastify.cjs +3 -14
  29. package/dist/cjs/server/impls/fastify.cjs.map +1 -1
  30. package/dist/cjs/server/impls/fastify.min.cjs +1 -1
  31. package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
  32. package/dist/cjs/server/index.cjs +1 -1
  33. package/dist/cjs/server/index.cjs.map +1 -1
  34. package/dist/cjs/server/index.min.cjs +1 -1
  35. package/dist/cjs/server/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/middlewares/requireAuthUser.cjs +9 -52
  37. package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +1 -1
  38. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +1 -1
  39. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +1 -1
  40. package/dist/cjs/server/pipes.cjs +23 -8
  41. package/dist/cjs/server/pipes.cjs.map +1 -1
  42. package/dist/cjs/server/pipes.min.cjs +1 -1
  43. package/dist/cjs/server/pipes.min.cjs.map +1 -1
  44. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +21 -0
  45. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +1 -0
  46. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +2 -0
  47. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +1 -0
  48. package/dist/cjs/server/requests-auth-methods/base.cjs +20 -0
  49. package/dist/cjs/server/requests-auth-methods/base.cjs.map +1 -0
  50. package/dist/cjs/server/requests-auth-methods/base.min.cjs +2 -0
  51. package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +1 -0
  52. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.cjs +2 -1
  53. package/dist/cjs/server/requests-auth-methods/index.cjs.map +1 -0
  54. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.min.cjs +1 -1
  55. package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +1 -0
  56. package/dist/cjs/server/requests-auth-methods/jwt.cjs +78 -0
  57. package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +1 -0
  58. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +2 -0
  59. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +1 -0
  60. package/dist/cjs/server/requests.cjs +1 -9
  61. package/dist/cjs/server/requests.cjs.map +1 -1
  62. package/dist/cjs/server/requests.min.cjs +1 -1
  63. package/dist/cjs/server/requests.min.cjs.map +1 -1
  64. package/dist/cjs/server/routes.cjs +1 -2
  65. package/dist/cjs/server/routes.cjs.map +1 -1
  66. package/dist/cjs/server/routes.min.cjs +1 -1
  67. package/dist/cjs/server/routes.min.cjs.map +1 -1
  68. package/dist/cjs/server/sockets.cjs +2 -4
  69. package/dist/cjs/server/sockets.cjs.map +1 -1
  70. package/dist/cjs/server/sockets.min.cjs +1 -1
  71. package/dist/cjs/server/sockets.min.cjs.map +1 -1
  72. package/dist/cjs/server/types.cjs +1 -1
  73. package/dist/cjs/server/types.cjs.map +1 -1
  74. package/dist/cjs/server/types.min.cjs +1 -1
  75. package/dist/cjs/server/types.min.cjs.map +1 -1
  76. package/dist/esm/dbs/mongo/changes.min.mjs +1 -1
  77. package/dist/esm/dbs/mongo/changes.min.mjs.map +1 -1
  78. package/dist/esm/dbs/mongo/changes.mjs +5 -1
  79. package/dist/esm/dbs/mongo/changes.mjs.map +1 -1
  80. package/dist/esm/errors/index.min.mjs +1 -1
  81. package/dist/esm/errors/index.min.mjs.map +1 -1
  82. package/dist/esm/errors/index.mjs +1 -2
  83. package/dist/esm/errors/index.mjs.map +1 -1
  84. package/dist/esm/errors/types/tokenExpired.min.mjs +2 -0
  85. package/dist/esm/errors/types/tokenExpired.min.mjs.map +1 -0
  86. package/dist/esm/errors/types/tokenExpired.mjs +12 -0
  87. package/dist/esm/errors/types/tokenExpired.mjs.map +1 -0
  88. package/dist/esm/events/types/kafka.min.mjs +1 -1
  89. package/dist/esm/events/types/kafka.min.mjs.map +1 -1
  90. package/dist/esm/events/types/kafka.mjs +13 -16
  91. package/dist/esm/events/types/kafka.mjs.map +1 -1
  92. package/dist/esm/instance/index.min.mjs +1 -1
  93. package/dist/esm/instance/index.min.mjs.map +1 -1
  94. package/dist/esm/instance/index.mjs.map +1 -1
  95. package/dist/esm/server/impls/base.min.mjs +1 -1
  96. package/dist/esm/server/impls/base.min.mjs.map +1 -1
  97. package/dist/esm/server/impls/base.mjs +9 -9
  98. package/dist/esm/server/impls/base.mjs.map +1 -1
  99. package/dist/esm/server/impls/express.min.mjs +1 -1
  100. package/dist/esm/server/impls/express.min.mjs.map +1 -1
  101. package/dist/esm/server/impls/express.mjs +2 -13
  102. package/dist/esm/server/impls/express.mjs.map +1 -1
  103. package/dist/esm/server/impls/fastify.min.mjs +1 -1
  104. package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
  105. package/dist/esm/server/impls/fastify.mjs +2 -13
  106. package/dist/esm/server/impls/fastify.mjs.map +1 -1
  107. package/dist/esm/server/index.min.mjs +1 -1
  108. package/dist/esm/server/index.min.mjs.map +1 -1
  109. package/dist/esm/server/index.mjs +1 -1
  110. package/dist/esm/server/index.mjs.map +1 -1
  111. package/dist/esm/server/middlewares/requireAuthUser.min.mjs +1 -1
  112. package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +1 -1
  113. package/dist/esm/server/middlewares/requireAuthUser.mjs +9 -52
  114. package/dist/esm/server/middlewares/requireAuthUser.mjs.map +1 -1
  115. package/dist/esm/server/pipes.min.mjs +1 -1
  116. package/dist/esm/server/pipes.min.mjs.map +1 -1
  117. package/dist/esm/server/pipes.mjs +23 -8
  118. package/dist/esm/server/pipes.mjs.map +1 -1
  119. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +2 -0
  120. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +1 -0
  121. package/dist/esm/server/requests-auth-methods/apiKeys.mjs +21 -0
  122. package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +1 -0
  123. package/dist/esm/server/requests-auth-methods/base.min.mjs +2 -0
  124. package/dist/esm/server/requests-auth-methods/base.min.mjs.map +1 -0
  125. package/dist/esm/server/requests-auth-methods/base.mjs +20 -0
  126. package/dist/esm/server/requests-auth-methods/base.mjs.map +1 -0
  127. package/dist/esm/server/requests-auth-methods/index.min.mjs +2 -0
  128. package/dist/esm/server/requests-auth-methods/index.min.mjs.map +1 -0
  129. package/dist/esm/server/requests-auth-methods/index.mjs +4 -0
  130. package/dist/esm/server/requests-auth-methods/index.mjs.map +1 -0
  131. package/dist/esm/server/requests-auth-methods/jwt.min.mjs +2 -0
  132. package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +1 -0
  133. package/dist/esm/server/requests-auth-methods/jwt.mjs +78 -0
  134. package/dist/esm/server/requests-auth-methods/jwt.mjs.map +1 -0
  135. package/dist/esm/server/requests.min.mjs +1 -1
  136. package/dist/esm/server/requests.min.mjs.map +1 -1
  137. package/dist/esm/server/requests.mjs +1 -9
  138. package/dist/esm/server/requests.mjs.map +1 -1
  139. package/dist/esm/server/routes.min.mjs +1 -1
  140. package/dist/esm/server/routes.min.mjs.map +1 -1
  141. package/dist/esm/server/routes.mjs +1 -2
  142. package/dist/esm/server/routes.mjs.map +1 -1
  143. package/dist/esm/server/sockets.min.mjs +1 -1
  144. package/dist/esm/server/sockets.min.mjs.map +1 -1
  145. package/dist/esm/server/sockets.mjs +2 -4
  146. package/dist/esm/server/sockets.mjs.map +1 -1
  147. package/dist/esm/server/types.min.mjs +1 -1
  148. package/dist/esm/server/types.min.mjs.map +1 -1
  149. package/dist/esm/server/types.mjs +1 -1
  150. package/dist/esm/server/types.mjs.map +1 -1
  151. package/dist/types/cache/index.d.ts +7 -1
  152. package/dist/types/dbs/mongo/changes.js +5 -1
  153. package/dist/types/errors/index.d.ts +7 -12
  154. package/dist/types/errors/index.js +1 -2
  155. package/dist/types/errors/types/tokenExpired.js +11 -0
  156. package/dist/types/events/types/kafka.js +13 -16
  157. package/dist/types/{fastify-CDJ2WuLy.d.ts → fastify-B6FUtYe9.d.ts} +5 -4
  158. package/dist/types/index.d.ts +4 -4
  159. package/dist/types/instance/index.d.ts +63 -16
  160. package/dist/types/{requestError-DqkM5BfW.d.ts → requestError-7N-ngghg.d.ts} +97 -80
  161. package/dist/types/server/impls/base.js +9 -9
  162. package/dist/types/server/impls/express.js +2 -13
  163. package/dist/types/server/impls/fastify.js +2 -13
  164. package/dist/types/server/index.d.ts +62 -20
  165. package/dist/types/server/index.js +1 -1
  166. package/dist/types/server/middlewares/requireAuthUser.js +9 -52
  167. package/dist/types/server/pipes.js +23 -8
  168. package/dist/types/server/requests-auth-methods/apiKeys.js +20 -0
  169. package/dist/types/server/requests-auth-methods/base.js +19 -0
  170. package/dist/types/server/requests-auth-methods/index.js +3 -0
  171. package/dist/types/server/requests-auth-methods/jwt.js +77 -0
  172. package/dist/types/server/requests.js +1 -9
  173. package/dist/types/server/routes.js +1 -2
  174. package/dist/types/server/sockets.js +2 -4
  175. package/dist/types/server/types.js +1 -1
  176. package/dist/types/{validationError-BMKfV51p.d.ts → validationError-BB4cfdZa.d.ts} +1 -1
  177. package/dist/types/validations/index.d.ts +3 -9
  178. package/package.json +13 -12
  179. package/dist/cjs/errors/types/authorizationExpired.cjs +0 -12
  180. package/dist/cjs/errors/types/authorizationExpired.cjs.map +0 -1
  181. package/dist/cjs/errors/types/authorizationExpired.min.cjs +0 -2
  182. package/dist/cjs/errors/types/authorizationExpired.min.cjs.map +0 -1
  183. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs +0 -12
  184. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs.map +0 -1
  185. package/dist/cjs/errors/types/refreshTokenMisusedError.min.cjs.map +0 -1
  186. package/dist/cjs/server/middlewares/parseAuthUser.cjs +0 -21
  187. package/dist/cjs/server/middlewares/parseAuthUser.cjs.map +0 -1
  188. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs +0 -2
  189. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs.map +0 -1
  190. package/dist/cjs/server/requests-auth/apiKeys.cjs +0 -6
  191. package/dist/cjs/server/requests-auth/apiKeys.cjs.map +0 -1
  192. package/dist/cjs/server/requests-auth/apiKeys.min.cjs +0 -2
  193. package/dist/cjs/server/requests-auth/apiKeys.min.cjs.map +0 -1
  194. package/dist/cjs/server/requests-auth/index.cjs.map +0 -1
  195. package/dist/cjs/server/requests-auth/index.min.cjs.map +0 -1
  196. package/dist/cjs/server/requests-auth/tokens.cjs +0 -92
  197. package/dist/cjs/server/requests-auth/tokens.cjs.map +0 -1
  198. package/dist/cjs/server/requests-auth/tokens.min.cjs +0 -2
  199. package/dist/cjs/server/requests-auth/tokens.min.cjs.map +0 -1
  200. package/dist/esm/errors/types/authorizationExpired.min.mjs +0 -2
  201. package/dist/esm/errors/types/authorizationExpired.min.mjs.map +0 -1
  202. package/dist/esm/errors/types/authorizationExpired.mjs +0 -12
  203. package/dist/esm/errors/types/authorizationExpired.mjs.map +0 -1
  204. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs +0 -2
  205. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs.map +0 -1
  206. package/dist/esm/errors/types/refreshTokenMisusedError.mjs +0 -12
  207. package/dist/esm/errors/types/refreshTokenMisusedError.mjs.map +0 -1
  208. package/dist/esm/server/middlewares/parseAuthUser.min.mjs +0 -2
  209. package/dist/esm/server/middlewares/parseAuthUser.min.mjs.map +0 -1
  210. package/dist/esm/server/middlewares/parseAuthUser.mjs +0 -21
  211. package/dist/esm/server/middlewares/parseAuthUser.mjs.map +0 -1
  212. package/dist/esm/server/requests-auth/apiKeys.min.mjs +0 -2
  213. package/dist/esm/server/requests-auth/apiKeys.min.mjs.map +0 -1
  214. package/dist/esm/server/requests-auth/apiKeys.mjs +0 -6
  215. package/dist/esm/server/requests-auth/apiKeys.mjs.map +0 -1
  216. package/dist/esm/server/requests-auth/index.min.mjs +0 -2
  217. package/dist/esm/server/requests-auth/index.min.mjs.map +0 -1
  218. package/dist/esm/server/requests-auth/index.mjs +0 -3
  219. package/dist/esm/server/requests-auth/index.mjs.map +0 -1
  220. package/dist/esm/server/requests-auth/tokens.min.mjs +0 -2
  221. package/dist/esm/server/requests-auth/tokens.min.mjs.map +0 -1
  222. package/dist/esm/server/requests-auth/tokens.mjs +0 -92
  223. package/dist/esm/server/requests-auth/tokens.mjs.map +0 -1
  224. package/dist/types/base-8yVXb67P.d.ts +0 -8
  225. package/dist/types/errors/types/authorizationExpired.js +0 -11
  226. package/dist/types/errors/types/refreshTokenMisusedError.js +0 -11
  227. package/dist/types/server/middlewares/parseAuthUser.js +0 -20
  228. package/dist/types/server/requests-auth/apiKeys.js +0 -5
  229. package/dist/types/server/requests-auth/index.js +0 -2
  230. package/dist/types/server/requests-auth/tokens.js +0 -91
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/sockets.ts","/home/runner/work/equipped/equipped/dist/cjs/server/sockets.cjs"],"names":["EmitTypes","to"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/sockets.cjs","sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\nimport { StatusCodes, type StatusCodesEnum } from './types'\n\nenum EmitTypes {\n\tcreated = 'created',\n\tupdated = 'updated',\n\tdeleted = 'deleted',\n}\n\nconst EmitterEvent = '__listener_emitter'\ntype EmitData = { channel: string; type: EmitTypes; after: any; before: any }\ntype LeaveRoomParams = { channel: string }\ntype JoinRoomParams = { channel: string; token?: string; query: Record<string, any> }\ntype Callback = (params: { code: StatusCodesEnum; message: string; channel: string }) => void\nexport type OnJoinFn = (\n\tdata: { channel: string; user: AuthUser | null },\n\tparams: Record<string, any>,\n\tquery: Record<string, any>,\n) => Promise<string | null>\nexport type SocketCallbacks = {\n\tonConnect: (userId: string, socketId: string) => Promise<void>\n\tonDisconnect: (userId: string, socketId: string) => Promise<void>\n}\n\nconst defaultTo = '*'\n\nexport class SocketEmitter {\n\treadonly socketInstance: Server\n\t#connectionCallbacks: SocketCallbacks = { onConnect: async () => {}, onDisconnect: async () => {} }\n\t#routes = {} as Record<string, OnJoinFn>\n\t#publish: (data: EmitData) => Promise<void> = async () => {}\n\n\tconstructor(\n\t\tsocket: Server,\n\t\tprivate config: ServerConfig,\n\t) {\n\t\tthis.socketInstance = socket\n\t\tthis.#setupSocketConnection()\n\t\tInstance.on(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\n\t\t)\n\t}\n\n\tasync created<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.created, { after: data.toJSON(), before: null }, to)\n\t}\n\n\tasync updated<T extends Entity>(channels: string[], { after, before }: { after: T; before: T }, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.updated, { after: after.toJSON(), before: before.toJSON() }, to)\n\t}\n\n\tasync deleted<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.deleted, { before: data.toJSON(), after: null }, to)\n\t}\n\n\tasync #emit(channels: string[], type: EmitTypes, { before, after }: { after: any; before: any }, to: string | string[] | null) {\n\t\tconst toArray = Array.isArray(to) ? to : [to ?? defaultTo]\n\t\tconst channelMap = channels.flatMap((c) => toArray.map((to) => `${to}:${c}`))\n\t\tawait Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })))\n\t}\n\n\tset connectionCallbacks(callbacks: SocketCallbacks) {\n\t\tthis.#connectionCallbacks = callbacks\n\t\tthis.#setupSocketConnection()\n\t}\n\n\tregister(channel: string, onJoin: OnJoinFn) {\n\t\tthis.#routes[channel] = onJoin\n\t\tthis.#routes[channel + '/:id'] = onJoin\n\t\treturn this\n\t}\n\n\t#getConfig(channel: string) {\n\t\tconst matcher = (key: string) => Match(key)(channel)\n\t\tconst matchedChannel = Object.keys(this.#routes).find(matcher) ?? null\n\t\tif (!matchedChannel) return null\n\t\tconst match = matcher(matchedChannel)\n\t\tif (!match) return null\n\t\treturn {\n\t\t\tconfig: this.#routes[matchedChannel],\n\t\t\tparams: match.params,\n\t\t}\n\t}\n\n\t#setupSocketConnection = () => {\n\t\tthis.socketInstance.removeAllListeners('connection')\n\t\tthis.socketInstance.on('connection', async (socket) => {\n\t\t\tconst socketId = socket.id\n\t\t\tlet user = null as AuthUser | null\n\t\t\tconst tokensUtil = this.config.requestsAuth.tokens\n\t\t\tif (socket.handshake.auth.authorization && tokensUtil)\n\t\t\t\tuser = await tokensUtil.verifyAccessToken(socket.handshake.auth.authorization ?? '').catch(() => null)\n\t\t\tsocket.on('leave', async (data: LeaveRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tsocket.leave(data.channel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tsocket.on('join', async (data: JoinRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst channel = data.channel\n\t\t\t\tconst route = this.#getConfig(channel) ?? null\n\t\t\t\tif (!route)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.BadRequest,\n\t\t\t\t\t\t\tmessage: 'unknown channel',\n\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst to = await route.config({ channel, user }, route.params, data.query ?? {})\n\t\t\t\tconst newChannel = `${to ?? defaultTo}:${channel}`\n\t\t\t\tsocket.join(newChannel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: newChannel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tif (user) await this.#connectionCallbacks.onConnect(user.id, socketId)\n\t\t\tsocket.on('disconnect', async () => {\n\t\t\t\tif (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId)\n\t\t\t})\n\t\t})\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../src/server/sockets.ts","/home/runner/work/equipped/equipped/dist/cjs/server/sockets.cjs"],"names":["EmitTypes","to"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/sockets.cjs","sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\nimport { BaseRequestAuthMethod } from './requests-auth-methods'\nimport { StatusCodes, type StatusCodesEnum } from './types'\n\nenum EmitTypes {\n\tcreated = 'created',\n\tupdated = 'updated',\n\tdeleted = 'deleted',\n}\n\nconst EmitterEvent = '__listener_emitter'\ntype EmitData = { channel: string; type: EmitTypes; after: any; before: any }\ntype LeaveRoomParams = { channel: string }\ntype JoinRoomParams = { channel: string; token?: string; query: Record<string, any> }\ntype Callback = (params: { code: StatusCodesEnum; message: string; channel: string }) => void\nexport type OnJoinFn = (\n\tdata: { channel: string; user: AuthUser | null },\n\tparams: Record<string, any>,\n\tquery: Record<string, any>,\n) => Promise<string | null>\nexport type SocketCallbacks = {\n\tonConnect: (userId: string, socketId: string) => Promise<void>\n\tonDisconnect: (userId: string, socketId: string) => Promise<void>\n}\n\nconst defaultTo = '*'\n\nexport class SocketEmitter {\n\treadonly socketInstance: Server\n\t#connectionCallbacks: SocketCallbacks = { onConnect: async () => {}, onDisconnect: async () => {} }\n\t#routes = {} as Record<string, OnJoinFn>\n\t#publish: (data: EmitData) => Promise<void> = async () => {}\n\n\tconstructor(\n\t\tsocket: Server,\n\t\tprivate config: ServerConfig,\n\t) {\n\t\tthis.socketInstance = socket\n\t\tthis.#setupSocketConnection()\n\t\tInstance.on(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\n\t\t)\n\t}\n\n\tasync created<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.created, { after: data.toJSON(), before: null }, to)\n\t}\n\n\tasync updated<T extends Entity>(channels: string[], { after, before }: { after: T; before: T }, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.updated, { after: after.toJSON(), before: before.toJSON() }, to)\n\t}\n\n\tasync deleted<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.deleted, { before: data.toJSON(), after: null }, to)\n\t}\n\n\tasync #emit(channels: string[], type: EmitTypes, { before, after }: { after: any; before: any }, to: string | string[] | null) {\n\t\tconst toArray = Array.isArray(to) ? to : [to ?? defaultTo]\n\t\tconst channelMap = channels.flatMap((c) => toArray.map((to) => `${to}:${c}`))\n\t\tawait Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })))\n\t}\n\n\tset connectionCallbacks(callbacks: SocketCallbacks) {\n\t\tthis.#connectionCallbacks = callbacks\n\t\tthis.#setupSocketConnection()\n\t}\n\n\tregister(channel: string, onJoin: OnJoinFn) {\n\t\tthis.#routes[channel] = onJoin\n\t\tthis.#routes[channel + '/:id'] = onJoin\n\t\treturn this\n\t}\n\n\t#getConfig(channel: string) {\n\t\tconst matcher = (key: string) => Match(key)(channel)\n\t\tconst matchedChannel = Object.keys(this.#routes).find(matcher) ?? null\n\t\tif (!matchedChannel) return null\n\t\tconst match = matcher(matchedChannel)\n\t\tif (!match) return null\n\t\treturn {\n\t\t\tconfig: this.#routes[matchedChannel],\n\t\t\tparams: match.params,\n\t\t}\n\t}\n\n\t#setupSocketConnection = () => {\n\t\tthis.socketInstance.removeAllListeners('connection')\n\t\tthis.socketInstance.on('connection', async (socket) => {\n\t\t\tconst socketId = socket.id\n\t\t\tconst user = await BaseRequestAuthMethod.process(this.config.socketsAuthMethods, socket.handshake.headers).catch(() => null)\n\t\t\tsocket.on('leave', async (data: LeaveRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tsocket.leave(data.channel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tsocket.on('join', async (data: JoinRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst channel = data.channel\n\t\t\t\tconst route = this.#getConfig(channel) ?? null\n\t\t\t\tif (!route)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.BadRequest,\n\t\t\t\t\t\t\tmessage: 'unknown channel',\n\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst to = await route.config({ channel, user }, route.params, data.query ?? {})\n\t\t\t\tconst newChannel = `${to ?? defaultTo}:${channel}`\n\t\t\t\tsocket.join(newChannel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: newChannel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tif (user) await this.#connectionCallbacks.onConnect(user.id, socketId)\n\t\t\tsocket.on('disconnect', async () => {\n\t\t\t\tif (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId)\n\t\t\t})\n\t\t})\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pathtoregexp = require('path-to-regexp');var _indexmincjs = require('../instance/index.min.cjs');var _typesmincjs = require('./types.min.cjs');var y=(e=>(e.created="created",e.updated="updated",e.deleted="deleted",e))(y||{});const p="__listener_emitter",h="*";class E{constructor(n,t){this.config=t;this.socketInstance=n,this.#r(),_indexmincjs.Instance.on("setup",()=>{const e=_optionalChain([t, 'access', _ => _.eventBus, 'optionalAccess', _2 => _2.createStream, 'call', _3 => _3(p,{fanout:!0})]);this.#s=e?e.publish:async s=>{n.to(s.channel).emit(s.channel,s)},_optionalChain([e, 'optionalAccess', _4 => _4.subscribe, 'call', _5 => _5(async s=>{n.to(s.channel).emit(s.channel,s)})])},1)}#e={onConnect:async()=>{},onDisconnect:async()=>{}};#n={};#s=async()=>{};async created(n,t,e){await this.#t(n,"created",{after:t.toJSON(),before:null},e)}async updated(n,{after:t,before:e},s){await this.#t(n,"updated",{after:t.toJSON(),before:e.toJSON()},s)}async deleted(n,t,e){await this.#t(n,"deleted",{before:t.toJSON(),after:null},e)}async#t(n,t,{before:e,after:s},r){const i=Array.isArray(r)?r:[_nullishCoalesce(r, () => (h))],o=n.flatMap(a=>i.map(l=>`${l}:${a}`));await Promise.all(o.map(async a=>this.#s({channel:a,type:t,before:e,after:s})))}set connectionCallbacks(n){this.#e=n,this.#r()}register(n,t){return this.#n[n]=t,this.#n[n+"/:id"]=t,this}#i(n){const t=r=>_pathtoregexp.match.call(void 0, r)(n),e=_nullishCoalesce(Object.keys(this.#n).find(t), () => (null));if(!e)return null;const s=t(e);return s?{config:this.#n[e],params:s.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async n=>{const t=n.id;let e=null;const s=this.config.requestsAuth.tokens;n.handshake.auth.authorization&&s&&(e=await s.verifyAccessToken(_nullishCoalesce(n.handshake.auth.authorization, () => (""))).catch(()=>null)),n.on("leave",async(r,i)=>r.channel?(n.leave(r.channel),typeof i=="function"&&i({code:_typesmincjs.StatusCodes.Ok,message:"",channel:r.channel})):typeof i=="function"&&i({code:_typesmincjs.StatusCodes.ValidationError,message:"channel is required",channel:""})),n.on("join",async(r,i)=>{if(!r.channel)return typeof i=="function"&&i({code:_typesmincjs.StatusCodes.ValidationError,message:"channel is required",channel:""});const o=r.channel,a=_nullishCoalesce(this.#i(o), () => (null));if(!a)return typeof i=="function"&&i({code:_typesmincjs.StatusCodes.BadRequest,message:"unknown channel",channel:o});const u=`${await _asyncNullishCoalesce(await a.config({channel:o,user:e},a.params,_nullishCoalesce(r.query, () => ({}))), async () => (h))}:${o}`;return n.join(u),typeof i=="function"&&i({code:_typesmincjs.StatusCodes.Ok,message:"",channel:u})}),e&&await this.#e.onConnect(e.id,t),n.on("disconnect",async()=>{e&&await this.#e.onDisconnect(e.id,t)})})}}exports.SocketEmitter = E;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _pathtoregexp = require('path-to-regexp');var _indexmincjs = require('../instance/index.min.cjs');var _indexmincjs3 = require('./requests-auth-methods/index.min.cjs');var _typesmincjs = require('./types.min.cjs');var y=(n=>(n.created="created",n.updated="updated",n.deleted="deleted",n))(y||{});const p="__listener_emitter",m="*";class S{constructor(e,s){this.config=s;this.socketInstance=e,this.#r(),_indexmincjs.Instance.on("setup",()=>{const n=_optionalChain([s, 'access', _ => _.eventBus, 'optionalAccess', _2 => _2.createStream, 'call', _3 => _3(p,{fanout:!0})]);this.#s=n?n.publish:async t=>{e.to(t.channel).emit(t.channel,t)},_optionalChain([n, 'optionalAccess', _4 => _4.subscribe, 'call', _5 => _5(async t=>{e.to(t.channel).emit(t.channel,t)})])},1)}#n={onConnect:async()=>{},onDisconnect:async()=>{}};#e={};#s=async()=>{};async created(e,s,n){await this.#t(e,"created",{after:s.toJSON(),before:null},n)}async updated(e,{after:s,before:n},t){await this.#t(e,"updated",{after:s.toJSON(),before:n.toJSON()},t)}async deleted(e,s,n){await this.#t(e,"deleted",{before:s.toJSON(),after:null},n)}async#t(e,s,{before:n,after:t},r){const o=Array.isArray(r)?r:[_nullishCoalesce(r, () => (m))],i=e.flatMap(c=>o.map(l=>`${l}:${c}`));await Promise.all(i.map(async c=>this.#s({channel:c,type:s,before:n,after:t})))}set connectionCallbacks(e){this.#n=e,this.#r()}register(e,s){return this.#e[e]=s,this.#e[e+"/:id"]=s,this}#o(e){const s=r=>_pathtoregexp.match.call(void 0, r)(e),n=_nullishCoalesce(Object.keys(this.#e).find(s), () => (null));if(!n)return null;const t=s(n);return t?{config:this.#e[n],params:t.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{const s=e.id,n=await _indexmincjs3.BaseRequestAuthMethod.process(this.config.socketsAuthMethods,e.handshake.headers).catch(()=>null);e.on("leave",async(t,r)=>t.channel?(e.leave(t.channel),typeof r=="function"&&r({code:_typesmincjs.StatusCodes.Ok,message:"",channel:t.channel})):typeof r=="function"&&r({code:_typesmincjs.StatusCodes.ValidationError,message:"channel is required",channel:""})),e.on("join",async(t,r)=>{if(!t.channel)return typeof r=="function"&&r({code:_typesmincjs.StatusCodes.ValidationError,message:"channel is required",channel:""});const o=t.channel,i=_nullishCoalesce(this.#o(o), () => (null));if(!i)return typeof r=="function"&&r({code:_typesmincjs.StatusCodes.BadRequest,message:"unknown channel",channel:o});const l=`${await _asyncNullishCoalesce(await i.config({channel:o,user:n},i.params,_nullishCoalesce(t.query, () => ({}))), async () => (m))}:${o}`;return e.join(l),typeof r=="function"&&r({code:_typesmincjs.StatusCodes.Ok,message:"",channel:l})}),n&&await this.#n.onConnect(n.id,s),e.on("disconnect",async()=>{n&&await this.#n.onDisconnect(n.id,s)})})}}exports.SocketEmitter = S;
2
2
  //# sourceMappingURL=sockets.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/sockets.ts"],"names":["EmitTypes","defaultTo","socket","config","#setupSocketConnection","stream","EmitterEvent","data","#connectionCallbacks","to","channels","after","#emit","before","c","toArray"],"mappings":"AAAA,o1BAA+B,wDAOtB,8CAGE,IAAA,CAAA,CAAA,CACVA,CAAAA,EAAA,CAAA,CAAA,CAAA,OAAU,CAAA,SACV,CAAA,CAAA,CAAA,OAAU,CAAA,SAHNA,CAAAA,CAAAA,CAAAA,OAML,CAAA,SAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,MAefC,CAAY,CAAA,oBAQjB,CAAA,CAAA,CACCC,GACQC,CACP,MADO,CAAA,CAAA,WAER,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,MAAiBD,CACtB,CAAA,CAAA,IAAKE,CAAAA,cAEJ,CAAA,CACA,CAAA,IACC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAMC,qBAAAA,CAASF,EAAO,CAAA,OAAA,CAAA,CAAU,CAAA,EAAA,CAAA,MAAA,CAAA,iBAAA,CAAaG,mBAAAA,QAAyB,6BAAQ,YAC9DD,mBAAAA,CACZA,CAAAA,CAAO,MAAA,CAAA,CACR,CAAA,CAAA,GAAA,CAAA,IAAOE,CAAmB,CAC1BL,CAAAA,CAAO,CAAA,CAAA,CAAGK,CAAAA,OAAK,CAAO,MAAE,CAAKA,EAAK,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAASA,OAEtC,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,OAAiBA,CAAAA,CAAAA,CAAmB,CAC3CL,iBAAAA,CAAO,6BAAA,SAAQ,mBAAO,MAAE,CAAKK,EAAK,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAASA,OAI9C,CACD,CA1BS,IAAA,CAAA,CAAA,CAAA,OAAA,CACTC,CAAAA,CAAAA,CAAwC,GAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAG,CAAA,CAAA,SAAA,CAAA,KAAc,CAAA,CAAA,EAAA,CAAY,CAAC,CAAE,YAEpD,CAAA,KAAA,CAAA,CAAY,EAAC,CAyB3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAA8CD,CAASE,CAAAA,EAC5D,CAAA,CAAA,CAAA,MAAM,OAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAqB,IAAOF,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,SAAU,CAAA,CAAQ,KAAK,CAAGE,CAAE,CACzF,MAEA,CAAM,CAAA,CAAA,MAA0BC,CAAAA,IAAsB,CAAA,CAAA,CAAA,CAAAC,CAAAA,MAAO,OAAiE,CAC7H,CAAA,CAAA,CAAA,KAAM,CAAA,CAAA,CAAKC,MAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAqB,IAAOD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,SAAU,CAAA,CAAQE,KAAO,CAAA,CAAA,CAAA,MACvF,CAEA,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,MAA8CN,CAASE,CAAAA,CAA8B,CAC1F,CAAA,CAAA,CAAA,MAAM,OAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAqB,IAAQF,CAAAA,CAAK,CAAA,CAAA,CAAA,CAAA,SAAU,CAAA,CAAO,MAAQE,CAAE,CACzF,CAEA,MAAMG,CAAAA,CAAMF,CAAAA,KAAuC,CAAA,IAAA,CAAAG,CAAAA,CAAQ,CAAA,CAAA,KAAM,CAAA,CAAgCJ,CAAAA,CAA8B,CAC9H,CAAA,CAAA,CAAA,MAAgB,CAAA,CAAA,CAAA,KAAM,CAAA,CAAA,CAAA,CAAA,CAAQA,CAAE,CAAA,MAAUA,CAAMR,CAAS,KACtCS,CAAS,OAAA,CAASI,CAAAA,CAAAA,CAAMC,CAAAA,CAAQ,kBAAA,CAAA,SAAKN,GAAAA,CAAAA,CAAO,CAAA,CAAA,CAAGA,CAAE,OAAO,CAAC,CAAA,EAC5E,CAAA,CAAA,GAAM,CAAA,CAAA,EAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/sockets.min.cjs","sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\nimport { StatusCodes, type StatusCodesEnum } from './types'\n\nenum EmitTypes {\n\tcreated = 'created',\n\tupdated = 'updated',\n\tdeleted = 'deleted',\n}\n\nconst EmitterEvent = '__listener_emitter'\ntype EmitData = { channel: string; type: EmitTypes; after: any; before: any }\ntype LeaveRoomParams = { channel: string }\ntype JoinRoomParams = { channel: string; token?: string; query: Record<string, any> }\ntype Callback = (params: { code: StatusCodesEnum; message: string; channel: string }) => void\nexport type OnJoinFn = (\n\tdata: { channel: string; user: AuthUser | null },\n\tparams: Record<string, any>,\n\tquery: Record<string, any>,\n) => Promise<string | null>\nexport type SocketCallbacks = {\n\tonConnect: (userId: string, socketId: string) => Promise<void>\n\tonDisconnect: (userId: string, socketId: string) => Promise<void>\n}\n\nconst defaultTo = '*'\n\nexport class SocketEmitter {\n\treadonly socketInstance: Server\n\t#connectionCallbacks: SocketCallbacks = { onConnect: async () => {}, onDisconnect: async () => {} }\n\t#routes = {} as Record<string, OnJoinFn>\n\t#publish: (data: EmitData) => Promise<void> = async () => {}\n\n\tconstructor(\n\t\tsocket: Server,\n\t\tprivate config: ServerConfig,\n\t) {\n\t\tthis.socketInstance = socket\n\t\tthis.#setupSocketConnection()\n\t\tInstance.on(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\n\t\t)\n\t}\n\n\tasync created<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.created, { after: data.toJSON(), before: null }, to)\n\t}\n\n\tasync updated<T extends Entity>(channels: string[], { after, before }: { after: T; before: T }, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.updated, { after: after.toJSON(), before: before.toJSON() }, to)\n\t}\n\n\tasync deleted<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.deleted, { before: data.toJSON(), after: null }, to)\n\t}\n\n\tasync #emit(channels: string[], type: EmitTypes, { before, after }: { after: any; before: any }, to: string | string[] | null) {\n\t\tconst toArray = Array.isArray(to) ? to : [to ?? defaultTo]\n\t\tconst channelMap = channels.flatMap((c) => toArray.map((to) => `${to}:${c}`))\n\t\tawait Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })))\n\t}\n\n\tset connectionCallbacks(callbacks: SocketCallbacks) {\n\t\tthis.#connectionCallbacks = callbacks\n\t\tthis.#setupSocketConnection()\n\t}\n\n\tregister(channel: string, onJoin: OnJoinFn) {\n\t\tthis.#routes[channel] = onJoin\n\t\tthis.#routes[channel + '/:id'] = onJoin\n\t\treturn this\n\t}\n\n\t#getConfig(channel: string) {\n\t\tconst matcher = (key: string) => Match(key)(channel)\n\t\tconst matchedChannel = Object.keys(this.#routes).find(matcher) ?? null\n\t\tif (!matchedChannel) return null\n\t\tconst match = matcher(matchedChannel)\n\t\tif (!match) return null\n\t\treturn {\n\t\t\tconfig: this.#routes[matchedChannel],\n\t\t\tparams: match.params,\n\t\t}\n\t}\n\n\t#setupSocketConnection = () => {\n\t\tthis.socketInstance.removeAllListeners('connection')\n\t\tthis.socketInstance.on('connection', async (socket) => {\n\t\t\tconst socketId = socket.id\n\t\t\tlet user = null as AuthUser | null\n\t\t\tconst tokensUtil = this.config.requestsAuth.tokens\n\t\t\tif (socket.handshake.auth.authorization && tokensUtil)\n\t\t\t\tuser = await tokensUtil.verifyAccessToken(socket.handshake.auth.authorization ?? '').catch(() => null)\n\t\t\tsocket.on('leave', async (data: LeaveRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tsocket.leave(data.channel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tsocket.on('join', async (data: JoinRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst channel = data.channel\n\t\t\t\tconst route = this.#getConfig(channel) ?? null\n\t\t\t\tif (!route)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.BadRequest,\n\t\t\t\t\t\t\tmessage: 'unknown channel',\n\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst to = await route.config({ channel, user }, route.params, data.query ?? {})\n\t\t\t\tconst newChannel = `${to ?? defaultTo}:${channel}`\n\t\t\t\tsocket.join(newChannel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: newChannel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tif (user) await this.#connectionCallbacks.onConnect(user.id, socketId)\n\t\t\tsocket.on('disconnect', async () => {\n\t\t\t\tif (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId)\n\t\t\t})\n\t\t})\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/server/sockets.ts"],"names":["EmitTypes","EmitterEvent","defaultTo","config","socket","#setupSocketConnection","stream","data","#connectionCallbacks","#routes","#publish","channels","to","#emit","after","before","channelMap"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/sockets.min.cjs","sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\nimport { BaseRequestAuthMethod } from './requests-auth-methods'\nimport { StatusCodes, type StatusCodesEnum } from './types'\n\nenum EmitTypes {\n\tcreated = 'created',\n\tupdated = 'updated',\n\tdeleted = 'deleted',\n}\n\nconst EmitterEvent = '__listener_emitter'\ntype EmitData = { channel: string; type: EmitTypes; after: any; before: any }\ntype LeaveRoomParams = { channel: string }\ntype JoinRoomParams = { channel: string; token?: string; query: Record<string, any> }\ntype Callback = (params: { code: StatusCodesEnum; message: string; channel: string }) => void\nexport type OnJoinFn = (\n\tdata: { channel: string; user: AuthUser | null },\n\tparams: Record<string, any>,\n\tquery: Record<string, any>,\n) => Promise<string | null>\nexport type SocketCallbacks = {\n\tonConnect: (userId: string, socketId: string) => Promise<void>\n\tonDisconnect: (userId: string, socketId: string) => Promise<void>\n}\n\nconst defaultTo = '*'\n\nexport class SocketEmitter {\n\treadonly socketInstance: Server\n\t#connectionCallbacks: SocketCallbacks = { onConnect: async () => {}, onDisconnect: async () => {} }\n\t#routes = {} as Record<string, OnJoinFn>\n\t#publish: (data: EmitData) => Promise<void> = async () => {}\n\n\tconstructor(\n\t\tsocket: Server,\n\t\tprivate config: ServerConfig,\n\t) {\n\t\tthis.socketInstance = socket\n\t\tthis.#setupSocketConnection()\n\t\tInstance.on(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\n\t\t)\n\t}\n\n\tasync created<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.created, { after: data.toJSON(), before: null }, to)\n\t}\n\n\tasync updated<T extends Entity>(channels: string[], { after, before }: { after: T; before: T }, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.updated, { after: after.toJSON(), before: before.toJSON() }, to)\n\t}\n\n\tasync deleted<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.deleted, { before: data.toJSON(), after: null }, to)\n\t}\n\n\tasync #emit(channels: string[], type: EmitTypes, { before, after }: { after: any; before: any }, to: string | string[] | null) {\n\t\tconst toArray = Array.isArray(to) ? to : [to ?? defaultTo]\n\t\tconst channelMap = channels.flatMap((c) => toArray.map((to) => `${to}:${c}`))\n\t\tawait Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })))\n\t}\n\n\tset connectionCallbacks(callbacks: SocketCallbacks) {\n\t\tthis.#connectionCallbacks = callbacks\n\t\tthis.#setupSocketConnection()\n\t}\n\n\tregister(channel: string, onJoin: OnJoinFn) {\n\t\tthis.#routes[channel] = onJoin\n\t\tthis.#routes[channel + '/:id'] = onJoin\n\t\treturn this\n\t}\n\n\t#getConfig(channel: string) {\n\t\tconst matcher = (key: string) => Match(key)(channel)\n\t\tconst matchedChannel = Object.keys(this.#routes).find(matcher) ?? null\n\t\tif (!matchedChannel) return null\n\t\tconst match = matcher(matchedChannel)\n\t\tif (!match) return null\n\t\treturn {\n\t\t\tconfig: this.#routes[matchedChannel],\n\t\t\tparams: match.params,\n\t\t}\n\t}\n\n\t#setupSocketConnection = () => {\n\t\tthis.socketInstance.removeAllListeners('connection')\n\t\tthis.socketInstance.on('connection', async (socket) => {\n\t\t\tconst socketId = socket.id\n\t\t\tconst user = await BaseRequestAuthMethod.process(this.config.socketsAuthMethods, socket.handshake.headers).catch(() => null)\n\t\t\tsocket.on('leave', async (data: LeaveRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tsocket.leave(data.channel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tsocket.on('join', async (data: JoinRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst channel = data.channel\n\t\t\t\tconst route = this.#getConfig(channel) ?? null\n\t\t\t\tif (!route)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.BadRequest,\n\t\t\t\t\t\t\tmessage: 'unknown channel',\n\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst to = await route.config({ channel, user }, route.params, data.query ?? {})\n\t\t\t\tconst newChannel = `${to ?? defaultTo}:${channel}`\n\t\t\t\tsocket.join(newChannel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: newChannel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tif (user) await this.#connectionCallbacks.onConnect(user.id, socketId)\n\t\t\tsocket.on('disconnect', async () => {\n\t\t\t\tif (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId)\n\t\t\t})\n\t\t})\n\t}\n}\n"]}
@@ -16,7 +16,7 @@ const StatusCodes = {
16
16
  NotFound: 404,
17
17
  ValidationError: 422,
18
18
  TooManyRequests: 429,
19
- AuthorizationExpired: 461
19
+ TokenExpired: 461
20
20
  };
21
21
  function makeMiddlewareHandler(cb, onSetup) {
22
22
  return { cb, onSetup };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/types.ts","/home/runner/work/equipped/equipped/dist/cjs/server/types.cjs"],"names":[],"mappings":"AAOO,+EAAM,QAAA,EAAU;AAAA,EACtB,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS;AACV,CAAA;AAEO,MAAM,YAAA,EAAc;AAAA,EAC1B,EAAA,EAAI,GAAA;AAAA,EACJ,KAAA,EAAO,GAAA;AAAA,EACP,UAAA,EAAY,GAAA;AAAA,EACZ,gBAAA,EAAkB,GAAA;AAAA,EAClB,aAAA,EAAe,GAAA;AAAA,EACf,QAAA,EAAU,GAAA;AAAA,EACV,eAAA,EAAiB,GAAA;AAAA,EACjB,eAAA,EAAiB,GAAA;AAAA,EACjB,oBAAA,EAAsB;AACvB,CAAA;AAkHA,SAAS,qBAAA,CAA+D,EAAA,EAAQ,OAAA,EAA2B;AAC1G,EAAA,OAAO,EAAE,EAAA,EAAI,QAAQ,CAAA;AACtB;AAEO,MAAM,eAAA,EAAiB,CAAA,GAA0B,IAAA,EAAA,GACvD,qBAAA,CAAsB,GAAG,IAAI,CAAA;AACvB,MAAM,oBAAA,EAAsB,CAAA,GAA0B,IAAA,EAAA,GAC5D,qBAAA,CAAsB,GAAG,IAAI,CAAA;AC3H9B;AACE;AACA;AACA;AACA;AACF,yJAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/server/types.cjs","sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\nimport type { Request, Response } from './requests'\n\nexport const Methods = {\n\thead: 'head',\n\tget: 'get',\n\tpost: 'post',\n\tput: 'put',\n\tpatch: 'patch',\n\tdelete: 'delete',\n\toptions: 'options',\n} as const\n\nexport const StatusCodes = {\n\tOk: 200,\n\tFound: 302,\n\tBadRequest: 400,\n\tNotAuthenticated: 401,\n\tNotAuthorized: 403,\n\tNotFound: 404,\n\tValidationError: 422,\n\tTooManyRequests: 429,\n\tAuthorizationExpired: 461,\n} as const\n\nexport type MethodsEnum = Enum<typeof Methods>\nexport type StatusCodesEnum = Enum<typeof StatusCodes>\n\nexport type DefaultHeaders = Record<string, ArrayOrValue<string>>\nexport type DefaultCookies = Record<string, string | undefined>\n\ntype ArrayOrValue<T> = T | T[] | undefined\n\nexport type IncomingFile = {\n\tname: string\n\ttype: string\n\tsize: number\n\tisTruncated: boolean\n\tdata: Buffer\n\tduration: number\n}\n\nexport type RouteDef = {\n\tparams?: Pipe<Record<string, ArrayOrValue<string>>, Record<string, ArrayOrValue<string>>>\n\tquery?: Pipe<Record<string, ArrayOrValue<unknown>>, Record<string, ArrayOrValue<unknown>>>\n\theaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tcookies?: Pipe<DefaultCookies, DefaultCookies>\n\tbody?: Pipe<Record<string, unknown>, Record<string, unknown>>\n\tresponse?: Pipe<unknown, unknown>\n\tresponseHeaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tresponseCookies?: Pipe<DefaultCookies, DefaultCookies>\n\tdefaultStatusCode?: StatusCodesEnum\n\tdefaultContentType?: string\n\tcontext?: (req: Request<RouteDefToReqRes<RouteDef>>) => Awaitable<Record<string, unknown>>\n}\n\ntype RouteGroup = { name: string; description?: string }\ntype HandlerSetup<T extends RouteDef> = (route: Route<T>) => void\n\nexport type RouteConfig<T extends RouteDef> = {\n\tmiddlewares?: ReturnType<typeof makeMiddleware<RouteDef>>[]\n\tonError?: ReturnType<typeof makeErrorMiddleware<RouteDef>>\n\tgroups?: (RouteGroup | RouteGroup['name'])[]\n\ttitle?: string\n\tdescriptions?: string[]\n\tsecurity?: Record<string, string[]>[]\n\tschema?: T\n\thide?: boolean\n}\n\nexport type RouterConfig<T extends RouteDef> = RouteConfig<T> & { path: string }\nexport type Route<T extends RouteDef> = RouteConfig<T> & {\n\tpath: string\n\tmethod: MethodsEnum\n\thandler: RouteDefHandler<T>\n}\n\ntype GetApiPart<T extends RouteDef, K extends keyof RouteDef> = NonNullable<IsInTypeList<T[K], [unknown]> extends true ? RouteDef[K] : T[K]>\n\ntype ArePipes<A, B> = A extends Pipe<any, any> ? (B extends Pipe<any, any> ? true : false) : false\ntype Compare<K extends keyof RouteDef, A, B> =\n\tIsInTypeList<B, [unknown]> extends true\n\t\t? A\n\t\t: IsInTypeList<A, [unknown]> extends true\n\t\t\t? B\n\t\t\t: K extends `default${string}` | 'context'\n\t\t\t\t? B\n\t\t\t\t: ArePipes<A, B> extends true\n\t\t\t\t\t? Pipe<PipeInput<A> & PipeInput<B>, PipeOutput<A> & PipeOutput<B>>\n\t\t\t\t\t: B\n\nexport type MergeRouteDefs<A extends RouteDef, B extends RouteDef> = {\n\t[K in keyof RouteDef]: Compare<K, A[K], B[K]>\n}\n\nexport type RouteDefToReqRes<T extends RouteDef> = Prettify<{\n\tbody: PipeOutput<GetApiPart<T, 'body'>>\n\tparams: PipeOutput<GetApiPart<T, 'params'>>\n\trequestHeaders: PipeOutput<GetApiPart<T, 'headers'>>\n\trequestCookies: PipeOutput<GetApiPart<T, 'cookies'>>\n\tquery: PipeOutput<GetApiPart<T, 'query'>>\n\tresponse: PipeOutput<GetApiPart<T, 'response'>>\n\tresponseHeaders: PipeOutput<GetApiPart<T, 'responseHeaders'>>\n\tresponseCookies: PipeOutput<GetApiPart<T, 'responseCookies'>>\n\tstatusCode: GetApiPart<T, 'defaultStatusCode'>\n\tcontentType: GetApiPart<T, 'defaultContentType'>\n\tcontext: Awaited<ReturnType<GetApiPart<T, 'context'>>>\n}>\n\ntype Awaitable<T> = Promise<T> | T\ntype Res<T extends RouteDefToReqRes<any>> = Awaitable<\n\tIsInTypeList<T['statusCode'], [StatusCodesEnum, 200]> extends true\n\t\t? IsInTypeList<T['responseHeaders'], [DefaultHeaders]> extends true\n\t\t\t? IsInTypeList<T['responseCookies'], [DefaultCookies]> extends true\n\t\t\t\t? Response<T> | T['response']\n\t\t\t\t: Response<T>\n\t\t\t: Response<T>\n\t\t: Response<T>\n>\nexport type RouteDefHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n\terr: Error,\n) => Res<\n\tOmit<RouteDefToReqRes<Def>, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies'> & {\n\t\tresponse: RequestError['serializedErrors']\n\t\tstatusCode: RequestError['statusCode']\n\t\tresponseHeaders: DefaultHeaders\n\t\tresponseCookies: DefaultCookies\n\t}\n>\n\nfunction makeMiddlewareHandler<Cb extends Function, T extends RouteDef>(cb: Cb, onSetup?: HandlerSetup<T>) {\n\treturn { cb, onSetup }\n}\n\nexport const makeMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<RouteMiddlewareHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\nexport const makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n",null]}
1
+ {"version":3,"sources":["../../../src/server/types.ts","/home/runner/work/equipped/equipped/dist/cjs/server/types.cjs"],"names":[],"mappings":"AAOO,+EAAM,QAAA,EAAU;AAAA,EACtB,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS;AACV,CAAA;AAEO,MAAM,YAAA,EAAc;AAAA,EAC1B,EAAA,EAAI,GAAA;AAAA,EACJ,KAAA,EAAO,GAAA;AAAA,EACP,UAAA,EAAY,GAAA;AAAA,EACZ,gBAAA,EAAkB,GAAA;AAAA,EAClB,aAAA,EAAe,GAAA;AAAA,EACf,QAAA,EAAU,GAAA;AAAA,EACV,eAAA,EAAiB,GAAA;AAAA,EACjB,eAAA,EAAiB,GAAA;AAAA,EACjB,YAAA,EAAc;AACf,CAAA;AAgHA,SAAS,qBAAA,CAA+D,EAAA,EAAQ,OAAA,EAA2B;AAC1G,EAAA,OAAO,EAAE,EAAA,EAAI,QAAQ,CAAA;AACtB;AAEO,MAAM,eAAA,EAAiB,CAAA,GAA0B,IAAA,EAAA,GACvD,qBAAA,CAAsB,GAAG,IAAI,CAAA;AACvB,MAAM,oBAAA,EAAsB,CAAA,GAA0B,IAAA,EAAA,GAC5D,qBAAA,CAAsB,GAAG,IAAI,CAAA;ACzH9B;AACE;AACA;AACA;AACA;AACF,yJAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/server/types.cjs","sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\nimport type { Request, Response } from './requests'\n\nexport const Methods = {\n\thead: 'head',\n\tget: 'get',\n\tpost: 'post',\n\tput: 'put',\n\tpatch: 'patch',\n\tdelete: 'delete',\n\toptions: 'options',\n} as const\n\nexport const StatusCodes = {\n\tOk: 200,\n\tFound: 302,\n\tBadRequest: 400,\n\tNotAuthenticated: 401,\n\tNotAuthorized: 403,\n\tNotFound: 404,\n\tValidationError: 422,\n\tTooManyRequests: 429,\n\tTokenExpired: 461,\n} as const\n\nexport type MethodsEnum = Enum<typeof Methods>\nexport type StatusCodesEnum = Enum<typeof StatusCodes>\n\nexport type DefaultHeaders = Record<string, ArrayOrValue<string>>\nexport type DefaultCookies = Record<string, string | undefined>\n\ntype ArrayOrValue<T> = T | T[] | undefined\n\nexport type IncomingFile = {\n\tname: string\n\ttype: string\n\tsize: number\n\tisTruncated: boolean\n\tdata: Buffer\n\tduration: number\n}\n\nexport type RouteDef = {\n\tparams?: Pipe<Record<string, ArrayOrValue<string>>, Record<string, ArrayOrValue<string>>>\n\tquery?: Pipe<Record<string, ArrayOrValue<unknown>>, Record<string, ArrayOrValue<unknown>>>\n\theaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tcookies?: Pipe<DefaultCookies, DefaultCookies>\n\tbody?: Pipe<Record<string, unknown>, Record<string, unknown>>\n\tresponse?: Pipe<unknown, unknown>\n\tresponseHeaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tresponseCookies?: Pipe<DefaultCookies, DefaultCookies>\n\tdefaultStatusCode?: StatusCodesEnum\n\tdefaultContentType?: string\n}\n\ntype RouteGroup = { name: string; description?: string }\ntype HandlerSetup<T extends RouteDef> = (route: Route<T>) => void\n\nexport type RouteConfig<T extends RouteDef> = {\n\tmiddlewares?: ReturnType<typeof makeMiddleware<RouteDef>>[]\n\tonError?: ReturnType<typeof makeErrorMiddleware<RouteDef>>\n\tgroups?: (RouteGroup | RouteGroup['name'])[]\n\ttitle?: string\n\tdescriptions?: string[]\n\tsecurity?: Record<string, string[]>[]\n\tschema?: T\n\thide?: boolean\n}\n\nexport type RouterConfig<T extends RouteDef> = RouteConfig<T> & { path: string }\nexport type Route<T extends RouteDef> = RouteConfig<T> & {\n\tpath: string\n\tmethod: MethodsEnum\n\thandler: RouteDefHandler<T>\n}\n\ntype GetApiPart<T extends RouteDef, K extends keyof RouteDef> = NonNullable<IsInTypeList<T[K], [unknown]> extends true ? RouteDef[K] : T[K]>\n\ntype ArePipes<A, B> = A extends Pipe<any, any> ? (B extends Pipe<any, any> ? true : false) : false\ntype Compare<K extends keyof RouteDef, A, B> =\n\tIsInTypeList<B, [unknown]> extends true\n\t\t? A\n\t\t: IsInTypeList<A, [unknown]> extends true\n\t\t\t? B\n\t\t\t: K extends `default${string}` | 'context'\n\t\t\t\t? B\n\t\t\t\t: ArePipes<A, B> extends true\n\t\t\t\t\t? Pipe<PipeInput<A> & PipeInput<B>, PipeOutput<A> & PipeOutput<B>>\n\t\t\t\t\t: B\n\nexport type MergeRouteDefs<A extends RouteDef, B extends RouteDef> = {\n\t[K in keyof RouteDef]: Compare<K, A[K], B[K]>\n}\n\nexport type RouteDefToReqRes<T extends RouteDef> = Prettify<{\n\tbody: PipeOutput<GetApiPart<T, 'body'>>\n\tparams: PipeOutput<GetApiPart<T, 'params'>>\n\trequestHeaders: PipeOutput<GetApiPart<T, 'headers'>>\n\trequestCookies: PipeOutput<GetApiPart<T, 'cookies'>>\n\tquery: PipeOutput<GetApiPart<T, 'query'>>\n\tresponse: PipeOutput<GetApiPart<T, 'response'>>\n\tresponseHeaders: PipeOutput<GetApiPart<T, 'responseHeaders'>>\n\tresponseCookies: PipeOutput<GetApiPart<T, 'responseCookies'>>\n\tstatusCode: GetApiPart<T, 'defaultStatusCode'>\n\tcontentType: GetApiPart<T, 'defaultContentType'>\n}>\n\ntype Awaitable<T> = Promise<T> | T\ntype Res<T extends RouteDefToReqRes<any>> = Awaitable<\n\tIsInTypeList<T['statusCode'], [StatusCodesEnum, 200]> extends true\n\t\t? IsInTypeList<T['responseHeaders'], [DefaultHeaders]> extends true\n\t\t\t? IsInTypeList<T['responseCookies'], [DefaultCookies]> extends true\n\t\t\t\t? Response<T> | T['response']\n\t\t\t\t: Response<T>\n\t\t\t: Response<T>\n\t\t: Response<T>\n>\nexport type RouteDefHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n\terr: Error,\n) => Res<\n\tOmit<RouteDefToReqRes<Def>, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies'> & {\n\t\tresponse: RequestError['serializedErrors']\n\t\tstatusCode: RequestError['statusCode']\n\t\tresponseHeaders: DefaultHeaders\n\t\tresponseCookies: DefaultCookies\n\t}\n>\n\nfunction makeMiddlewareHandler<Cb extends Function, T extends RouteDef>(cb: Cb, onSetup?: HandlerSetup<T>) {\n\treturn { cb, onSetup }\n}\n\nexport const makeMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<RouteMiddlewareHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\nexport const makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});const r={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},s= exports.StatusCodes ={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,AuthorizationExpired:461};function t(e,o){return{cb:e,onSetup:o}}const n=(...e)=>t(...e),u= exports.makeErrorMiddleware =(...e)=>t(...e);exports.Methods = r; exports.StatusCodes = s; exports.makeErrorMiddleware = u; exports.makeMiddleware = n;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});const r={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},s= exports.StatusCodes ={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,TokenExpired:461};function t(e,o){return{cb:e,onSetup:o}}const n=(...e)=>t(...e),u= exports.makeErrorMiddleware =(...e)=>t(...e);exports.Methods = r; exports.StatusCodes = s; exports.makeErrorMiddleware = u; exports.makeMiddleware = n;
2
2
  //# sourceMappingURL=types.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/types.ts"],"names":["Methods","StatusCodes","makeMiddlewareHandler","cb","onSetup","makeMiddleware","args","makeErrorMiddleware"],"mappings":"AAOO,+EAAMA,CAAAA,CAAU,CACtB,IAAA,CAAM,MAAA,CACN,GAAA,CAAK,KAAA,CACL,IAAA,CAAM,MAAA,CACN,GAAA,CAAK,KAAA,CACL,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SACV,CAAA,CAEaC,CAAAA,uBAAc,CAC1B,EAAA,CAAI,GAAA,CACJ,KAAA,CAAO,GAAA,CACP,UAAA,CAAY,GAAA,CACZ,gBAAA,CAAkB,GAAA,CAClB,aAAA,CAAe,GAAA,CACf,QAAA,CAAU,GAAA,CACV,eAAA,CAAiB,GAAA,CACjB,eAAA,CAAiB,GAAA,CACjB,oBAAA,CAAsB,GACvB,CAAA,CAkHA,SAASC,CAAAA,CAA+DC,CAAAA,CAAQC,CAAAA,CAA2B,CAC1G,MAAO,CAAE,EAAA,CAAAD,CAAAA,CAAI,OAAA,CAAAC,CAAQ,CACtB,CAEO,MAAMC,CAAAA,CAAiB,CAAA,GAA0BC,CAAAA,CAAAA,EACvDJ,CAAAA,CAAsB,GAAGI,CAAI,CAAA,CACjBC,CAAAA,+BAAsB,CAAA,GAA0BD,CAAAA,CAAAA,EAC5DJ,CAAAA,CAAsB,GAAGI,CAAI,CAAA,CAAA,0GAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/types.min.cjs","sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\nimport type { Request, Response } from './requests'\n\nexport const Methods = {\n\thead: 'head',\n\tget: 'get',\n\tpost: 'post',\n\tput: 'put',\n\tpatch: 'patch',\n\tdelete: 'delete',\n\toptions: 'options',\n} as const\n\nexport const StatusCodes = {\n\tOk: 200,\n\tFound: 302,\n\tBadRequest: 400,\n\tNotAuthenticated: 401,\n\tNotAuthorized: 403,\n\tNotFound: 404,\n\tValidationError: 422,\n\tTooManyRequests: 429,\n\tAuthorizationExpired: 461,\n} as const\n\nexport type MethodsEnum = Enum<typeof Methods>\nexport type StatusCodesEnum = Enum<typeof StatusCodes>\n\nexport type DefaultHeaders = Record<string, ArrayOrValue<string>>\nexport type DefaultCookies = Record<string, string | undefined>\n\ntype ArrayOrValue<T> = T | T[] | undefined\n\nexport type IncomingFile = {\n\tname: string\n\ttype: string\n\tsize: number\n\tisTruncated: boolean\n\tdata: Buffer\n\tduration: number\n}\n\nexport type RouteDef = {\n\tparams?: Pipe<Record<string, ArrayOrValue<string>>, Record<string, ArrayOrValue<string>>>\n\tquery?: Pipe<Record<string, ArrayOrValue<unknown>>, Record<string, ArrayOrValue<unknown>>>\n\theaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tcookies?: Pipe<DefaultCookies, DefaultCookies>\n\tbody?: Pipe<Record<string, unknown>, Record<string, unknown>>\n\tresponse?: Pipe<unknown, unknown>\n\tresponseHeaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tresponseCookies?: Pipe<DefaultCookies, DefaultCookies>\n\tdefaultStatusCode?: StatusCodesEnum\n\tdefaultContentType?: string\n\tcontext?: (req: Request<RouteDefToReqRes<RouteDef>>) => Awaitable<Record<string, unknown>>\n}\n\ntype RouteGroup = { name: string; description?: string }\ntype HandlerSetup<T extends RouteDef> = (route: Route<T>) => void\n\nexport type RouteConfig<T extends RouteDef> = {\n\tmiddlewares?: ReturnType<typeof makeMiddleware<RouteDef>>[]\n\tonError?: ReturnType<typeof makeErrorMiddleware<RouteDef>>\n\tgroups?: (RouteGroup | RouteGroup['name'])[]\n\ttitle?: string\n\tdescriptions?: string[]\n\tsecurity?: Record<string, string[]>[]\n\tschema?: T\n\thide?: boolean\n}\n\nexport type RouterConfig<T extends RouteDef> = RouteConfig<T> & { path: string }\nexport type Route<T extends RouteDef> = RouteConfig<T> & {\n\tpath: string\n\tmethod: MethodsEnum\n\thandler: RouteDefHandler<T>\n}\n\ntype GetApiPart<T extends RouteDef, K extends keyof RouteDef> = NonNullable<IsInTypeList<T[K], [unknown]> extends true ? RouteDef[K] : T[K]>\n\ntype ArePipes<A, B> = A extends Pipe<any, any> ? (B extends Pipe<any, any> ? true : false) : false\ntype Compare<K extends keyof RouteDef, A, B> =\n\tIsInTypeList<B, [unknown]> extends true\n\t\t? A\n\t\t: IsInTypeList<A, [unknown]> extends true\n\t\t\t? B\n\t\t\t: K extends `default${string}` | 'context'\n\t\t\t\t? B\n\t\t\t\t: ArePipes<A, B> extends true\n\t\t\t\t\t? Pipe<PipeInput<A> & PipeInput<B>, PipeOutput<A> & PipeOutput<B>>\n\t\t\t\t\t: B\n\nexport type MergeRouteDefs<A extends RouteDef, B extends RouteDef> = {\n\t[K in keyof RouteDef]: Compare<K, A[K], B[K]>\n}\n\nexport type RouteDefToReqRes<T extends RouteDef> = Prettify<{\n\tbody: PipeOutput<GetApiPart<T, 'body'>>\n\tparams: PipeOutput<GetApiPart<T, 'params'>>\n\trequestHeaders: PipeOutput<GetApiPart<T, 'headers'>>\n\trequestCookies: PipeOutput<GetApiPart<T, 'cookies'>>\n\tquery: PipeOutput<GetApiPart<T, 'query'>>\n\tresponse: PipeOutput<GetApiPart<T, 'response'>>\n\tresponseHeaders: PipeOutput<GetApiPart<T, 'responseHeaders'>>\n\tresponseCookies: PipeOutput<GetApiPart<T, 'responseCookies'>>\n\tstatusCode: GetApiPart<T, 'defaultStatusCode'>\n\tcontentType: GetApiPart<T, 'defaultContentType'>\n\tcontext: Awaited<ReturnType<GetApiPart<T, 'context'>>>\n}>\n\ntype Awaitable<T> = Promise<T> | T\ntype Res<T extends RouteDefToReqRes<any>> = Awaitable<\n\tIsInTypeList<T['statusCode'], [StatusCodesEnum, 200]> extends true\n\t\t? IsInTypeList<T['responseHeaders'], [DefaultHeaders]> extends true\n\t\t\t? IsInTypeList<T['responseCookies'], [DefaultCookies]> extends true\n\t\t\t\t? Response<T> | T['response']\n\t\t\t\t: Response<T>\n\t\t\t: Response<T>\n\t\t: Response<T>\n>\nexport type RouteDefHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n\terr: Error,\n) => Res<\n\tOmit<RouteDefToReqRes<Def>, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies'> & {\n\t\tresponse: RequestError['serializedErrors']\n\t\tstatusCode: RequestError['statusCode']\n\t\tresponseHeaders: DefaultHeaders\n\t\tresponseCookies: DefaultCookies\n\t}\n>\n\nfunction makeMiddlewareHandler<Cb extends Function, T extends RouteDef>(cb: Cb, onSetup?: HandlerSetup<T>) {\n\treturn { cb, onSetup }\n}\n\nexport const makeMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<RouteMiddlewareHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\nexport const makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"]}
1
+ {"version":3,"sources":["../../../src/server/types.ts"],"names":["Methods","StatusCodes","makeMiddlewareHandler","cb","onSetup","makeMiddleware","args","makeErrorMiddleware"],"mappings":"AAOO,+EAAMA,CAAAA,CAAU,CACtB,IAAA,CAAM,MAAA,CACN,GAAA,CAAK,KAAA,CACL,IAAA,CAAM,MAAA,CACN,GAAA,CAAK,KAAA,CACL,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SACV,CAAA,CAEaC,CAAAA,uBAAc,CAC1B,EAAA,CAAI,GAAA,CACJ,KAAA,CAAO,GAAA,CACP,UAAA,CAAY,GAAA,CACZ,gBAAA,CAAkB,GAAA,CAClB,aAAA,CAAe,GAAA,CACf,QAAA,CAAU,GAAA,CACV,eAAA,CAAiB,GAAA,CACjB,eAAA,CAAiB,GAAA,CACjB,YAAA,CAAc,GACf,CAAA,CAgHA,SAASC,CAAAA,CAA+DC,CAAAA,CAAQC,CAAAA,CAA2B,CAC1G,MAAO,CAAE,EAAA,CAAAD,CAAAA,CAAI,OAAA,CAAAC,CAAQ,CACtB,CAEO,MAAMC,CAAAA,CAAiB,CAAA,GAA0BC,CAAAA,CAAAA,EACvDJ,CAAAA,CAAsB,GAAGI,CAAI,CAAA,CACjBC,CAAAA,+BAAsB,CAAA,GAA0BD,CAAAA,CAAAA,EAC5DJ,CAAAA,CAAsB,GAAGI,CAAI,CAAA,CAAA,0GAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/types.min.cjs","sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\nimport type { Request, Response } from './requests'\n\nexport const Methods = {\n\thead: 'head',\n\tget: 'get',\n\tpost: 'post',\n\tput: 'put',\n\tpatch: 'patch',\n\tdelete: 'delete',\n\toptions: 'options',\n} as const\n\nexport const StatusCodes = {\n\tOk: 200,\n\tFound: 302,\n\tBadRequest: 400,\n\tNotAuthenticated: 401,\n\tNotAuthorized: 403,\n\tNotFound: 404,\n\tValidationError: 422,\n\tTooManyRequests: 429,\n\tTokenExpired: 461,\n} as const\n\nexport type MethodsEnum = Enum<typeof Methods>\nexport type StatusCodesEnum = Enum<typeof StatusCodes>\n\nexport type DefaultHeaders = Record<string, ArrayOrValue<string>>\nexport type DefaultCookies = Record<string, string | undefined>\n\ntype ArrayOrValue<T> = T | T[] | undefined\n\nexport type IncomingFile = {\n\tname: string\n\ttype: string\n\tsize: number\n\tisTruncated: boolean\n\tdata: Buffer\n\tduration: number\n}\n\nexport type RouteDef = {\n\tparams?: Pipe<Record<string, ArrayOrValue<string>>, Record<string, ArrayOrValue<string>>>\n\tquery?: Pipe<Record<string, ArrayOrValue<unknown>>, Record<string, ArrayOrValue<unknown>>>\n\theaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tcookies?: Pipe<DefaultCookies, DefaultCookies>\n\tbody?: Pipe<Record<string, unknown>, Record<string, unknown>>\n\tresponse?: Pipe<unknown, unknown>\n\tresponseHeaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tresponseCookies?: Pipe<DefaultCookies, DefaultCookies>\n\tdefaultStatusCode?: StatusCodesEnum\n\tdefaultContentType?: string\n}\n\ntype RouteGroup = { name: string; description?: string }\ntype HandlerSetup<T extends RouteDef> = (route: Route<T>) => void\n\nexport type RouteConfig<T extends RouteDef> = {\n\tmiddlewares?: ReturnType<typeof makeMiddleware<RouteDef>>[]\n\tonError?: ReturnType<typeof makeErrorMiddleware<RouteDef>>\n\tgroups?: (RouteGroup | RouteGroup['name'])[]\n\ttitle?: string\n\tdescriptions?: string[]\n\tsecurity?: Record<string, string[]>[]\n\tschema?: T\n\thide?: boolean\n}\n\nexport type RouterConfig<T extends RouteDef> = RouteConfig<T> & { path: string }\nexport type Route<T extends RouteDef> = RouteConfig<T> & {\n\tpath: string\n\tmethod: MethodsEnum\n\thandler: RouteDefHandler<T>\n}\n\ntype GetApiPart<T extends RouteDef, K extends keyof RouteDef> = NonNullable<IsInTypeList<T[K], [unknown]> extends true ? RouteDef[K] : T[K]>\n\ntype ArePipes<A, B> = A extends Pipe<any, any> ? (B extends Pipe<any, any> ? true : false) : false\ntype Compare<K extends keyof RouteDef, A, B> =\n\tIsInTypeList<B, [unknown]> extends true\n\t\t? A\n\t\t: IsInTypeList<A, [unknown]> extends true\n\t\t\t? B\n\t\t\t: K extends `default${string}` | 'context'\n\t\t\t\t? B\n\t\t\t\t: ArePipes<A, B> extends true\n\t\t\t\t\t? Pipe<PipeInput<A> & PipeInput<B>, PipeOutput<A> & PipeOutput<B>>\n\t\t\t\t\t: B\n\nexport type MergeRouteDefs<A extends RouteDef, B extends RouteDef> = {\n\t[K in keyof RouteDef]: Compare<K, A[K], B[K]>\n}\n\nexport type RouteDefToReqRes<T extends RouteDef> = Prettify<{\n\tbody: PipeOutput<GetApiPart<T, 'body'>>\n\tparams: PipeOutput<GetApiPart<T, 'params'>>\n\trequestHeaders: PipeOutput<GetApiPart<T, 'headers'>>\n\trequestCookies: PipeOutput<GetApiPart<T, 'cookies'>>\n\tquery: PipeOutput<GetApiPart<T, 'query'>>\n\tresponse: PipeOutput<GetApiPart<T, 'response'>>\n\tresponseHeaders: PipeOutput<GetApiPart<T, 'responseHeaders'>>\n\tresponseCookies: PipeOutput<GetApiPart<T, 'responseCookies'>>\n\tstatusCode: GetApiPart<T, 'defaultStatusCode'>\n\tcontentType: GetApiPart<T, 'defaultContentType'>\n}>\n\ntype Awaitable<T> = Promise<T> | T\ntype Res<T extends RouteDefToReqRes<any>> = Awaitable<\n\tIsInTypeList<T['statusCode'], [StatusCodesEnum, 200]> extends true\n\t\t? IsInTypeList<T['responseHeaders'], [DefaultHeaders]> extends true\n\t\t\t? IsInTypeList<T['responseCookies'], [DefaultCookies]> extends true\n\t\t\t\t? Response<T> | T['response']\n\t\t\t\t: Response<T>\n\t\t\t: Response<T>\n\t\t: Response<T>\n>\nexport type RouteDefHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n\terr: Error,\n) => Res<\n\tOmit<RouteDefToReqRes<Def>, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies'> & {\n\t\tresponse: RequestError['serializedErrors']\n\t\tstatusCode: RequestError['statusCode']\n\t\tresponseHeaders: DefaultHeaders\n\t\tresponseCookies: DefaultCookies\n\t}\n>\n\nfunction makeMiddlewareHandler<Cb extends Function, T extends RouteDef>(cb: Cb, onSetup?: HandlerSetup<T>) {\n\treturn { cb, onSetup }\n}\n\nexport const makeMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<RouteMiddlewareHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\nexport const makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"]}
@@ -1,2 +1,2 @@
1
- import"mongodb";import{differ as m}from"valleyed";import{EquippedError as y}from "../../errors/index.min.mjs";import{Instance as s}from "../../instance/index.min.mjs";import{retry as C}from "../../utilities/index.min.mjs";import{DbChange as _,TopicPrefix as D}from "../base/changes.min.mjs";import"../base/core";class v extends _{#e=!1;constructor(u,c,r,b,g){super(c,b,g);const l=e=>e._id?{...e,_id:e._id.$oid??e._id}:void 0,h=r.dbName,d=r.collectionName,n=`${h}.${d}`,f=`${D}.${n}`,i="5f5f65717569707065645f5f",p={_id:i};c.eventBus.createStream(f,{skipScope:!0}).subscribe(async e=>{const a=e.op;let t=JSON.parse(e.before??"null"),o=JSON.parse(e.after??"null");t&&(t=l(t)),o&&(o=l(o)),!(t?._id===i||o?._id===i)&&(a==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):a==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:m.from(m.diff(t,o))}):a==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),s.on("start",async()=>{this.#e||(this.#e=!0,await C(async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":u.uri,"collection.include.list":n,"snapshot.mode":"always"})?{done:!0,value:!0}:(await r.findOneAndUpdate(p,{$set:{colName:d}},{upsert:!0}),await r.findOneAndDelete(p),s.get().log.warn(`Waiting for db changes for ${n} to start...`),{done:!1}),6,3e4).catch(e=>s.crash(new y("Failed to start db changes",{dbColName:n},e))))},10)}}export{v as MongoDbChange};
1
+ import"mongodb";import{differ as m}from"valleyed";import{EquippedError as y}from "../../errors/index.min.mjs";import{Instance as s}from "../../instance/index.min.mjs";import{retry as C}from "../../utilities/index.min.mjs";import{DbChange as _,TopicPrefix as D}from "../base/changes.min.mjs";import"../base/core";class S extends _{#e=!1;constructor(u,c,n,b,g){super(c,b,g);const l=e=>e._id?{...e,_id:e._id.$oid??e._id}:void 0,h=n.dbName,d=n.collectionName,r=`${h}.${d}`,f=`${D}.${r}`,a="5f5f65717569707065645f5f",p={_id:a};c.eventBus.createStream(f,{skipScope:!0}).subscribe(async e=>{const i=e.op;let t=JSON.parse(e.before??"null"),o=JSON.parse(e.after??"null");t&&(t=l(t)),o&&(o=l(o)),!(t?._id===a||o?._id===a)&&(i==="c"&&this.callbacks.created&&o?await this.callbacks.created({before:null,after:this.mapper(o)}):i==="u"&&this.callbacks.updated&&t&&o?await this.callbacks.updated({before:this.mapper(t),after:this.mapper(o),changes:m.from(m.diff(t,o))}):i==="d"&&this.callbacks.deleted&&t&&await this.callbacks.deleted({before:this.mapper(t),after:null}))}),s.on("start",async()=>{this.#e||(this.#e=!0,await C(async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":u.uri,"collection.include.list":r,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":r,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await n.findOneAndUpdate(p,{$set:{colName:d}},{upsert:!0}),await n.findOneAndDelete(p),s.get().log.warn(`Waiting for db changes for ${r} to start...`),{done:!1}),6,3e4).catch(e=>s.crash(new y("Failed to start db changes",{dbColName:r},e))))},10)}}export{S as MongoDbChange};
2
2
  //# sourceMappingURL=changes.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,MAAwC,UACxC,OAAS,UAAAA,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBACtC,MAAsB,eAIf,MAAMC,UAA6FF,CAAwB,CACjIG,GAAW,GAEX,YACCC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,MAAMH,EAAQE,EAAWC,CAAM,EAE/B,MAAMC,EAAWC,GAChBA,EAAK,IACF,CACA,GAAGA,EACH,IAAKA,EAAK,IAAI,MAAWA,EAAK,GAC/B,EACC,OAEEC,EAASL,EAAW,OACpBM,EAAUN,EAAW,eACrBO,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGb,CAAW,IAAIY,CAAS,GAEnCE,EAAS,2BACTC,EAAY,CAAE,IAAKD,CAAO,EAEhCV,EAAO,SAAS,aAAaS,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOJ,GAA2B,CAC7G,MAAMO,EAAKP,EAAK,GAEhB,IAAIQ,EAAS,KAAK,MAAMR,EAAK,QAAU,MAAM,EACzCS,EAAQ,KAAK,MAAMT,EAAK,OAAS,MAAM,EAEvCQ,IAAQA,EAAST,EAAQS,CAAM,GAC/BC,IAAOA,EAAQV,EAAQU,CAAK,GAC5B,EAAAD,GAAQ,MAAQH,GAAUI,GAAO,MAAQJ,KAEzCE,IAAO,KAAO,KAAK,UAAU,SAAWE,EAC3C,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KACR,MAAO,KAAK,OAAOA,CAAK,CACzB,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAAUC,EAC1D,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOD,CAAM,EAC1B,MAAO,KAAK,OAAOC,CAAK,EACxB,QAASvB,EAAO,KAAKA,EAAO,KAAKsB,EAAQC,CAAK,CAAC,CAChD,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAChD,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOA,CAAM,EAC1B,MAAO,IACR,CAAC,EACH,CAAC,EAEDpB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBe,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BV,EAAO,IACpC,0BAA2BS,EAC3B,gBAAiB,QAClB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMP,EAAW,iBAAiBU,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMN,EAAW,iBAAiBU,CAAS,EAC3ClB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8Be,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQtB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAgB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD","names":["differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,MAAwC,UACxC,OAAS,UAAAA,MAAc,WAEvB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBACzB,OAAS,SAAAC,MAAa,kBACtB,OAAS,YAAAC,EAAU,eAAAC,MAAmB,kBACtC,MAAsB,eAIf,MAAMC,UAA6FF,CAAwB,CACjIG,GAAW,GAEX,YACCC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,MAAMH,EAAQE,EAAWC,CAAM,EAE/B,MAAMC,EAAWC,GAChBA,EAAK,IACF,CACA,GAAGA,EACH,IAAKA,EAAK,IAAI,MAAWA,EAAK,GAC/B,EACC,OAEEC,EAASL,EAAW,OACpBM,EAAUN,EAAW,eACrBO,EAAY,GAAGF,CAAM,IAAIC,CAAO,GAChCE,EAAQ,GAAGb,CAAW,IAAIY,CAAS,GAEnCE,EAAS,2BACTC,EAAY,CAAE,IAAKD,CAAO,EAEhCV,EAAO,SAAS,aAAaS,EAAgB,CAAE,UAAW,EAAK,CAAC,EAAE,UAAU,MAAOJ,GAA2B,CAC7G,MAAMO,EAAKP,EAAK,GAEhB,IAAIQ,EAAS,KAAK,MAAMR,EAAK,QAAU,MAAM,EACzCS,EAAQ,KAAK,MAAMT,EAAK,OAAS,MAAM,EAEvCQ,IAAQA,EAAST,EAAQS,CAAM,GAC/BC,IAAOA,EAAQV,EAAQU,CAAK,GAC5B,EAAAD,GAAQ,MAAQH,GAAUI,GAAO,MAAQJ,KAEzCE,IAAO,KAAO,KAAK,UAAU,SAAWE,EAC3C,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KACR,MAAO,KAAK,OAAOA,CAAK,CACzB,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAAUC,EAC1D,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOD,CAAM,EAC1B,MAAO,KAAK,OAAOC,CAAK,EACxB,QAASvB,EAAO,KAAKA,EAAO,KAAKsB,EAAQC,CAAK,CAAC,CAChD,CAAC,EACOF,IAAO,KAAO,KAAK,UAAU,SAAWC,GAChD,MAAM,KAAK,UAAU,QAAQ,CAC5B,OAAQ,KAAK,OAAOA,CAAM,EAC1B,MAAO,IACR,CAAC,EACH,CAAC,EAEDpB,EAAS,GACR,QACA,SAAY,CACP,KAAKK,KACT,KAAKA,GAAW,GAEhB,MAAMJ,EACL,SACiB,MAAM,KAAK,mBAAmBe,EAAO,CACpD,kBAAmB,iDACnB,eAAgB,4CAChB,4BAA6BV,EAAO,IACpC,0BAA2BS,EAC3B,gBAAiB,cACjB,gBAAiB,aACjB,iBAAkBA,EAClB,wBAAyB,QACzB,qBAAsB,GACvB,CAAC,EAEmB,CAAE,KAAM,GAAM,MAAO,EAAK,GAC9C,MAAMP,EAAW,iBAAiBU,EAAW,CAAE,KAAM,CAAE,QAAAJ,CAAQ,CAAS,EAAG,CAAE,OAAQ,EAAK,CAAC,EAC3F,MAAMN,EAAW,iBAAiBU,CAAS,EAC3ClB,EAAS,IAAI,EAAE,IAAI,KAAK,8BAA8Be,CAAS,cAAc,EACtE,CAAE,KAAM,EAAM,GAEtB,EACA,GACD,EAAE,MAAOO,GAAQtB,EAAS,MAAM,IAAID,EAAc,6BAA8B,CAAE,UAAAgB,CAAU,EAAGO,CAAG,CAAC,CAAC,EACrG,EACA,EACD,CACD,CACD","names":["differ","EquippedError","Instance","retry","DbChange","TopicPrefix","MongoDbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TestId","condition","op","before","after","err"]}
@@ -55,7 +55,11 @@ class MongoDbChange extends DbChange {
55
55
  "capture.mode": "change_streams_update_full_with_pre_image",
56
56
  "mongodb.connection.string": config.uri,
57
57
  "collection.include.list": dbColName,
58
- "snapshot.mode": "always"
58
+ "snapshot.mode": "when_needed",
59
+ "capture.scope": "collection",
60
+ "capture.target": dbColName,
61
+ "heartbeat.interval.ms": "60000",
62
+ "errors.max.retries": "3"
59
63
  });
60
64
  if (started) return { done: true, value: true };
61
65
  await collection.findOneAndUpdate(condition, { $set: { colName } }, { upsert: true });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'always',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,SAAS,kBAA+B;AACxC,SAAS,cAAc;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,mBAAmB;AACtC,YAAY,UAAU;AAIf,MAAM,sBAA6F,SAAwB;AAAA,EACjI,WAAW;AAAA,EAEX,YACC,QACA,QACA,YACA,WACA,QACC;AACD,UAAM,QAAQ,WAAW,MAAM;AAE/B,UAAM,UAAU,CAAC,SAChB,KAAK,MACF;AAAA,MACA,GAAG;AAAA,MACH,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IAC/B,IACC;AAEJ,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAU,WAAW;AAC3B,UAAM,YAAY,GAAG,MAAM,IAAI,OAAO;AACtC,UAAM,QAAQ,GAAG,WAAW,IAAI,SAAS;AAEzC,UAAM,SAAS;AACf,UAAM,YAAY,EAAE,KAAK,OAAO;AAEhC,WAAO,SAAS,aAAa,OAAgB,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,OAAO,SAA2B;AAC7G,YAAM,KAAK,KAAK;AAEhB,UAAI,SAAS,KAAK,MAAM,KAAK,UAAU,MAAM;AAC7C,UAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM;AAE3C,UAAI,OAAQ,UAAS,QAAQ,MAAM;AACnC,UAAI,MAAO,SAAQ,QAAQ,KAAK;AAChC,UAAI,QAAQ,QAAQ,UAAU,OAAO,QAAQ,OAAQ;AAErD,UAAI,OAAO,OAAO,KAAK,UAAU,WAAW;AAC3C,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ;AAAA,UACR,OAAO,KAAK,OAAO,KAAK;AAAA,QACzB,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW,UAAU;AAC1D,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO,KAAK,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,QAChD,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW;AAChD,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR,CAAC;AAAA,IACH,CAAC;AAED,aAAS;AAAA,MACR;AAAA,MACA,YAAY;AACX,YAAI,KAAK,SAAU;AACnB,aAAK,WAAW;AAEhB,cAAM;AAAA,UACL,YAAY;AACX,kBAAM,UAAU,MAAM,KAAK,mBAAmB,OAAO;AAAA,cACpD,mBAAmB;AAAA,cACnB,gBAAgB;AAAA,cAChB,6BAA6B,OAAO;AAAA,cACpC,2BAA2B;AAAA,cAC3B,iBAAiB;AAAA,YAClB,CAAC;AAED,gBAAI,QAAS,QAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAC9C,kBAAM,WAAW,iBAAiB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAS,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC3F,kBAAM,WAAW,iBAAiB,SAAS;AAC3C,qBAAS,IAAI,EAAE,IAAI,KAAK,8BAA8B,SAAS,cAAc;AAC7E,mBAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACD,EAAE,MAAM,CAAC,QAAQ,SAAS,MAAM,IAAI,cAAc,8BAA8B,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,MACrG;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/changes.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { retry } from '../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\nimport type { MongoDbConfig } from '../pipes'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.createStream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) return\n\t\t\t\tthis.#started = true\n\n\t\t\t\tawait retry(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\t\treturn { done: false }\n\t\t\t\t\t},\n\t\t\t\t\t6,\n\t\t\t\t\t30_000,\n\t\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t\t},\n\t\t\t10,\n\t\t)\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n"],"mappings":"AAAA,SAAS,kBAA+B;AACxC,SAAS,cAAc;AAEvB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,UAAU,mBAAmB;AACtC,YAAY,UAAU;AAIf,MAAM,sBAA6F,SAAwB;AAAA,EACjI,WAAW;AAAA,EAEX,YACC,QACA,QACA,YACA,WACA,QACC;AACD,UAAM,QAAQ,WAAW,MAAM;AAE/B,UAAM,UAAU,CAAC,SAChB,KAAK,MACF;AAAA,MACA,GAAG;AAAA,MACH,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IAC/B,IACC;AAEJ,UAAM,SAAS,WAAW;AAC1B,UAAM,UAAU,WAAW;AAC3B,UAAM,YAAY,GAAG,MAAM,IAAI,OAAO;AACtC,UAAM,QAAQ,GAAG,WAAW,IAAI,SAAS;AAEzC,UAAM,SAAS;AACf,UAAM,YAAY,EAAE,KAAK,OAAO;AAEhC,WAAO,SAAS,aAAa,OAAgB,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,OAAO,SAA2B;AAC7G,YAAM,KAAK,KAAK;AAEhB,UAAI,SAAS,KAAK,MAAM,KAAK,UAAU,MAAM;AAC7C,UAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM;AAE3C,UAAI,OAAQ,UAAS,QAAQ,MAAM;AACnC,UAAI,MAAO,SAAQ,QAAQ,KAAK;AAChC,UAAI,QAAQ,QAAQ,UAAU,OAAO,QAAQ,OAAQ;AAErD,UAAI,OAAO,OAAO,KAAK,UAAU,WAAW;AAC3C,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ;AAAA,UACR,OAAO,KAAK,OAAO,KAAK;AAAA,QACzB,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW,UAAU;AAC1D,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO,KAAK,OAAO,KAAK;AAAA,UACxB,SAAS,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,QAChD,CAAC;AAAA,eACO,OAAO,OAAO,KAAK,UAAU,WAAW;AAChD,cAAM,KAAK,UAAU,QAAQ;AAAA,UAC5B,QAAQ,KAAK,OAAO,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR,CAAC;AAAA,IACH,CAAC;AAED,aAAS;AAAA,MACR;AAAA,MACA,YAAY;AACX,YAAI,KAAK,SAAU;AACnB,aAAK,WAAW;AAEhB,cAAM;AAAA,UACL,YAAY;AACX,kBAAM,UAAU,MAAM,KAAK,mBAAmB,OAAO;AAAA,cACpD,mBAAmB;AAAA,cACnB,gBAAgB;AAAA,cAChB,6BAA6B,OAAO;AAAA,cACpC,2BAA2B;AAAA,cAC3B,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB,kBAAkB;AAAA,cAClB,yBAAyB;AAAA,cACzB,sBAAsB;AAAA,YACvB,CAAC;AAED,gBAAI,QAAS,QAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAC9C,kBAAM,WAAW,iBAAiB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAS,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC3F,kBAAM,WAAW,iBAAiB,SAAS;AAC3C,qBAAS,IAAI,EAAE,IAAI,KAAK,8BAA8B,SAAS,cAAc;AAC7E,mBAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACD,EAAE,MAAM,CAAC,QAAQ,SAAS,MAAM,IAAI,cAAc,8BAA8B,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,MACrG;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;","names":[]}
@@ -1,2 +1,2 @@
1
- export*from "./equippedError.min.mjs";export*from "./requestError.min.mjs";export*from "./types/authorizationExpired.min.mjs";export*from "./types/badRequestError.min.mjs";export*from "./types/notAuthenticatedError.min.mjs";export*from "./types/notAuthorizedError.min.mjs";export*from "./types/notFoundError.min.mjs";export*from "./types/refreshTokenMisusedError.min.mjs";export*from "./types/validationError.min.mjs";
1
+ export*from "./equippedError.min.mjs";export*from "./requestError.min.mjs";export*from "./types/badRequestError.min.mjs";export*from "./types/notAuthenticatedError.min.mjs";export*from "./types/notAuthorizedError.min.mjs";export*from "./types/notFoundError.min.mjs";export*from "./types/tokenExpired.min.mjs";export*from "./types/validationError.min.mjs";
2
2
  //# sourceMappingURL=index.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/errors/index.ts"],"sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/authorizationExpired'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/refreshTokenMisusedError'\nexport * from './types/validationError'\n"],"mappings":"AAAA,WAAc,kBACd,WAAc,iBACd,WAAc,+BACd,WAAc,0BACd,WAAc,gCACd,WAAc,6BACd,WAAc,wBACd,WAAc,mCACd,WAAc","names":[]}
1
+ {"version":3,"sources":["../../../src/errors/index.ts"],"sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"],"mappings":"AAAA,WAAc,kBACd,WAAc,iBACd,WAAc,0BACd,WAAc,gCACd,WAAc,6BACd,WAAc,wBACd,WAAc,uBACd,WAAc","names":[]}
@@ -1,10 +1,9 @@
1
1
  export * from "./equippedError.mjs";
2
2
  export * from "./requestError.mjs";
3
- export * from "./types/authorizationExpired.mjs";
4
3
  export * from "./types/badRequestError.mjs";
5
4
  export * from "./types/notAuthenticatedError.mjs";
6
5
  export * from "./types/notAuthorizedError.mjs";
7
6
  export * from "./types/notFoundError.mjs";
8
- export * from "./types/refreshTokenMisusedError.mjs";
7
+ export * from "./types/tokenExpired.mjs";
9
8
  export * from "./types/validationError.mjs";
10
9
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/errors/index.ts"],"sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/authorizationExpired'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/refreshTokenMisusedError'\nexport * from './types/validationError'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/errors/index.ts"],"sourcesContent":["export * from './equippedError'\nexport * from './requestError'\nexport * from './types/badRequestError'\nexport * from './types/notAuthenticatedError'\nexport * from './types/notAuthorizedError'\nexport * from './types/notFoundError'\nexport * from './types/tokenExpired'\nexport * from './types/validationError'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,2 @@
1
+ import{StatusCodes as e}from "../../server/index.min.mjs";import{RequestError as t}from "../requestError.min.mjs";class d extends t{statusCode=e.TokenExpired;constructor(o="Token expired",r){super(o,[{message:o}],r)}}export{d as TokenExpired};
2
+ //# sourceMappingURL=tokenExpired.min.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts"],"sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n"],"mappings":"AAAA,OAAS,eAAAA,MAAmB,eAC5B,OAAS,gBAAAC,MAAoB,kBAEtB,MAAMC,UAAqBD,CAAa,CAC9C,WAAaD,EAAY,aAEzB,YAAYG,EAAU,gBAAiBC,EAAiB,CACvD,MAAMD,EAAS,CAAC,CAAE,QAAAA,CAAQ,CAAC,EAAGC,CAAK,CACpC,CACD","names":["StatusCodes","RequestError","TokenExpired","message","cause"]}
@@ -0,0 +1,12 @@
1
+ import { StatusCodes } from "../../server/index.mjs";
2
+ import { RequestError } from "../requestError.mjs";
3
+ class TokenExpired extends RequestError {
4
+ statusCode = StatusCodes.TokenExpired;
5
+ constructor(message = "Token expired", cause) {
6
+ super(message, [{ message }], cause);
7
+ }
8
+ }
9
+ export {
10
+ TokenExpired
11
+ };
12
+ //# sourceMappingURL=tokenExpired.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/errors/types/tokenExpired.ts"],"sourcesContent":["import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n"],"mappings":"AAAA,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAEtB,MAAM,qBAAqB,aAAa;AAAA,EAC9C,aAAa,YAAY;AAAA,EAEzB,YAAY,UAAU,iBAAiB,OAAiB;AACvD,UAAM,SAAS,CAAC,EAAE,QAAQ,CAAC,GAAG,KAAK;AAAA,EACpC;AACD;","names":[]}
@@ -1,2 +1,2 @@
1
- import{KafkaJS as m}from"@confluentinc/kafka-javascript";import{EquippedError as p}from "../../errors/index.min.mjs";import{Instance as a}from "../../instance/index.min.mjs";import{Random as f,parseJSONValue as d}from "../../utilities/index.min.mjs";import{EventBus as g}from "../base.min.mjs";class S extends g{#t;#a;constructor(t){super(),this.#t=new m.Kafka({kafkaJS:{...t,logLevel:m.logLevel.NOTHING}})}createStream(t,e={}){const n=e.skipScope?t:a.get().getScopedName(t);return{publish:async r=>{try{const s=this.#t.producer();return await s.connect(),await s.send({topic:n,messages:[{value:JSON.stringify(r)}]}),!0}catch{return!1}},subscribe:r=>{const s=async()=>{await this.#n(n);const o=e.fanout?a.get().getScopedName(`${a.get().id}-fanout-${f.string(10)}`):n,i=this.#t.consumer({kafkaJS:{groupId:o}});await i.connect(),await i.subscribe({topic:n}),await i.run({eachMessage:async({message:c})=>{await a.resolveBeforeCrash(async()=>{c.value&&await r(d(c.value.toString()))}).catch(u=>a.crash(new p("Error processing kafka event",{topic:n,groupId:o,options:e},u)))}}),e.fanout&&a.on("close",async()=>{await i.disconnect(),await this.#s(o)},10)};a.on("start",s,2)}}}async#e(){return this.#a||(this.#a=(async()=>{const t=this.#t.admin();return await t.connect(),t})()),this.#a}async#n(t){await(await this.#e()).createTopics({topics:[{topic:t}],timeout:5e3})}async#s(t){await(await this.#e()).deleteGroups([t]).catch(()=>{})}}export{S as KafkaEventBus};
1
+ import{KafkaJS as m}from"@confluentinc/kafka-javascript";import{EquippedError as u}from "../../errors/index.min.mjs";import{Instance as a}from "../../instance/index.min.mjs";import{Random as f,parseJSONValue as d}from "../../utilities/index.min.mjs";import{EventBus as g}from "../base.min.mjs";class S extends g{#t;#a;constructor(t){super(),this.#t=new m.Kafka({kafkaJS:{...t,logLevel:m.logLevel.NOTHING}})}createStream(t,e={}){const n=e.skipScope?t:a.get().getScopedName(t);return{publish:async r=>{const i=this.#t.producer();return await i.connect(),await i.send({topic:n,messages:[{value:JSON.stringify(r)}]}),!0},subscribe:r=>{const i=async()=>{await this.#n(n);const o=e.fanout?a.get().getScopedName(`${a.get().id}-fanout-${f.string(10)}`):n,s=this.#t.consumer({kafkaJS:{groupId:o}});await s.connect(),await s.subscribe({topic:n}),await s.run({eachMessage:async({message:c})=>{await a.resolveBeforeCrash(async()=>{c.value&&await r(d(c.value.toString()))}).catch(p=>a.crash(new u("Error processing kafka event",{topic:n,groupId:o,options:e},p)))}}),e.fanout&&a.on("close",async()=>{await s.disconnect(),await this.#i(o)},10)};a.on("start",i,2)}}}async#e(){return this.#a||(this.#a=(async()=>{const t=this.#t.admin();return await t.connect(),t})()),this.#a}async#n(t){await(await this.#e()).createTopics({topics:[{topic:t}],timeout:5e3})}async#i(t){await(await this.#e()).deleteGroups([t]).catch(()=>{})}}export{S as KafkaEventBus};
2
2
  //# sourceMappingURL=kafka.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING }\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin) this.#admin = (async () => {\n\t\t\tconst admin = this.#client.admin()\n\t\t\tawait admin.connect()\n\t\t\treturn admin\n\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,iCAExB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAAoC,UAGtC,MAAMC,UAAsBD,CAAS,CAC3CE,GACAC,GACA,YAAYC,EAAqB,CAChC,MAAM,EACN,KAAKF,GAAU,IAAIP,EAAQ,MAAM,CAChC,QAAS,CAAE,GAAGS,EAAQ,SAAUT,EAAQ,SAAS,OAAQ,CAC1D,CAAC,CACF,CAEA,aAAiDU,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYR,EAAS,IAAI,EAAE,cAAcQ,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GAAwB,CACvC,GAAI,CACH,MAAMC,EAAW,KAAKP,GAAQ,SAAS,EACvC,aAAMO,EAAS,QAAQ,EACvB,MAAMA,EAAS,KAAK,CACnB,MAAAF,EACA,SAAU,CAAC,CAAE,MAAO,KAAK,UAAUC,CAAI,CAAE,CAAC,CAC3C,CAAC,EACM,EACR,MAAQ,CACP,MAAO,EACR,CACD,EACA,UAAYE,GAAsD,CACjE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKC,GAAaL,CAAK,EAC7B,MAAMM,EAAUP,EAAQ,OACrBT,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/ES,EACGO,EAAW,KAAKZ,GAAQ,SAAS,CAAE,QAAS,CAAE,QAAAW,CAAQ,CAAE,CAAC,EAE/D,MAAMC,EAAS,QAAQ,EACvB,MAAMA,EAAS,UAAU,CAAE,MAAAP,CAAM,CAAC,EAElC,MAAMO,EAAS,IAAI,CAClB,YAAa,MAAO,CAAE,QAAAC,CAAQ,IAAM,CACnC,MAAMlB,EAAS,mBAAmB,SAAY,CACxCkB,EAAQ,OACb,MAAML,EAAUX,EAAegB,EAAQ,MAAM,SAAS,CAAC,CAAC,CACzD,CAAC,EAAE,MAAOC,GACTnB,EAAS,MAAM,IAAID,EAAc,+BAAgC,CAAE,MAAAW,EAAO,QAAAM,EAAS,QAAAP,CAAQ,EAAGU,CAAK,CAAC,CACrG,CACD,CACD,CAAC,EAEGV,EAAQ,QACXT,EAAS,GACR,QACA,SAAY,CACX,MAAMiB,EAAS,WAAW,EAC1B,MAAM,KAAKG,GAAaJ,CAAO,CAChC,EACA,EACD,CACF,EACAhB,EAAS,GAAG,QAASc,EAAW,CAAC,CAClC,CACD,CACD,CAEA,KAAMO,IAAY,CACjB,OAAK,KAAKf,KAAQ,KAAKA,IAAU,SAAY,CAC5C,MAAMgB,EAAQ,KAAKjB,GAAQ,MAAM,EACjC,aAAMiB,EAAM,QAAQ,EACbA,CACR,GAAG,GACI,KAAKhB,EACb,CAEA,KAAMS,GAAaL,EAAe,CAEjC,MADc,MAAM,KAAKW,GAAU,GACvB,aAAa,CAAE,OAAQ,CAAC,CAAE,MAAAX,CAAM,CAAC,EAAG,QAAS,GAAK,CAAC,CAChE,CAEA,KAAMU,GAAaJ,EAAiB,CAEnC,MADc,MAAM,KAAKK,GAAU,GACvB,aAAa,CAACL,CAAO,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnD,CACD","names":["KafkaJS","EquippedError","Instance","Random","parseJSONValue","EventBus","KafkaEventBus","#client","#admin","config","topicName","options","topic","data","producer","onMessage","subscribe","#createTopic","groupId","consumer","message","error","#deleteGroup","#getAdmin","admin"]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"],"mappings":"AAAA,OAAS,WAAAA,MAAe,iCAExB,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,YAAAC,MAAgB,iBAEzB,OAAS,UAAAC,EAAQ,kBAAAC,MAAsB,kBACvC,OAAS,YAAAC,MAAoC,UAGtC,MAAMC,UAAsBD,CAAS,CAC3CE,GACAC,GACA,YAAYC,EAAqB,CAChC,MAAM,EACN,KAAKF,GAAU,IAAIP,EAAQ,MAAM,CAChC,QAAS,CAAE,GAAGS,EAAQ,SAAUT,EAAQ,SAAS,OAAQ,CAC1D,CAAC,CACF,CAEA,aAAiDU,EAA2BC,EAAkC,CAAC,EAAG,CACjH,MAAMC,EAAQD,EAAQ,UAAYD,EAAYR,EAAS,IAAI,EAAE,cAAcQ,CAAS,EACpF,MAAO,CACN,QAAS,MAAOG,GAAwB,CACvC,MAAMC,EAAW,KAAKP,GAAQ,SAAS,EACvC,aAAMO,EAAS,QAAQ,EACvB,MAAMA,EAAS,KAAK,CACnB,MAAAF,EACA,SAAU,CAAC,CAAE,MAAO,KAAK,UAAUC,CAAI,CAAE,CAAC,CAC3C,CAAC,EACM,EACR,EACA,UAAYE,GAAsD,CACjE,MAAMC,EAAY,SAAY,CAC7B,MAAM,KAAKC,GAAaL,CAAK,EAC7B,MAAMM,EAAUP,EAAQ,OACrBT,EAAS,IAAI,EAAE,cAAc,GAAGA,EAAS,IAAI,EAAE,EAAE,WAAWC,EAAO,OAAO,EAAE,CAAC,EAAE,EAC/ES,EACGO,EAAW,KAAKZ,GAAQ,SAAS,CAAE,QAAS,CAAE,QAAAW,CAAQ,CAAE,CAAC,EAE/D,MAAMC,EAAS,QAAQ,EACvB,MAAMA,EAAS,UAAU,CAAE,MAAAP,CAAM,CAAC,EAElC,MAAMO,EAAS,IAAI,CAClB,YAAa,MAAO,CAAE,QAAAC,CAAQ,IAAM,CACnC,MAAMlB,EAAS,mBAAmB,SAAY,CACxCkB,EAAQ,OACb,MAAML,EAAUX,EAAegB,EAAQ,MAAM,SAAS,CAAC,CAAC,CACzD,CAAC,EAAE,MAAOC,GACTnB,EAAS,MAAM,IAAID,EAAc,+BAAgC,CAAE,MAAAW,EAAO,QAAAM,EAAS,QAAAP,CAAQ,EAAGU,CAAK,CAAC,CACrG,CACD,CACD,CAAC,EAEGV,EAAQ,QACXT,EAAS,GACR,QACA,SAAY,CACX,MAAMiB,EAAS,WAAW,EAC1B,MAAM,KAAKG,GAAaJ,CAAO,CAChC,EACA,EACD,CACF,EACAhB,EAAS,GAAG,QAASc,EAAW,CAAC,CAClC,CACD,CACD,CAEA,KAAMO,IAAY,CACjB,OAAK,KAAKf,KACT,KAAKA,IAAU,SAAY,CAC1B,MAAMgB,EAAQ,KAAKjB,GAAQ,MAAM,EACjC,aAAMiB,EAAM,QAAQ,EACbA,CACR,GAAG,GACG,KAAKhB,EACb,CAEA,KAAMS,GAAaL,EAAe,CAEjC,MADc,MAAM,KAAKW,GAAU,GACvB,aAAa,CAAE,OAAQ,CAAC,CAAE,MAAAX,CAAM,CAAC,EAAG,QAAS,GAAK,CAAC,CAChE,CAEA,KAAMU,GAAaJ,EAAiB,CAEnC,MADc,MAAM,KAAKK,GAAU,GACvB,aAAa,CAACL,CAAO,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnD,CACD","names":["KafkaJS","EquippedError","Instance","Random","parseJSONValue","EventBus","KafkaEventBus","#client","#admin","config","topicName","options","topic","data","producer","onMessage","subscribe","#createTopic","groupId","consumer","message","error","#deleteGroup","#getAdmin","admin"]}
@@ -16,17 +16,13 @@ class KafkaEventBus extends EventBus {
16
16
  const topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName);
17
17
  return {
18
18
  publish: async (data) => {
19
- try {
20
- const producer = this.#client.producer();
21
- await producer.connect();
22
- await producer.send({
23
- topic,
24
- messages: [{ value: JSON.stringify(data) }]
25
- });
26
- return true;
27
- } catch {
28
- return false;
29
- }
19
+ const producer = this.#client.producer();
20
+ await producer.connect();
21
+ await producer.send({
22
+ topic,
23
+ messages: [{ value: JSON.stringify(data) }]
24
+ });
25
+ return true;
30
26
  },
31
27
  subscribe: (onMessage) => {
32
28
  const subscribe = async () => {
@@ -60,11 +56,12 @@ class KafkaEventBus extends EventBus {
60
56
  };
61
57
  }
62
58
  async #getAdmin() {
63
- if (!this.#admin) this.#admin = (async () => {
64
- const admin = this.#client.admin();
65
- await admin.connect();
66
- return admin;
67
- })();
59
+ if (!this.#admin)
60
+ this.#admin = (async () => {
61
+ const admin = this.#client.admin();
62
+ await admin.connect();
63
+ return admin;
64
+ })();
68
65
  return this.#admin;
69
66
  }
70
67
  async #createTopic(topic) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING }\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\t\tawait producer.connect()\n\t\t\t\t\tawait producer.send({\n\t\t\t\t\t\ttopic,\n\t\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t\t})\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin) this.#admin = (async () => {\n\t\t\tconst admin = this.#client.admin()\n\t\t\tawait admin.connect()\n\t\t\treturn admin\n\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAAoC;AAGtC,MAAM,sBAAsB,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAChC,UAAM;AACN,SAAK,UAAU,IAAI,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,GAAG,QAAQ,UAAU,QAAQ,SAAS,QAAQ;AAAA,IAC1D,CAAC;AAAA,EACF;AAAA,EAEA,aAAiD,WAA2B,UAAkC,CAAC,GAAG;AACjH,UAAM,QAAQ,QAAQ,YAAY,YAAY,SAAS,IAAI,EAAE,cAAc,SAAS;AACpF,WAAO;AAAA,MACN,SAAS,OAAO,SAAwB;AACvC,YAAI;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,KAAK;AAAA,YACnB;AAAA,YACA,UAAU,CAAC,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,UAC3C,CAAC;AACD,iBAAO;AAAA,QACR,QAAQ;AACP,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,WAAW,CAAC,cAAsD;AACjE,cAAM,YAAY,YAAY;AAC7B,gBAAM,KAAK,aAAa,KAAK;AAC7B,gBAAM,UAAU,QAAQ,SACrB,SAAS,IAAI,EAAE,cAAc,GAAG,SAAS,IAAI,EAAE,EAAE,WAAW,OAAO,OAAO,EAAE,CAAC,EAAE,IAC/E;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAE/D,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,UAAU,EAAE,MAAM,CAAC;AAElC,gBAAM,SAAS,IAAI;AAAA,YAClB,aAAa,OAAO,EAAE,QAAQ,MAAM;AACnC,oBAAM,SAAS,mBAAmB,YAAY;AAC7C,oBAAI,CAAC,QAAQ,MAAO;AACpB,sBAAM,UAAU,eAAe,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,cACzD,CAAC,EAAE;AAAA,gBAAM,CAAC,UACT,SAAS,MAAM,IAAI,cAAc,gCAAgC,EAAE,OAAO,SAAS,QAAQ,GAAG,KAAK,CAAC;AAAA,cACrG;AAAA,YACD;AAAA,UACD,CAAC;AAED,cAAI,QAAQ;AACX,qBAAS;AAAA,cACR;AAAA,cACA,YAAY;AACX,sBAAM,SAAS,WAAW;AAC1B,sBAAM,KAAK,aAAa,OAAO;AAAA,cAChC;AAAA,cACA;AAAA,YACD;AAAA,QACF;AACA,iBAAS,GAAG,SAAS,WAAW,CAAC;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,YAAY;AACjB,QAAI,CAAC,KAAK,OAAQ,MAAK,UAAU,YAAY;AAC5C,YAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,YAAM,MAAM,QAAQ;AACpB,aAAO;AAAA,IACR,GAAG;AACH,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,aAAa,OAAe;AACjC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,IAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,aAAa,SAAiB;AACnC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnD;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../../src/events/types/kafka.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport type { Events } from '../../types'\nimport { Random, parseJSONValue } from '../../utilities'\nimport { EventBus, type StreamOptions } from '../base'\nimport type { KafkaConfig } from '../pipes'\n\nexport class KafkaEventBus extends EventBus {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | undefined\n\tconstructor(config: KafkaConfig) {\n\t\tsuper()\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tcreateStream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}) {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data: Event['data']) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage: (data: Event['data']) => Promise<void>) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on(\n\t\t\t\t\t\t\t'close',\n\t\t\t\t\t\t\tasync () => {\n\t\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, 2)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAEzB,SAAS,QAAQ,sBAAsB;AACvC,SAAS,gBAAoC;AAGtC,MAAM,sBAAsB,SAAS;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,YAAY,QAAqB;AAChC,UAAM;AACN,SAAK,UAAU,IAAI,QAAQ,MAAM;AAAA,MAChC,SAAS,EAAE,GAAG,QAAQ,UAAU,QAAQ,SAAS,QAAQ;AAAA,IAC1D,CAAC;AAAA,EACF;AAAA,EAEA,aAAiD,WAA2B,UAAkC,CAAC,GAAG;AACjH,UAAM,QAAQ,QAAQ,YAAY,YAAY,SAAS,IAAI,EAAE,cAAc,SAAS;AACpF,WAAO;AAAA,MACN,SAAS,OAAO,SAAwB;AACvC,cAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,cAAM,SAAS,QAAQ;AACvB,cAAM,SAAS,KAAK;AAAA,UACnB;AAAA,UACA,UAAU,CAAC,EAAE,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QAC3C,CAAC;AACD,eAAO;AAAA,MACR;AAAA,MACA,WAAW,CAAC,cAAsD;AACjE,cAAM,YAAY,YAAY;AAC7B,gBAAM,KAAK,aAAa,KAAK;AAC7B,gBAAM,UAAU,QAAQ,SACrB,SAAS,IAAI,EAAE,cAAc,GAAG,SAAS,IAAI,EAAE,EAAE,WAAW,OAAO,OAAO,EAAE,CAAC,EAAE,IAC/E;AACH,gBAAM,WAAW,KAAK,QAAQ,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAE/D,gBAAM,SAAS,QAAQ;AACvB,gBAAM,SAAS,UAAU,EAAE,MAAM,CAAC;AAElC,gBAAM,SAAS,IAAI;AAAA,YAClB,aAAa,OAAO,EAAE,QAAQ,MAAM;AACnC,oBAAM,SAAS,mBAAmB,YAAY;AAC7C,oBAAI,CAAC,QAAQ,MAAO;AACpB,sBAAM,UAAU,eAAe,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,cACzD,CAAC,EAAE;AAAA,gBAAM,CAAC,UACT,SAAS,MAAM,IAAI,cAAc,gCAAgC,EAAE,OAAO,SAAS,QAAQ,GAAG,KAAK,CAAC;AAAA,cACrG;AAAA,YACD;AAAA,UACD,CAAC;AAED,cAAI,QAAQ;AACX,qBAAS;AAAA,cACR;AAAA,cACA,YAAY;AACX,sBAAM,SAAS,WAAW;AAC1B,sBAAM,KAAK,aAAa,OAAO;AAAA,cAChC;AAAA,cACA;AAAA,YACD;AAAA,QACF;AACA,iBAAS,GAAG,SAAS,WAAW,CAAC;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,YAAY;AACjB,QAAI,CAAC,KAAK;AACT,WAAK,UAAU,YAAY;AAC1B,cAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,cAAM,MAAM,QAAQ;AACpB,eAAO;AAAA,MACR,GAAG;AACJ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,aAAa,OAAe;AACjC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,IAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,aAAa,SAAiB;AACnC,UAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,UAAM,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnD;AACD;","names":[]}
@@ -1,4 +1,4 @@
1
- import a from"pino";import{ulid as p}from"ulid";import{v as s}from"valleyed";import{EquippedError as i}from "../errors/index.min.mjs";import{runHooks as o}from "./hooks.min.mjs";import{cachePipe as y,dbPipe as c,eventBusPipe as d,instanceSettingsPipe as u,jobsPipe as l,serverTypePipe as g}from "./settings.min.mjs";class t{static#e;static#r;static#t={};settings;log;constructor(e){t.#r=this,this.settings=Object.freeze(e),this.log=a({level:this.settings.log.level,serializers:{err:a.stdSerializers.err,error:a.stdSerializers.err,req:a.stdSerializers.req,res:a.stdSerializers.res},mixin:()=>({instanceId:t.#e})}),t.#s()}alias(e){if(t.#e!==void 0)return t.crash(new i("Instance already has an alias",{}));t.#e=e}get id(){return t.#e===void 0?t.crash(new i("Instance doesnt have an alias yet",{})):t.#e}getScopedName(e,r="."){return[this.settings.app.name,e].join(r)}createCache(e){return s.assert(y(),e)}createJobs(e){return s.assert(l(),e)}createEventBus(e){return s.assert(d(),e)}createDb(e){return s.assert(c(),e)}createServer(e){return s.assert(g(),e)}async start(){try{await o(t.#t.setup??[]),await o(t.#t.start??[])}catch(e){t.crash(new i("Error starting instance",{},e))}}static envs(e){const r=s.validate(e,process.env);return r.valid||t.crash(new i(`Environment variables are not valid
1
+ import a from"pino";import{ulid as p}from"ulid";import{v as s}from"valleyed";import{EquippedError as i}from "../errors/index.min.mjs";import{runHooks as o}from "./hooks.min.mjs";import{cachePipe as y,dbPipe as c,eventBusPipe as d,instanceSettingsPipe as u,jobsPipe as l,serverTypePipe as T}from "./settings.min.mjs";class t{static#e;static#r;static#t={};settings;log;constructor(e){t.#r=this,this.settings=Object.freeze(e),this.log=a({level:this.settings.log.level,serializers:{err:a.stdSerializers.err,error:a.stdSerializers.err,req:a.stdSerializers.req,res:a.stdSerializers.res},mixin:()=>({instanceId:t.#e})}),t.#s()}alias(e){if(t.#e!==void 0)return t.crash(new i("Instance already has an alias",{}));t.#e=e}get id(){return t.#e===void 0?t.crash(new i("Instance doesnt have an alias yet",{})):t.#e}getScopedName(e,r="."){return[this.settings.app.name,e].join(r)}createCache(e){return s.assert(y(),e)}createJobs(e){return s.assert(l(),e)}createEventBus(e){return s.assert(d(),e)}createDb(e){return s.assert(c(),e)}createServer(e){return s.assert(T(),e)}async start(){try{await o(t.#t.setup??[]),await o(t.#t.start??[])}catch(e){t.crash(new i("Error starting instance",{},e))}}static envs(e){const r=s.validate(e,process.env);return r.valid||t.crash(new i(`Environment variables are not valid
2
2
  ${r.error.toString()}`,{messages:r.error.messages})),r.value}static create(e){if(t.#r)return t.crash(new i("Instance has been initialized already",{}));const r=s.validate(u(),e);return r.valid||t.crash(new i(`Settings are not valid
3
3
  ${r.error.toString()}`,{messages:r.error.messages})),new t(r.value)}static get(){return t.#r?t.#r:t.crash(new i("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static on(e,r,n){t.#t[e]??=[],t.#t[e].push({cb:r,order:n})}static#s(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([r,n])=>{process.on(r,async()=>{await o(t.#t.close??[],()=>{}),process.exit(128+n)})})}static resolveBeforeCrash(e){const r=e();return t.on("close",async()=>await r,10),r}static crash(e){console.error(e),process.exit(1)}static createId(e){return`${e?.prefix??""}${p(e?.time?.getTime())}`}}export{t as Instance};
4
4
  //# sourceMappingURL=index.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends PipeInput<ReturnType<typeof cachePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T['type']]\n\t}\n\n\tcreateJobs<T extends PipeInput<ReturnType<typeof jobsPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T['type']]\n\t}\n\n\tcreateEventBus<T extends PipeInput<ReturnType<typeof eventBusPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T['type']]\n\t}\n\n\tcreateDb<T extends PipeInput<ReturnType<typeof dbPipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T['db']['type']]\n\t}\n\n\tcreateServer<T extends PipeInput<ReturnType<typeof serverTypePipe>>>(input: ConditionalObjectKeys<T>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T['type']]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n"],"mappings":"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","names":["pino","ulid","v","EquippedError","runHooks","cachePipe","dbPipe","eventBusPipe","instanceSettingsPipe","jobsPipe","serverTypePipe","Instance","#id","#instance","#hooks","settings","#registerOnExitHandler","id","name","key","input","error","envsPipe","envValidity","settingsValidity","event","cb","order","signal","code","value","opts"]}
1
+ {"version":3,"sources":["../../../src/instance/index.ts"],"sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n"],"mappings":"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","names":["pino","ulid","v","EquippedError","runHooks","cachePipe","dbPipe","eventBusPipe","instanceSettingsPipe","jobsPipe","serverTypePipe","Instance","#id","#instance","#hooks","settings","#registerOnExitHandler","id","name","key","input","error","envsPipe","envValidity","settingsValidity","event","cb","order","signal","code","value","opts"]}