@zintrust/core 0.1.24 → 0.1.26

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 (152) hide show
  1. package/package.json +4 -3
  2. package/src/auth/Auth.d.ts.map +1 -0
  3. package/src/boot/Application.d.ts.map +1 -1
  4. package/src/boot/Application.js +8 -0
  5. package/src/boot/bootstrap.js +34 -15
  6. package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
  7. package/src/cache/drivers/RedisDriver.js +10 -5
  8. package/src/cli/CLI.d.ts.map +1 -1
  9. package/src/cli/CLI.js +6 -0
  10. package/src/cli/commands/QueueCommand.d.ts.map +1 -1
  11. package/src/cli/commands/QueueCommand.js +89 -39
  12. package/src/cli/commands/QueueLockCommand.d.ts +7 -0
  13. package/src/cli/commands/QueueLockCommand.d.ts.map +1 -0
  14. package/src/cli/commands/QueueLockCommand.js +138 -0
  15. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  16. package/src/cli/commands/StartCommand.js +15 -3
  17. package/src/cli/commands/TemplatesCommand.js +1 -1
  18. package/src/cli/commands/WorkerCommands.d.ts.map +1 -1
  19. package/src/cli/commands/WorkerCommands.js +46 -22
  20. package/src/cli/scaffolding/ProjectScaffolder.js +2 -2
  21. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  22. package/src/cli/scaffolding/RouteGenerator.js +27 -28
  23. package/src/cli/services/VersionChecker.d.ts +53 -0
  24. package/src/cli/services/VersionChecker.d.ts.map +1 -0
  25. package/src/cli/services/VersionChecker.js +180 -0
  26. package/src/cli/workers/QueueWorkRunner.d.ts.map +1 -1
  27. package/src/cli/workers/QueueWorkRunner.js +128 -7
  28. package/src/common/ExternalServiceUtils.d.ts +2 -2
  29. package/src/config/app.d.ts +4 -0
  30. package/src/config/app.d.ts.map +1 -1
  31. package/src/config/app.js +9 -0
  32. package/src/config/constants.d.ts +140 -10
  33. package/src/config/constants.d.ts.map +1 -1
  34. package/src/config/constants.js +86 -5
  35. package/src/config/index.d.ts +1 -0
  36. package/src/config/index.d.ts.map +1 -1
  37. package/src/config/middleware.d.ts +6 -6
  38. package/src/config/middleware.d.ts.map +1 -1
  39. package/src/config/middleware.js +6 -7
  40. package/src/config/queue.d.ts +4 -0
  41. package/src/config/queue.d.ts.map +1 -1
  42. package/src/config/queue.js +1 -1
  43. package/src/config/redis.d.ts +17 -0
  44. package/src/config/redis.d.ts.map +1 -0
  45. package/src/config/redis.js +54 -0
  46. package/src/config/type.d.ts +3 -0
  47. package/src/config/type.d.ts.map +1 -1
  48. package/src/http/Request.d.ts +10 -1
  49. package/src/http/Request.d.ts.map +1 -1
  50. package/src/http/Request.js +79 -7
  51. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
  52. package/src/http/error-pages/ErrorPageRenderer.js +4 -3
  53. package/src/index.d.ts +14 -11
  54. package/src/index.d.ts.map +1 -1
  55. package/src/index.js +18 -11
  56. package/src/lang/lang.d.ts +23 -0
  57. package/src/lang/lang.d.ts.map +1 -0
  58. package/src/lang/lang.js +22 -0
  59. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
  60. package/src/middleware/ErrorHandlerMiddleware.js +9 -1
  61. package/src/migrations/schema/SchemaCompiler.js +1 -1
  62. package/src/migrations/schema/types.d.ts +1 -1
  63. package/src/migrations/schema/types.d.ts.map +1 -1
  64. package/src/node.d.ts +1 -1
  65. package/src/node.d.ts.map +1 -1
  66. package/src/node.js +1 -1
  67. package/src/orm/Database.d.ts +1 -1
  68. package/src/orm/Database.d.ts.map +1 -1
  69. package/src/orm/Database.js +22 -3
  70. package/src/performance/Optimizer.js +1 -1
  71. package/src/routing/Router.d.ts +6 -2
  72. package/src/routing/Router.d.ts.map +1 -1
  73. package/src/routing/Router.js +19 -4
  74. package/src/runtime/PluginManager.js +1 -1
  75. package/src/runtime/PluginRegistry.js +2 -2
  76. package/src/start.d.ts.map +1 -1
  77. package/src/start.js +8 -7
  78. package/src/templates/TemplateRegistry.js +2 -2
  79. package/src/templates/TemplateRegistry.ts +2 -2
  80. package/src/templates/feature/Queue.ts.tpl +114 -0
  81. package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +22 -0
  82. package/src/templates/project/basic/config/queue.ts.tpl +19 -0
  83. package/src/templates/project/basic/package.json.tpl +2 -1
  84. package/src/templates/project/basic/src/index.ts.tpl +0 -3
  85. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -1
  86. package/src/tools/broadcast/drivers/Redis.js +8 -56
  87. package/src/tools/mail/Mail.d.ts +1 -29
  88. package/src/tools/mail/Mail.d.ts.map +1 -1
  89. package/src/tools/mail/Mail.js +1 -111
  90. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -1
  91. package/src/tools/mail/drivers/SendGrid.js +4 -3
  92. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  93. package/src/tools/mail/drivers/Smtp.js +32 -10
  94. package/src/tools/mail/index.d.ts +40 -0
  95. package/src/tools/mail/index.d.ts.map +1 -0
  96. package/src/tools/mail/index.js +129 -0
  97. package/src/tools/mail/template-loader.d.ts +10 -0
  98. package/src/tools/mail/template-loader.d.ts.map +1 -0
  99. package/src/tools/mail/template-loader.js +101 -0
  100. package/src/tools/mail/template-utils.d.ts +10 -0
  101. package/src/tools/mail/template-utils.d.ts.map +1 -0
  102. package/src/tools/mail/template-utils.js +16 -0
  103. package/src/tools/mail/templates/index.d.ts +30 -0
  104. package/src/tools/mail/templates/index.d.ts.map +1 -1
  105. package/src/tools/mail/templates/index.js +69 -0
  106. package/src/tools/queue/AdvancedQueue.d.ts +19 -0
  107. package/src/tools/queue/AdvancedQueue.d.ts.map +1 -0
  108. package/src/tools/queue/AdvancedQueue.js +352 -0
  109. package/src/tools/queue/DeduplicationBuilder.d.ts +20 -0
  110. package/src/tools/queue/DeduplicationBuilder.d.ts.map +1 -0
  111. package/src/tools/queue/DeduplicationBuilder.js +77 -0
  112. package/src/tools/queue/LockProvider.d.ts +22 -0
  113. package/src/tools/queue/LockProvider.d.ts.map +1 -0
  114. package/src/tools/queue/LockProvider.js +282 -0
  115. package/src/tools/queue/Queue.d.ts.map +1 -1
  116. package/src/tools/queue/Queue.js +2 -1
  117. package/src/tools/queue/QueueExtensions.d.ts +46 -0
  118. package/src/tools/queue/QueueExtensions.d.ts.map +1 -0
  119. package/src/tools/queue/QueueExtensions.js +129 -0
  120. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  121. package/src/tools/queue/QueueRuntimeRegistration.js +2 -2
  122. package/src/tools/queue/drivers/Database.d.ts +23 -0
  123. package/src/tools/queue/drivers/Database.d.ts.map +1 -0
  124. package/src/tools/queue/drivers/Database.js +123 -0
  125. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  126. package/src/tools/queue/drivers/Redis.js +11 -82
  127. package/src/tools/queue/index.d.ts +9 -0
  128. package/src/tools/queue/index.d.ts.map +1 -0
  129. package/src/tools/queue/index.js +7 -0
  130. package/src/tools/redis/RedisKeyManager.d.ts +64 -0
  131. package/src/tools/redis/RedisKeyManager.d.ts.map +1 -0
  132. package/src/tools/redis/RedisKeyManager.js +124 -0
  133. package/src/types/Queue.d.ts +62 -0
  134. package/src/types/Queue.d.ts.map +1 -0
  135. package/src/types/Queue.js +5 -0
  136. package/src/features/Auth.d.ts.map +0 -1
  137. package/src/features/Queue.d.ts +0 -21
  138. package/src/features/Queue.d.ts.map +0 -1
  139. package/src/features/Queue.js +0 -33
  140. package/src/templates/features/Queue.ts.tpl +0 -47
  141. package/src/tools/mail/templates/markdown/index.d.ts +0 -17
  142. package/src/tools/mail/templates/markdown/index.d.ts.map +0 -1
  143. package/src/tools/mail/templates/markdown/index.js +0 -49
  144. package/src/tools/mail/templates/markdown/registry.d.ts +0 -15
  145. package/src/tools/mail/templates/markdown/registry.d.ts.map +0 -1
  146. package/src/tools/mail/templates/markdown/registry.js +0 -34
  147. package/src/tools/mail/templates/markdown/validator.d.ts +0 -16
  148. package/src/tools/mail/templates/markdown/validator.d.ts.map +0 -1
  149. package/src/tools/mail/templates/markdown/validator.js +0 -24
  150. /package/src/{features → auth}/Auth.d.ts +0 -0
  151. /package/src/{features → auth}/Auth.js +0 -0
  152. /package/src/templates/{features → auth}/Auth.ts.tpl +0 -0
