bunqueue 1.9.7 → 1.9.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/dist/application/backgroundTasks.d.ts +3 -6
- package/dist/application/backgroundTasks.d.ts.map +1 -1
- package/dist/application/backgroundTasks.js +10 -179
- package/dist/application/backgroundTasks.js.map +1 -1
- package/dist/application/cleanupTasks.d.ts +1 -1
- package/dist/application/cleanupTasks.d.ts.map +1 -1
- package/dist/application/cleanupTasks.js +61 -22
- package/dist/application/cleanupTasks.js.map +1 -1
- package/dist/application/clientTracking.d.ts +22 -0
- package/dist/application/clientTracking.d.ts.map +1 -0
- package/dist/application/clientTracking.js +118 -0
- package/dist/application/clientTracking.js.map +1 -0
- package/dist/application/contextFactory.d.ts +97 -0
- package/dist/application/contextFactory.d.ts.map +1 -0
- package/dist/application/contextFactory.js +170 -0
- package/dist/application/contextFactory.js.map +1 -0
- package/dist/application/dependencyProcessor.d.ts +11 -0
- package/dist/application/dependencyProcessor.d.ts.map +1 -0
- package/dist/application/dependencyProcessor.js +69 -0
- package/dist/application/dependencyProcessor.js.map +1 -0
- package/dist/application/dlqManager.d.ts +12 -0
- package/dist/application/dlqManager.d.ts.map +1 -1
- package/dist/application/dlqManager.js +36 -0
- package/dist/application/dlqManager.js.map +1 -1
- package/dist/application/lockManager.d.ts +3 -49
- package/dist/application/lockManager.d.ts.map +1 -1
- package/dist/application/lockManager.js +101 -272
- package/dist/application/lockManager.js.map +1 -1
- package/dist/application/lockOperations.d.ts +39 -0
- package/dist/application/lockOperations.d.ts.map +1 -0
- package/dist/application/lockOperations.js +101 -0
- package/dist/application/lockOperations.js.map +1 -0
- package/dist/application/operations/ack.d.ts +1 -5
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js +43 -259
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/ackHelpers.d.ts +79 -0
- package/dist/application/operations/ackHelpers.d.ts.map +1 -0
- package/dist/application/operations/ackHelpers.js +173 -0
- package/dist/application/operations/ackHelpers.js.map +1 -0
- package/dist/application/operations/jobManagement.d.ts +2 -0
- package/dist/application/operations/jobManagement.d.ts.map +1 -1
- package/dist/application/operations/jobManagement.js +8 -0
- package/dist/application/operations/jobManagement.js.map +1 -1
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +20 -6
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/operations/queryOperations.d.ts +11 -0
- package/dist/application/operations/queryOperations.d.ts.map +1 -1
- package/dist/application/operations/queryOperations.js +32 -0
- package/dist/application/operations/queryOperations.js.map +1 -1
- package/dist/application/queueManager.d.ts +3 -11
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +98 -244
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/stallDetection.d.ts +11 -0
- package/dist/application/stallDetection.d.ts.map +1 -0
- package/dist/application/stallDetection.js +128 -0
- package/dist/application/stallDetection.js.map +1 -0
- package/dist/application/types.js +1 -1
- package/dist/application/types.js.map +1 -1
- package/dist/cli/client.d.ts +3 -5
- package/dist/cli/client.d.ts.map +1 -1
- package/dist/cli/client.js +31 -27
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/core.js +3 -3
- package/dist/cli/commands/core.js.map +1 -1
- package/dist/cli/commands/job.js +14 -14
- package/dist/cli/commands/job.js.map +1 -1
- package/dist/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +5 -29
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/client/events.d.ts +0 -1
- package/dist/client/events.d.ts.map +1 -1
- package/dist/client/events.js +4 -7
- package/dist/client/events.js.map +1 -1
- package/dist/client/flow.d.ts +23 -1
- package/dist/client/flow.d.ts.map +1 -1
- package/dist/client/flow.js +166 -68
- package/dist/client/flow.js.map +1 -1
- package/dist/client/queue/queue.d.ts.map +1 -1
- package/dist/client/queue/queue.js +3 -1
- package/dist/client/queue/queue.js.map +1 -1
- package/dist/client/sandboxed/types.d.ts +1 -0
- package/dist/client/sandboxed/types.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.d.ts +1 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.js +31 -8
- package/dist/client/sandboxed/worker.js.map +1 -1
- package/dist/client/sandboxed/wrapper.d.ts.map +1 -1
- package/dist/client/sandboxed/wrapper.js +10 -1
- package/dist/client/sandboxed/wrapper.js.map +1 -1
- package/dist/client/tcp/client.d.ts +4 -1
- package/dist/client/tcp/client.d.ts.map +1 -1
- package/dist/client/tcp/client.js +26 -8
- package/dist/client/tcp/client.js.map +1 -1
- package/dist/client/tcp/connection.d.ts +6 -8
- package/dist/client/tcp/connection.d.ts.map +1 -1
- package/dist/client/tcp/connection.js +24 -22
- package/dist/client/tcp/connection.js.map +1 -1
- package/dist/client/tcp/index.d.ts +0 -1
- package/dist/client/tcp/index.d.ts.map +1 -1
- package/dist/client/tcp/index.js +0 -1
- package/dist/client/tcp/index.js.map +1 -1
- package/dist/client/tcp/types.d.ts +8 -13
- package/dist/client/tcp/types.d.ts.map +1 -1
- package/dist/client/tcp/types.js +0 -1
- package/dist/client/tcp/types.js.map +1 -1
- package/dist/client/tcpPool.d.ts.map +1 -1
- package/dist/client/tcpPool.js +0 -6
- package/dist/client/tcpPool.js.map +1 -1
- package/dist/client/worker/ackBatcher.d.ts +1 -1
- package/dist/client/worker/ackBatcher.d.ts.map +1 -1
- package/dist/client/worker/ackBatcher.js +20 -18
- package/dist/client/worker/ackBatcher.js.map +1 -1
- package/dist/client/worker/jobParser.d.ts.map +1 -1
- package/dist/client/worker/jobParser.js +8 -7
- package/dist/client/worker/jobParser.js.map +1 -1
- package/dist/client/worker/processor.d.ts.map +1 -1
- package/dist/client/worker/processor.js +10 -6
- package/dist/client/worker/processor.js.map +1 -1
- package/dist/domain/queue/dependencyTracker.d.ts +74 -0
- package/dist/domain/queue/dependencyTracker.d.ts.map +1 -0
- package/dist/domain/queue/dependencyTracker.js +126 -0
- package/dist/domain/queue/dependencyTracker.js.map +1 -0
- package/dist/domain/queue/dlqShard.d.ts +61 -0
- package/dist/domain/queue/dlqShard.d.ts.map +1 -0
- package/dist/domain/queue/dlqShard.js +175 -0
- package/dist/domain/queue/dlqShard.js.map +1 -0
- package/dist/domain/queue/limiterManager.d.ts +44 -0
- package/dist/domain/queue/limiterManager.d.ts.map +1 -0
- package/dist/domain/queue/limiterManager.js +99 -0
- package/dist/domain/queue/limiterManager.js.map +1 -0
- package/dist/domain/queue/shard.d.ts +33 -124
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +157 -427
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/queue/temporalManager.d.ts +82 -0
- package/dist/domain/queue/temporalManager.d.ts.map +1 -0
- package/dist/domain/queue/temporalManager.js +150 -0
- package/dist/domain/queue/temporalManager.js.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts +32 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.js +87 -0
- package/dist/domain/queue/uniqueKeyManager.js.map +1 -0
- package/dist/domain/types/command.d.ts +6 -0
- package/dist/domain/types/command.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.d.ts +3 -40
- package/dist/infrastructure/backup/s3Backup.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.js +10 -182
- package/dist/infrastructure/backup/s3Backup.js.map +1 -1
- package/dist/infrastructure/backup/s3BackupConfig.d.ts +67 -0
- package/dist/infrastructure/backup/s3BackupConfig.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupConfig.js +48 -0
- package/dist/infrastructure/backup/s3BackupConfig.js.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts +23 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.js +170 -0
- package/dist/infrastructure/backup/s3BackupOperations.js.map +1 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +6 -13
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +28 -179
- package/dist/infrastructure/persistence/sqlite.js.map +1 -1
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +38 -0
- package/dist/infrastructure/persistence/sqliteBatch.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteBatch.js +124 -0
- package/dist/infrastructure/persistence/sqliteBatch.js.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts +17 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js +81 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js.map +1 -0
- package/dist/infrastructure/persistence/statements.d.ts +1 -1
- package/dist/infrastructure/persistence/statements.d.ts.map +1 -1
- package/dist/infrastructure/persistence/statements.js +3 -2
- package/dist/infrastructure/persistence/statements.js.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +7 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.js +23 -3
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
- package/dist/infrastructure/server/handler.d.ts.map +1 -1
- package/dist/infrastructure/server/handler.js +1 -186
- package/dist/infrastructure/server/handler.js.map +1 -1
- package/dist/infrastructure/server/handlerRoutes.d.ts +23 -0
- package/dist/infrastructure/server/handlerRoutes.d.ts.map +1 -0
- package/dist/infrastructure/server/handlerRoutes.js +190 -0
- package/dist/infrastructure/server/handlerRoutes.js.map +1 -0
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/core.js +26 -19
- package/dist/infrastructure/server/handlers/core.js.map +1 -1
- package/dist/infrastructure/server/http.d.ts +4 -25
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +68 -285
- package/dist/infrastructure/server/http.js.map +1 -1
- package/dist/infrastructure/server/httpEndpoints.d.ts +19 -0
- package/dist/infrastructure/server/httpEndpoints.d.ts.map +1 -0
- package/dist/infrastructure/server/httpEndpoints.js +151 -0
- package/dist/infrastructure/server/httpEndpoints.js.map +1 -0
- package/dist/infrastructure/server/protocol.d.ts +15 -1
- package/dist/infrastructure/server/protocol.d.ts.map +1 -1
- package/dist/infrastructure/server/protocol.js +37 -3
- package/dist/infrastructure/server/protocol.js.map +1 -1
- package/dist/infrastructure/server/sseHandler.d.ts +27 -0
- package/dist/infrastructure/server/sseHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/sseHandler.js +77 -0
- package/dist/infrastructure/server/sseHandler.js.map +1 -0
- package/dist/infrastructure/server/tcp.d.ts +8 -10
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +51 -42
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/infrastructure/server/wsHandler.d.ts +31 -0
- package/dist/infrastructure/server/wsHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/wsHandler.js +63 -0
- package/dist/infrastructure/server/wsHandler.js.map +1 -0
- package/dist/main.js +2 -4
- package/dist/main.js.map +1 -1
- package/dist/mcp/index.js +3 -465
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcpHandlers.d.ts +129 -0
- package/dist/mcp/mcpHandlers.d.ts.map +1 -0
- package/dist/mcp/mcpHandlers.js +204 -0
- package/dist/mcp/mcpHandlers.js.map +1 -0
- package/dist/mcp/mcpTools.d.ts +15 -0
- package/dist/mcp/mcpTools.d.ts.map +1 -0
- package/dist/mcp/mcpTools.js +277 -0
- package/dist/mcp/mcpTools.js.map +1 -0
- package/dist/shared/lru.d.ts +23 -0
- package/dist/shared/lru.d.ts.map +1 -1
- package/dist/shared/lru.js +61 -3
- package/dist/shared/lru.js.map +1 -1
- package/dist/shared/skipList.d.ts +10 -2
- package/dist/shared/skipList.d.ts.map +1 -1
- package/dist/shared/skipList.js +22 -1
- package/dist/shared/skipList.js.map +1 -1
- package/package.json +2 -2
- package/dist/cli/dashboard.d.ts +0 -32
- package/dist/cli/dashboard.d.ts.map +0 -1
- package/dist/cli/dashboard.js +0 -183
- package/dist/cli/dashboard.js.map +0 -1
- package/dist/client/tcp/lineBuffer.d.ts +0 -17
- package/dist/client/tcp/lineBuffer.d.ts.map +0 -1
- package/dist/client/tcp/lineBuffer.js +0 -32
- package/dist/client/tcp/lineBuffer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/server/handlers/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ/C,0BAA0B;AAC1B,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/server/handlers/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ/C,0BAA0B;AAC1B,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAyDnB;AAED,wCAAwC;AACxC,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,EACvC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED,0BAA0B;AAC1B,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CA6BnB;AAED,gFAAgF;AAChF,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,EACvC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAkCnB;AAED,yBAAyB;AACzB,wBAAsB,SAAS,CAC7B,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED,6EAA6E;AAC7E,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CA0BnB;AAED,0BAA0B;AAC1B,wBAAsB,UAAU,CAC9B,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,GAAG,EAAE,cAAc,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
|
|
@@ -35,25 +35,32 @@ export async function handlePush(cmd, ctx, reqId) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
38
|
+
try {
|
|
39
|
+
const job = await ctx.queueManager.push(cmd.queue, {
|
|
40
|
+
data: cmd.data,
|
|
41
|
+
priority: cmd.priority,
|
|
42
|
+
delay: cmd.delay,
|
|
43
|
+
maxAttempts: cmd.maxAttempts,
|
|
44
|
+
backoff: cmd.backoff,
|
|
45
|
+
ttl: cmd.ttl,
|
|
46
|
+
timeout: cmd.timeout,
|
|
47
|
+
uniqueKey: cmd.uniqueKey,
|
|
48
|
+
customId: cmd.jobId,
|
|
49
|
+
dependsOn: cmd.dependsOn?.map((id) => jobId(id)),
|
|
50
|
+
tags: cmd.tags,
|
|
51
|
+
groupId: cmd.groupId,
|
|
52
|
+
lifo: cmd.lifo,
|
|
53
|
+
removeOnComplete: cmd.removeOnComplete,
|
|
54
|
+
removeOnFail: cmd.removeOnFail,
|
|
55
|
+
durable: cmd.durable,
|
|
56
|
+
repeat: cmd.repeat,
|
|
57
|
+
});
|
|
58
|
+
return resp.ok(job.id, reqId);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
62
|
+
return resp.error(message, reqId);
|
|
63
|
+
}
|
|
57
64
|
}
|
|
58
65
|
/** Handle PUSHB (batch push) command */
|
|
59
66
|
export async function handlePushBatch(cmd, ctx, reqId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/infrastructure/server/handlers/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,IAAI,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAElD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,0BAA0B;AAC1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAsC,EACtC,GAAmB,EACnB,KAAc;IAEd,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAErD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEnD,0BAA0B;IAC1B,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC;IACH,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEzD,sCAAsC;IACtC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,MAAM,GACV,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC5C,GAAG,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/infrastructure/server/handlers/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,47 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Server, ServerWebSocket } from 'bun';
|
|
6
6
|
import type { QueueManager } from '../../application/queueManager';
|
|
7
|
+
import { type WsData } from './wsHandler';
|
|
7
8
|
/** HTTP Server configuration */
|
|
8
9
|
export interface HttpServerConfig {
|
|
9
|
-
/** HTTP port (ignored if socketPath is set) */
|
|
10
10
|
port?: number;
|
|
11
|
-
/** Hostname to bind (ignored if socketPath is set) */
|
|
12
11
|
hostname?: string;
|
|
13
|
-
/** Unix socket path (takes priority over port/hostname) */
|
|
14
12
|
socketPath?: string;
|
|
15
|
-
/** Auth tokens for authentication */
|
|
16
13
|
authTokens?: string[];
|
|
17
|
-
/** CORS allowed origins */
|
|
18
14
|
corsOrigins?: string[];
|
|
19
|
-
/** Require auth for metrics endpoint */
|
|
20
15
|
requireAuthForMetrics?: boolean;
|
|
21
16
|
}
|
|
22
|
-
/** WebSocket client data */
|
|
23
|
-
interface WsData {
|
|
24
|
-
id: string;
|
|
25
|
-
authenticated: boolean;
|
|
26
|
-
queueFilter: string | null;
|
|
27
|
-
}
|
|
28
|
-
/** SSE client tracking */
|
|
29
|
-
interface SseClient {
|
|
30
|
-
id: string;
|
|
31
|
-
controller: ReadableStreamDefaultController;
|
|
32
|
-
queueFilter: string | null;
|
|
33
|
-
}
|
|
34
17
|
/**
|
|
35
18
|
* Create and start HTTP server
|
|
36
19
|
*/
|
|
37
20
|
export declare function createHttpServer(queueManager: QueueManager, config: HttpServerConfig): {
|
|
38
21
|
server: Server<WsData>;
|
|
39
22
|
wsClients: Map<string, ServerWebSocket<WsData>>;
|
|
40
|
-
sseClients: Map<string, SseClient>;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
/** Get SSE client count */
|
|
44
|
-
getSseClientCount(): number;
|
|
45
|
-
/** Stop the server */
|
|
23
|
+
sseClients: Map<string, import("./sseHandler").SseClient>;
|
|
24
|
+
getWsClientCount: () => number;
|
|
25
|
+
getSseClientCount: () => number;
|
|
46
26
|
stop(): void;
|
|
47
27
|
};
|
|
48
28
|
export type HttpServer = ReturnType<typeof createHttpServer>;
|
|
49
|
-
export {};
|
|
50
29
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/server/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/server/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAOnE,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAuBrD,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB;;;;;;YA2KzE,IAAI;EAMf;AAqFD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -3,18 +3,14 @@
|
|
|
3
3
|
* REST API and WebSocket support
|
|
4
4
|
*/
|
|
5
5
|
import { handleCommand } from './handler';
|
|
6
|
-
import { parseCommand, serializeResponse, errorResponse } from './protocol';
|
|
7
6
|
import { constantTimeEqual, uuid } from '../../shared/hash';
|
|
8
|
-
import { httpLog
|
|
7
|
+
import { httpLog } from '../../shared/logger';
|
|
9
8
|
import { getRateLimiter } from './rateLimiter';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/** Singleton TextDecoder for WebSocket messages */
|
|
14
|
-
const textDecoder = new TextDecoder();
|
|
9
|
+
import { SseHandler } from './sseHandler';
|
|
10
|
+
import { WsHandler } from './wsHandler';
|
|
11
|
+
import { jsonResponse, corsResponse, healthEndpoint, gcEndpoint, heapStatsEndpoint, statsEndpoint, metricsEndpoint, } from './httpEndpoints';
|
|
15
12
|
/**
|
|
16
|
-
* Validate auth token against valid tokens set
|
|
17
|
-
* Uses constant-time comparison to prevent timing attacks
|
|
13
|
+
* Validate auth token against valid tokens set
|
|
18
14
|
*/
|
|
19
15
|
function validateAuthToken(token, authTokens) {
|
|
20
16
|
for (const validToken of authTokens) {
|
|
@@ -29,37 +25,16 @@ function validateAuthToken(token, authTokens) {
|
|
|
29
25
|
*/
|
|
30
26
|
export function createHttpServer(queueManager, config) {
|
|
31
27
|
const authTokens = new Set(config.authTokens ?? []);
|
|
32
|
-
const wsClients = new Map();
|
|
33
|
-
const sseClients = new Map();
|
|
34
28
|
const corsOrigins = new Set(config.corsOrigins ?? ['*']);
|
|
35
|
-
|
|
29
|
+
const wsHandler = new WsHandler();
|
|
30
|
+
const sseHandler = new SseHandler();
|
|
31
|
+
// Subscribe to queue events for broadcast
|
|
36
32
|
queueManager.subscribe((event) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (const [, ws] of wsClients) {
|
|
40
|
-
if (!ws.data.queueFilter || ws.data.queueFilter === event.queue) {
|
|
41
|
-
ws.send(message);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// SSE clients
|
|
45
|
-
const sseMessage = `data: ${message}\n\n`;
|
|
46
|
-
const disconnectedClients = [];
|
|
47
|
-
for (const [clientId, client] of sseClients) {
|
|
48
|
-
if (!client.queueFilter || client.queueFilter === event.queue) {
|
|
49
|
-
try {
|
|
50
|
-
client.controller.enqueue(textEncoder.encode(sseMessage));
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// Client disconnected, mark for removal
|
|
54
|
-
disconnectedClients.push(clientId);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// Remove disconnected clients
|
|
59
|
-
for (const clientId of disconnectedClients) {
|
|
60
|
-
sseClients.delete(clientId);
|
|
61
|
-
}
|
|
33
|
+
wsHandler.broadcast(event);
|
|
34
|
+
sseHandler.broadcast(event);
|
|
62
35
|
});
|
|
36
|
+
// Helper to get CORS origin string
|
|
37
|
+
const getCorsOrigin = () => (corsOrigins.has('*') ? '*' : Array.from(corsOrigins).join(', '));
|
|
63
38
|
// Fetch handler
|
|
64
39
|
const fetch = async (req, server) => {
|
|
65
40
|
const url = new URL(req.url);
|
|
@@ -68,101 +43,24 @@ export function createHttpServer(queueManager, config) {
|
|
|
68
43
|
if (req.method === 'OPTIONS') {
|
|
69
44
|
return corsResponse(corsOrigins);
|
|
70
45
|
}
|
|
71
|
-
// Health
|
|
46
|
+
// Health endpoints (no auth, no rate limit)
|
|
72
47
|
if (path === '/health') {
|
|
73
|
-
|
|
74
|
-
const uptime = process.uptime();
|
|
75
|
-
const memoryUsage = process.memoryUsage();
|
|
76
|
-
return jsonResponse({
|
|
77
|
-
ok: true,
|
|
78
|
-
status: 'healthy',
|
|
79
|
-
uptime: Math.floor(uptime),
|
|
80
|
-
version: VERSION,
|
|
81
|
-
queues: {
|
|
82
|
-
waiting: stats.waiting,
|
|
83
|
-
active: stats.active,
|
|
84
|
-
delayed: stats.delayed,
|
|
85
|
-
completed: stats.completed,
|
|
86
|
-
dlq: stats.dlq,
|
|
87
|
-
},
|
|
88
|
-
connections: {
|
|
89
|
-
tcp: 0, // Would need server reference
|
|
90
|
-
ws: wsClients.size,
|
|
91
|
-
sse: sseClients.size,
|
|
92
|
-
},
|
|
93
|
-
memory: {
|
|
94
|
-
heapUsed: Math.round(memoryUsage.heapUsed / 1024 / 1024),
|
|
95
|
-
heapTotal: Math.round(memoryUsage.heapTotal / 1024 / 1024),
|
|
96
|
-
rss: Math.round(memoryUsage.rss / 1024 / 1024),
|
|
97
|
-
},
|
|
98
|
-
});
|
|
48
|
+
return healthEndpoint(queueManager, wsHandler.size, sseHandler.size);
|
|
99
49
|
}
|
|
100
|
-
// Simple liveness probe (minimal response)
|
|
101
50
|
if (path === '/healthz' || path === '/live') {
|
|
102
51
|
return new Response('OK', { status: 200 });
|
|
103
52
|
}
|
|
104
|
-
// Readiness probe (checks if server can accept work)
|
|
105
53
|
if (path === '/ready') {
|
|
106
54
|
return jsonResponse({ ok: true, ready: true });
|
|
107
55
|
}
|
|
108
|
-
//
|
|
56
|
+
// Debug endpoints
|
|
109
57
|
if (path === '/gc' && req.method === 'POST') {
|
|
110
|
-
|
|
111
|
-
if (typeof Bun !== 'undefined' && Bun.gc) {
|
|
112
|
-
Bun.gc(true); // Aggressive GC
|
|
113
|
-
}
|
|
114
|
-
queueManager.compactMemory();
|
|
115
|
-
const after = process.memoryUsage();
|
|
116
|
-
return jsonResponse({
|
|
117
|
-
ok: true,
|
|
118
|
-
before: {
|
|
119
|
-
heapUsed: Math.round(before.heapUsed / 1024 / 1024),
|
|
120
|
-
heapTotal: Math.round(before.heapTotal / 1024 / 1024),
|
|
121
|
-
rss: Math.round(before.rss / 1024 / 1024),
|
|
122
|
-
},
|
|
123
|
-
after: {
|
|
124
|
-
heapUsed: Math.round(after.heapUsed / 1024 / 1024),
|
|
125
|
-
heapTotal: Math.round(after.heapTotal / 1024 / 1024),
|
|
126
|
-
rss: Math.round(after.rss / 1024 / 1024),
|
|
127
|
-
},
|
|
128
|
-
});
|
|
58
|
+
return gcEndpoint(queueManager);
|
|
129
59
|
}
|
|
130
|
-
// Heap statistics (for debugging memory leaks)
|
|
131
60
|
if (path === '/heapstats' && req.method === 'GET') {
|
|
132
|
-
|
|
133
|
-
if (typeof Bun !== 'undefined' && Bun.gc) {
|
|
134
|
-
Bun.gc(true);
|
|
135
|
-
}
|
|
136
|
-
// Get heap stats from bun:jsc
|
|
137
|
-
const { heapStats } = await import('bun:jsc');
|
|
138
|
-
const stats = heapStats();
|
|
139
|
-
const mem = process.memoryUsage();
|
|
140
|
-
const memStats = queueManager.getMemoryStats();
|
|
141
|
-
// Get top object types by count
|
|
142
|
-
const typeCounts = stats.objectTypeCounts;
|
|
143
|
-
const topTypes = typeCounts
|
|
144
|
-
? Object.entries(typeCounts)
|
|
145
|
-
.sort((a, b) => b[1] - a[1])
|
|
146
|
-
.slice(0, 20)
|
|
147
|
-
.map(([type, count]) => ({ type, count }))
|
|
148
|
-
: [];
|
|
149
|
-
return jsonResponse({
|
|
150
|
-
ok: true,
|
|
151
|
-
memory: {
|
|
152
|
-
heapUsed: Math.round(mem.heapUsed / 1024 / 1024),
|
|
153
|
-
heapTotal: Math.round(mem.heapTotal / 1024 / 1024),
|
|
154
|
-
rss: Math.round(mem.rss / 1024 / 1024),
|
|
155
|
-
},
|
|
156
|
-
heap: {
|
|
157
|
-
objectCount: stats.objectCount,
|
|
158
|
-
protectedCount: stats.protectedObjectCount,
|
|
159
|
-
globalCount: stats.globalObjectCount,
|
|
160
|
-
},
|
|
161
|
-
collections: memStats,
|
|
162
|
-
topObjectTypes: topTypes,
|
|
163
|
-
});
|
|
61
|
+
return heapStatsEndpoint(queueManager);
|
|
164
62
|
}
|
|
165
|
-
// Rate limiting
|
|
63
|
+
// Rate limiting
|
|
166
64
|
const clientIp = req.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ??
|
|
167
65
|
req.headers.get('x-real-ip') ??
|
|
168
66
|
'unknown';
|
|
@@ -171,25 +69,23 @@ export function createHttpServer(queueManager, config) {
|
|
|
171
69
|
}
|
|
172
70
|
// WebSocket upgrade
|
|
173
71
|
if (path === '/ws' || path.startsWith('/ws/')) {
|
|
72
|
+
// Validate auth token if authentication is required
|
|
73
|
+
if (authTokens.size > 0) {
|
|
74
|
+
const token = req.headers.get('Authorization')?.replace('Bearer ', '') ?? '';
|
|
75
|
+
if (!validateAuthToken(token, authTokens)) {
|
|
76
|
+
return jsonResponse({ ok: false, error: 'Unauthorized' }, 401);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
174
79
|
const queueFilter = path.startsWith('/ws/queues/') ? path.slice('/ws/queues/'.length) : null;
|
|
175
80
|
const upgraded = server.upgrade(req, {
|
|
176
|
-
data: {
|
|
177
|
-
id: uuid(),
|
|
178
|
-
authenticated: authTokens.size === 0,
|
|
179
|
-
queueFilter,
|
|
180
|
-
},
|
|
81
|
+
data: { id: uuid(), authenticated: true, queueFilter },
|
|
181
82
|
});
|
|
182
|
-
|
|
183
|
-
return new Response('WebSocket upgrade failed', { status: 400 });
|
|
184
|
-
}
|
|
185
|
-
return undefined;
|
|
83
|
+
return upgraded ? undefined : new Response('WebSocket upgrade failed', { status: 400 });
|
|
186
84
|
}
|
|
187
|
-
// SSE
|
|
85
|
+
// SSE endpoint
|
|
188
86
|
if (path === '/events' || path.startsWith('/events/')) {
|
|
189
|
-
// Check authentication for SSE
|
|
190
87
|
if (authTokens.size > 0) {
|
|
191
|
-
const
|
|
192
|
-
const token = authHeader?.replace('Bearer ', '') ?? '';
|
|
88
|
+
const token = req.headers.get('Authorization')?.replace('Bearer ', '') ?? '';
|
|
193
89
|
if (!validateAuthToken(token, authTokens)) {
|
|
194
90
|
return jsonResponse({ ok: false, error: 'Unauthorized' }, 401);
|
|
195
91
|
}
|
|
@@ -197,61 +93,30 @@ export function createHttpServer(queueManager, config) {
|
|
|
197
93
|
const queueFilter = path.startsWith('/events/queues/')
|
|
198
94
|
? path.slice('/events/queues/'.length)
|
|
199
95
|
: null;
|
|
200
|
-
|
|
201
|
-
const stream = new ReadableStream({
|
|
202
|
-
start(controller) {
|
|
203
|
-
sseClients.set(clientId, {
|
|
204
|
-
id: clientId,
|
|
205
|
-
controller,
|
|
206
|
-
queueFilter,
|
|
207
|
-
});
|
|
208
|
-
// Send initial connection message
|
|
209
|
-
controller.enqueue(textEncoder.encode(`data: {"connected":true,"clientId":"${clientId}"}\n\n`));
|
|
210
|
-
},
|
|
211
|
-
cancel() {
|
|
212
|
-
sseClients.delete(clientId);
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
return new Response(stream, {
|
|
216
|
-
headers: {
|
|
217
|
-
'Content-Type': 'text/event-stream',
|
|
218
|
-
'Cache-Control': 'no-cache',
|
|
219
|
-
Connection: 'keep-alive',
|
|
220
|
-
'Access-Control-Allow-Origin': corsOrigins.has('*')
|
|
221
|
-
? '*'
|
|
222
|
-
: Array.from(corsOrigins).join(', '),
|
|
223
|
-
},
|
|
224
|
-
});
|
|
96
|
+
return sseHandler.createResponse(queueFilter, getCorsOrigin());
|
|
225
97
|
}
|
|
226
|
-
// Prometheus metrics
|
|
98
|
+
// Prometheus metrics
|
|
227
99
|
if (path === '/prometheus' && req.method === 'GET') {
|
|
228
100
|
if (config.requireAuthForMetrics && authTokens.size > 0) {
|
|
229
|
-
const
|
|
230
|
-
const token = authHeader?.replace('Bearer ', '') ?? '';
|
|
101
|
+
const token = req.headers.get('Authorization')?.replace('Bearer ', '') ?? '';
|
|
231
102
|
if (!validateAuthToken(token, authTokens)) {
|
|
232
103
|
return jsonResponse({ ok: false, error: 'Unauthorized' }, 401);
|
|
233
104
|
}
|
|
234
105
|
}
|
|
235
|
-
|
|
236
|
-
return new Response(metrics, {
|
|
106
|
+
return new Response(queueManager.getPrometheusMetrics(), {
|
|
237
107
|
headers: { 'Content-Type': 'text/plain; version=0.0.4; charset=utf-8' },
|
|
238
108
|
});
|
|
239
109
|
}
|
|
240
|
-
// Check authentication
|
|
110
|
+
// Check authentication for other endpoints
|
|
241
111
|
if (authTokens.size > 0) {
|
|
242
|
-
const
|
|
243
|
-
const token = authHeader?.replace('Bearer ', '') ?? '';
|
|
112
|
+
const token = req.headers.get('Authorization')?.replace('Bearer ', '') ?? '';
|
|
244
113
|
if (!validateAuthToken(token, authTokens)) {
|
|
245
114
|
return jsonResponse({ ok: false, error: 'Unauthorized' }, 401);
|
|
246
115
|
}
|
|
247
116
|
}
|
|
248
|
-
//
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
authTokens,
|
|
252
|
-
authenticated: true,
|
|
253
|
-
};
|
|
254
|
-
// Route request
|
|
117
|
+
// Generate unique clientId for HTTP request (stateless, but needed for job ownership tracking)
|
|
118
|
+
const clientId = uuid();
|
|
119
|
+
const ctx = { queueManager, authTokens, authenticated: true, clientId };
|
|
255
120
|
try {
|
|
256
121
|
return await routeRequest(req, path, ctx, corsOrigins);
|
|
257
122
|
}
|
|
@@ -263,47 +128,40 @@ export function createHttpServer(queueManager, config) {
|
|
|
263
128
|
// WebSocket handlers
|
|
264
129
|
const websocket = {
|
|
265
130
|
open(ws) {
|
|
266
|
-
|
|
267
|
-
wsLog.info('Client connected', { clientId: ws.data.id });
|
|
131
|
+
wsHandler.onOpen(ws);
|
|
268
132
|
},
|
|
269
133
|
async message(ws, message) {
|
|
270
|
-
const text = typeof message === 'string' ? message : textDecoder.decode(message);
|
|
271
|
-
const cmd = parseCommand(text);
|
|
272
|
-
if (!cmd) {
|
|
273
|
-
ws.send(errorResponse('Invalid command'));
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
134
|
const ctx = {
|
|
277
135
|
queueManager,
|
|
278
136
|
authTokens,
|
|
279
137
|
authenticated: ws.data.authenticated,
|
|
138
|
+
clientId: ws.data.id, // Use WebSocket connection ID for job ownership tracking
|
|
280
139
|
};
|
|
281
|
-
|
|
282
|
-
const response = await handleCommand(cmd, ctx);
|
|
283
|
-
// Update authentication state
|
|
284
|
-
if (cmd.cmd === 'Auth' && response.ok) {
|
|
285
|
-
ws.data.authenticated = true;
|
|
286
|
-
}
|
|
287
|
-
ws.send(serializeResponse(response));
|
|
288
|
-
}
|
|
289
|
-
catch (err) {
|
|
290
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
291
|
-
ws.send(errorResponse(msg, cmd.reqId));
|
|
292
|
-
}
|
|
140
|
+
await wsHandler.onMessage(ws, message, ctx);
|
|
293
141
|
},
|
|
294
142
|
close(ws) {
|
|
295
|
-
|
|
296
|
-
|
|
143
|
+
const clientId = ws.data.id;
|
|
144
|
+
wsHandler.onClose(ws);
|
|
145
|
+
// Release all jobs owned by this WebSocket client back to queue
|
|
146
|
+
queueManager
|
|
147
|
+
.releaseClientJobs(clientId)
|
|
148
|
+
.then((released) => {
|
|
149
|
+
if (released > 0) {
|
|
150
|
+
httpLog.info('WebSocket client disconnected, released jobs', { clientId, released });
|
|
151
|
+
}
|
|
152
|
+
})
|
|
153
|
+
.catch((err) => {
|
|
154
|
+
httpLog.error('Failed to release WebSocket client jobs', {
|
|
155
|
+
clientId,
|
|
156
|
+
error: String(err),
|
|
157
|
+
});
|
|
158
|
+
});
|
|
297
159
|
},
|
|
298
160
|
};
|
|
299
|
-
// Create server
|
|
161
|
+
// Create server
|
|
300
162
|
let server;
|
|
301
163
|
if (config.socketPath) {
|
|
302
|
-
server = Bun.serve({
|
|
303
|
-
unix: config.socketPath,
|
|
304
|
-
fetch,
|
|
305
|
-
websocket,
|
|
306
|
-
});
|
|
164
|
+
server = Bun.serve({ unix: config.socketPath, fetch, websocket });
|
|
307
165
|
httpLog.info('Server listening', { unix: config.socketPath });
|
|
308
166
|
}
|
|
309
167
|
else {
|
|
@@ -317,76 +175,29 @@ export function createHttpServer(queueManager, config) {
|
|
|
317
175
|
}
|
|
318
176
|
return {
|
|
319
177
|
server,
|
|
320
|
-
wsClients,
|
|
321
|
-
sseClients,
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
return wsClients.size;
|
|
325
|
-
},
|
|
326
|
-
/** Get SSE client count */
|
|
327
|
-
getSseClientCount() {
|
|
328
|
-
return sseClients.size;
|
|
329
|
-
},
|
|
330
|
-
/** Stop the server */
|
|
178
|
+
wsClients: wsHandler.getClients(),
|
|
179
|
+
sseClients: sseHandler.getClients(),
|
|
180
|
+
getWsClientCount: () => wsHandler.size,
|
|
181
|
+
getSseClientCount: () => sseHandler.size,
|
|
331
182
|
stop() {
|
|
332
|
-
|
|
333
|
-
for (const [, client] of sseClients) {
|
|
334
|
-
try {
|
|
335
|
-
client.controller.close();
|
|
336
|
-
}
|
|
337
|
-
catch {
|
|
338
|
-
// Ignore
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
sseClients.clear();
|
|
183
|
+
sseHandler.closeAll();
|
|
342
184
|
void server.stop();
|
|
343
185
|
httpLog.info('Server stopped');
|
|
344
186
|
},
|
|
345
187
|
};
|
|
346
188
|
}
|
|
347
|
-
/**
|
|
348
|
-
* Route HTTP request to appropriate handler
|
|
349
|
-
*/
|
|
189
|
+
/** Route HTTP request to handler */
|
|
350
190
|
async function routeRequest(req, path, ctx, corsOrigins) {
|
|
351
191
|
const method = req.method;
|
|
352
192
|
// Stats endpoint
|
|
353
193
|
if (path === '/stats' && method === 'GET') {
|
|
354
|
-
|
|
355
|
-
const memStats = ctx.queueManager.getMemoryStats();
|
|
356
|
-
const mem = process.memoryUsage();
|
|
357
|
-
return jsonResponse({
|
|
358
|
-
ok: true,
|
|
359
|
-
stats: {
|
|
360
|
-
...stats,
|
|
361
|
-
totalPushed: Number(stats.totalPushed),
|
|
362
|
-
totalPulled: Number(stats.totalPulled),
|
|
363
|
-
totalCompleted: Number(stats.totalCompleted),
|
|
364
|
-
totalFailed: Number(stats.totalFailed),
|
|
365
|
-
},
|
|
366
|
-
memory: {
|
|
367
|
-
heapUsed: Math.round(mem.heapUsed / 1024 / 1024),
|
|
368
|
-
heapTotal: Math.round(mem.heapTotal / 1024 / 1024),
|
|
369
|
-
rss: Math.round(mem.rss / 1024 / 1024),
|
|
370
|
-
external: Math.round(mem.external / 1024 / 1024),
|
|
371
|
-
arrayBuffers: Math.round(mem.arrayBuffers / 1024 / 1024),
|
|
372
|
-
},
|
|
373
|
-
collections: memStats,
|
|
374
|
-
}, 200, corsOrigins);
|
|
194
|
+
return statsEndpoint(ctx.queueManager, corsOrigins);
|
|
375
195
|
}
|
|
376
196
|
// Metrics endpoint
|
|
377
197
|
if (path === '/metrics' && method === 'GET') {
|
|
378
|
-
|
|
379
|
-
return jsonResponse({
|
|
380
|
-
ok: true,
|
|
381
|
-
metrics: {
|
|
382
|
-
totalPushed: Number(stats.totalPushed),
|
|
383
|
-
totalPulled: Number(stats.totalPulled),
|
|
384
|
-
totalCompleted: Number(stats.totalCompleted),
|
|
385
|
-
totalFailed: Number(stats.totalFailed),
|
|
386
|
-
},
|
|
387
|
-
}, 200, corsOrigins);
|
|
198
|
+
return metricsEndpoint(ctx.queueManager, corsOrigins);
|
|
388
199
|
}
|
|
389
|
-
// Queue operations: POST /queues/:queue/jobs
|
|
200
|
+
// Queue operations: POST/GET /queues/:queue/jobs
|
|
390
201
|
const queueJobsMatch = path.match(/^\/queues\/([^/]+)\/jobs$/);
|
|
391
202
|
if (queueJobsMatch) {
|
|
392
203
|
const queue = decodeURIComponent(queueJobsMatch[1]);
|
|
@@ -403,7 +214,6 @@ async function routeRequest(req, path, ctx, corsOrigins) {
|
|
|
403
214
|
return jsonResponse(response, response.ok ? 200 : 400, corsOrigins);
|
|
404
215
|
}
|
|
405
216
|
if (method === 'GET') {
|
|
406
|
-
// Pull job
|
|
407
217
|
const timeout = parseInt(new URL(req.url).searchParams.get('timeout') ?? '0');
|
|
408
218
|
const cmd = { cmd: 'PULL', queue, timeout };
|
|
409
219
|
const response = await handleCommand(cmd, ctx);
|
|
@@ -443,33 +253,6 @@ async function routeRequest(req, path, ctx, corsOrigins) {
|
|
|
443
253
|
const response = await handleCommand(cmd, ctx);
|
|
444
254
|
return jsonResponse(response, response.ok ? 200 : 400, corsOrigins);
|
|
445
255
|
}
|
|
446
|
-
// Not found
|
|
447
256
|
return jsonResponse({ ok: false, error: 'Not found' }, 404, corsOrigins);
|
|
448
257
|
}
|
|
449
|
-
/** Create JSON response with CORS headers */
|
|
450
|
-
function jsonResponse(data, status = 200, corsOrigins) {
|
|
451
|
-
const headers = {
|
|
452
|
-
'Content-Type': 'application/json',
|
|
453
|
-
};
|
|
454
|
-
if (corsOrigins) {
|
|
455
|
-
headers['Access-Control-Allow-Origin'] = corsOrigins.has('*')
|
|
456
|
-
? '*'
|
|
457
|
-
: Array.from(corsOrigins).join(', ');
|
|
458
|
-
}
|
|
459
|
-
return new Response(JSON.stringify(data), { status, headers });
|
|
460
|
-
}
|
|
461
|
-
/** Create CORS preflight response */
|
|
462
|
-
function corsResponse(corsOrigins) {
|
|
463
|
-
return new Response(null, {
|
|
464
|
-
status: 204,
|
|
465
|
-
headers: {
|
|
466
|
-
'Access-Control-Allow-Origin': corsOrigins.has('*')
|
|
467
|
-
? '*'
|
|
468
|
-
: Array.from(corsOrigins).join(', '),
|
|
469
|
-
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
470
|
-
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
|
471
|
-
'Access-Control-Max-Age': '86400',
|
|
472
|
-
},
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
258
|
//# sourceMappingURL=http.js.map
|