@zintrust/core 0.1.41 → 0.1.42
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 +17 -1
- package/src/boot/bootstrap.js +27 -11
- package/src/boot/registry/runtime.d.ts.map +1 -1
- package/src/boot/registry/runtime.js +11 -0
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +12 -0
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/ConfigCommand.js +3 -5
- package/src/cli/commands/D1LearnCommand.d.ts +9 -0
- package/src/cli/commands/D1LearnCommand.d.ts.map +1 -0
- package/src/cli/commands/D1LearnCommand.js +143 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +55 -16
- package/src/cli/commands/InitContainerCommand.d.ts.map +1 -1
- package/src/cli/commands/InitContainerCommand.js +21 -6
- package/src/cli/commands/InitEcosystemCommand.d.ts +6 -0
- package/src/cli/commands/InitEcosystemCommand.d.ts.map +1 -0
- package/src/cli/commands/InitEcosystemCommand.js +51 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +78 -36
- package/src/cli/commands/MigrateWorkerCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateWorkerCommand.js +36 -2
- package/src/cli/commands/PutCommand.d.ts +6 -0
- package/src/cli/commands/PutCommand.d.ts.map +1 -0
- package/src/cli/commands/PutCommand.js +173 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -1
- package/src/cli/commands/QueueRecoveryCommand.js +113 -14
- package/src/cli/commands/ScheduleListCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleListCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleListCommand.js +62 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleRunCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleRunCommand.js +32 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts +6 -0
- package/src/cli/commands/ScheduleStartCommand.d.ts.map +1 -0
- package/src/cli/commands/ScheduleStartCommand.js +40 -0
- package/src/cli/commands/SecretsCommand.d.ts.map +1 -1
- package/src/cli/commands/SecretsCommand.js +2 -2
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts +6 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.d.ts.map +1 -0
- package/src/cli/commands/schedule/ScheduleCliSupport.js +55 -0
- package/src/cli/config/ConfigManager.d.ts.map +1 -1
- package/src/cli/config/ConfigManager.js +8 -1
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
- package/src/cli/d1/D1SqlMigrations.js +11 -1
- package/src/cli/d1/WranglerConfig.d.ts.map +1 -1
- package/src/cli/d1/WranglerConfig.js +34 -2
- package/src/cli/services/VersionChecker.d.ts.map +1 -1
- package/src/cli/services/VersionChecker.js +5 -1
- package/src/cli/utils/DatabaseCliUtils.d.ts.map +1 -1
- package/src/cli/utils/DatabaseCliUtils.js +6 -1
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/cli/utils/EnvFileLoader.js +33 -14
- package/src/cli.d.ts +5 -0
- package/src/cli.d.ts.map +1 -0
- package/src/cli.js +4 -0
- package/src/collections/index.d.ts +2 -2
- package/src/collections/index.d.ts.map +1 -1
- package/src/collections/index.js +1 -1
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +49 -23
- package/src/common/utility.d.ts.map +1 -1
- package/src/common/utility.js +2 -6
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/cloudflare.js +19 -8
- package/src/config/env.js +2 -2
- package/src/helper/index.d.ts +225 -0
- package/src/helper/index.d.ts.map +1 -0
- package/src/helper/index.js +347 -0
- package/src/index.d.ts +3 -6
- package/src/index.d.ts.map +1 -1
- package/src/index.js +7 -9
- package/src/migrations/MigrationDiscovery.d.ts.map +1 -1
- package/src/migrations/MigrationDiscovery.js +2 -1
- package/src/orm/DatabaseAdapter.d.ts +1 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/SchemaStatemenWriter.d.ts +15 -0
- package/src/orm/SchemaStatemenWriter.d.ts.map +1 -0
- package/src/orm/SchemaStatemenWriter.js +78 -0
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +52 -2
- package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +137 -89
- package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLProxyAdapter.js +100 -81
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLProxyAdapter.js +26 -10
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -1
- package/src/orm/adapters/SqlProxyAdapterUtils.js +2 -1
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts +12 -0
- package/src/orm/adapters/SqlProxyRegistryMode.d.ts.map +1 -0
- package/src/orm/adapters/SqlProxyRegistryMode.js +24 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SqlServerProxyAdapter.js +125 -117
- package/src/orm/migrations/MigrationStore.js +1 -1
- package/src/proxy/ProxyRequestParsing.d.ts +9 -0
- package/src/proxy/ProxyRequestParsing.d.ts.map +1 -0
- package/src/proxy/ProxyRequestParsing.js +16 -0
- package/src/proxy/RequestValidator.d.ts.map +1 -1
- package/src/proxy/RequestValidator.js +2 -1
- package/src/proxy/SigningService.js +2 -2
- package/src/proxy/SqlProxyDbOverrides.d.ts +17 -0
- package/src/proxy/SqlProxyDbOverrides.d.ts.map +1 -0
- package/src/proxy/SqlProxyDbOverrides.js +1 -0
- package/src/proxy/SqlProxyServerDeps.d.ts +12 -0
- package/src/proxy/SqlProxyServerDeps.d.ts.map +1 -0
- package/src/proxy/SqlProxyServerDeps.js +9 -0
- package/src/proxy/StatementPayloadValidator.d.ts +13 -0
- package/src/proxy/StatementPayloadValidator.d.ts.map +1 -0
- package/src/proxy/StatementPayloadValidator.js +18 -0
- package/src/proxy/StatementRegistryLoader.d.ts +2 -0
- package/src/proxy/StatementRegistryLoader.d.ts.map +1 -0
- package/src/proxy/StatementRegistryLoader.js +36 -0
- package/src/proxy/StatementRegistryResolver.d.ts +15 -0
- package/src/proxy/StatementRegistryResolver.d.ts.map +1 -0
- package/src/proxy/StatementRegistryResolver.js +34 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -1
- package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -1
- package/src/proxy/d1/ZintrustD1Proxy.js +2 -1
- package/src/proxy/isMutatingSql.d.ts +2 -0
- package/src/proxy/isMutatingSql.d.ts.map +1 -0
- package/src/proxy/isMutatingSql.js +12 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -1
- package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -1
- package/src/proxy/kv/ZintrustKvProxy.js +2 -1
- package/src/proxy/mysql/MySqlProxyServer.d.ts +2 -8
- package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -1
- package/src/proxy/mysql/MySqlProxyServer.js +84 -51
- package/src/proxy/postgres/PostgresProxyServer.d.ts +2 -8
- package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -1
- package/src/proxy/postgres/PostgresProxyServer.js +86 -48
- package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -1
- package/src/proxy/smtp/SmtpProxyServer.js +6 -5
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +2 -8
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -1
- package/src/proxy/sqlserver/SqlServerProxyServer.js +84 -49
- package/src/proxy.d.ts +4 -0
- package/src/proxy.d.ts.map +1 -0
- package/src/proxy.js +3 -0
- package/src/scheduler/Schedule.d.ts +36 -0
- package/src/scheduler/Schedule.d.ts.map +1 -0
- package/src/scheduler/Schedule.js +197 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts +8 -0
- package/src/scheduler/ScheduleHttpGateway.d.ts.map +1 -0
- package/src/scheduler/ScheduleHttpGateway.js +196 -0
- package/src/scheduler/ScheduleRunner.d.ts +6 -0
- package/src/scheduler/ScheduleRunner.d.ts.map +1 -1
- package/src/scheduler/ScheduleRunner.js +166 -29
- package/src/scheduler/SchedulerRuntime.d.ts +15 -0
- package/src/scheduler/SchedulerRuntime.d.ts.map +1 -0
- package/src/scheduler/SchedulerRuntime.js +79 -0
- package/src/scheduler/cron/Cron.d.ts +19 -0
- package/src/scheduler/cron/Cron.d.ts.map +1 -0
- package/src/scheduler/cron/Cron.js +200 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts +14 -0
- package/src/scheduler/leader/SchedulerLeader.d.ts.map +1 -0
- package/src/scheduler/leader/SchedulerLeader.js +187 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts +27 -0
- package/src/scheduler/state/ScheduleStateStore.d.ts.map +1 -0
- package/src/scheduler/state/ScheduleStateStore.js +27 -0
- package/src/scheduler/types.d.ts +10 -0
- package/src/scheduler/types.d.ts.map +1 -1
- package/src/schedules/index.d.ts +1 -0
- package/src/schedules/index.d.ts.map +1 -1
- package/src/schedules/index.js +1 -0
- package/src/schedules/job-tracking-cleanup.d.ts +4 -0
- package/src/schedules/job-tracking-cleanup.d.ts.map +1 -0
- package/src/schedules/job-tracking-cleanup.js +116 -0
- package/src/schedules/log-cleanup.d.ts +1 -2
- package/src/schedules/log-cleanup.d.ts.map +1 -1
- package/src/schedules/log-cleanup.js +12 -15
- package/src/security/Sanitizer.d.ts.map +1 -1
- package/src/security/Sanitizer.js +1 -9
- package/src/security/SignedRequest.d.ts.map +1 -1
- package/src/security/SignedRequest.js +2 -2
- package/src/templates/docker/docker-compose.ecosystem.yml.tpl +301 -0
- package/src/templates/docker/docker-compose.schedules.yml.tpl +84 -0
- package/src/templates/project/basic/app/Schedules/index.ts.tpl +0 -0
- package/src/templates/project/basic/config/database.ts.tpl +1 -1
- package/src/toolkit/Secrets/Manifest.d.ts.map +1 -1
- package/src/toolkit/Secrets/Manifest.js +5 -7
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
- package/src/tools/mail/drivers/Smtp.js +7 -1
- package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -1
- package/src/tools/queue/JobReconciliationRunner.js +7 -39
- package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -1
- package/src/tools/queue/JobRecoveryDaemon.js +116 -18
- package/src/tools/queue/JobStateTracker.d.ts +10 -1
- package/src/tools/queue/JobStateTracker.d.ts.map +1 -1
- package/src/tools/queue/JobStateTracker.js +24 -2
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -1
- package/src/tools/queue/JobStateTrackerDbPersistence.js +93 -2
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
name: zintrust-ecosystem
|
|
2
|
+
|
|
3
|
+
x-app-runtime: &app-runtime
|
|
4
|
+
build:
|
|
5
|
+
context: .
|
|
6
|
+
dockerfile: Dockerfile
|
|
7
|
+
|
|
8
|
+
x-common-env: &common-env
|
|
9
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
10
|
+
CSRF_SKIP_PATHS: ${CSRF_SKIP_PATHS:-/api/*,/queue-monitor/*}
|
|
11
|
+
|
|
12
|
+
SCHEDULE_SHUTDOWN_TIMEOUT_MS: ${SCHEDULE_SHUTDOWN_TIMEOUT_MS:-30000}
|
|
13
|
+
SCHEDULE_OVERLAP_LOCK_TTL_MS: ${SCHEDULE_OVERLAP_LOCK_TTL_MS:-300000}
|
|
14
|
+
|
|
15
|
+
# Database & Redis
|
|
16
|
+
DB_CONNECTION: ${DB_CONNECTION:-postgresql}
|
|
17
|
+
DB_HOST: ${DB_HOST:-postgres}
|
|
18
|
+
DB_PORT: ${DB_PORT:-5432}
|
|
19
|
+
DB_DATABASE: ${DB_DATABASE:-zintrust}
|
|
20
|
+
DB_USERNAME: ${DB_USERNAME:-zintrust}
|
|
21
|
+
DB_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
22
|
+
|
|
23
|
+
REDIS_HOST: ${REDIS_HOST:-redis}
|
|
24
|
+
REDIS_PORT: ${REDIS_PORT:-6379}
|
|
25
|
+
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
|
|
26
|
+
REDIS_DB: ${REDIS_DB:-0}
|
|
27
|
+
|
|
28
|
+
services:
|
|
29
|
+
# Web Application (API)
|
|
30
|
+
web:
|
|
31
|
+
<<: *app-runtime
|
|
32
|
+
ports:
|
|
33
|
+
- '${PORT:-3000}:3000'
|
|
34
|
+
environment:
|
|
35
|
+
<<: *common-env
|
|
36
|
+
PORT: 3000
|
|
37
|
+
HOST: 0.0.0.0
|
|
38
|
+
RUNTIME_MODE: node-server
|
|
39
|
+
WORKER_ENABLED: 'false'
|
|
40
|
+
QUEUE_ENABLED: 'true'
|
|
41
|
+
command: npm run dev
|
|
42
|
+
depends_on:
|
|
43
|
+
postgres:
|
|
44
|
+
condition: service_healthy
|
|
45
|
+
redis:
|
|
46
|
+
condition: service_healthy
|
|
47
|
+
volumes:
|
|
48
|
+
- .:/app
|
|
49
|
+
- /app/node_modules
|
|
50
|
+
- /app/dist
|
|
51
|
+
networks:
|
|
52
|
+
- zintrust-network
|
|
53
|
+
|
|
54
|
+
# Workers (Consumers)
|
|
55
|
+
workers:
|
|
56
|
+
<<: *app-runtime
|
|
57
|
+
environment:
|
|
58
|
+
<<: *common-env
|
|
59
|
+
RUNTIME_MODE: containers
|
|
60
|
+
WORKER_ENABLED: 'true'
|
|
61
|
+
WORKER_AUTO_START: 'true'
|
|
62
|
+
QUEUE_ENABLED: 'true'
|
|
63
|
+
command: npx tsx bin/zin.ts worker:start-all
|
|
64
|
+
depends_on:
|
|
65
|
+
postgres:
|
|
66
|
+
condition: service_healthy
|
|
67
|
+
redis:
|
|
68
|
+
condition: service_healthy
|
|
69
|
+
volumes:
|
|
70
|
+
- .:/app
|
|
71
|
+
- /app/node_modules
|
|
72
|
+
- /app/dist
|
|
73
|
+
networks:
|
|
74
|
+
- zintrust-network
|
|
75
|
+
|
|
76
|
+
# Dedicated schedules service (auto-start schedules)
|
|
77
|
+
schedules:
|
|
78
|
+
<<: *app-runtime
|
|
79
|
+
environment:
|
|
80
|
+
<<: *common-env
|
|
81
|
+
# Dedicated schedules service enabled by default (override in .env)
|
|
82
|
+
SCHEDULES_ENABLED: ${SCHEDULES_ENABLED:-true}
|
|
83
|
+
# job tracking cleanup schedule
|
|
84
|
+
JOB_TRACKING_CLEANUP_ENABLED: ${JOB_TRACKING_CLEANUP_ENABLED:-false}
|
|
85
|
+
JOB_TRACKING_CLEANUP_INTERVAL_MS: ${JOB_TRACKING_CLEANUP_INTERVAL_MS:-21600000}
|
|
86
|
+
JOB_TRACKING_CLEANUP_RETENTION_DAYS: ${JOB_TRACKING_CLEANUP_RETENTION_DAYS:-30}
|
|
87
|
+
JOB_TRACKING_CLEANUP_BATCH_SIZE: ${JOB_TRACKING_CLEANUP_BATCH_SIZE:-5000}
|
|
88
|
+
JOB_TRACKING_CLEANUP_MAX_BATCHES: ${JOB_TRACKING_CLEANUP_MAX_BATCHES:-1}
|
|
89
|
+
JOB_TRACKING_CLEANUP_LOCK_PROVIDER: ${JOB_TRACKING_CLEANUP_LOCK_PROVIDER:-redis}
|
|
90
|
+
command: ['node', 'dist/bin/zin.js', 'schedule:start']
|
|
91
|
+
depends_on:
|
|
92
|
+
postgres:
|
|
93
|
+
condition: service_healthy
|
|
94
|
+
redis:
|
|
95
|
+
condition: service_healthy
|
|
96
|
+
networks:
|
|
97
|
+
- zintrust-network
|
|
98
|
+
|
|
99
|
+
# Backing services
|
|
100
|
+
postgres:
|
|
101
|
+
image: postgres:16-alpine
|
|
102
|
+
environment:
|
|
103
|
+
POSTGRES_DB: ${DB_DATABASE:-zintrust}
|
|
104
|
+
POSTGRES_USER: ${DB_USERNAME:-zintrust}
|
|
105
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
106
|
+
ports:
|
|
107
|
+
- '${POSTGRES_PORT:-5432}:5432'
|
|
108
|
+
volumes:
|
|
109
|
+
- postgres_data:/var/lib/postgresql/data
|
|
110
|
+
healthcheck:
|
|
111
|
+
test: ['CMD-SHELL', 'pg_isready -U ${DB_USERNAME:-zintrust}']
|
|
112
|
+
interval: 10s
|
|
113
|
+
timeout: 5s
|
|
114
|
+
retries: 5
|
|
115
|
+
networks:
|
|
116
|
+
- zintrust-network
|
|
117
|
+
|
|
118
|
+
redis:
|
|
119
|
+
image: redis:7-alpine
|
|
120
|
+
ports:
|
|
121
|
+
- '${REDIS_PORT:-6379}:6379'
|
|
122
|
+
volumes:
|
|
123
|
+
- redis_data:/data
|
|
124
|
+
healthcheck:
|
|
125
|
+
test: ['CMD', 'redis-cli', 'ping']
|
|
126
|
+
interval: 10s
|
|
127
|
+
timeout: 5s
|
|
128
|
+
retries: 5
|
|
129
|
+
networks:
|
|
130
|
+
- zintrust-network
|
|
131
|
+
|
|
132
|
+
# Proxies (optional; separate blocks like docker-compose.proxy.yml)
|
|
133
|
+
# These can be started/stopped independently.
|
|
134
|
+
proxy-gateway:
|
|
135
|
+
image: ${PROXY_GATEWAY_IMAGE:-zintrust-proxy-gateway:local}
|
|
136
|
+
build:
|
|
137
|
+
context: ./docker/proxy-gateway
|
|
138
|
+
dockerfile: Dockerfile
|
|
139
|
+
restart: on-failure:3
|
|
140
|
+
depends_on:
|
|
141
|
+
- proxy-mysql
|
|
142
|
+
- proxy-pg
|
|
143
|
+
- proxy-redis
|
|
144
|
+
- proxy-mongodb
|
|
145
|
+
- proxy-sqlserver
|
|
146
|
+
- proxy-smtp
|
|
147
|
+
ports:
|
|
148
|
+
- ${PROXY_GATEWAY_PORT:-8800}:8080
|
|
149
|
+
environment:
|
|
150
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
151
|
+
CSRF_SKIP_PATHS: ${CSRF_SKIP_PATHS:-/api/*,/queue-monitor/*}
|
|
152
|
+
networks:
|
|
153
|
+
- zintrust-network
|
|
154
|
+
|
|
155
|
+
proxy-mysql:
|
|
156
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
157
|
+
build:
|
|
158
|
+
context: .
|
|
159
|
+
dockerfile: Dockerfile
|
|
160
|
+
target: runtime
|
|
161
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:mysql', '--host', '0.0.0.0', '--port', '8789']
|
|
162
|
+
expose:
|
|
163
|
+
- '8789'
|
|
164
|
+
environment:
|
|
165
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
166
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
167
|
+
APP_KEY: ${APP_KEY:-}
|
|
168
|
+
MYSQL_PROXY_REQUIRE_SIGNING: true
|
|
169
|
+
MYSQL_PROXY_KEY_ID: ${MYSQL_PROXY_KEY_ID:-}
|
|
170
|
+
MYSQL_PROXY_SECRET: ${MYSQL_PROXY_SECRET:-}
|
|
171
|
+
MYSQL_PROXY_SIGNING_WINDOW_MS: ${MYSQL_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
172
|
+
MYSQL_DB_HOST: ${MYSQL_DB_HOST:-${DOCKER_DB_HOST:-host.docker.internal}}
|
|
173
|
+
MYSQL_DB_PORT: ${MYSQL_DB_PORT:-${DB_PORT:-3306}}
|
|
174
|
+
MYSQL_DB_DATABASE: ${MYSQL_DB_DATABASE:-${DB_DATABASE:-zintrust}}
|
|
175
|
+
MYSQL_DB_USERNAME: ${MYSQL_DB_USERNAME:-${DB_USERNAME:-zintrust}}
|
|
176
|
+
MYSQL_DB_PASSWORD: ${MYSQL_DB_PASSWORD:-${DB_PASSWORD:-secret}}
|
|
177
|
+
networks:
|
|
178
|
+
- zintrust-network
|
|
179
|
+
|
|
180
|
+
proxy-pg:
|
|
181
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
182
|
+
build:
|
|
183
|
+
context: .
|
|
184
|
+
dockerfile: Dockerfile
|
|
185
|
+
target: runtime
|
|
186
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:postgres', '--host', '0.0.0.0', '--port', '8790']
|
|
187
|
+
expose:
|
|
188
|
+
- '8790'
|
|
189
|
+
environment:
|
|
190
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
191
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
192
|
+
APP_KEY: ${APP_KEY:-}
|
|
193
|
+
POSTGRES_PROXY_REQUIRE_SIGNING: true
|
|
194
|
+
POSTGRES_PROXY_KEY_ID: ${POSTGRES_PROXY_KEY_ID:-}
|
|
195
|
+
POSTGRES_PROXY_SECRET: ${POSTGRES_PROXY_SECRET:-}
|
|
196
|
+
POSTGRES_PROXY_SIGNING_WINDOW_MS: ${POSTGRES_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
197
|
+
DB_HOST: ${DOCKER_DB_HOST:-host.docker.internal}
|
|
198
|
+
DB_PORT_POSTGRESQL: ${POSTGRES_DB_PORT:-5432}
|
|
199
|
+
DB_DATABASE_POSTGRESQL: ${POSTGRES_DB_DATABASE:-postgres}
|
|
200
|
+
DB_USERNAME_POSTGRESQL: ${POSTGRES_DB_USERNAME:-postgres}
|
|
201
|
+
DB_PASSWORD_POSTGRESQL: ${POSTGRES_DB_PASSWORD:-postgres}
|
|
202
|
+
networks:
|
|
203
|
+
- zintrust-network
|
|
204
|
+
|
|
205
|
+
proxy-redis:
|
|
206
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
207
|
+
build:
|
|
208
|
+
context: .
|
|
209
|
+
dockerfile: Dockerfile
|
|
210
|
+
target: runtime
|
|
211
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:redis', '--host', '0.0.0.0', '--port', '8791']
|
|
212
|
+
expose:
|
|
213
|
+
- '8791'
|
|
214
|
+
environment:
|
|
215
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
216
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
217
|
+
APP_KEY: ${APP_KEY:-}
|
|
218
|
+
REDIS_PROXY_REQUIRE_SIGNING: true
|
|
219
|
+
REDIS_PROXY_KEY_ID: ${REDIS_PROXY_KEY_ID:-}
|
|
220
|
+
REDIS_PROXY_SECRET: ${REDIS_PROXY_SECRET:-}
|
|
221
|
+
REDIS_PROXY_SIGNING_WINDOW_MS: ${REDIS_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
222
|
+
REDIS_PROXY_TARGET_HOST: ${REDIS_PROXY_TARGET_HOST:-${DOCKER_REDIS_HOST:-host.docker.internal}}
|
|
223
|
+
REDIS_PROXY_TARGET_PORT: ${REDIS_PROXY_TARGET_PORT:-${REDIS_PORT:-6379}}
|
|
224
|
+
REDIS_PROXY_TARGET_PASSWORD: ${REDIS_PROXY_TARGET_PASSWORD:-${REDIS_PASSWORD:-}}
|
|
225
|
+
REDIS_PROXY_TARGET_DB: ${REDIS_PROXY_TARGET_DB:-${REDIS_DB:-0}}
|
|
226
|
+
networks:
|
|
227
|
+
- zintrust-network
|
|
228
|
+
|
|
229
|
+
proxy-mongodb:
|
|
230
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
231
|
+
build:
|
|
232
|
+
context: .
|
|
233
|
+
dockerfile: Dockerfile
|
|
234
|
+
target: runtime
|
|
235
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:mongodb', '--host', '0.0.0.0', '--port', '8792']
|
|
236
|
+
expose:
|
|
237
|
+
- '8792'
|
|
238
|
+
environment:
|
|
239
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
240
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
241
|
+
APP_KEY: ${APP_KEY:-}
|
|
242
|
+
MONGODB_PROXY_REQUIRE_SIGNING: true
|
|
243
|
+
MONGODB_PROXY_KEY_ID: ${MONGODB_PROXY_KEY_ID:-}
|
|
244
|
+
MONGODB_PROXY_SECRET: ${MONGODB_PROXY_SECRET:-}
|
|
245
|
+
MONGODB_PROXY_SIGNING_WINDOW_MS: ${MONGODB_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
246
|
+
MONGO_URI: ${MONGODB_PROXY_TARGET_URI:-mongodb://host.docker.internal:27017}
|
|
247
|
+
MONGO_DB: ${MONGODB_PROXY_TARGET_DB:-zintrust}
|
|
248
|
+
networks:
|
|
249
|
+
- zintrust-network
|
|
250
|
+
|
|
251
|
+
proxy-sqlserver:
|
|
252
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
253
|
+
build:
|
|
254
|
+
context: .
|
|
255
|
+
dockerfile: Dockerfile
|
|
256
|
+
target: runtime
|
|
257
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:sqlserver', '--host', '0.0.0.0', '--port', '8793']
|
|
258
|
+
expose:
|
|
259
|
+
- '8793'
|
|
260
|
+
environment:
|
|
261
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
262
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
263
|
+
APP_KEY: ${APP_KEY:-}
|
|
264
|
+
SQLSERVER_PROXY_REQUIRE_SIGNING: true
|
|
265
|
+
SQLSERVER_PROXY_KEY_ID: ${SQLSERVER_PROXY_KEY_ID:-}
|
|
266
|
+
SQLSERVER_PROXY_SECRET: ${SQLSERVER_PROXY_SECRET:-}
|
|
267
|
+
SQLSERVER_PROXY_SIGNING_WINDOW_MS: ${SQLSERVER_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
268
|
+
DB_HOST_MSSQL: ${SQLSERVER_DB_HOST:-host.docker.internal}
|
|
269
|
+
DB_PORT_MSSQL: ${SQLSERVER_DB_PORT:-1433}
|
|
270
|
+
DB_DATABASE_MSSQL: ${SQLSERVER_DB_DATABASE:-zintrust}
|
|
271
|
+
DB_USERNAME_MSSQL: ${SQLSERVER_DB_USERNAME:-sa}
|
|
272
|
+
DB_PASSWORD_MSSQL: ${SQLSERVER_DB_PASSWORD:-}
|
|
273
|
+
networks:
|
|
274
|
+
- zintrust-network
|
|
275
|
+
|
|
276
|
+
proxy-smtp:
|
|
277
|
+
image: ${PROXY_IMAGE:-zintrust-proxy:local}
|
|
278
|
+
build:
|
|
279
|
+
context: .
|
|
280
|
+
dockerfile: Dockerfile
|
|
281
|
+
target: runtime
|
|
282
|
+
command: ['node', 'dist/bin/zin.js', 'proxy:smtp', '--host', '0.0.0.0', '--port', '8794']
|
|
283
|
+
expose:
|
|
284
|
+
- '8794'
|
|
285
|
+
environment:
|
|
286
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
287
|
+
APP_NAME: ${APP_NAME:-ZinTrust}
|
|
288
|
+
APP_KEY: ${APP_KEY:-}
|
|
289
|
+
SMTP_PROXY_REQUIRE_SIGNING: true
|
|
290
|
+
SMTP_PROXY_KEY_ID: ${SMTP_PROXY_KEY_ID:-}
|
|
291
|
+
SMTP_PROXY_SECRET: ${SMTP_PROXY_SECRET:-}
|
|
292
|
+
SMTP_PROXY_SIGNING_WINDOW_MS: ${SMTP_PROXY_SIGNING_WINDOW_MS:-60000}
|
|
293
|
+
networks:
|
|
294
|
+
- zintrust-network
|
|
295
|
+
|
|
296
|
+
networks:
|
|
297
|
+
zintrust-network:
|
|
298
|
+
|
|
299
|
+
volumes:
|
|
300
|
+
postgres_data:
|
|
301
|
+
redis_data:
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: zintrust-schedules
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
schedules:
|
|
5
|
+
build:
|
|
6
|
+
context: .
|
|
7
|
+
dockerfile: Dockerfile
|
|
8
|
+
environment:
|
|
9
|
+
NODE_ENV: ${NODE_ENV:-development}
|
|
10
|
+
SCHEDULES_ENABLED: ${SCHEDULES_ENABLED:-true}
|
|
11
|
+
CSRF_SKIP_PATHS: ${CSRF_SKIP_PATHS:-/api/*,/queue-monitor/*}
|
|
12
|
+
|
|
13
|
+
# Scheduling
|
|
14
|
+
SCHEDULE_SHUTDOWN_TIMEOUT_MS: ${SCHEDULE_SHUTDOWN_TIMEOUT_MS:-30000}
|
|
15
|
+
SCHEDULE_OVERLAP_LOCK_TTL_MS: ${SCHEDULE_OVERLAP_LOCK_TTL_MS:-300000}
|
|
16
|
+
|
|
17
|
+
# Redis (for locks / queue / cache)
|
|
18
|
+
REDIS_HOST: ${REDIS_HOST:-redis}
|
|
19
|
+
REDIS_PORT: ${REDIS_PORT:-6379}
|
|
20
|
+
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
|
|
21
|
+
REDIS_DB: ${REDIS_DB:-0}
|
|
22
|
+
|
|
23
|
+
# Database (for job-tracking cleanup schedule)
|
|
24
|
+
DB_CONNECTION: ${DB_CONNECTION:-postgresql}
|
|
25
|
+
DB_HOST: ${DB_HOST:-postgres}
|
|
26
|
+
DB_PORT: ${DB_PORT:-5432}
|
|
27
|
+
DB_DATABASE: ${DB_DATABASE:-zintrust}
|
|
28
|
+
DB_USERNAME: ${DB_USERNAME:-zintrust}
|
|
29
|
+
DB_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
30
|
+
|
|
31
|
+
# Job tracking cleanup schedule
|
|
32
|
+
JOB_TRACKING_CLEANUP_ENABLED: ${JOB_TRACKING_CLEANUP_ENABLED:-false}
|
|
33
|
+
JOB_TRACKING_CLEANUP_INTERVAL_MS: ${JOB_TRACKING_CLEANUP_INTERVAL_MS:-21600000}
|
|
34
|
+
JOB_TRACKING_CLEANUP_RETENTION_DAYS: ${JOB_TRACKING_CLEANUP_RETENTION_DAYS:-30}
|
|
35
|
+
JOB_TRACKING_CLEANUP_BATCH_SIZE: ${JOB_TRACKING_CLEANUP_BATCH_SIZE:-5000}
|
|
36
|
+
JOB_TRACKING_CLEANUP_MAX_BATCHES: ${JOB_TRACKING_CLEANUP_MAX_BATCHES:-1}
|
|
37
|
+
JOB_TRACKING_CLEANUP_LOCK_PROVIDER: ${JOB_TRACKING_CLEANUP_LOCK_PROVIDER:-redis}
|
|
38
|
+
command: ['node', 'dist/bin/zin.js', 'schedule:start']
|
|
39
|
+
depends_on:
|
|
40
|
+
postgres:
|
|
41
|
+
condition: service_healthy
|
|
42
|
+
redis:
|
|
43
|
+
condition: service_healthy
|
|
44
|
+
networks:
|
|
45
|
+
- zintrust-network
|
|
46
|
+
|
|
47
|
+
postgres:
|
|
48
|
+
image: postgres:16-alpine
|
|
49
|
+
environment:
|
|
50
|
+
POSTGRES_DB: ${DB_DATABASE:-zintrust}
|
|
51
|
+
POSTGRES_USER: ${DB_USERNAME:-zintrust}
|
|
52
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
53
|
+
ports:
|
|
54
|
+
- '${POSTGRES_PORT:-5432}:5432'
|
|
55
|
+
volumes:
|
|
56
|
+
- postgres_data:/var/lib/postgresql/data
|
|
57
|
+
healthcheck:
|
|
58
|
+
test: ['CMD-SHELL', 'pg_isready -U ${DB_USERNAME:-zintrust}']
|
|
59
|
+
interval: 10s
|
|
60
|
+
timeout: 5s
|
|
61
|
+
retries: 5
|
|
62
|
+
networks:
|
|
63
|
+
- zintrust-network
|
|
64
|
+
|
|
65
|
+
redis:
|
|
66
|
+
image: redis:7-alpine
|
|
67
|
+
ports:
|
|
68
|
+
- '${REDIS_PORT:-6379}:6379'
|
|
69
|
+
volumes:
|
|
70
|
+
- redis_data:/data
|
|
71
|
+
healthcheck:
|
|
72
|
+
test: ['CMD', 'redis-cli', 'ping']
|
|
73
|
+
interval: 10s
|
|
74
|
+
timeout: 5s
|
|
75
|
+
retries: 5
|
|
76
|
+
networks:
|
|
77
|
+
- zintrust-network
|
|
78
|
+
|
|
79
|
+
networks:
|
|
80
|
+
zintrust-network:
|
|
81
|
+
|
|
82
|
+
volumes:
|
|
83
|
+
postgres_data:
|
|
84
|
+
redis_data:
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Manifest.d.ts","sourceRoot":"","sources":["../../../../src/toolkit/Secrets/Manifest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Manifest.d.ts","sourceRoot":"","sources":["../../../../src/toolkit/Secrets/Manifest.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,YAAY,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACvC,CAAC;AAyDF,eAAO,MAAM,QAAQ;iBACA;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,mBAAmB,CAAC;KAC/B,GAAG,OAAO,CAAC,eAAe,CAAC;EA4B5B,CAAC;AAEH,eAAe,QAAQ,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
|
+
import { isNonEmptyString, isObject } from '../../helper/index.js';
|
|
2
3
|
import { fsPromises as fs } from '../../node-singletons/fs.js';
|
|
3
4
|
import * as path from '../../node-singletons/path.js';
|
|
4
|
-
const isRecord = (value) =>
|
|
5
|
+
const isRecord = (value) => isObject(value);
|
|
5
6
|
const assertString = (value, name) => {
|
|
6
|
-
if (
|
|
7
|
+
if (!isNonEmptyString(value)) {
|
|
7
8
|
throw ErrorFactory.createCliError(`Manifest: missing/invalid ${name}`);
|
|
8
9
|
}
|
|
9
10
|
return value;
|
|
@@ -28,17 +29,14 @@ const parseKeySpec = (envKey, specUnknown) => {
|
|
|
28
29
|
if (isRecord(awsUnknown)) {
|
|
29
30
|
spec.aws = {
|
|
30
31
|
secretId: assertString(awsUnknown['secretId'], `keys.${envKey}.aws.secretId`),
|
|
31
|
-
jsonKey:
|
|
32
|
-
? awsUnknown['jsonKey']
|
|
33
|
-
: undefined,
|
|
32
|
+
jsonKey: isNonEmptyString(awsUnknown['jsonKey']) ? awsUnknown['jsonKey'] : undefined,
|
|
34
33
|
};
|
|
35
34
|
}
|
|
36
35
|
const cloudflareUnknown = specUnknown['cloudflare'];
|
|
37
36
|
if (isRecord(cloudflareUnknown)) {
|
|
38
37
|
spec.cloudflare = {
|
|
39
38
|
key: assertString(cloudflareUnknown['key'], `keys.${envKey}.cloudflare.key`),
|
|
40
|
-
namespaceId:
|
|
41
|
-
cloudflareUnknown['namespaceId'].trim() !== ''
|
|
39
|
+
namespaceId: isNonEmptyString(cloudflareUnknown['namespaceId'])
|
|
42
40
|
? cloudflareUnknown['namespaceId']
|
|
43
41
|
: undefined,
|
|
44
42
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Smtp.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Smtp.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"Smtp.d.ts","sourceRoot":"","sources":["../../../../../src/tools/mail/drivers/Smtp.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAuqBF,eAAO,MAAM,UAAU;IACrB;;;;OAIG;iBACgB,UAAU,WAAW,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;EAuDzE,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
|
@@ -85,7 +85,13 @@ const ensureSignedSettings = (settings) => {
|
|
|
85
85
|
const shouldUseProxy = () => {
|
|
86
86
|
if (Env.USE_SMTP_PROXY === true)
|
|
87
87
|
return true;
|
|
88
|
-
|
|
88
|
+
// In Cloudflare Workers, SMTP requires TCP sockets; if sockets are disabled,
|
|
89
|
+
// we must use the HTTP SMTP proxy transport when a URL is configured.
|
|
90
|
+
if (isWorkersRuntime() && Cloudflare.isCloudflareSocketsEnabled() === false) {
|
|
91
|
+
return Env.SMTP_PROXY_URL.trim() !== '';
|
|
92
|
+
}
|
|
93
|
+
// Default: do not use proxy unless explicitly enabled.
|
|
94
|
+
return false;
|
|
89
95
|
};
|
|
90
96
|
const serializeMessage = (message) => {
|
|
91
97
|
const attachments = message.attachments?.map((attachment) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobReconciliationRunner.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobReconciliationRunner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JobReconciliationRunner.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobReconciliationRunner.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,uBAAuB;yBACP,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;8CA6B3B,OAAO,CAAC,MAAM,CAAC;eAqB3C,OAAO,CAAC;QAAE,QAAQ,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;EAc/F,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
|
|
@@ -4,24 +4,6 @@ import { useDatabase } from '../../orm/Database.js';
|
|
|
4
4
|
import { JobStateTracker } from './JobStateTracker.js';
|
|
5
5
|
const getDb = () => useDatabase(undefined, Env.get('JOB_TRACKING_DB_CONNECTION', 'default'));
|
|
6
6
|
const toSqlDateTime = (value) => value.toISOString().slice(0, 19).replace('T', ' ');
|
|
7
|
-
const mapPersistedStatus = (raw) => {
|
|
8
|
-
if (typeof raw !== 'string')
|
|
9
|
-
return null;
|
|
10
|
-
const value = raw.trim().toLowerCase();
|
|
11
|
-
const allowed = [
|
|
12
|
-
'pending',
|
|
13
|
-
'active',
|
|
14
|
-
'completed',
|
|
15
|
-
'failed',
|
|
16
|
-
'stalled',
|
|
17
|
-
'timeout',
|
|
18
|
-
'pending_recovery',
|
|
19
|
-
'dead_letter',
|
|
20
|
-
'manual_review',
|
|
21
|
-
'delayed',
|
|
22
|
-
];
|
|
23
|
-
return (allowed.find((entry) => entry === value) ?? null);
|
|
24
|
-
};
|
|
25
7
|
export const JobReconciliationRunner = Object.freeze({
|
|
26
8
|
async reconcileInMemory() {
|
|
27
9
|
const timeoutMs = Math.max(1000, Env.getInt('QUEUE_JOB_TIMEOUT', 60) * 1000);
|
|
@@ -46,31 +28,17 @@ export const JobReconciliationRunner = Object.freeze({
|
|
|
46
28
|
const db = getDb();
|
|
47
29
|
const staleAfterMs = Math.max(1000, Env.getInt('JOB_RECONCILIATION_STALE_MS', 120000));
|
|
48
30
|
const cutoff = new Date(Date.now() - staleAfterMs);
|
|
49
|
-
|
|
31
|
+
// Persistence is an enqueue-fallback buffer (jobs that failed to enqueue).
|
|
32
|
+
// Do not reconcile stale 'pending'/'active' from DB: QUEUE_DRIVER is the source of truth.
|
|
33
|
+
// pending_recovery rows are handled by JobRecoveryDaemon, which performs the enqueue attempt.
|
|
34
|
+
const candidates = await db
|
|
50
35
|
.table(Env.get('JOB_TRACKING_DB_TABLE', 'zintrust_jobs'))
|
|
51
|
-
.select('queue_name', 'job_id'
|
|
52
|
-
.whereIn('status', ['
|
|
36
|
+
.select('queue_name', 'job_id')
|
|
37
|
+
.whereIn('status', ['pending_recovery'])
|
|
53
38
|
.where('updated_at', '<=', toSqlDateTime(cutoff))
|
|
54
39
|
.limit(Math.max(1, limit))
|
|
55
40
|
.get();
|
|
56
|
-
|
|
57
|
-
await Promise.all(actionableRows.map(async (row) => {
|
|
58
|
-
const status = mapPersistedStatus(row.status);
|
|
59
|
-
if (status === 'active') {
|
|
60
|
-
await JobStateTracker.stalled({
|
|
61
|
-
queueName: row.queue_name,
|
|
62
|
-
jobId: row.job_id,
|
|
63
|
-
reason: 'Persisted active job stale during reconciliation',
|
|
64
|
-
});
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
await JobStateTracker.pendingRecovery({
|
|
68
|
-
queueName: row.queue_name,
|
|
69
|
-
jobId: row.job_id,
|
|
70
|
-
reason: 'Persisted pending job stale during reconciliation',
|
|
71
|
-
});
|
|
72
|
-
}));
|
|
73
|
-
return actionableRows.length;
|
|
41
|
+
return candidates.length;
|
|
74
42
|
},
|
|
75
43
|
async runOnce() {
|
|
76
44
|
const inMemory = await this.reconcileInMemory();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobRecoveryDaemon.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobRecoveryDaemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JobRecoveryDaemon.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobRecoveryDaemon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAejF,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;AAE7F,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAuFF,eAAO,MAAM,iBAAiB;uBAElB,iBAAiB,GACxB,OAAO,CAAC,UAAU,GAAG,aAAa,GAAG,eAAe,CAAC;eA2EvC,OAAO,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;4BAkD4B,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;EA2DzE,CAAC;AAiFH,eAAe,iBAAiB,CAAC"}
|