@@ -171,7 +171,7 @@ function buildCreateIndexSql(driver, table, idx) {
171
171
  assertIdentifier(SchOther.COLUMN, c);
172
172
  const unique = idx.type === ColumnType.UNIQUE ? `${ColumnType.UNIQUE} ` : '';
173
173
  const cols = idx.columns.map((c) => quoteIdent(driver, c)).join(', ');
174
- return `${ColumnType.CREATE_INDEX_S} ${unique}${ColumnType.INDEX} ${quoteIdent(driver, idx.name)} ${ColumnType.ON} ${quoteIdent(driver, table)} (${cols})`;
174
+ return `${ColumnType.CREATE_INDEX_S} ${unique}${quoteIdent(driver, idx.name)} ${ColumnType.ON} ${quoteIdent(driver, table)} (${cols})`;
175
175
  }
176
176
  function buildDropIndexSql(driver, table, indexName) {
177
177
  assertIdentifier(SchOther.TABLE, table);
@@ -51,7 +51,7 @@ export type ForeignKeyBuilder = {
51
51
  getDefinition(): ForeignKeyDefinition;
52
52
  };
53
53
  export type Blueprint = {
54
- uuid(arg0: string): unknown;
54
+ uuid(name: string): ColumnBuilder;
55
55
  string(name: string, length?: number): ColumnBuilder;
56
56
  integer(name: string): ColumnBuilder;
57
57
  bigInteger(name: string): ColumnBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
package/src/node.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { default, default as process } from './node-singletons/process';
2
2
  export { cleanOnce, FileLogWriter } from './config/FileLogWriter';
3
- export { listTemplates, loadTemplate, renderTemplate } from './tools/mail/templates/markdown';
3
+ export { listTemplates, loadTemplate, renderTemplate } from './tools/mail/templates';
4
4
  export { MailFake } from './tools/mail/testing';
5
5
  export { FakeStorage } from './tools/storage/testing';
6
6
  export { TestEnvironment, TestHttp } from './testing/index';
package/src/node.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,IAAI,yBAAyB,EAC1C,YAAY,IAAI,wBAAwB,EACxC,cAAc,IAAI,0BAA0B,GAC7C,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,IAAI,yBAAyB,EAC1C,YAAY,IAAI,wBAAwB,EACxC,cAAc,IAAI,0BAA0B,GAC7C,MAAM,kCAAkC,CAAC"}
package/src/node.js CHANGED
@@ -6,7 +6,7 @@ if (__coverageMarker !== true) {
6
6
  }
7
7
  export { default, default as process } from './node-singletons/process.js';
8
8
  export { cleanOnce, FileLogWriter } from './config/FileLogWriter.js';
9
- export { listTemplates, loadTemplate, renderTemplate } from './tools/mail/templates/markdown/index.js';
9
+ export { listTemplates, loadTemplate, renderTemplate } from './tools/mail/templates/index.js';
10
10
  export { MailFake } from './tools/mail/testing.js';
11
11
  export { FakeStorage } from './tools/storage/testing.js';
12
12
  export { TestEnvironment, TestHttp } from './testing/index.js';
@@ -29,7 +29,7 @@ export declare const Database: Readonly<{
29
29
  */
30
30
  create(config?: DatabaseConfig): IDatabase;
31
31
  }>;
32
- export declare const useEnsureDbConnected: (config?: undefined, connectionName?: string) => Promise<ReturnType<typeof useDatabase>>;
32
+ export declare const useEnsureDbConnected: (config?: DatabaseConfig | undefined, connectionName?: string) => Promise<ReturnType<typeof useDatabase>>;
33
33
  export declare function useDatabase(config?: DatabaseConfig, connection?: string): IDatabase;
34
34
  export declare function resetDatabase(): Promise<void>;
35
35
  //# sourceMappingURL=Database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA0YD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,EAClB,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAgBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA6aD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,SAAQ,cAAc,GAAG,SAAqB,EAC9C,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAgBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
@@ -173,25 +173,44 @@ const createQueryHandlers = (writeAdapter, _readAdapters, eventEmitter, connecte
173
173
  if (connected.value === false)
174
174
  await db.connect();
175
175
  const adapter = getAdapter(isRead);
176
+ const registry = DatabaseAdapterRegistry.list();
177
+ // Validate that database adapters are registered
178
+ if (registry.length === 0) {
179
+ throw ErrorFactory.createConfigError('No database adapters are registered. Call DatabaseAdapterRegistry.register() during startup to register database adapters.');
180
+ }
176
181
  Logger.debug('Using DB adapter', {
177
182
  type: adapter?.getType?.(),
178
- hasRegistry: DatabaseAdapterRegistry.list(),
183
+ hasRegistry: registry,
179
184
  });
180
185
  return executeQuery(adapter, eventEmitter, sql, parameters, 'query');
181
186
  },
182
187
  async queryOne(sql, parameters = [], isRead = false) {
183
188
  if (connected.value === false)
184
189
  await db.connect();
185
- return executeQueryOne(getAdapter(isRead), eventEmitter, sql, parameters);
190
+ const adapter = getAdapter(isRead);
191
+ // Validate that database adapters are registered
192
+ if (DatabaseAdapterRegistry.list().length === 0) {
193
+ throw ErrorFactory.createConfigError('No database adapters are registered. Call DatabaseAdapterRegistry.register() during startup to register database adapters.');
194
+ }
195
+ return executeQueryOne(adapter, eventEmitter, sql, parameters);
186
196
  },
187
197
  async execute(sql, parameters = [], isRead = false) {
188
198
  if (connected.value === false)
189
199
  await db.connect();
190
- return executeFullQuery(getAdapter(isRead), eventEmitter, sql, parameters);
200
+ const adapter = getAdapter(isRead);
201
+ // Validate that database adapters are registered
202
+ if (DatabaseAdapterRegistry.list().length === 0) {
203
+ throw ErrorFactory.createConfigError('No database adapters are registered. Call DatabaseAdapterRegistry.register() during startup to register database adapters.');
204
+ }
205
+ return executeFullQuery(adapter, eventEmitter, sql, parameters);
191
206
  },
192
207
  async transaction(callback) {
193
208
  if (connected.value === false)
194
209
  await db.connect();
210
+ // Validate that database adapters are registered
211
+ if (DatabaseAdapterRegistry.list().length === 0) {
212
+ throw ErrorFactory.createConfigError('No database adapters are registered. Call DatabaseAdapterRegistry.register() during startup to register database adapters.');
213
+ }
195
214
  return writeAdapter.transaction(async () => callback(db));
196
215
  },
197
216
  };
@@ -180,7 +180,7 @@ function createCacheInstance(state) {
180
180
  }
181
181
  const payload = JSON.stringify({ code, timestamp: Date.now() }, null, 2);
182
182
  scheduleCacheWrite(state, key, payload);
183
- return Promise.resolve();
183
+ return Promise.resolve(); // NOSONAR
184
184
  },
