@lyxa.ai/core 1.0.381-alpha.0 → 1.0.381

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 (156) hide show
  1. package/dist/index.js +1 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/libraries/event/decorators/subscribe.js.map +1 -1
  4. package/dist/libraries/event/index.d.ts +4 -0
  5. package/dist/libraries/event/index.js +49 -0
  6. package/dist/libraries/event/index.js.map +1 -1
  7. package/dist/libraries/index.d.ts +2 -1
  8. package/dist/libraries/index.js +3 -0
  9. package/dist/libraries/index.js.map +1 -1
  10. package/dist/libraries/mongo/models/admin-access-control.model.js +2 -1
  11. package/dist/libraries/mongo/models/admin-access-control.model.js.map +1 -1
  12. package/dist/libraries/mongo/models/category.model.d.ts +1 -0
  13. package/dist/libraries/mongo/models/category.model.js +32 -1
  14. package/dist/libraries/mongo/models/category.model.js.map +1 -1
  15. package/dist/libraries/mongo/models/counter.model.d.ts +1 -0
  16. package/dist/libraries/mongo/models/counter.model.js +5 -0
  17. package/dist/libraries/mongo/models/counter.model.js.map +1 -1
  18. package/dist/libraries/mongo/models/embedded/shop-document.model.d.ts +1 -0
  19. package/dist/libraries/mongo/models/embedded/shop-document.model.js +5 -0
  20. package/dist/libraries/mongo/models/embedded/shop-document.model.js.map +1 -1
  21. package/dist/libraries/mongo/models/embedded/shop-search-fields.model.d.ts +7 -0
  22. package/dist/libraries/mongo/models/embedded/shop-search-fields.model.js +42 -0
  23. package/dist/libraries/mongo/models/embedded/shop-search-fields.model.js.map +1 -0
  24. package/dist/libraries/mongo/models/finance-settlement.model.d.ts +1 -0
  25. package/dist/libraries/mongo/models/finance-settlement.model.js +12 -1
  26. package/dist/libraries/mongo/models/finance-settlement.model.js.map +1 -1
  27. package/dist/libraries/mongo/models/gallery.model.js +1 -1
  28. package/dist/libraries/mongo/models/gallery.model.js.map +1 -1
  29. package/dist/libraries/mongo/models/index.d.ts +0 -3
  30. package/dist/libraries/mongo/models/index.js +2 -5
  31. package/dist/libraries/mongo/models/index.js.map +1 -1
  32. package/dist/libraries/mongo/models/line-item.model.d.ts +2 -0
  33. package/dist/libraries/mongo/models/line-item.model.js +12 -0
  34. package/dist/libraries/mongo/models/line-item.model.js.map +1 -1
  35. package/dist/libraries/mongo/models/order.model.d.ts +11 -5
  36. package/dist/libraries/mongo/models/order.model.js +70 -30
  37. package/dist/libraries/mongo/models/order.model.js.map +1 -1
  38. package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.d.ts +1 -0
  39. package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js +5 -0
  40. package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js.map +1 -1
  41. package/dist/libraries/mongo/models/punch-marketing-history.model.d.ts +5 -2
  42. package/dist/libraries/mongo/models/punch-marketing-history.model.js +16 -9
  43. package/dist/libraries/mongo/models/punch-marketing-history.model.js.map +1 -1
  44. package/dist/libraries/mongo/models/service-cart.model.d.ts +3 -2
  45. package/dist/libraries/mongo/models/service-cart.model.js +6 -5
  46. package/dist/libraries/mongo/models/service-cart.model.js.map +1 -1
  47. package/dist/libraries/mongo/models/service-order.model.d.ts +3 -2
  48. package/dist/libraries/mongo/models/service-order.model.js +6 -5
  49. package/dist/libraries/mongo/models/service-order.model.js.map +1 -1
  50. package/dist/libraries/mongo/models/service-promotion.model.d.ts +1 -0
  51. package/dist/libraries/mongo/models/service-promotion.model.js +5 -0
  52. package/dist/libraries/mongo/models/service-promotion.model.js.map +1 -1
  53. package/dist/libraries/mongo/models/service.model.d.ts +2 -0
  54. package/dist/libraries/mongo/models/service.model.js +6 -0
  55. package/dist/libraries/mongo/models/service.model.js.map +1 -1
  56. package/dist/libraries/mongo/models/shop.model.d.ts +3 -0
  57. package/dist/libraries/mongo/models/shop.model.js +11 -0
  58. package/dist/libraries/mongo/models/shop.model.js.map +1 -1
  59. package/dist/libraries/mongo/models/ticket.model.d.ts +2 -0
  60. package/dist/libraries/mongo/models/ticket.model.js +10 -0
  61. package/dist/libraries/mongo/models/ticket.model.js.map +1 -1
  62. package/dist/libraries/mongo/models/user-app-section-setting.model.js +1 -1
  63. package/dist/libraries/mongo/models/user-app-section-setting.model.js.map +1 -1
  64. package/dist/libraries/mongo/models/user.model.d.ts +1 -1
  65. package/dist/libraries/mongo/utilities/uniqueIdHooks.d.ts +1 -1
  66. package/dist/libraries/mongo/utilities/uniqueIdHooks.js +2 -2
  67. package/dist/libraries/mongo/utilities/uniqueIdHooks.js.map +1 -1
  68. package/dist/libraries/redis/index.d.ts +4 -0
  69. package/dist/libraries/redis/index.js +14 -0
  70. package/dist/libraries/redis/index.js.map +1 -1
  71. package/dist/libraries/socket/adapters/index.d.ts +2 -0
  72. package/dist/libraries/socket/adapters/index.js +19 -0
  73. package/dist/libraries/socket/adapters/index.js.map +1 -0
  74. package/dist/libraries/socket/adapters/socket-context.d.ts +9 -0
  75. package/dist/libraries/socket/adapters/socket-context.js +29 -0
  76. package/dist/libraries/socket/adapters/socket-context.js.map +1 -0
  77. package/dist/libraries/socket/adapters/socket-trpc.d.ts +71 -0
  78. package/dist/libraries/socket/adapters/socket-trpc.js +22 -0
  79. package/dist/libraries/socket/adapters/socket-trpc.js.map +1 -0
  80. package/dist/libraries/socket/core/BaseSocketEvent.d.ts +15 -0
  81. package/dist/libraries/socket/core/BaseSocketEvent.js +23 -0
  82. package/dist/libraries/socket/core/BaseSocketEvent.js.map +1 -0
  83. package/dist/libraries/socket/core/LocalSubscriptionRegistry.d.ts +19 -0
  84. package/dist/libraries/socket/core/LocalSubscriptionRegistry.js +58 -0
  85. package/dist/libraries/socket/core/LocalSubscriptionRegistry.js.map +1 -0
  86. package/dist/libraries/socket/core/index.d.ts +5 -0
  87. package/dist/libraries/socket/core/index.js +22 -0
  88. package/dist/libraries/socket/core/index.js.map +1 -0
  89. package/dist/libraries/socket/core/socket-event-registry.d.ts +42 -0
  90. package/dist/libraries/socket/core/socket-event-registry.js +25 -0
  91. package/dist/libraries/socket/core/socket-event-registry.js.map +1 -0
  92. package/dist/libraries/socket/core/socket-redis-connections.d.ts +12 -0
  93. package/dist/libraries/socket/core/socket-redis-connections.js +65 -0
  94. package/dist/libraries/socket/core/socket-redis-connections.js.map +1 -0
  95. package/dist/libraries/socket/core/zAsyncIterable.d.ts +7 -0
  96. package/dist/libraries/socket/core/zAsyncIterable.js +35 -0
  97. package/dist/libraries/socket/core/zAsyncIterable.js.map +1 -0
  98. package/dist/libraries/socket/events/chatlist-message-send.socket.event.d.ts +67 -0
  99. package/dist/libraries/socket/events/chatlist-message-send.socket.event.js +30 -0
  100. package/dist/libraries/socket/events/chatlist-message-send.socket.event.js.map +1 -0
  101. package/dist/libraries/socket/events/chatroom-message-send.socket.event.d.ts +56 -0
  102. package/dist/libraries/socket/events/chatroom-message-send.socket.event.js +32 -0
  103. package/dist/libraries/socket/events/chatroom-message-send.socket.event.js.map +1 -0
  104. package/dist/libraries/socket/events/index.d.ts +1 -0
  105. package/dist/libraries/socket/events/index.js +18 -0
  106. package/dist/libraries/socket/events/index.js.map +1 -0
  107. package/dist/libraries/socket/index.d.ts +3 -2
  108. package/dist/libraries/socket/index.js +3 -2
  109. package/dist/libraries/socket/index.js.map +1 -1
  110. package/dist/types/README.md +1 -1
  111. package/dist/types/package.json +1 -1
  112. package/dist/types/utilities/enum.d.ts +42 -16
  113. package/dist/types/utilities/enum.js +49 -20
  114. package/dist/types/utilities/enum.js.map +1 -1
  115. package/dist/types/utilities/validation/common-validation.d.ts +103 -3
  116. package/dist/types/utilities/validation/common-validation.js +7 -2
  117. package/dist/types/utilities/validation/common-validation.js.map +1 -1
  118. package/dist/types/utilities/validation/global-validation.d.ts +38 -14
  119. package/dist/utilities/enum.d.ts +42 -16
  120. package/dist/utilities/enum.js +49 -20
  121. package/dist/utilities/enum.js.map +1 -1
  122. package/dist/utilities/validation/common-validation.d.ts +103 -3
  123. package/dist/utilities/validation/common-validation.js +7 -2
  124. package/dist/utilities/validation/common-validation.js.map +1 -1
  125. package/dist/utilities/validation/global-validation.d.ts +38 -14
  126. package/package.json +3 -3
  127. package/dist/libraries/mongo/models/order-delivery.model.d.ts +0 -19
  128. package/dist/libraries/mongo/models/order-delivery.model.js +0 -87
  129. package/dist/libraries/mongo/models/order-delivery.model.js.map +0 -1
  130. package/dist/libraries/mongo/repositories/index.d.ts +0 -0
  131. package/dist/libraries/mongo/repositories/index.js +0 -2
  132. package/dist/libraries/mongo/repositories/index.js.map +0 -1
  133. package/dist/libraries/mongo/repositories/optimized-product.repository.d.ts +0 -0
  134. package/dist/libraries/mongo/repositories/optimized-product.repository.js +0 -2
  135. package/dist/libraries/mongo/repositories/optimized-product.repository.js.map +0 -1
  136. package/dist/libraries/mongo/repositories/optimized-product.service.d.ts +0 -0
  137. package/dist/libraries/mongo/repositories/optimized-product.service.js +0 -2
  138. package/dist/libraries/mongo/repositories/optimized-product.service.js.map +0 -1
  139. package/dist/libraries/mongo/repositories/product-benchmark.d.ts +0 -0
  140. package/dist/libraries/mongo/repositories/product-benchmark.js +0 -2
  141. package/dist/libraries/mongo/repositories/product-benchmark.js.map +0 -1
  142. package/dist/libraries/mongo/repositories/product-query-optimizer.d.ts +0 -0
  143. package/dist/libraries/mongo/repositories/product-query-optimizer.js +0 -2
  144. package/dist/libraries/mongo/repositories/product-query-optimizer.js.map +0 -1
  145. package/dist/libraries/mongo/repositories/product.repository.d.ts +0 -0
  146. package/dist/libraries/mongo/repositories/product.repository.js +0 -2
  147. package/dist/libraries/mongo/repositories/product.repository.js.map +0 -1
  148. package/dist/libraries/mongo/repositories/test-optimized-product.d.ts +0 -0
  149. package/dist/libraries/mongo/repositories/test-optimized-product.js +0 -2
  150. package/dist/libraries/mongo/repositories/test-optimized-product.js.map +0 -1
  151. package/dist/libraries/socket/SocketEmitEvent.d.ts +0 -9
  152. package/dist/libraries/socket/SocketEmitEvent.js +0 -29
  153. package/dist/libraries/socket/SocketEmitEvent.js.map +0 -1
  154. package/dist/libraries/socket/socket-publisher.d.ts +0 -11
  155. package/dist/libraries/socket/socket-publisher.js +0 -36
  156. package/dist/libraries/socket/socket-publisher.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/redis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA4B;AAC5B,mCAAiC;AAG1B,IAAM,YAAY,GAAlB,MAAM,YAAY;IAChB,YAAY,CAAS;IAE7B,YAAY,QAAgB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAK,CAAC,QAAQ,EAAE;YACvC,oBAAoB,EAAE,IAAI;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,eAAe,CAAI,GAAW;QAC1C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,MAAS,EAAE,MAAe;QAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW;QAChE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW,EAAE,MAAS;QAC3E,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAI,KAAa,EAAE,GAAW;QACnE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG;aACR,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,WAAW,EAAE,CAAC;IACjB,CAAC;CACD,CAAA;AApEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,gBAAO,GAAE;;GACG,YAAY,CAoExB","sourcesContent":["import Redis from 'ioredis';\nimport { Service } from 'typedi';\n\n@Service()\nexport class RedisService {\n\tprivate _redisClient!: Redis;\n\n\tconstructor(redisURL: string) {\n\t\tthis._redisClient = new Redis(redisURL, {\n\t\t\tmaxRetriesPerRequest: null,\n\t\t});\n\t}\n\n\tget redisClient(): Redis {\n\t\treturn this._redisClient;\n\t}\n\n\tpublic async getCachedObject<T>(key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.get(key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\t\t\n\t\tif (expiry) {\n\t\t\tawait this._redisClient.setex(key, expiry, stringifiedObject);\n\t\t} else {\n\t\t\tawait this._redisClient.set(key, stringifiedObject);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObject(key: string): Promise<boolean> {\n\t\tawait this._redisClient.del(key);\n\t\treturn true;\n\t}\n\n\tpublic async getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.hget(group, key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\t\tawait this._redisClient.hset(group, key, stringifiedObject);\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean> {\n\t\tawait this._redisClient.hdel(group, key);\n\t\treturn true;\n\t}\n\n\tpublic sanitizeKey(key: string) {\n\t\treturn key\n\t\t\t.replace(/[^\\w\\s]/gi, '')\n\t\t\t.replace(/\\s+/g, '-')\n\t\t\t.toLowerCase();\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/redis/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Redis from 'ioredis';\nimport { Service } from 'typedi';\n\n@Service()\nexport class RedisService {\n\tprivate _redisClient!: Redis;\n\n\tconstructor(redisURL: string) {\n\t\tthis._redisClient = new Redis(redisURL, {\n\t\t\tmaxRetriesPerRequest: null,\n\t\t});\n\t}\n\n\tget redisClient(): Redis {\n\t\treturn this._redisClient;\n\t}\n\n\tpublic async getCachedObject<T>(key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.get(key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\n\t\tif (expiry) {\n\t\t\tawait this._redisClient.setex(key, expiry, stringifiedObject);\n\t\t} else {\n\t\t\tawait this._redisClient.set(key, stringifiedObject);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObject(key: string): Promise<boolean> {\n\t\tawait this._redisClient.del(key);\n\t\treturn true;\n\t}\n\n\tpublic async getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.hget(group, key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\t\tawait this._redisClient.hset(group, key, stringifiedObject);\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean> {\n\t\tawait this._redisClient.hdel(group, key);\n\t\treturn true;\n\t}\n\n\tpublic sanitizeKey(key: string) {\n\t\treturn key\n\t\t\t.replace(/[^\\w\\s]/gi, '')\n\t\t\t.replace(/\\s+/g, '-')\n\t\t\t.toLowerCase();\n\t}\n\n\tpublic async addToSet(group: string, member: string): Promise<boolean> {\n\t\tawait this._redisClient.sadd(group, member);\n\t\treturn true;\n\t}\n\n\tpublic async removeFromSet(group: string, member: string): Promise<boolean> {\n\t\tawait this._redisClient.srem(group, member);\n\t\treturn true;\n\t}\n\n\tpublic async isMemberOfSet(group: string, member: string): Promise<boolean> {\n\t\treturn (await this._redisClient.sismember(group, member)) === 1;\n\t}\n\n\tpublic async getSetMembers(group: string): Promise<string[]> {\n\t\treturn await this._redisClient.smembers(group);\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './socket-trpc';
2
+ export * from './socket-context';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./socket-trpc"), exports);
18
+ __exportStar(require("./socket-context"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,mDAAiC","sourcesContent":["export * from './socket-trpc';\nexport * from './socket-context';\n"]}
@@ -0,0 +1,9 @@
1
+ import { CreateWSSContextFnOptions } from '@trpc/server/adapters/ws';
2
+ import { IncomingMessage } from 'http';
3
+ import ws from 'ws';
4
+ import { LyxaContextParams } from '../../trpc/context';
5
+ export interface LyxaWSContext extends LyxaContextParams {
6
+ req: IncomingMessage;
7
+ client: ws.WebSocket;
8
+ }
9
+ export declare const createLyxaWsContext: (opts: CreateWSSContextFnOptions) => Promise<LyxaWSContext>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLyxaWsContext = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const auth_1 = require("../../auth");
6
+ const createLyxaWsContext = async (opts) => {
7
+ const { req, res } = opts;
8
+ const url = new URL(req.url ?? '', 'http://localhost');
9
+ const token = url.searchParams.get('token');
10
+ req.headers = {
11
+ ...req.headers,
12
+ authorization: token ? `Bearer ${token}` : undefined,
13
+ };
14
+ let entity;
15
+ if (token) {
16
+ entity = await (0, auth_1.verifyAccessToken)([auth_1.AuthEntityType.USER, auth_1.AuthEntityType.DELIVERY_BOY, auth_1.AuthEntityType.CRM, auth_1.AuthEntityType.SELLER], token);
17
+ }
18
+ return {
19
+ client: res,
20
+ req,
21
+ entity,
22
+ requestId: (0, crypto_1.randomUUID)(),
23
+ tokenType: entity ? auth_1.TokenType.ACCESS : undefined,
24
+ usedRefreshToken: false,
25
+ tokenRenewed: false,
26
+ };
27
+ };
28
+ exports.createLyxaWsContext = createLyxaWsContext;
29
+ //# sourceMappingURL=socket-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-context.js","sourceRoot":"/","sources":["libraries/socket/adapters/socket-context.ts"],"names":[],"mappings":";;;AACA,mCAAoC;AAIpC,qCAA0E;AAOnE,MAAM,mBAAmB,GAAG,KAAK,EAAE,IAA+B,EAA0B,EAAE;IACpG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5C,GAAG,CAAC,OAAO,GAAG;QACb,GAAG,GAAG,CAAC,OAAO;QACd,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC;IAEF,IAAI,MAAM,CAAC;IACX,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,MAAM,IAAA,wBAAiB,EAC/B,CAAC,qBAAc,CAAC,IAAI,EAAE,qBAAc,CAAC,YAAY,EAAE,qBAAc,CAAC,GAAG,EAAE,qBAAc,CAAC,MAAM,CAAC,EAC7F,KAAK,CACL,CAAC;IACH,CAAC;IAED,OAAO;QACN,MAAM,EAAE,GAAG;QACX,GAAG;QACH,MAAM;QACN,SAAS,EAAE,IAAA,mBAAU,GAAE;QACvB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAChD,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,KAAK;KACnB,CAAC;AACH,CAAC,CAAC;AA5BW,QAAA,mBAAmB,uBA4B9B","sourcesContent":["import { CreateWSSContextFnOptions } from '@trpc/server/adapters/ws';\nimport { randomUUID } from 'crypto';\nimport { IncomingMessage } from 'http';\nimport ws from 'ws';\nimport { LyxaContextParams } from '../../trpc/context';\nimport { AuthEntityType, TokenType, verifyAccessToken } from '../../auth';\n\nexport interface LyxaWSContext extends LyxaContextParams {\n\treq: IncomingMessage;\n\tclient: ws.WebSocket;\n}\n\nexport const createLyxaWsContext = async (opts: CreateWSSContextFnOptions): Promise<LyxaWSContext> => {\n\tconst { req, res } = opts;\n\n\tconst url = new URL(req.url ?? '', 'http://localhost');\n\tconst token = url.searchParams.get('token');\n\n\treq.headers = {\n\t\t...req.headers,\n\t\tauthorization: token ? `Bearer ${token}` : undefined,\n\t};\n\n\tlet entity;\n\tif (token) {\n\t\tentity = await verifyAccessToken(\n\t\t\t[AuthEntityType.USER, AuthEntityType.DELIVERY_BOY, AuthEntityType.CRM, AuthEntityType.SELLER],\n\t\t\ttoken\n\t\t);\n\t}\n\n\treturn {\n\t\tclient: res,\n\t\treq,\n\t\tentity,\n\t\trequestId: randomUUID(),\n\t\ttokenType: entity ? TokenType.ACCESS : undefined,\n\t\tusedRefreshToken: false,\n\t\ttokenRenewed: false,\n\t};\n};\n"]}
@@ -0,0 +1,71 @@
1
+ import { TRPCError } from '@trpc/server';
2
+ import { LyxaWSContext } from './socket-context';
3
+ export declare const tWS: import("@trpc/server").TRPCRootObject<LyxaWSContext, object, {
4
+ errorFormatter({ shape, error }: {
5
+ error: TRPCError;
6
+ type: import("@trpc/server").ProcedureType | "unknown";
7
+ path: string | undefined;
8
+ input: unknown;
9
+ ctx: LyxaWSContext | undefined;
10
+ shape: import("@trpc/server").TRPCDefaultErrorShape;
11
+ }): {
12
+ data: {
13
+ stack: undefined;
14
+ path: undefined;
15
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
16
+ httpStatus: number;
17
+ };
18
+ stack: undefined;
19
+ message: string;
20
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
21
+ };
22
+ }, {
23
+ ctx: LyxaWSContext;
24
+ meta: object;
25
+ errorShape: {
26
+ data: {
27
+ stack: undefined;
28
+ path: undefined;
29
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
30
+ httpStatus: number;
31
+ };
32
+ stack: undefined;
33
+ message: string;
34
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
35
+ };
36
+ transformer: false;
37
+ }>;
38
+ export declare const publicWSProcedure: import("@trpc/server").TRPCProcedureBuilder<LyxaWSContext, object, object, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, false>;
39
+ export declare const createWSRouter: import("@trpc/server").TRPCRouterBuilder<{
40
+ ctx: LyxaWSContext;
41
+ meta: object;
42
+ errorShape: {
43
+ data: {
44
+ stack: undefined;
45
+ path: undefined;
46
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
47
+ httpStatus: number;
48
+ };
49
+ stack: undefined;
50
+ message: string;
51
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
52
+ };
53
+ transformer: false;
54
+ }>;
55
+ export declare const createWSCallerFactory: import("@trpc/server").TRPCRouterCallerFactory<{
56
+ ctx: LyxaWSContext;
57
+ meta: object;
58
+ errorShape: {
59
+ data: {
60
+ stack: undefined;
61
+ path: undefined;
62
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
63
+ httpStatus: number;
64
+ };
65
+ stack: undefined;
66
+ message: string;
67
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
68
+ };
69
+ transformer: false;
70
+ }>;
71
+ export type LyxaWSRouter = ReturnType<typeof createWSRouter>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWSCallerFactory = exports.createWSRouter = exports.publicWSProcedure = exports.tWS = void 0;
4
+ const server_1 = require("@trpc/server");
5
+ exports.tWS = server_1.initTRPC.context().create({
6
+ errorFormatter({ shape, error }) {
7
+ console.log('WS Error:', error, shape);
8
+ return {
9
+ ...shape,
10
+ data: {
11
+ ...shape.data,
12
+ stack: undefined,
13
+ path: undefined,
14
+ },
15
+ stack: undefined,
16
+ };
17
+ },
18
+ });
19
+ exports.publicWSProcedure = exports.tWS.procedure;
20
+ exports.createWSRouter = exports.tWS.router;
21
+ exports.createWSCallerFactory = exports.tWS.createCallerFactory;
22
+ //# sourceMappingURL=socket-trpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-trpc.js","sourceRoot":"/","sources":["libraries/socket/adapters/socket-trpc.ts"],"names":[],"mappings":";;;AAAA,yCAAmD;AAGtC,QAAA,GAAG,GAAG,iBAAQ,CAAC,OAAO,EAAiB,CAAC,MAAM,CAAC;IAC3D,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvC,OAAO;YACN,GAAG,KAAK;YACR,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YACD,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,WAAG,CAAC,SAAS,CAAC;AAClC,QAAA,cAAc,GAAG,WAAG,CAAC,MAAM,CAAC;AAC5B,QAAA,qBAAqB,GAAG,WAAG,CAAC,mBAAmB,CAAC","sourcesContent":["import { initTRPC, TRPCError } from '@trpc/server';\nimport { LyxaWSContext } from './socket-context';\n\nexport const tWS = initTRPC.context<LyxaWSContext>().create({\n\terrorFormatter({ shape, error }) {\n\t\tconsole.log('WS Error:', error, shape);\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tdata: {\n\t\t\t\t...shape.data,\n\t\t\t\tstack: undefined,\n\t\t\t\tpath: undefined,\n\t\t\t},\n\t\t\tstack: undefined,\n\t\t};\n\t},\n});\n\nexport const publicWSProcedure = tWS.procedure;\nexport const createWSRouter = tWS.router;\nexport const createWSCallerFactory = tWS.createCallerFactory;\n\nexport type LyxaWSRouter = ReturnType<typeof createWSRouter>;\n"]}
@@ -0,0 +1,15 @@
1
+ import z, { ZodTypeAny } from 'zod';
2
+ import { SocketEventType } from '../../../utilities/enum';
3
+ export declare abstract class BaseSocketEvent<SIn extends ZodTypeAny, SOut extends ZodTypeAny> {
4
+ protected readonly _eventType: SocketEventType;
5
+ protected readonly inputSchema: SIn;
6
+ protected readonly outputSchema: SOut;
7
+ protected readonly data: z.infer<SOut>;
8
+ abstract getIdentifier(): string;
9
+ protected constructor(eventType: SocketEventType, schemas: {
10
+ input: SIn;
11
+ output: SOut;
12
+ }, data: z.infer<SOut>);
13
+ payload(): z.infer<SOut>;
14
+ eventType(): SocketEventType;
15
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSocketEvent = void 0;
4
+ class BaseSocketEvent {
5
+ _eventType;
6
+ inputSchema;
7
+ outputSchema;
8
+ data;
9
+ constructor(eventType, schemas, data) {
10
+ this._eventType = eventType;
11
+ this.inputSchema = schemas.input;
12
+ this.outputSchema = schemas.output;
13
+ this.data = this.outputSchema.parse(data);
14
+ }
15
+ payload() {
16
+ return this.data;
17
+ }
18
+ eventType() {
19
+ return this._eventType;
20
+ }
21
+ }
22
+ exports.BaseSocketEvent = BaseSocketEvent;
23
+ //# sourceMappingURL=BaseSocketEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseSocketEvent.js","sourceRoot":"/","sources":["libraries/socket/core/BaseSocketEvent.ts"],"names":[],"mappings":";;;AAGA,MAAsB,eAAe;IACjB,UAAU,CAAkB;IAC5B,WAAW,CAAM;IACjB,YAAY,CAAO;IAEnB,IAAI,CAAgB;IAIvC,YACC,SAA0B,EAC1B,OAAqC,EACrC,IAAmB;QAEnB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD;AA5BD,0CA4BC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport { SocketEventType } from '../../../utilities/enum';\n\nexport abstract class BaseSocketEvent<SIn extends ZodTypeAny, SOut extends ZodTypeAny> {\n\tprotected readonly _eventType: SocketEventType;\n\tprotected readonly inputSchema: SIn;\n\tprotected readonly outputSchema: SOut;\n\n\tprotected readonly data: z.infer<SOut>;\n\n\tabstract getIdentifier(): string;\n\n\tprotected constructor(\n\t\teventType: SocketEventType,\n\t\tschemas: { input: SIn; output: SOut },\n\t\tdata: z.infer<SOut>\n\t) {\n\t\tthis._eventType = eventType;\n\t\tthis.inputSchema = schemas.input;\n\t\tthis.outputSchema = schemas.output;\n\n\t\tthis.data = this.outputSchema.parse(data);\n\t}\n\n\tpublic payload(): z.infer<SOut> {\n\t\treturn this.data;\n\t}\n\n\tpublic eventType(): SocketEventType {\n\t\treturn this._eventType;\n\t}\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import EventEmitter from 'events';
2
+ type EventKey = string;
3
+ type EntityId = string;
4
+ type SocketId = string;
5
+ export declare class LocalEventEmitter {
6
+ private _ee;
7
+ private _socketId;
8
+ constructor(socketId: SocketId);
9
+ get socketId(): string;
10
+ get ee(): EventEmitter<[never]>;
11
+ }
12
+ declare class LocalSubscriptionRegistry {
13
+ private byEntity;
14
+ bind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter): void;
15
+ unbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter): void;
16
+ emit(entityId: EntityId, eventKey: EventKey, payload: unknown): void;
17
+ }
18
+ export declare const LocalSubs: LocalSubscriptionRegistry;
19
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalSubs = exports.LocalEventEmitter = void 0;
7
+ const events_1 = __importDefault(require("events"));
8
+ class LocalEventEmitter {
9
+ _ee;
10
+ _socketId;
11
+ constructor(socketId) {
12
+ this._ee = new events_1.default();
13
+ this._socketId = socketId;
14
+ }
15
+ get socketId() {
16
+ return this._socketId;
17
+ }
18
+ get ee() {
19
+ return this._ee;
20
+ }
21
+ }
22
+ exports.LocalEventEmitter = LocalEventEmitter;
23
+ class LocalSubscriptionRegistry {
24
+ byEntity = new Map();
25
+ bind(entityId, eventKey, ee) {
26
+ let m = this.byEntity.get(entityId);
27
+ if (!m) {
28
+ m = new Map();
29
+ this.byEntity.set(entityId, m);
30
+ }
31
+ const s = m.get(eventKey);
32
+ if (!s) {
33
+ m.set(eventKey, new Set());
34
+ }
35
+ m.get(eventKey)?.add(ee);
36
+ }
37
+ unbind(entityId, eventKey, ee) {
38
+ const m = this.byEntity.get(entityId);
39
+ if (!m)
40
+ return;
41
+ const s = m.get(eventKey);
42
+ if (s) {
43
+ s.delete(ee);
44
+ if (s.size === 0)
45
+ m.delete(eventKey);
46
+ }
47
+ if (m.size === 0)
48
+ this.byEntity.delete(entityId);
49
+ }
50
+ emit(entityId, eventKey, payload) {
51
+ const m = this.byEntity.get(entityId);
52
+ const ee = m?.get(eventKey);
53
+ if (ee)
54
+ ee.forEach(e => e.ee.emit(eventKey, payload));
55
+ }
56
+ }
57
+ exports.LocalSubs = new LocalSubscriptionRegistry();
58
+ //# sourceMappingURL=LocalSubscriptionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSubscriptionRegistry.js","sourceRoot":"/","sources":["libraries/socket/core/LocalSubscriptionRegistry.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAMlC,MAAa,iBAAiB;IACrB,GAAG,CAAe;IAClB,SAAS,CAAW;IAE5B,YAAY,QAAkB;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,EAAE;QACL,OAAO,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;CACD;AAhBD,8CAgBC;AAED,MAAM,yBAAyB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE9E,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;YACR,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,QAAkB,EAAE,QAAkB,EAAE,EAAqB;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC;YACP,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;gBAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,QAAkB,EAAE,QAAkB,EAAE,OAAgB;QAC5D,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;CACD;AAEY,QAAA,SAAS,GAAG,IAAI,yBAAyB,EAAE,CAAC","sourcesContent":["import EventEmitter from 'events';\n\ntype EventKey = string; // \"EVENT_TYPE:identifier\"\ntype EntityId = string;\ntype SocketId = string;\n\nexport class LocalEventEmitter {\n\tprivate _ee: EventEmitter;\n\tprivate _socketId: SocketId;\n\n\tconstructor(socketId: SocketId) {\n\t\tthis._ee = new EventEmitter();\n\t\tthis._socketId = socketId;\n\t}\n\n\tget socketId() {\n\t\treturn this._socketId;\n\t}\n\n\tget ee() {\n\t\treturn this._ee;\n\t}\n}\n\nclass LocalSubscriptionRegistry {\n\tprivate byEntity = new Map<EntityId, Map<EventKey, Set<LocalEventEmitter>>>();\n\n\tbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tlet m = this.byEntity.get(entityId);\n\t\tif (!m) {\n\t\t\tm = new Map();\n\t\t\tthis.byEntity.set(entityId, m);\n\t\t}\n\t\tconst s = m.get(eventKey);\n\t\tif (!s) {\n\t\t\tm.set(eventKey, new Set());\n\t\t}\n\t\tm.get(eventKey)?.add(ee);\n\t}\n\n\tunbind(entityId: EntityId, eventKey: EventKey, ee: LocalEventEmitter) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tif (!m) return;\n\t\tconst s = m.get(eventKey);\n\t\tif (s) {\n\t\t\ts.delete(ee);\n\t\t\tif (s.size === 0) m.delete(eventKey);\n\t\t}\n\t\tif (m.size === 0) this.byEntity.delete(entityId);\n\t}\n\n\temit(entityId: EntityId, eventKey: EventKey, payload: unknown) {\n\t\tconst m = this.byEntity.get(entityId);\n\t\tconst ee = m?.get(eventKey);\n\t\tif (ee) ee.forEach(e => e.ee.emit(eventKey, payload));\n\t}\n}\n\nexport const LocalSubs = new LocalSubscriptionRegistry();\n"]}
@@ -0,0 +1,5 @@
1
+ export * from './BaseSocketEvent';
2
+ export * from './LocalSubscriptionRegistry';
3
+ export * from './socket-event-registry';
4
+ export * from './zAsyncIterable';
5
+ export * from './socket-redis-connections';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./BaseSocketEvent"), exports);
18
+ __exportStar(require("./LocalSubscriptionRegistry"), exports);
19
+ __exportStar(require("./socket-event-registry"), exports);
20
+ __exportStar(require("./zAsyncIterable"), exports);
21
+ __exportStar(require("./socket-redis-connections"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/socket/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8DAA4C;AAC5C,0DAAwC;AACxC,mDAAiC;AACjC,6DAA2C","sourcesContent":["export * from './BaseSocketEvent';\nexport * from './LocalSubscriptionRegistry';\nexport * from './socket-event-registry';\nexport * from './zAsyncIterable';\nexport * from './socket-redis-connections';\n"]}
@@ -0,0 +1,42 @@
1
+ import z, { ZodTypeAny } from 'zod';
2
+ import { ChatroomMessageSendEvent, ChatroomMessageSendInput, ChatroomMessageSendOutput } from '../events/chatroom-message-send.socket.event';
3
+ import { SocketEventType } from '../../../utilities/enum';
4
+ import { BaseSocketEvent } from './BaseSocketEvent';
5
+ type EventCtor<SIn extends ZodTypeAny, SOut extends ZodTypeAny, C extends BaseSocketEvent<SIn, SOut>> = new (data: z.input<SOut>) => C;
6
+ declare const REGISTRY: {
7
+ readonly CHATROOM_MESSAGE_SEND: {
8
+ readonly ctor: EventCtor<typeof ChatroomMessageSendInput, typeof ChatroomMessageSendOutput, ChatroomMessageSendEvent>;
9
+ readonly input: z.ZodObject<{
10
+ chatId: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
12
+ chatId: string;
13
+ }, {
14
+ chatId: string;
15
+ }>;
16
+ readonly output: z.ZodObject<{
17
+ chatId: z.ZodString;
18
+ messageId: z.ZodString;
19
+ content: z.ZodString;
20
+ createdAt: z.ZodDate;
21
+ }, "strip", z.ZodTypeAny, {
22
+ content: string;
23
+ createdAt: Date;
24
+ chatId: string;
25
+ messageId: string;
26
+ }, {
27
+ content: string;
28
+ createdAt: Date;
29
+ chatId: string;
30
+ messageId: string;
31
+ }>;
32
+ readonly identifier: typeof ChatroomMessageSendEvent.identifier;
33
+ };
34
+ };
35
+ type Registry = typeof REGISTRY;
36
+ type PayloadFor<T extends SocketEventType> = z.input<Registry[T]['output']>;
37
+ type EventFor<T extends SocketEventType> = InstanceType<Registry[T]['ctor']>;
38
+ export declare class EventFactory {
39
+ static createEvent<T extends SocketEventType>(SocketEventType: T, data: PayloadFor<T>): EventFor<T>;
40
+ static getSubscriptionKey<T extends SocketEventType>(SocketEventType: T, input: z.infer<(typeof REGISTRY)[T]['input']>): string;
41
+ }
42
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventFactory = void 0;
4
+ const chatroom_message_send_socket_event_1 = require("../events/chatroom-message-send.socket.event");
5
+ const enum_1 = require("../../../utilities/enum");
6
+ const REGISTRY = {
7
+ [enum_1.SocketEventType.CHATROOM_MESSAGE_SEND]: {
8
+ ctor: chatroom_message_send_socket_event_1.ChatroomMessageSendEvent,
9
+ input: chatroom_message_send_socket_event_1.ChatroomMessageSendEvent.schemas.input,
10
+ output: chatroom_message_send_socket_event_1.ChatroomMessageSendEvent.schemas.output,
11
+ identifier: chatroom_message_send_socket_event_1.ChatroomMessageSendEvent.identifier,
12
+ },
13
+ };
14
+ class EventFactory {
15
+ static createEvent(SocketEventType, data) {
16
+ const { ctor } = REGISTRY[SocketEventType];
17
+ return new ctor(data);
18
+ }
19
+ static getSubscriptionKey(SocketEventType, input) {
20
+ const { identifier } = REGISTRY[SocketEventType];
21
+ return `${SocketEventType}:${identifier(input)}`;
22
+ }
23
+ }
24
+ exports.EventFactory = EventFactory;
25
+ //# sourceMappingURL=socket-event-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-event-registry.js","sourceRoot":"/","sources":["libraries/socket/core/socket-event-registry.ts"],"names":[],"mappings":";;;AACA,qGAIsD;AACtD,kDAA0D;AAO1D,MAAM,QAAQ,GAAG;IAChB,CAAC,sBAAe,CAAC,qBAAqB,CAAC,EAAE;QACxC,IAAI,EAAE,6DAIL;QACD,KAAK,EAAE,6DAAwB,CAAC,OAAO,CAAC,KAAK;QAC7C,MAAM,EAAE,6DAAwB,CAAC,OAAO,CAAC,MAAM;QAC/C,UAAU,EAAE,6DAAwB,CAAC,UAAU;KAC/C;CACQ,CAAC;AAOX,MAAa,YAAY;IACjB,MAAM,CAAC,WAAW,CAA4B,eAAkB,EAAE,IAAmB;QAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC3C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAgB,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAC/B,eAAkB,EAClB,KAA6C;QAE7C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,GAAG,eAAe,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,CAAC;CACD;AAbD,oCAaC","sourcesContent":["import z, { ZodTypeAny } from 'zod';\nimport {\n\tChatroomMessageSendEvent,\n\tChatroomMessageSendInput,\n\tChatroomMessageSendOutput,\n} from '../events/chatroom-message-send.socket.event';\nimport { SocketEventType } from '../../../utilities/enum';\nimport { BaseSocketEvent } from './BaseSocketEvent';\n\ntype EventCtor<SIn extends ZodTypeAny, SOut extends ZodTypeAny, C extends BaseSocketEvent<SIn, SOut>> = new (\n\tdata: z.input<SOut>\n) => C;\n\nconst REGISTRY = {\n\t[SocketEventType.CHATROOM_MESSAGE_SEND]: {\n\t\tctor: ChatroomMessageSendEvent as EventCtor<\n\t\t\ttypeof ChatroomMessageSendInput,\n\t\t\ttypeof ChatroomMessageSendOutput,\n\t\t\tChatroomMessageSendEvent\n\t\t>,\n\t\tinput: ChatroomMessageSendEvent.schemas.input,\n\t\toutput: ChatroomMessageSendEvent.schemas.output,\n\t\tidentifier: ChatroomMessageSendEvent.identifier,\n\t},\n} as const;\n\ntype Registry = typeof REGISTRY;\n\ntype PayloadFor<T extends SocketEventType> = z.input<Registry[T]['output']>;\ntype EventFor<T extends SocketEventType> = InstanceType<Registry[T]['ctor']>;\n\nexport class EventFactory {\n\tpublic static createEvent<T extends SocketEventType>(SocketEventType: T, data: PayloadFor<T>): EventFor<T> {\n\t\tconst { ctor } = REGISTRY[SocketEventType];\n\t\treturn new ctor(data) as EventFor<T>;\n\t}\n\n\tpublic static getSubscriptionKey<T extends SocketEventType>(\n\t\tSocketEventType: T,\n\t\tinput: z.infer<(typeof REGISTRY)[T]['input']>\n\t): string {\n\t\tconst { identifier } = REGISTRY[SocketEventType];\n\t\treturn `${SocketEventType}:${identifier(input)}`;\n\t}\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare const kEntityEvents: (entityId: string) => string;
2
+ export declare const kEntityInstances: (entityId: string) => string;
3
+ export declare const kEntityConnection: () => string;
4
+ export interface SocketRedisEventInformation {
5
+ eventKey: string;
6
+ instanceId: string;
7
+ socketId: string;
8
+ }
9
+ export declare function connectEntityToSocketEvent(entityId: string, socketRedisEventInformation: SocketRedisEventInformation): Promise<void>;
10
+ export declare function disconnectEntityFromSocketEvent(entityId: string, socketRedisEventInformation: SocketRedisEventInformation): Promise<void>;
11
+ export declare function isEntitySubscribed(entityId: string, eventKey: string): Promise<boolean>;
12
+ export declare function disconnectAllEntitiesFromInstance(instanceId: string): Promise<void>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.kEntityConnection = exports.kEntityInstances = exports.kEntityEvents = void 0;
4
+ exports.connectEntityToSocketEvent = connectEntityToSocketEvent;
5
+ exports.disconnectEntityFromSocketEvent = disconnectEntityFromSocketEvent;
6
+ exports.isEntitySubscribed = isEntitySubscribed;
7
+ exports.disconnectAllEntitiesFromInstance = disconnectAllEntitiesFromInstance;
8
+ const __1 = require("../../..");
9
+ const kEntityEvents = (entityId) => `socket:events:entity:${entityId}`;
10
+ exports.kEntityEvents = kEntityEvents;
11
+ const kEntityInstances = (entityId) => `socket:instances:entity:${entityId}`;
12
+ exports.kEntityInstances = kEntityInstances;
13
+ const kEntityConnection = () => `socket:connections`;
14
+ exports.kEntityConnection = kEntityConnection;
15
+ async function connectEntityToSocketEvent(entityId, socketRedisEventInformation) {
16
+ const redis = (0, __1.getLibraries)().getRedisService();
17
+ await redis.addToSet((0, exports.kEntityEvents)(entityId), JSON.stringify(socketRedisEventInformation));
18
+ await redis.addToSet((0, exports.kEntityInstances)(entityId), socketRedisEventInformation.instanceId);
19
+ await redis.addToSet((0, exports.kEntityConnection)(), entityId);
20
+ }
21
+ async function disconnectEntityFromSocketEvent(entityId, socketRedisEventInformation) {
22
+ const redis = (0, __1.getLibraries)().getRedisService();
23
+ await redis.removeFromSet((0, exports.kEntityEvents)(entityId), JSON.stringify(socketRedisEventInformation));
24
+ const remainingEvents = (await redis.getSetMembers((0, exports.kEntityEvents)(entityId))).map(r => JSON.parse(r));
25
+ if (remainingEvents.filter(e => e.instanceId === socketRedisEventInformation.instanceId).length === 0) {
26
+ await redis.removeFromSet((0, exports.kEntityInstances)(entityId), socketRedisEventInformation.instanceId);
27
+ }
28
+ if (remainingEvents.length === 0) {
29
+ await redis.removeFromSet((0, exports.kEntityConnection)(), entityId);
30
+ }
31
+ }
32
+ async function isEntitySubscribed(entityId, eventKey) {
33
+ const redis = (0, __1.getLibraries)().getRedisService();
34
+ const events = await redis.getSetMembers((0, exports.kEntityEvents)(entityId));
35
+ return events.map(e => JSON.parse(e)).some(e => e.eventKey === eventKey);
36
+ }
37
+ async function disconnectAllEntitiesFromInstance(instanceId) {
38
+ const redis = (0, __1.getLibraries)().getRedisService();
39
+ const connectedEntities = await redis.getSetMembers((0, exports.kEntityConnection)());
40
+ if (connectedEntities.length === 0)
41
+ return;
42
+ for (const entityId of connectedEntities) {
43
+ const allEvents = await redis.getSetMembers((0, exports.kEntityEvents)(entityId));
44
+ if (allEvents.length === 0)
45
+ continue;
46
+ const eventsToKeep = [];
47
+ for (const e of allEvents) {
48
+ const parsed = JSON.parse(e);
49
+ if (parsed.instanceId === instanceId) {
50
+ await redis.removeFromSet((0, exports.kEntityEvents)(entityId), e);
51
+ }
52
+ else {
53
+ eventsToKeep.push(e);
54
+ }
55
+ }
56
+ const stillOnInstance = eventsToKeep.some(e => JSON.parse(e).instanceId === instanceId);
57
+ if (!stillOnInstance) {
58
+ await redis.removeFromSet((0, exports.kEntityInstances)(entityId), instanceId);
59
+ }
60
+ if (eventsToKeep.length === 0) {
61
+ await redis.removeFromSet((0, exports.kEntityConnection)(), entityId);
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=socket-redis-connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-redis-connections.js","sourceRoot":"/","sources":["libraries/socket/core/socket-redis-connections.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLibraries } from '../../..';\n\nexport const kEntityEvents = (entityId: string) => `socket:events:entity:${entityId}`;\nexport const kEntityInstances = (entityId: string) => `socket:instances:entity:${entityId}`;\nexport const kEntityConnection = () => `socket:connections`;\n\nexport interface SocketRedisEventInformation {\n\teventKey: string;\n\tinstanceId: string;\n\tsocketId: string;\n}\n\nexport async function connectEntityToSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.addToSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\tawait redis.addToSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\tawait redis.addToSet(kEntityConnection(), entityId);\n}\n\nexport async function disconnectEntityFromSocketEvent(\n\tentityId: string,\n\tsocketRedisEventInformation: SocketRedisEventInformation\n) {\n\tconst redis = getLibraries().getRedisService();\n\n\tawait redis.removeFromSet(kEntityEvents(entityId), JSON.stringify(socketRedisEventInformation));\n\n\tconst remainingEvents = (await redis.getSetMembers(kEntityEvents(entityId))).map(\n\t\tr => JSON.parse(r) as SocketRedisEventInformation\n\t);\n\n\tif (remainingEvents.filter(e => e.instanceId === socketRedisEventInformation.instanceId).length === 0) {\n\t\tawait redis.removeFromSet(kEntityInstances(entityId), socketRedisEventInformation.instanceId);\n\t}\n\n\tif (remainingEvents.length === 0) {\n\t\tawait redis.removeFromSet(kEntityConnection(), entityId);\n\t}\n}\n\nexport async function isEntitySubscribed(entityId: string, eventKey: string): Promise<boolean> {\n\tconst redis = getLibraries().getRedisService();\n\tconst events = await redis.getSetMembers(kEntityEvents(entityId));\n\treturn events.map(e => JSON.parse(e) as SocketRedisEventInformation).some(e => e.eventKey === eventKey);\n}\n\nexport async function disconnectAllEntitiesFromInstance(instanceId: string) {\n\tconst redis = getLibraries().getRedisService();\n\n\tconst connectedEntities = await redis.getSetMembers(kEntityConnection());\n\tif (connectedEntities.length === 0) return;\n\n\tfor (const entityId of connectedEntities) {\n\t\tconst allEvents = await redis.getSetMembers(kEntityEvents(entityId));\n\t\tif (allEvents.length === 0) continue;\n\n\t\tconst eventsToKeep: string[] = [];\n\n\t\tfor (const e of allEvents) {\n\t\t\tconst parsed = JSON.parse(e) as SocketRedisEventInformation;\n\t\t\tif (parsed.instanceId === instanceId) {\n\t\t\t\tawait redis.removeFromSet(kEntityEvents(entityId), e);\n\t\t\t} else {\n\t\t\t\teventsToKeep.push(e);\n\t\t\t}\n\t\t}\n\n\t\tconst stillOnInstance = eventsToKeep.some(\n\t\t\te => (JSON.parse(e) as SocketRedisEventInformation).instanceId === instanceId\n\t\t);\n\t\tif (!stillOnInstance) {\n\t\t\tawait redis.removeFromSet(kEntityInstances(entityId), instanceId);\n\t\t}\n\t\tif (eventsToKeep.length === 0) {\n\t\t\tawait redis.removeFromSet(kEntityConnection(), entityId);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { TrackedEnvelope } from '@trpc/server';
2
+ import { z } from 'zod';
3
+ export declare function zAsyncIterable<TYieldIn, TYieldOut, TReturnIn = void, TReturnOut = void, Tracked extends boolean = false>(opts: {
4
+ yield: z.ZodType<TYieldIn, any, TYieldOut>;
5
+ return?: z.ZodType<TReturnIn, any, TReturnOut>;
6
+ tracked?: Tracked;
7
+ }): z.ZodType<AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn, unknown>, any, AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldOut> : TYieldOut, TReturnOut, unknown>>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.zAsyncIterable = zAsyncIterable;
4
+ const server_1 = require("@trpc/server");
5
+ const zod_1 = require("zod");
6
+ function isAsyncIterable(value) {
7
+ return !!value && typeof value === 'object' && Symbol.asyncIterator in value;
8
+ }
9
+ const trackedEnvelopeSchema = zod_1.z.custom(server_1.isTrackedEnvelope);
10
+ function zAsyncIterable(opts) {
11
+ return zod_1.z
12
+ .custom(val => isAsyncIterable(val))
13
+ .transform(async function* (iter) {
14
+ const iterator = iter[Symbol.asyncIterator]();
15
+ try {
16
+ let next;
17
+ while ((next = await iterator.next()) && !next.done) {
18
+ if (opts.tracked) {
19
+ const [id, data] = trackedEnvelopeSchema.parse(next.value);
20
+ yield (0, server_1.tracked)(id, await opts.yield.parseAsync(data));
21
+ continue;
22
+ }
23
+ yield opts.yield.parseAsync(next.value);
24
+ }
25
+ if (opts.return) {
26
+ return await opts.return.parseAsync(next.value);
27
+ }
28
+ return;
29
+ }
30
+ finally {
31
+ await iterator.return?.();
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=zAsyncIterable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zAsyncIterable.js","sourceRoot":"/","sources":["libraries/socket/core/zAsyncIterable.ts"],"names":[],"mappings":";;AAgBA,wCAkDC;AAjED,yCAA0D;AAC1D,6BAAwB;AAExB,SAAS,eAAe,CAA4B,KAAc;IACjE,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;AAC9E,CAAC;AAED,MAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAA2B,0BAAiB,CAAC,CAAC;AAQpF,SAAgB,cAAc,CAM5B,IAeD;IACA,OAAO,OAAC;SACN,MAAM,CAAwF,GAAG,CAAC,EAAE,CACpG,eAAe,CAAC,GAAG,CAAC,CACpB;SACA,SAAS,CAAC,KAAK,SAAS,CAAC,EAAE,IAAI;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3D,MAAM,IAAA,gBAAO,EAAC,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrD,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YACD,OAAO;QACR,CAAC;gBAAS,CAAC;YACV,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3B,CAAC;IACF,CAAC,CAID,CAAC;AACH,CAAC","sourcesContent":["import type { TrackedEnvelope } from '@trpc/server';\nimport { isTrackedEnvelope, tracked } from '@trpc/server';\nimport { z } from 'zod';\n\nfunction isAsyncIterable<TValue, TReturn = unknown>(value: unknown): value is AsyncIterable<TValue, TReturn> {\n\treturn !!value && typeof value === 'object' && Symbol.asyncIterator in value;\n}\n\nconst trackedEnvelopeSchema = z.custom<TrackedEnvelope<unknown>>(isTrackedEnvelope);\n\n/**\n * A Zod schema helper designed specifically for validating async iterables. This schema ensures that:\n * 1. The value being validated is an async iterable.\n * 2. Each item yielded by the async iterable conforms to a specified type.\n * 3. The return value of the async iterable, if any, also conforms to a specified type.\n */\nexport function zAsyncIterable<\n\tTYieldIn,\n\tTYieldOut,\n\tTReturnIn = void,\n\tTReturnOut = void,\n\tTracked extends boolean = false,\n>(opts: {\n\t/**\n\t * Validate the value yielded by the async generator\n\t */\n\tyield: z.ZodType<TYieldIn, any, TYieldOut>;\n\t/**\n\t * Validate the return value of the async generator\n\t * @remark not applicable for subscriptions\n\t */\n\treturn?: z.ZodType<TReturnIn, any, TReturnOut>;\n\t/**\n\t * Whether if the yielded values are tracked\n\t * @remark only applicable for subscriptions\n\t */\n\ttracked?: Tracked;\n}) {\n\treturn z\n\t\t.custom<AsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn>>(val =>\n\t\t\tisAsyncIterable(val)\n\t\t)\n\t\t.transform(async function* (iter) {\n\t\t\tconst iterator = iter[Symbol.asyncIterator]();\n\t\t\ttry {\n\t\t\t\tlet next;\n\t\t\t\twhile ((next = await iterator.next()) && !next.done) {\n\t\t\t\t\tif (opts.tracked) {\n\t\t\t\t\t\tconst [id, data] = trackedEnvelopeSchema.parse(next.value);\n\t\t\t\t\t\tyield tracked(id, await opts.yield.parseAsync(data));\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tyield opts.yield.parseAsync(next.value);\n\t\t\t\t}\n\t\t\t\tif (opts.return) {\n\t\t\t\t\treturn await opts.return.parseAsync(next.value);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t} finally {\n\t\t\t\tawait iterator.return?.();\n\t\t\t}\n\t\t}) as z.ZodType<\n\t\tAsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldIn> : TYieldIn, TReturnIn, unknown>,\n\t\tany,\n\t\tAsyncIterable<Tracked extends true ? TrackedEnvelope<TYieldOut> : TYieldOut, TReturnOut, unknown>\n\t>;\n}\n"]}