@archlast/server 0.1.8 → 0.1.9
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/README.md +104 -100
- package/dist/admin/auth.d.ts +24 -5
- package/dist/admin/auth.js +49 -25
- package/dist/admin/schema.d.ts +122 -32
- package/dist/admin/schema.js +131 -95
- package/dist/admin/seed.d.ts +1 -1
- package/dist/admin/seed.js +79 -47
- package/dist/auth/api-key-resolver.d.ts +1 -1
- package/dist/auth/api-key-resolver.js +7 -3
- package/dist/auth/archlast-auth-adapter.d.ts +2 -5
- package/dist/auth/archlast-auth-adapter.js +1 -1
- package/dist/auth/better-auth-adapter.d.ts.map +1 -1
- package/dist/auth/better-auth-adapter.js +41 -26
- package/dist/auth/better-auth-adapter.js.map +1 -1
- package/dist/auth/better-auth-admin.d.ts.map +1 -1
- package/dist/auth/better-auth-admin.js +1 -1
- package/dist/auth/better-auth-admin.js.map +1 -1
- package/dist/auth/better-auth-api-key-resolver.js +1 -1
- package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
- package/dist/auth/better-auth-instance.d.ts +249 -301
- package/dist/auth/better-auth-instance.d.ts.map +1 -1
- package/dist/auth/better-auth-instance.js +11 -0
- package/dist/auth/better-auth-instance.js.map +1 -1
- package/dist/auth/better-auth-seed.d.ts +5 -2
- package/dist/auth/better-auth-seed.js +31 -22
- package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
- package/dist/auth/better-auth-session-adapter.js +14 -10
- package/dist/auth/better-auth-session-adapter.js.map +1 -1
- package/dist/auth/errors.d.ts.map +1 -1
- package/dist/auth/errors.js +11 -11
- package/dist/auth/errors.js.map +1 -1
- package/dist/auth/oauth-proxy.d.ts +5 -2
- package/dist/auth/oauth-proxy.js +23 -27
- package/dist/auth/resolver.d.ts.map +1 -1
- package/dist/auth/resolver.js.map +1 -1
- package/dist/auth/role-helpers.d.ts +1 -1
- package/dist/auth/role-helpers.d.ts.map +1 -1
- package/dist/auth/role-helpers.js.map +1 -1
- package/dist/auth/session-manager.d.ts +2 -5
- package/dist/auth/session-manager.js +16 -6
- package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
- package/dist/auth/system/better-auth-schema.js +6 -23
- package/dist/auth/system/better-auth-schema.js.map +1 -1
- package/dist/cache/circuit-breaker.d.ts +81 -0
- package/dist/cache/circuit-breaker.d.ts.map +1 -0
- package/dist/cache/circuit-breaker.js +170 -0
- package/dist/cache/circuit-breaker.js.map +1 -0
- package/dist/cache/client.d.ts +6 -3
- package/dist/cache/client.d.ts.map +1 -1
- package/dist/cache/client.js +12 -53
- package/dist/cache/client.js.map +1 -1
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +5 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/invalidation-queue.d.ts +63 -0
- package/dist/cache/invalidation-queue.d.ts.map +1 -0
- package/dist/cache/invalidation-queue.js +196 -0
- package/dist/cache/invalidation-queue.js.map +1 -0
- package/dist/cache/layers.d.ts +14 -4
- package/dist/cache/layers.d.ts.map +1 -1
- package/dist/cache/layers.js +66 -72
- package/dist/cache/layers.js.map +1 -1
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js +6 -41
- package/dist/cache/manager.js.map +1 -1
- package/dist/cache/protocol.d.ts +4 -39
- package/dist/cache/protocol.d.ts.map +1 -1
- package/dist/cache/protocol.js.map +1 -1
- package/dist/cache/redis-adapter.d.ts +103 -0
- package/dist/cache/redis-adapter.d.ts.map +1 -0
- package/dist/cache/redis-adapter.js +424 -0
- package/dist/cache/redis-adapter.js.map +1 -0
- package/dist/cache/run-sidecar.js +10 -1
- package/dist/cache/run-sidecar.js.map +1 -1
- package/dist/cache/sidecar-server.d.ts +51 -1
- package/dist/cache/sidecar-server.d.ts.map +1 -1
- package/dist/cache/sidecar-server.js +368 -22
- package/dist/cache/sidecar-server.js.map +1 -1
- package/dist/cache/store.d.ts +43 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +69 -76
- package/dist/cache/store.js.map +1 -1
- package/dist/cache/strategies.d.ts +2 -9
- package/dist/cache/strategies.d.ts.map +1 -1
- package/dist/cache/types.d.ts +130 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +60 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config/bullmq.d.ts +16 -0
- package/dist/config/bullmq.d.ts.map +1 -0
- package/dist/config/bullmq.js +103 -0
- package/dist/config/bullmq.js.map +1 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +80 -6
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +71 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/config/service.d.ts +54 -4
- package/dist/config/service.d.ts.map +1 -1
- package/dist/config/service.js +56 -2
- package/dist/config/service.js.map +1 -1
- package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
- package/dist/controllers/admin/admin-tokens.controller.js +117 -98
- package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
- package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
- package/dist/controllers/admin/api-keys.controller.js.map +1 -1
- package/dist/controllers/admin/app-users.controller.d.ts +274 -243
- package/dist/controllers/admin/app-users.controller.js +301 -257
- package/dist/controllers/admin/auth.controller.d.ts +260 -236
- package/dist/controllers/admin/auth.controller.js +197 -174
- package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
- package/dist/controllers/admin/backup.controller.js.map +1 -1
- package/dist/controllers/admin/settings.controller.d.ts +1 -1
- package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
- package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
- package/dist/controllers/admin/storage-stats.controller.js +33 -0
- package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
- package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
- package/dist/controllers/admin/tenants.controller.js.map +1 -1
- package/dist/controllers/admin/users.controller.d.ts +1 -1
- package/dist/controllers/admin/users.controller.d.ts.map +1 -1
- package/dist/controllers/admin/users.controller.js.map +1 -1
- package/dist/controllers/auth.controller.d.ts +289 -271
- package/dist/controllers/auth.controller.js +275 -226
- package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
- package/dist/controllers/crud-generator.controller.js +127 -125
- package/dist/controllers/crud-generator.controller.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -1
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/introspection.controller.d.ts +642 -0
- package/dist/controllers/introspection.controller.d.ts.map +1 -1
- package/dist/controllers/introspection.controller.js +611 -0
- package/dist/controllers/introspection.controller.js.map +1 -1
- package/dist/controllers/invite.controller.d.ts +190 -170
- package/dist/controllers/invite.controller.js +183 -164
- package/dist/controllers/mfa.controller.d.ts +205 -183
- package/dist/controllers/mfa.controller.js +131 -111
- package/dist/controllers/otp.controller.d.ts +194 -171
- package/dist/controllers/otp.controller.js +192 -175
- package/dist/controllers/storage.controller.d.ts.map +1 -1
- package/dist/controllers/storage.controller.js.map +1 -1
- package/dist/controllers/system.controller.d.ts +5 -3
- package/dist/controllers/system.controller.d.ts.map +1 -1
- package/dist/controllers/system.controller.js +4 -2
- package/dist/controllers/system.controller.js.map +1 -1
- package/dist/controllers/tenant.controller.d.ts +258 -227
- package/dist/controllers/tenant.controller.js +224 -200
- package/dist/db/cachedclient.d.ts +6 -11
- package/dist/db/cachedclient.d.ts.map +1 -1
- package/dist/db/cachedclient.js +79 -43
- package/dist/db/cachedclient.js.map +1 -1
- package/dist/db/distributed-client.d.ts +79 -24
- package/dist/db/distributed-client.js +23 -24
- package/dist/db/factory.d.ts +3 -8
- package/dist/db/factory.d.ts.map +1 -1
- package/dist/db/factory.js +3 -22
- package/dist/db/factory.js.map +1 -1
- package/dist/db/socket-client.d.ts +7 -0
- package/dist/db/socket-client.d.ts.map +1 -1
- package/dist/db/socket-client.js +140 -11
- package/dist/db/socket-client.js.map +1 -1
- package/dist/deployment/handler.d.ts +10 -2
- package/dist/deployment/handler.d.ts.map +1 -1
- package/dist/deployment/handler.js +70 -15
- package/dist/deployment/handler.js.map +1 -1
- package/dist/deployment/persistence.d.ts.map +1 -1
- package/dist/deployment/persistence.js +6 -1
- package/dist/deployment/persistence.js.map +1 -1
- package/dist/docker/compose.d.ts.map +1 -1
- package/dist/docker/compose.js +76 -0
- package/dist/docker/compose.js.map +1 -1
- package/dist/engine/runner.d.ts.map +1 -1
- package/dist/engine/runner.js +0 -43
- package/dist/engine/runner.js.map +1 -1
- package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
- package/dist/functions/built-in/auth-apikey.js.map +1 -1
- package/dist/functions/built-in/system-cache.d.ts.map +1 -1
- package/dist/functions/built-in/system-cache.js +6 -31
- package/dist/functions/built-in/system-cache.js.map +1 -1
- package/dist/functions/built-in/system-data.d.ts.map +1 -1
- package/dist/functions/built-in/system-data.js +4 -2
- package/dist/functions/built-in/system-data.js.map +1 -1
- package/dist/functions/definition.d.ts.map +1 -1
- package/dist/functions/definition.js +6 -2
- package/dist/functions/definition.js.map +1 -1
- package/dist/http/routes/metrics.d.ts +42 -0
- package/dist/http/routes/metrics.d.ts.map +1 -0
- package/dist/http/routes/metrics.js +29 -0
- package/dist/http/routes/metrics.js.map +1 -0
- package/dist/http/server.d.ts +1 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +41 -3
- package/dist/http/server.js.map +1 -1
- package/dist/ipc/socket-bridge.d.ts +1 -0
- package/dist/ipc/socket-bridge.d.ts.map +1 -1
- package/dist/ipc/socket-bridge.js +5 -1
- package/dist/ipc/socket-bridge.js.map +1 -1
- package/dist/jobs/bullmq-adapter.d.ts +154 -0
- package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
- package/dist/jobs/bullmq-adapter.js +688 -0
- package/dist/jobs/bullmq-adapter.js.map +1 -0
- package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
- package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
- package/dist/jobs/bullmq-circuit-breaker.js +323 -0
- package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
- package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
- package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
- package/dist/jobs/bullmq-dlq-manager.js +325 -0
- package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
- package/dist/jobs/bullmq-metrics.d.ts +104 -0
- package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
- package/dist/jobs/bullmq-metrics.js +323 -0
- package/dist/jobs/bullmq-metrics.js.map +1 -0
- package/dist/jobs/bullmq-priority-service.d.ts +173 -0
- package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
- package/dist/jobs/bullmq-priority-service.js +390 -0
- package/dist/jobs/bullmq-priority-service.js.map +1 -0
- package/dist/jobs/bullmq-scheduler.d.ts +111 -0
- package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
- package/dist/jobs/bullmq-scheduler.js +300 -0
- package/dist/jobs/bullmq-scheduler.js.map +1 -0
- package/dist/jobs/bullmq-worker.d.ts +155 -0
- package/dist/jobs/bullmq-worker.d.ts.map +1 -0
- package/dist/jobs/bullmq-worker.js +651 -0
- package/dist/jobs/bullmq-worker.js.map +1 -0
- package/dist/jobs/circuit-breaker.d.ts +120 -0
- package/dist/jobs/circuit-breaker.d.ts.map +1 -0
- package/dist/jobs/circuit-breaker.js +262 -0
- package/dist/jobs/circuit-breaker.js.map +1 -0
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/queue.d.ts +120 -1
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jobs/queue.js +487 -9
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/redis-connection.d.ts +50 -0
- package/dist/jobs/redis-connection.d.ts.map +1 -0
- package/dist/jobs/redis-connection.js +123 -0
- package/dist/jobs/redis-connection.js.map +1 -0
- package/dist/jobs/run-scheduler.js +163 -10
- package/dist/jobs/run-scheduler.js.map +1 -1
- package/dist/jobs/run-worker.js +101 -9
- package/dist/jobs/run-worker.js.map +1 -1
- package/dist/jobs/worker-thread.d.ts +6 -0
- package/dist/jobs/worker-thread.d.ts.map +1 -1
- package/dist/jobs/worker-thread.js +37 -8
- package/dist/jobs/worker-thread.js.map +1 -1
- package/dist/jobs/worker.d.ts +33 -0
- package/dist/jobs/worker.d.ts.map +1 -1
- package/dist/jobs/worker.js +358 -115
- package/dist/jobs/worker.js.map +1 -1
- package/dist/linq/async-enumerable.d.ts.map +1 -1
- package/dist/linq/async-enumerable.js.map +1 -1
- package/dist/linq/enumerable.d.ts.map +1 -1
- package/dist/linq/enumerable.js +10 -10
- package/dist/linq/enumerable.js.map +1 -1
- package/dist/metrics/collector.d.ts +26 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +103 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/polling/updates.controller.d.ts +57 -0
- package/dist/polling/updates.controller.d.ts.map +1 -0
- package/dist/polling/updates.controller.js +70 -0
- package/dist/polling/updates.controller.js.map +1 -0
- package/dist/repository/db-set.d.ts.map +1 -1
- package/dist/repository/db-set.js +12 -8
- package/dist/repository/db-set.js.map +1 -1
- package/dist/repository/ef-core.d.ts.map +1 -1
- package/dist/repository/ef-core.js +6 -6
- package/dist/repository/ef-core.js.map +1 -1
- package/dist/repository/factory.d.ts +1 -1
- package/dist/repository/factory.d.ts.map +1 -1
- package/dist/repository/factory.js.map +1 -1
- package/dist/repository/interfaces.d.ts.map +1 -1
- package/dist/repository/interfaces.js.map +1 -1
- package/dist/repository/queryable.d.ts.map +1 -1
- package/dist/repository/queryable.js.map +1 -1
- package/dist/rpc/adapter.d.ts.map +1 -1
- package/dist/rpc/adapter.js.map +1 -1
- package/dist/rpc/router.d.ts +2 -2
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/router.js +1 -1
- package/dist/rpc/router.js.map +1 -1
- package/dist/schema/relationship-types.d.ts +7 -2
- package/dist/schema/relationship-types.js +1 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/services/admin/app-users.service.d.ts +1 -1
- package/dist/services/admin/app-users.service.js +31 -38
- package/dist/services/admin/auth.service.d.ts +1 -1
- package/dist/services/admin/auth.service.js +11 -5
- package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
- package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
- package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
- package/dist/services/admin/backup/SqliteGenerator.js +8 -8
- package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
- package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
- package/dist/services/admin/backup/StorageStreamer.js +16 -55
- package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
- package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
- package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
- package/dist/services/admin/backup/ZipComposer.js +23 -0
- package/dist/services/admin/backup/ZipComposer.js.map +1 -1
- package/dist/services/admin/backup.service.d.ts.map +1 -1
- package/dist/services/admin/backup.service.js.map +1 -1
- package/dist/services/admin/data.service.d.ts.map +1 -1
- package/dist/services/admin/data.service.js +287 -286
- package/dist/services/admin/data.service.js.map +1 -1
- package/dist/services/admin/tenants.service.d.ts.map +1 -1
- package/dist/services/admin/tenants.service.js.map +1 -1
- package/dist/services/auth.service.d.ts +2 -3
- package/dist/services/auth.service.js +16 -16
- package/dist/services/invite.service.d.ts +1 -1
- package/dist/services/invite.service.js +17 -15
- package/dist/services/storage.service.d.ts.map +1 -1
- package/dist/services/storage.service.js +35 -4
- package/dist/services/storage.service.js.map +1 -1
- package/dist/services/system.service.d.ts.map +1 -1
- package/dist/services/system.service.js +1 -1
- package/dist/services/system.service.js.map +1 -1
- package/dist/services/tenant.service.d.ts +1 -1
- package/dist/services/tenant.service.js +43 -31
- package/dist/sse/subscriptions.controller.d.ts +57 -0
- package/dist/sse/subscriptions.controller.d.ts.map +1 -0
- package/dist/sse/subscriptions.controller.js +127 -0
- package/dist/sse/subscriptions.controller.js.map +1 -0
- package/dist/startup/bootstrap.d.ts +13 -2
- package/dist/startup/bootstrap.d.ts.map +1 -1
- package/dist/startup/bootstrap.js +85 -13
- package/dist/startup/bootstrap.js.map +1 -1
- package/dist/storage/s3-backend.d.ts.map +1 -1
- package/dist/storage/s3-backend.js +3 -3
- package/dist/storage/s3-backend.js.map +1 -1
- package/dist/websocket/server.d.ts.map +1 -1
- package/dist/websocket/server.js +14 -3
- package/dist/websocket/server.js.map +1 -1
- package/docker/README.md +309 -11
- package/package.json +214 -210
- package/templates/.env.example +115 -55
- package/templates/archlast.config.js +51 -37
- package/templates/docker-compose.prod.yml +32 -15
- package/templates/docker-compose.yml +117 -33
|
@@ -11,19 +11,13 @@ const runner_js_1 = require("../engine/runner.js");
|
|
|
11
11
|
const runtime_loader_js_1 = require("./runtime-loader.js");
|
|
12
12
|
const logger_js_1 = require("../logging/logger.js");
|
|
13
13
|
const manager_js_1 = require("../storage/manager.js");
|
|
14
|
-
const fs_backend_js_1 = __importDefault(require("../storage/fs-backend.js"));
|
|
15
14
|
const s3_backend_js_1 = __importDefault(require("../storage/s3-backend.js"));
|
|
16
15
|
const paths_js_1 = require("../config/paths.js");
|
|
17
16
|
const index_js_1 = require("../config/index.js");
|
|
18
17
|
const queue_js_1 = require("./queue.js");
|
|
19
18
|
const config = (0, index_js_1.loadServerConfig)();
|
|
20
19
|
(0, paths_js_1.ensureAllDbDirectories)(config.paths);
|
|
21
|
-
const storageBackend =
|
|
22
|
-
? new s3_backend_js_1.default()
|
|
23
|
-
: new fs_backend_js_1.default({
|
|
24
|
-
root: config.storage.root,
|
|
25
|
-
signingSecret: config.storage.signingSecret,
|
|
26
|
-
});
|
|
20
|
+
const storageBackend = new s3_backend_js_1.default();
|
|
27
21
|
const isWorkerThread = !Bun.isMainThread;
|
|
28
22
|
/* ---------------------- Worker-side implementation ---------------------- */
|
|
29
23
|
async function workerMain() {
|
|
@@ -106,6 +100,7 @@ class WorkerPool {
|
|
|
106
100
|
dispose() {
|
|
107
101
|
for (const h of this.pool) {
|
|
108
102
|
try {
|
|
103
|
+
this.markWorkerTerminated(h.worker);
|
|
109
104
|
h.worker.terminate();
|
|
110
105
|
}
|
|
111
106
|
catch {
|
|
@@ -122,6 +117,7 @@ class WorkerPool {
|
|
|
122
117
|
if (pendingIndex >= 0) {
|
|
123
118
|
const pending = this.inflight[pendingIndex];
|
|
124
119
|
this.inflight.splice(pendingIndex, 1);
|
|
120
|
+
this.pendingResponses.delete(res.jobId);
|
|
125
121
|
pending.resolve(res);
|
|
126
122
|
}
|
|
127
123
|
this.markIdle(worker);
|
|
@@ -139,9 +135,38 @@ class WorkerPool {
|
|
|
139
135
|
worker.onmessageerror = () => {
|
|
140
136
|
this.markIdle(worker);
|
|
141
137
|
};
|
|
138
|
+
// Note: Bun Workers don't have an 'exit' event property
|
|
139
|
+
// Worker termination is tracked through safePostMessage() errors
|
|
140
|
+
// and the dispose() method which calls worker.terminate()
|
|
142
141
|
return worker;
|
|
143
142
|
}
|
|
144
143
|
inflight = [];
|
|
144
|
+
workersTerminated = new Set();
|
|
145
|
+
pendingResponses = new Map();
|
|
146
|
+
isWorkerAlive(worker) {
|
|
147
|
+
return !this.workersTerminated.has(worker);
|
|
148
|
+
}
|
|
149
|
+
markWorkerTerminated(worker) {
|
|
150
|
+
this.workersTerminated.add(worker);
|
|
151
|
+
}
|
|
152
|
+
safePostMessage(worker, message) {
|
|
153
|
+
if (!this.isWorkerAlive(worker)) {
|
|
154
|
+
console.error("[WorkerPool] Cannot post to terminated worker");
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
worker.postMessage(message);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
if (err instanceof Error && err.message.includes("terminated")) {
|
|
163
|
+
console.error("[WorkerPool] postMessage failed:", err.message);
|
|
164
|
+
this.markWorkerTerminated(worker);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
145
170
|
drain() {
|
|
146
171
|
for (const handle of this.pool) {
|
|
147
172
|
if (this.queue.length === 0)
|
|
@@ -159,9 +184,13 @@ class WorkerPool {
|
|
|
159
184
|
payload: job.payload,
|
|
160
185
|
};
|
|
161
186
|
this.inflight.push({ ...job, worker: handle.worker });
|
|
162
|
-
|
|
187
|
+
this.pendingResponses.set(job.jobId, { resolve: job.resolve, reject: job.reject });
|
|
188
|
+
this.safePostMessage(handle.worker, msg);
|
|
163
189
|
}
|
|
164
190
|
}
|
|
191
|
+
hasPendingResponses() {
|
|
192
|
+
return this.pendingResponses.size > 0;
|
|
193
|
+
}
|
|
165
194
|
markIdle(worker) {
|
|
166
195
|
const handle = this.pool.find((h) => h.worker === worker);
|
|
167
196
|
if (handle)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-thread.js","sourceRoot":"","sources":["../../src/jobs/worker-thread.ts"],"names":[],"mappings":";;;;;;AAEA,qDAAyD;AACzD,iDAAwD;AACxD,2DAA6D;AAC7D,mDAAsD;AACtD,2DAAkD;AAClD,oDAA8C;AAC9C,sDAAuD;AACvD,6EAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"worker-thread.js","sourceRoot":"","sources":["../../src/jobs/worker-thread.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs/worker.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { JobQueue } from "./queue.js";
|
|
2
2
|
import type { IpcClient } from "../ipc/socket-bridge.js";
|
|
3
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when a job exceeds its timeout duration
|
|
6
|
+
*/
|
|
7
|
+
export declare class JobTimeoutError extends Error {
|
|
8
|
+
constructor(jobName: string, timeoutMs: number);
|
|
9
|
+
}
|
|
3
10
|
type JobHandler<Payload = any> = (payload: Payload) => Promise<void | {
|
|
4
11
|
affectedQueries?: Set<string> | string[];
|
|
5
12
|
affectedKeys?: Set<string> | string[];
|
|
@@ -23,8 +30,34 @@ export declare function setEngineDispatcher(dispatcher: {
|
|
|
23
30
|
* Must be called before start().
|
|
24
31
|
*/
|
|
25
32
|
export declare function initWorker(jobQueue: JobQueue, ipcClient?: IpcClient): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get the number of active jobs being processed
|
|
35
|
+
*/
|
|
36
|
+
export declare function getActiveJobsCount(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Get the IDs of all active jobs being processed
|
|
39
|
+
*/
|
|
40
|
+
export declare function getActiveJobIds(): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Stop the worker from claiming new jobs
|
|
43
|
+
* Used for graceful shutdown initiation
|
|
44
|
+
*/
|
|
45
|
+
export declare function stopWorker(): void;
|
|
26
46
|
/** Entrypoint */
|
|
27
47
|
declare function main(): Promise<void>;
|
|
28
48
|
export declare const start: typeof main;
|
|
29
49
|
export type { JobHandler };
|
|
50
|
+
/**
|
|
51
|
+
* Get circuit breaker instance (for monitoring/management)
|
|
52
|
+
* Returns null if circuit breaker is disabled
|
|
53
|
+
*/
|
|
54
|
+
export declare function getCircuitBreaker(): CircuitBreaker | null;
|
|
55
|
+
/**
|
|
56
|
+
* Check if circuit breaker is enabled
|
|
57
|
+
*/
|
|
58
|
+
export declare function isCircuitBreakerEnabled(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Check if worker is stopped
|
|
61
|
+
*/
|
|
62
|
+
export declare function isStopped(): boolean;
|
|
30
63
|
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAGjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,KAAK,UAAU,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,GAAG;IAClE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;IACzC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACzC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAM,CAAC;AAE5D,wBAAgB,eAAe,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,QAExF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,QAEzC;AAED,wBAAgB,WAAW,oCAE1B;AAMD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC1F,QAEA;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAGjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EACH,cAAc,EAGjB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAIjD;AAED,KAAK,UAAU,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,GAAG;IAClE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;IACzC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CACzC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAM,CAAC;AAE5D,wBAAgB,eAAe,CAAC,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,QAExF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,QAEzC;AAED,wBAAgB,WAAW,oCAE1B;AAMD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC1F,QAEA;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,QA2BnE;AA4UD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8ED,iBAAiB;AACjB,iBAAe,IAAI,kBAsBlB;AAED,eAAO,MAAM,KAAK,aAAO,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC"}
|