185
185
  /**
186
186
  * Save cache to disk (async)
@@ -27,6 +27,9 @@ export interface Route {
27
27
  meta?: RouteMeta;
28
28
  }
29
29
  export type RouteGroupCallback = (router: IRouter) => void;
30
+ export type GroupOptions<MiddlewareName extends string = string> = {
31
+ middleware?: ReadonlyArray<MiddlewareName>;
32
+ };
30
33
  export interface ResourceController {
31
34
  index?: RouteHandler;
32
35
  show?: RouteHandler;
@@ -45,6 +48,7 @@ export type IRouter = {
45
48
  routes: Route[];
46
49
  prefix: string;
47
50
  routeIndex: Map<string, Route[]>;
51
+ inheritedMiddleware?: ReadonlyArray<string>;
48
52
  };
49
53
  export declare const createRouter: () => IRouter;
50
54
  /**
@@ -53,8 +57,8 @@ export declare const createRouter: () => IRouter;
53
57
  */
54
58
  export declare const Router: Readonly<{
55
59
  createRouter: () => IRouter;
56
- scopeRouter: (router: IRouter, prefix: string) => IRouter;
57
- group: (router: IRouter, prefix: string, callback: RouteGroupCallback) => void;
60
+ scopeRouter: (router: IRouter, prefix: string, inheritedMiddleware?: ReadonlyArray<string>) => IRouter;
61
+ group: <M extends string = string>(router: IRouter, prefix: string, callback: RouteGroupCallback, options?: GroupOptions<M>) => void;
58
62
  resource: <M extends string = string>(router: IRouter, path: string, controller: ResourceController, options?: ResourceOptions<M>) => void;
59
63
  get: <M extends string = string>(router: IRouter, path: string, handler: RouteHandler, options?: RouteOptions<M>) => void;
60
64
  post: <M extends string = string>(router: IRouter, path: string, handler: RouteHandler, options?: RouteOptions<M>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../src/routing/Router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../src/routing/Router.ts"],"names":[],"mappings":"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"}
@@ -31,13 +31,27 @@ const pathToRegex = (path) => {
31
31
  */
32
32
  const registerRoute = (router, method, path, handler, options) => {
33
33
  const { pattern, paramNames } = pathToRegex(path);
34
+ // Merge inherited middleware with route-specific middleware
35
+ let routeMiddleware;
36
+ if (router.inheritedMiddleware && router.inheritedMiddleware.length > 0) {
37
+ const routeSpecificMiddleware = Array.isArray(options?.middleware)
38
+ ? options?.middleware
39
+ : [];
40
+ routeMiddleware = [...router.inheritedMiddleware, ...routeSpecificMiddleware];
41
+ }
42
+ else {
43
+ const hasRouteSpecificMiddleware = Array.isArray(options?.middleware);
44
+ if (hasRouteSpecificMiddleware) {
45
+ routeMiddleware = options?.middleware;
46
+ }
47
+ }
34
48
  const route = {
35
49
  method,
36
50
  path,
37
51
  pattern,
38
52
  handler,
39
53
  paramNames,
40
- middleware: Array.isArray(options?.middleware) ? options?.middleware : undefined,
54
+ middleware: routeMiddleware,
41
55
  meta: normalizeRouteMeta(options?.meta),
42
56
  };
43
57
  router.routes.push(route);
@@ -139,13 +153,14 @@ const joinPaths = (prefix, path) => {
139
153
  return pfx || '/';
140
154
  return `${pfx}${pth}`;
141
155
  };
142
- const scopeRouter = (router, prefix) => ({
156
+ const scopeRouter = (router, prefix, inheritedMiddleware) => ({
143
157
  routes: router.routes,
144
158
  prefix: joinPaths(router.prefix, prefix),
145
159
  routeIndex: router.routeIndex,
160
+ inheritedMiddleware,
146
161
  });
147
- const group = (router, prefix, callback) => {
148
- callback(scopeRouter(router, prefix));
162
+ const group = (router, prefix, callback, options) => {
163
+ callback(scopeRouter(router, prefix, options?.middleware));
149
164
  };
150
165
  function buildResourcePaths(prefix, path) {
151
166
  const base = joinPaths(prefix, path);
@@ -3,12 +3,12 @@
3
3
  * Plugin Manager
4
4
  * Handles installation and removal of framework plugins.
5
5
  */
6
- import { execSync } from '../node-singletons/child-process.js';
7
6
  import { SpawnUtil } from '../cli/utils/spawn.js';
8
7
  import { readEnvString } from '../common/ExternalServiceUtils.js';
9
8
  import { esmDirname, resolvePackageManager } from '../common/index.js';
10
9
  import { Logger } from '../config/logger.js';
11
10
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
11
+ import { execSync } from '../node-singletons/child-process.js';
12
12
  import { existsSync, fsPromises as fs } from '../node-singletons/fs.js';
13
13
  import * as path from '../node-singletons/path.js';
14
14
  import { PluginRegistry } from './PluginRegistry.js';
@@ -43,8 +43,8 @@ export const PluginRegistry = {
43
43
  devDependencies: ['@types/jsonwebtoken', '@types/bcrypt'],
44
44
  templates: [
45
45
  {
46
- source: 'features/Auth.ts.tpl',
47
- destination: 'src/features/Auth.ts',
46
+ source: 'auth/Auth.ts.tpl',
47
+ destination: 'src/auth/Auth.ts',
48
48
  },
49
49
  ],
50
50
  postInstall: {
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,UAAU,GAAI,eAAe,MAAM,KAAG,OAYlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAO1C,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/start.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,UAAU,GAAI,eAAe,MAAM,KAAG,OAYlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAO1C,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
package/src/start.js CHANGED
@@ -1,20 +1,21 @@
1
+ import { ZintrustLang } from './lang/lang.js';
1
2
  const isNodeRuntime = () => {
2
3
  // Avoid importing any `node:*` modules so this file remains Worker-safe.
3
4
  // In Workers/Deno, `process` is typically undefined.
4
- return (typeof process !== 'undefined' &&
5
- typeof process === 'object' &&
5
+ return (typeof process !== ZintrustLang.UNDEFINED &&
6
+ typeof process === ZintrustLang.OBJECT &&
6
7
  process !== null &&
7
- typeof process.versions === 'object');
8
+ typeof process.versions === ZintrustLang.OBJECT);
8
9
  };
9
10
  const fileUrlToPathLike = (value) => {
10
- if (!value.startsWith('file://'))
11
+ if (!value.startsWith(ZintrustLang.FILE_PROTOCOL))
11
12
  return value;
12
13
  // Basic file URL decoding (sufficient for macOS/Linux paths).
13
14
  try {
14
- return decodeURIComponent(value.slice('file://'.length));
15
+ return decodeURIComponent(value.slice(ZintrustLang.FILE_PROTOCOL.length));
15
16
  }
16
17
  catch {
17
- return value.slice('file://'.length);
18
+ return value.slice(ZintrustLang.FILE_PROTOCOL.length);
18
19
  }
19
20
  };
20
21
  export const isNodeMain = (importMetaUrl) => {
@@ -41,7 +42,7 @@ export const start = async () => {
41
42
  // Compiled output places bootstrap at `dist/src/boot/bootstrap.js`.
42
43
  // This file compiles to `dist/src/start.js`, so relative import is stable.
43
44
  // In unit tests, importing bootstrap has heavy side effects (starts server + exits).
44
- await import('./boot/' + 'bootstrap.js');
45
+ await import('./boot/' + ZintrustLang.BOOTSTRAPJS);
45
46
  };
46
47
  /**
47
48
  * Cloudflare Workers entry (module worker style).
@@ -25,8 +25,8 @@ const MAPPINGS = [
25
25
  description: 'SQL Server database adapter',
26
26
  },
27
27
  {
28
- basePath: 'src/features/Auth.ts',
29
- templatePath: 'src/templates/features/Auth.ts.tpl',
28
+ basePath: 'src/auth/Auth.ts',
29
+ templatePath: 'src/templates/auth/Auth.ts.tpl',
30
30
  description: 'Authentication feature with JWT & bcrypt',
31
31
  },
32
32
  {
@@ -32,8 +32,8 @@ const MAPPINGS: TemplateMapping[] = [
32
32
  description: 'SQL Server database adapter',
33
33
  },
34
34
  {
35
- basePath: 'src/features/Auth.ts',
36
- templatePath: 'src/templates/features/Auth.ts.tpl',
35
+ basePath: 'src/auth/Auth.ts',
36
+ templatePath: 'src/templates/auth/Auth.ts.tpl',
37
37
  description: 'Authentication feature with JWT & bcrypt',
38
38
  },
39
39
  {
@@ -0,0 +1,114 @@
1
+ // TEMPLATE_START
2
+
3
+ import { generateSecureJobId } from '@zintrust/core';
4
+ import { Logger } from '@zintrust/core';
5
+
6
+ export interface QueueJob {
7
+ id: string;
8
+ data: unknown;
9
+ timestamp: number;
10
+ }
11
+
12
+ /**
13
+ * Queue Feature Template
14
+ *
15
+ * This template shows both in-memory and BullMQ Redis options.
16
+ * Choose the appropriate implementation based on your needs:
17
+ *
18
+ * 1. In-Memory Queue: For testing and development only
19
+ * 2. BullMQ Redis Queue: For production with enterprise features
20
+ */
21
+
22
+ // Option 1: Simple In-Memory Queue (Development/Testing Only)
23
+ export const InMemoryQueue = Object.freeze({
24
+ jobs: [] as QueueJob[],
25
+
26
+ /**
27
+ * Add a job to the queue
28
+ */
29
+ add<T>(data: T): string {
30
+ const id = generateSecureJobId();
31
+ const job: QueueJob = {
32
+ id,
33
+ data,
34
+ timestamp: Date.now(),
35
+ };
36
+
37
+ InMemoryQueue.jobs.push(job);
38
+ Logger.info(`[InMemoryQueue] Job added: ${id}`);
39
+ return id;
40
+ },
41
+
42
+ /**
43
+ * Process jobs
44
+ */
45
+ async process(handler: (job: QueueJob) => Promise<void>): Promise<void> {
46
+ Logger.info('[InMemoryQueue] Processing jobs...');
47
+ const jobsToProcess = [...InMemoryQueue.jobs];
48
+ InMemoryQueue.jobs.length = 0;
49
+ await Promise.all(jobsToProcess.map(async (job) => handler(job)));
50
+ },
51
+ });
52
+
53
+ // Option 2: BullMQ Redis Queue (Production Recommended)
54
+ // To use this, set QUEUE_DRIVER=redis in your environment
55
+ // Configure BullMQ settings with BULLMQ_* environment variables:
56
+ // - BULLMQ_REMOVE_ON_COMPLETE (default: 100)
57
+ // - BULLMQ_REMOVE_ON_FAIL (default: 50)
58
+ // - BULLMQ_DEFAULT_ATTEMPTS (default: 3)
59
+ // - BULLMQ_BACKOFF_DELAY (default: 2000)
60
+ // - BULLMQ_BACKOFF_TYPE (default: 'exponential')
61
+
62
+ export const RedisQueue = Object.freeze({
63
+ /**
64
+ * Add a job to the queue using BullMQ Redis
65
+ * This provides enterprise features: auto-scaling, circuit breaker, DLQ, monitoring
66
+ */
67
+ async add<T>(data: T): Promise<string> {
68
+ // Import dynamically to avoid circular dependencies
69
+ const { Queue } = await import('@zintrust/core');
70
+
71
+ const id = generateSecureJobId();
72
+ const job: QueueJob = {
73
+ id,
74
+ data,
75
+ timestamp: Date.now(),
76
+ };
77
+
78
+ // Uses BullMQ when QUEUE_DRIVER=redis
79
+ const jobId = await Queue.enqueue('default', job);
80
+ Logger.info(`[RedisQueue] Job added via BullMQ: ${jobId}`);
81
+ return jobId;
82
+ },
83
+
84
+ /**
85
+ * Note: For BullMQ, use proper workers instead of manual processing
86
+ * See documentation for setting up BullMQ workers
87
+ */
88
+ async process(_handler: (job: QueueJob) => Promise<void>): Promise<void> {
89
+ Logger.warn('[RedisQueue] Manual processing not recommended for BullMQ. Use proper workers instead.');
90
+ },
91
+ });
92
+
93
+ // Default export - choose based on environment
94
+ export const Queue = (() => {
95
+ const driver = process.env.QUEUE_DRIVER;
96
+
97
+ switch (driver) {
98
+ case 'redis':
99
+ return RedisQueue; // BullMQ Redis with enterprise features
100
+ case 'sqs':
101
+ case 'rabbitmq':
102
+ case 'database':
103
+ // For production drivers, use the main Queue API from @tools/queue/Queue
104
+ // This template only provides in-memory and Redis implementations
105
+ Logger.warn(`Queue driver '${driver}' not implemented in this template. Falling back to in-memory.`);
106
+ return InMemoryQueue; // Fall back to in-memory for unsupported drivers
107
+ case 'sync':
108
+ case 'inmemory':
109
+ default:
110
+ return InMemoryQueue; // Simple in-memory for development
111
+ }
112
+ })();
113
+
114
+ // TEMPLATE_END
@@ -72,6 +72,28 @@ const userControllerMethods: IUserController = {
72
72
  }
73
73
  },
74
74
 
75
+ /**
76
+ * Fill user data
77
+ * POST /users/:id/fill
78
+ */
79
+ async fill(req: IRequest, res: IResponse): Promise<void> {
80
+ try {
81
+ const id = req.params['id'];
82
+ const user = await User.find(id);
83
+ if (user === null) {
84
+ res.status(404).json({ error: 'User not found' });
85
+ return;
86
+ }
87
+ const body = req.body;
88
+ user.fill(body);
89
+ await user.save();
90
+ res.json({ message: 'User data filled', user });
91
+ } catch (error) {
92
+ Logger.error('Error filling user data:', error);
93
+ res.status(500).json({ error: 'Failed to fill user data' });
94
+ }
95
+ },
96
+
75
97
  /**
76
98
  * Show edit form
77
99
  * GET /users/:id/edit
@@ -6,6 +6,23 @@ import { Env, type QueueConfigOverrides, type QueueDriverName } from '@zintrust/
6
6
  * Keep this file declarative:
7
7
  * - Core owns env parsing/default logic.
8
8
  * - Projects can override config by editing values below.
9
+ *
10
+ * BullMQ Redis Driver Environment Variables:
11
+ * When QUEUE_DRIVER=redis, the system uses BullMQ for enterprise features.
12
+ * Additional BullMQ-specific settings can be configured via environment variables:
13
+ *
14
+ * | Environment Variable | Default | Description | Example |
15
+ * |---------------------|---------|-------------|---------|
16
+ * | BULLMQ_REMOVE_ON_COMPLETE | 100 | Number of completed jobs to keep in Redis | 200 |
17
+ * | BULLMQ_REMOVE_ON_FAIL | 50 | Number of failed jobs to keep in Redis | 25 |
18
+ * | BULLMQ_DEFAULT_ATTEMPTS | 3 | Default retry attempts for jobs | 5 |
19
+ * | BULLMQ_BACKOFF_DELAY | 2000 | Delay between retries (milliseconds) | 5000 |
20
+ * | BULLMQ_BACKOFF_TYPE | exponential | Backoff strategy: 'exponential', 'fixed', 'custom' | fixed |
21
+ *
22
+ * Usage Examples:
23
+ * Development: BULLMQ_REMOVE_ON_COMPLETE=500 BULLMQ_DEFAULT_ATTEMPTS=2
24
+ * Production: BULLMQ_REMOVE_ON_COMPLETE=50 BULLMQ_DEFAULT_ATTEMPTS=5
25
+ * High-Volume: BULLMQ_REMOVE_ON_COMPLETE=10 BULLMQ_BACKOFF_DELAY=500
9
26
  */
10
27
 
11
28
  export default {
@@ -25,6 +42,8 @@ export default {
25
42
  port: Env.getInt('REDIS_PORT', 6379),
26
43
  password: Env.get('REDIS_PASSWORD'),
27
44
  database: Env.getInt('REDIS_QUEUE_DB', 1),
45
+ // Note: Redis driver uses BullMQ for enterprise features
46
+ // See BullMQ environment variables in file header for customization
28
47
  },
29
48
  rabbitmq: {
30
49
  driver: 'rabbitmq' as const,
@@ -11,7 +11,8 @@
11
11
  "type-check": "tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@zintrust/core": "^{{coreVersion}}"
14
+ "@zintrust/core": "^{{coreVersion}}",
15
+ "@zintrust/governance": "^0.1.25"
15
16
  },
16
17
  "devDependencies": {
17
18
  "@types/node": "^25.0.3",
@@ -4,9 +4,6 @@
4
4
 
5
5
  import { isNodeMain, start } from '@zintrust/core/start';
6
6
 
7
- // Register plugins (side-effects)
8
- import './zintrust.plugins';
9
-
10
7
  // Cloudflare Workers entry.
11
8
  export { default } from '@zintrust/core/start';
12
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/Redis.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,WAAW;4BAsDD,0BAA0B,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;;CAmB5F,CAAC;AAEL,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/Redis.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAOF,eAAO,MAAM,WAAW;4BAED,0BAA0B,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;;CAsB5F,CAAC;AAEL,eAAe,WAAW,CAAC"}
@@ -1,63 +1,15 @@
1
+ import { ensureDriver } from '../../../config/redis.js';
1
2
  import { ErrorFactory } from '../../../exceptions/ZintrustError.js';
2
- const buildRedisUrl = (config) => {
3
- const host = (config.host ?? '').trim();
4
- const port = Number(config.port);
5
- if (!host)
6
- throw ErrorFactory.createConfigError('Redis broadcast driver requires host');
7
- if (!Number.isFinite(port) || port <= 0) {
8
- throw ErrorFactory.createConfigError('Redis broadcast driver requires a valid port');
9
- }
10
- const password = (config.password ?? '').trim();
11
- const authPart = password ? `:${encodeURIComponent(password)}@` : '';
12
- return `redis://${authPart}${host}:${port}`;
3
+ import { createRedisKey } from '../../redis/RedisKeyManager.js';
4
+ const normalizePrefix = (value) => {
5
+ const prefix = (value ?? '').trim();
6
+ return prefix || 'broadcast:';
13
7
  };
14
8
  export const RedisDriver = (() => {
15
- let client = null;
16
- let connected = false;
17
- const ensureClient = async (config) => {
18
- // Always validate config even if a client is already cached
19
- const url = buildRedisUrl(config);
20
- if (connected && client !== null)
21
- return client;
22
- // Import lazily so package is optional for environments that don't use Redis
23
- try {
24
- const mod = (await import('redis'));
25
- client = mod.createClient({ url });
26
- if (typeof client.connect === 'function') {
27
- try {
28
- await client.connect();
29
- connected = true;
30
- }
31
- catch (err) {
32
- connected = false;
33
- throw ErrorFactory.createTryCatchError('Redis broadcast driver failed to connect', err);
34
- }
35
- }
36
- else {
37
- connected = true;
38
- }
39
- }
40
- catch {
41
- const globalFake = globalThis
42
- .__fakeRedisClient;
43
- if (globalFake === undefined) {
44
- throw ErrorFactory.createConfigError("Redis broadcast driver requires the 'redis' package (run `zin add broadcast:redis` / `zin plugin install broadcast:redis`, or `npm install redis`) or a test fake client set in globalThis.__fakeRedisClient");
45
- }
46
- client = globalFake;
47
- connected = true;
48
- }
49
- if (client === null)
50
- throw ErrorFactory.createConfigError('Redis client could not be initialized');
51
- return client;
52
- };
53
- const normalizePrefix = (value) => {
54
- const prefix = (value ?? '').trim();
55
- return prefix || 'broadcast:';
56
- };
57
9
  return {
58
10
  async send(config, channel, event, data) {
59
- const cli = await ensureClient(config);
60
- const fullChannel = `${normalizePrefix(config.channelPrefix)}${channel}`;
11
+ const cli = await ensureDriver('publish');
12
+ const prefixedChannel = createRedisKey(`broadcast:${normalizePrefix(config.channelPrefix)}${channel}`);
61
13
  let message;
62
14
  try {
63
15
  message = JSON.stringify({ event, data });
@@ -65,7 +17,7 @@ export const RedisDriver = (() => {
65
17
  catch (err) {
66
18
  throw ErrorFactory.createTryCatchError('Failed to serialize broadcast payload', err);
67
19
  }
68
- const published = await cli.publish(fullChannel, message);
20
+ const published = await cli.publish(prefixedChannel, message);
69
21
  return { ok: true, published };
70
22
  },
71
23
  };