@zintrust/core 0.4.49 → 0.4.50

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.4.49",
3
+ "version": "0.4.50",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "dependencies": {
60
60
  "@cloudflare/containers": "^0.2.0",
61
- "@zintrust/workers": "0.4.49",
61
+ "@zintrust/workers": "0.4.50",
62
62
  "bcryptjs": "^3.0.3",
63
63
  "bullmq": "^5.71.1",
64
64
  "chalk": "^5.6.2",
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAiN9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA4BlF,CAAC;AA8NF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CA8E7D,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAuN9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA4BlF,CAAC;AAmPF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CA+E7D,CAAC"}
@@ -10,6 +10,7 @@ import { FeatureFlags } from '../../config/features.js';
10
10
  import { Logger } from '../../config/logger.js';
11
11
  import notificationConfig from '../../config/notification.js';
12
12
  import { StartupConfigValidator } from '../../config/StartupConfigValidator.js';
13
+ import { isNonEmptyString } from '../../helper/index.js';
13
14
  import { existsSync } from '../../node-singletons/fs.js';
14
15
  import * as path from '../../node-singletons/path.js';
15
16
  import { pathToFileURL } from '../../node-singletons/url.js';
@@ -278,8 +279,24 @@ const initializeQueueMonitor = async (router) => {
278
279
  }
279
280
  const redisConfig = extractRedisConfigFromQueueConfig();
280
281
  const { QueueMonitor } = queueMonitorModule;
282
+ const resolveKnownQueues = async () => {
283
+ try {
284
+ const workersModule = (await loadWorkersModule());
285
+ const records = await workersModule?.WorkerFactory?.listPersistedRecords?.();
286
+ if (!Array.isArray(records)) {
287
+ return [];
288
+ }
289
+ return Array.from(new Set(records
290
+ .map((record) => record.queueName)
291
+ .filter((queueName) => isNonEmptyString(queueName)))).sort((left, right) => left.localeCompare(right));
292
+ }
293
+ catch {
294
+ return [];
295
+ }
296
+ };
281
297
  const monitor = QueueMonitor.create({
282
298
  ...monitorConfig,
299
+ knownQueues: resolveKnownQueues,
283
300
  redis: redisConfig,
284
301
  });
285
302
  try {
@@ -292,7 +309,7 @@ const initializeQueueMonitor = async (router) => {
292
309
  Logger.info(`Queue Monitor enqueue endpoint at http://127.0.0.1:${appConfig.port}/test/enqueue`);
293
310
  };
294
311
  const initializeWorkers = async (router) => {
295
- const workers = await loadWorkersModule();
312
+ const workers = await loadWorkersModule({ allowWhenDisabled: true });
296
313
  if (workers?.WorkerInit !== undefined && typeof workers.registerWorkerRoutes === 'function') {
297
314
  workers.registerWorkerRoutes(router, undefined, { middleware: undefined });
298
315
  }
@@ -403,16 +420,19 @@ export const createLifecycle = (params) => {
403
420
  await initializeArtifactDirectories(params.resolvedBasePath);
404
421
  await registerMasterRoutes(params.resolvedBasePath, params.router);
405
422
  await initializeSystemDebugger();
406
- if (Cloudflare.getWorkersEnv() === null &&
407
- appConfig.dockerWorker === false &&
408
- appConfig.worker === true) {
423
+ if (Cloudflare.getWorkersEnv() === null && appConfig.dockerWorker === false) {
409
424
  await initializeWorkers(params.router);
410
425
  await initializeQueueMonitor(params.router);
411
- await initializeQueueHttpGateway(params.router);
412
- await initializeScheduleHttpGateway(params.router);
426
+ if (appConfig.worker === true) {
427
+ await initializeQueueHttpGateway(params.router);
428
+ await initializeScheduleHttpGateway(params.router);
429
+ }
430
+ else {
431
+ Logger.info('Skipping worker execution/gateway initialization (WORKER_ENABLED=false).');
432
+ }
413
433
  }
414
434
  else if (!appConfig.dockerWorker) {
415
- Logger.info('Skipping worker module initialization (WORKER_ENABLED=false).');
435
+ Logger.info('Skipping local worker dashboards in Cloudflare Workers runtime.');
416
436
  }
417
437
  // Register service providers
418
438
  // Bootstrap services
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.4.49
2
+ * @zintrust/core v0.4.50
3
3
  *
4
4
  * ZinTrust Framework - Production-Grade TypeScript Backend
5
5
  * Built for performance, type safety, and exceptional developer experience
6
6
  *
7
7
  * Build Information:
8
- * Built: 2026-04-03T16:22:10.308Z
8
+ * Built: 2026-04-04T09:55:52.876Z
9
9
  * Node: >=20.0.0
10
10
  * License: MIT
11
11
  *
@@ -21,7 +21,7 @@
21
21
  * Available at runtime for debugging and health checks
22
22
  */
23
23
  export const ZINTRUST_VERSION = '0.1.41';
24
- export const ZINTRUST_BUILD_DATE = '2026-04-03T16:22:10.274Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-04-04T09:55:52.845Z'; // Replaced during build
25
25
  export { Application } from './boot/Application.js';
26
26
  export { AwsSigV4 } from './common/index.js';
27
27
  export { SignedRequest } from './security/SignedRequest.js';
@@ -63,12 +63,12 @@ export const D1Adapter = Object.freeze({
63
63
  // eslint-disable-next-line @typescript-eslint/require-await
64
64
  async connect() {
65
65
  connected = true;
66
- Logger.info('✓ D1 connected');
66
+ Logger.debug('✓ D1 connected');
67
67
  },
68
68
  // eslint-disable-next-line @typescript-eslint/require-await
69
69
  async disconnect() {
70
70
  connected = false;
71
- Logger.info('✓ D1 disconnected');
71
+ Logger.debug('✓ D1 disconnected');
72
72
  },
73
73
  async query(sql, parameters) {
74
74
  if (!connected)
@@ -1,6 +1,8 @@
1
1
  type WorkersModule = typeof import('../../packages/workers/src/index.js');
2
2
  type QueueMonitorModule = typeof import('../../packages/queue-monitor/src/index.js');
3
- export declare const loadWorkersModule: () => Promise<WorkersModule>;
3
+ export declare const loadWorkersModule: (options?: {
4
+ allowWhenDisabled?: boolean;
5
+ }) => Promise<WorkersModule>;
4
6
  export declare const loadQueueMonitorModule: () => Promise<QueueMonitorModule>;
5
7
  export {};
6
8
  //# sourceMappingURL=WorkersModule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkersModule.d.ts","sourceRoot":"","sources":["../../../src/runtime/WorkersModule.ts"],"names":[],"mappings":"AAOA,KAAK,aAAa,GAAG,cAAc,mBAAmB,CAAC,CAAC;AACxD,KAAK,kBAAkB,GAAG,cAAc,yBAAyB,CAAC,CAAC;AA8WnE,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,aAAa,CAwB/D,CAAC;AA4CF,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,kBAAkB,CAkBzE,CAAC"}
1
+ {"version":3,"file":"WorkersModule.d.ts","sourceRoot":"","sources":["../../../src/runtime/WorkersModule.ts"],"names":[],"mappings":"AAOA,KAAK,aAAa,GAAG,cAAc,mBAAmB,CAAC,CAAC;AACxD,KAAK,kBAAkB,GAAG,cAAc,yBAAyB,CAAC,CAAC;AA+WnE,eAAO,MAAM,iBAAiB,GAC5B,UAAS;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,KAC5C,OAAO,CAAC,aAAa,CA2BvB,CAAC;AA4CF,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,kBAAkB,CAkBzE,CAAC"}
@@ -203,6 +203,7 @@ let patchAfterFailureAttempted = false;
203
203
  let queueMonitorModulePromise;
204
204
  let queueMonitorPatchAfterFailureAttempted = false;
205
205
  let workersResolverDiagnosticLogged = false;
206
+ let workersDisabledByEnvLogged = false;
206
207
  const resolvePackageEntryForDebug = (packageName) => {
207
208
  if (!isNodeRuntime())
208
209
  return null;
@@ -306,9 +307,12 @@ const tryLocalFallback = async () => {
306
307
  }
307
308
  return null;
308
309
  };
309
- export const loadWorkersModule = async () => {
310
- if (shouldDisableWorkerModules()) {
311
- Logger.info('Skipping @zintrust/workers module import (workers disabled by env).');
310
+ export const loadWorkersModule = async (options = {}) => {
311
+ if (shouldDisableWorkerModules() && options.allowWhenDisabled !== true) {
312
+ if (!workersDisabledByEnvLogged) {
313
+ workersDisabledByEnvLogged = true;
314
+ Logger.info('Skipping @zintrust/workers module import (workers disabled by env).');
315
+ }
312
316
  workersModulePromise ??= Promise.resolve(createDisabledWorkersModule());
313
317
  return workersModulePromise;
314
318
  }
@@ -5,6 +5,7 @@ export type RedisTransportOptions = Readonly<{
5
5
  requireDirect?: boolean;
6
6
  }>;
7
7
  type RedisProxyConnection = {
8
+ [x: string]: unknown;
8
9
  status: 'ready';
9
10
  connect: () => Promise<void>;
10
11
  quit: () => Promise<'OK'>;
@@ -1 +1 @@
1
- {"version":3,"file":"RedisTransport.d.ts","sourceRoot":"","sources":["../../../../src/tools/redis/RedisTransport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,CAAC;AASH,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACnF,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACrF,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACpF,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IAC/F,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,QAAQ,EAAE,MAAM;QACd,IAAI,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK;QAC5D,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;QACtE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;QACxE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;KACxE,CAAC;CACH,CAAC;AA0PF,eAAO,MAAM,yBAAyB,QAAO,kBAE5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,WAAW,EACnB,UAAU,qBAAqB,KAC9B,oBAoCF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,WAAW,EACnB,UAAU,qBAAqB,KAC9B,kBAaF,CAAC"}
1
+ {"version":3,"file":"RedisTransport.d.ts","sourceRoot":"","sources":["../../../../src/tools/redis/RedisTransport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,CAAC;AASH,KAAK,oBAAoB,GAAG;IAC1B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACnF,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACrF,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IACpF,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,oBAAoB,CAAC;IAC/F,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,QAAQ,EAAE,MAAM;QACd,IAAI,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK;QAC5D,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;QACtE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;QACxE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,OAAO,CAAC;KACxE,CAAC;CACH,CAAC;AA4QF,eAAO,MAAM,yBAAyB,QAAO,kBAI5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,WAAW,EACnB,UAAU,qBAAqB,KAC9B,oBAoCF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,WAAW,EACnB,UAAU,qBAAqB,KAC9B,kBAaF,CAAC"}
@@ -3,6 +3,20 @@ import { Logger } from '../../config/logger.js';
3
3
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
4
  import { SignedRequest } from '../../security/SignedRequest.js';
5
5
  const loggedSelections = new Set();
6
+ const readEnvString = (key, fallback = '') => {
7
+ if (typeof Env.get === 'function') {
8
+ return Env.get(key, fallback);
9
+ }
10
+ const value = Env[key];
11
+ return typeof value === 'string' ? value : fallback;
12
+ };
13
+ const readEnvBool = (key, fallback = false) => {
14
+ if (typeof Env.getBool === 'function') {
15
+ return Env.getBool(key, fallback);
16
+ }
17
+ const value = Env[key];
18
+ return typeof value === 'boolean' ? value : fallback;
19
+ };
6
20
  const resolveSigningPrefix = (baseUrl) => {
7
21
  try {
8
22
  const parsed = new URL(baseUrl);
@@ -35,7 +49,7 @@ const buildSigningUrl = (requestUrl, baseUrl) => {
35
49
  return requestUrl;
36
50
  };
37
51
  const resolveProxyBaseUrl = () => {
38
- const explicit = Env.REDIS_PROXY_URL.trim();
52
+ const explicit = readEnvString('REDIS_PROXY_URL', '').trim();
39
53
  if (explicit !== '')
40
54
  return explicit;
41
55
  return `http://${Env.REDIS_PROXY_HOST}:${Env.REDIS_PROXY_PORT}`;
@@ -205,7 +219,9 @@ const createPipeline = (settings) => {
205
219
  return pipeline;
206
220
  };
207
221
  export const resolveRedisTransportMode = () => {
208
- return Env.USE_REDIS_PROXY || Env.REDIS_PROXY_URL.trim() !== '' ? 'proxy' : 'direct';
222
+ return readEnvBool('USE_REDIS_PROXY', false) || readEnvString('REDIS_PROXY_URL', '').trim() !== ''
223
+ ? 'proxy'
224
+ : 'direct';
209
225
  };
210
226
  export const createRedisProxyConnection = (config, options) => {
211
227
  const settings = resolveProxySettings();