bunqueue 2.0.5 → 2.0.7
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/operations/pull.d.ts +0 -1
- package/dist/application/operations/pull.d.ts.map +1 -1
- package/dist/application/operations/pull.js +151 -129
- package/dist/application/operations/pull.js.map +1 -1
- package/dist/application/operations/push.d.ts +2 -0
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +204 -119
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/webhookManager.d.ts.map +1 -1
- package/dist/application/webhookManager.js +6 -29
- package/dist/application/webhookManager.js.map +1 -1
- package/dist/client/sandboxed/types.d.ts +2 -2
- package/dist/client/sandboxed/types.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.d.ts +2 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.js +112 -62
- 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 +4 -2
- package/dist/client/sandboxed/wrapper.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,162 +5,247 @@
|
|
|
5
5
|
import { createJob, generateJobId, jobId, } from '../../domain/types/job';
|
|
6
6
|
import { withWriteLock } from '../../shared/lock';
|
|
7
7
|
import { shardIndex } from '../../shared/hash';
|
|
8
|
+
const LOG_PREFIX = '[Push]';
|
|
9
|
+
/** Structured log helper */
|
|
10
|
+
function log(level, message, data) {
|
|
11
|
+
const entry = data ? { message, ...data } : message;
|
|
12
|
+
switch (level) {
|
|
13
|
+
case 'info':
|
|
14
|
+
console.log(LOG_PREFIX, entry);
|
|
15
|
+
break;
|
|
16
|
+
case 'warn':
|
|
17
|
+
console.warn(LOG_PREFIX, entry);
|
|
18
|
+
break;
|
|
19
|
+
case 'error':
|
|
20
|
+
console.error(LOG_PREFIX, entry);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle custom ID idempotency check
|
|
26
|
+
* Returns existing job if found, or new ID to use
|
|
27
|
+
*/
|
|
28
|
+
function handleCustomId(input, shard, ctx) {
|
|
29
|
+
if (!input.customId) {
|
|
30
|
+
return { skip: false, id: generateJobId() };
|
|
31
|
+
}
|
|
32
|
+
const id = jobId(input.customId);
|
|
33
|
+
const existing = ctx.customIdMap.get(input.customId);
|
|
34
|
+
// No existing mapping - register and proceed
|
|
35
|
+
if (!existing) {
|
|
36
|
+
ctx.customIdMap.set(input.customId, id);
|
|
37
|
+
return { skip: false, id };
|
|
38
|
+
}
|
|
39
|
+
// Check if existing job is still in queue
|
|
40
|
+
const location = ctx.jobIndex.get(existing);
|
|
41
|
+
const existingJob = location?.type === 'queue' ? shard.getQueue(location.queueName).find(existing) : null;
|
|
42
|
+
if (existingJob) {
|
|
43
|
+
log('info', 'Duplicate customId, returning existing job', {
|
|
44
|
+
customId: input.customId,
|
|
45
|
+
existingJobId: String(existing),
|
|
46
|
+
});
|
|
47
|
+
return { skip: true, existingJob };
|
|
48
|
+
}
|
|
49
|
+
// Job gone (processing/completed) - allow reuse of customId
|
|
50
|
+
ctx.customIdMap.delete(input.customId);
|
|
51
|
+
ctx.customIdMap.set(input.customId, id);
|
|
52
|
+
return { skip: false, id };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Handle unique key deduplication
|
|
56
|
+
* Returns existing job ID if duplicate found and should skip, or allows insert
|
|
57
|
+
*/
|
|
58
|
+
function handleDeduplication(job, input, queue, shard, ctx) {
|
|
59
|
+
if (!job.uniqueKey) {
|
|
60
|
+
return { skip: false };
|
|
61
|
+
}
|
|
62
|
+
const q = shard.getQueue(queue);
|
|
63
|
+
const existingEntry = shard.getUniqueKeyEntry(queue, job.uniqueKey);
|
|
64
|
+
if (!existingEntry) {
|
|
65
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
66
|
+
return { skip: false };
|
|
67
|
+
}
|
|
68
|
+
const dedupOpts = input.dedup;
|
|
69
|
+
// Replace strategy: remove old, insert new
|
|
70
|
+
if (dedupOpts?.replace) {
|
|
71
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
72
|
+
if (existingJob) {
|
|
73
|
+
q.remove(existingEntry.jobId);
|
|
74
|
+
shard.decrementQueued(existingEntry.jobId);
|
|
75
|
+
ctx.jobIndex.delete(existingEntry.jobId);
|
|
76
|
+
log('info', 'Dedup replace: removed existing job', {
|
|
77
|
+
queue,
|
|
78
|
+
uniqueKey: job.uniqueKey,
|
|
79
|
+
removedJobId: String(existingEntry.jobId),
|
|
80
|
+
newJobId: String(job.id),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
shard.releaseUniqueKey(queue, job.uniqueKey);
|
|
84
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, dedupOpts?.ttl);
|
|
85
|
+
return { skip: false };
|
|
86
|
+
}
|
|
87
|
+
// Extend strategy: reset TTL, return existing
|
|
88
|
+
if (dedupOpts?.extend && dedupOpts?.ttl) {
|
|
89
|
+
shard.extendUniqueKeyTtl(queue, job.uniqueKey, dedupOpts.ttl);
|
|
90
|
+
if (input.customId)
|
|
91
|
+
ctx.customIdMap.delete(input.customId);
|
|
92
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
93
|
+
if (existingJob) {
|
|
94
|
+
log('info', 'Dedup extend: extended TTL, returning existing job', {
|
|
95
|
+
queue,
|
|
96
|
+
uniqueKey: job.uniqueKey,
|
|
97
|
+
existingJobId: String(existingEntry.jobId),
|
|
98
|
+
ttl: dedupOpts.ttl,
|
|
99
|
+
});
|
|
100
|
+
return { skip: true, existingId: existingEntry.jobId };
|
|
101
|
+
}
|
|
102
|
+
throw new Error('Duplicate unique_key (extended TTL)');
|
|
103
|
+
}
|
|
104
|
+
// Default: return existing job (BullMQ-style)
|
|
105
|
+
if (input.customId)
|
|
106
|
+
ctx.customIdMap.delete(input.customId);
|
|
107
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
108
|
+
if (existingJob) {
|
|
109
|
+
ctx.broadcast({
|
|
110
|
+
eventType: "duplicated" /* EventType.Duplicated */,
|
|
111
|
+
queue,
|
|
112
|
+
jobId: existingEntry.jobId,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
});
|
|
115
|
+
return { skip: true, existingId: existingEntry.jobId };
|
|
116
|
+
}
|
|
117
|
+
// Job not in queue (completed/failed) - allow new insert
|
|
118
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
119
|
+
return { skip: false };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Insert job into shard (queue or waitingDeps)
|
|
123
|
+
*/
|
|
124
|
+
function insertJobToShard(job, queue, shard, shardIdx, ctx) {
|
|
125
|
+
const hasDeps = job.dependsOn.length > 0;
|
|
126
|
+
const needsWaiting = hasDeps && !job.dependsOn.every((depId) => ctx.completedJobs.has(depId));
|
|
127
|
+
if (needsWaiting) {
|
|
128
|
+
shard.waitingDeps.set(job.id, job);
|
|
129
|
+
shard.registerDependencies(job.id, job.dependsOn);
|
|
130
|
+
log('info', 'Job waiting for dependencies', {
|
|
131
|
+
queue,
|
|
132
|
+
jobId: String(job.id),
|
|
133
|
+
pendingDeps: job.dependsOn.filter((d) => !ctx.completedJobs.has(d)).map(String),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
shard.getQueue(queue).push(job);
|
|
138
|
+
const isDelayed = job.runAt > Date.now();
|
|
139
|
+
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
140
|
+
}
|
|
141
|
+
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx, queueName: queue });
|
|
142
|
+
}
|
|
8
143
|
/**
|
|
9
144
|
* Push a single job to queue
|
|
145
|
+
* NOTE: customId check happens OUTSIDE lock for performance (unlike batch)
|
|
10
146
|
*/
|
|
11
147
|
export async function pushJob(queue, input, ctx) {
|
|
12
|
-
|
|
148
|
+
const idx = shardIndex(queue);
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
// Check custom ID idempotency OUTSIDE lock (original behavior)
|
|
13
151
|
const id = input.customId ? jobId(input.customId) : generateJobId();
|
|
14
|
-
// Handle custom ID idempotency (BullMQ-style: return existing job)
|
|
15
152
|
if (input.customId) {
|
|
16
153
|
const existing = ctx.customIdMap.get(input.customId);
|
|
17
154
|
if (existing) {
|
|
18
155
|
const location = ctx.jobIndex.get(existing);
|
|
19
156
|
if (location?.type === 'queue') {
|
|
20
|
-
// BullMQ-style: return existing job instead of creating a duplicate
|
|
21
157
|
const shard = ctx.shards[location.shardIdx];
|
|
22
158
|
const existingJob = shard.getQueue(location.queueName).find(existing);
|
|
23
159
|
if (existingJob) {
|
|
160
|
+
log('info', 'Duplicate customId, returning existing job', {
|
|
161
|
+
queue,
|
|
162
|
+
customId: input.customId,
|
|
163
|
+
existingJobId: String(existing),
|
|
164
|
+
});
|
|
24
165
|
return existingJob;
|
|
25
166
|
}
|
|
26
167
|
}
|
|
27
|
-
// If job is processing, completed, or not found, clean up the map entry
|
|
28
|
-
// and allow creating a new job with the same customId
|
|
29
168
|
ctx.customIdMap.delete(input.customId);
|
|
30
169
|
}
|
|
31
170
|
ctx.customIdMap.set(input.customId, id);
|
|
32
171
|
}
|
|
33
|
-
// Create job
|
|
34
|
-
const now = Date.now();
|
|
35
172
|
const job = createJob(id, queue, input, now);
|
|
36
|
-
|
|
37
|
-
// Note: The actual dependency check MUST happen inside the lock to avoid race conditions
|
|
38
|
-
const hasDependencies = job.dependsOn.length > 0;
|
|
39
|
-
// Insert into shard
|
|
40
|
-
const idx = shardIndex(queue);
|
|
41
|
-
let returnedJob;
|
|
173
|
+
let result;
|
|
42
174
|
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
43
175
|
const shard = ctx.shards[idx];
|
|
44
|
-
// Check
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// Replace strategy: remove old job, insert new
|
|
52
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
53
|
-
if (existingJob) {
|
|
54
|
-
shard.getQueue(queue).remove(existingEntry.jobId);
|
|
55
|
-
shard.decrementQueued(existingEntry.jobId);
|
|
56
|
-
ctx.jobIndex.delete(existingEntry.jobId);
|
|
57
|
-
}
|
|
58
|
-
// Release old unique key entry before registering new one to avoid stale TTL
|
|
59
|
-
shard.releaseUniqueKey(queue, job.uniqueKey);
|
|
60
|
-
// Register new key with TTL
|
|
61
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, dedupOpts?.ttl);
|
|
62
|
-
}
|
|
63
|
-
else if (dedupOpts?.extend && dedupOpts?.ttl) {
|
|
64
|
-
// Extend strategy: reset TTL, return existing job
|
|
65
|
-
shard.extendUniqueKeyTtl(queue, job.uniqueKey, dedupOpts.ttl);
|
|
66
|
-
// Rollback custom ID since we're not inserting
|
|
67
|
-
if (input.customId) {
|
|
68
|
-
ctx.customIdMap.delete(input.customId);
|
|
69
|
-
}
|
|
70
|
-
// Set returnedJob to existing job
|
|
71
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
72
|
-
if (existingJob) {
|
|
73
|
-
returnedJob = existingJob;
|
|
74
|
-
return; // Exit early from withWriteLock
|
|
75
|
-
}
|
|
76
|
-
throw new Error('Duplicate unique_key (extended TTL)');
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// Default: return existing job (BullMQ-style idempotency)
|
|
80
|
-
if (input.customId) {
|
|
81
|
-
ctx.customIdMap.delete(input.customId);
|
|
82
|
-
}
|
|
83
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
84
|
-
if (existingJob) {
|
|
85
|
-
// Emit duplicated event (BullMQ v5)
|
|
86
|
-
ctx.broadcast({
|
|
87
|
-
eventType: "duplicated" /* EventType.Duplicated */,
|
|
88
|
-
queue,
|
|
89
|
-
jobId: existingEntry.jobId,
|
|
90
|
-
timestamp: Date.now(),
|
|
91
|
-
});
|
|
92
|
-
returnedJob = existingJob;
|
|
93
|
-
return; // Exit early, return existing job
|
|
94
|
-
}
|
|
95
|
-
// Job not in queue (maybe completed/failed) - allow new insert
|
|
96
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
97
|
-
}
|
|
176
|
+
// Check deduplication
|
|
177
|
+
const dedupResult = handleDeduplication(job, input, queue, shard, ctx);
|
|
178
|
+
if (dedupResult.skip) {
|
|
179
|
+
const existingJob = shard.getQueue(queue).find(dedupResult.existingId);
|
|
180
|
+
if (existingJob) {
|
|
181
|
+
result = { job: existingJob, persisted: false };
|
|
182
|
+
return;
|
|
98
183
|
}
|
|
99
|
-
else {
|
|
100
|
-
// No existing entry - register with TTL if specified
|
|
101
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Always check dependencies inside lock if job has any
|
|
105
|
-
// This avoids a race condition where dependencies could change between pre-check and lock acquisition
|
|
106
|
-
const needsWaitingDeps = hasDependencies && !job.dependsOn.every((depId) => ctx.completedJobs.has(depId));
|
|
107
|
-
// Insert based on state
|
|
108
|
-
if (needsWaitingDeps) {
|
|
109
|
-
shard.waitingDeps.set(job.id, job);
|
|
110
|
-
// Register in dependency index for O(1) lookup when deps complete
|
|
111
|
-
shard.registerDependencies(job.id, job.dependsOn);
|
|
112
184
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
118
|
-
shard.notify();
|
|
119
|
-
}
|
|
120
|
-
// Index job
|
|
121
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
185
|
+
// Insert to shard
|
|
186
|
+
insertJobToShard(job, queue, shard, idx, ctx);
|
|
187
|
+
shard.notify();
|
|
188
|
+
result = { job, persisted: true };
|
|
122
189
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
190
|
+
if (!result) {
|
|
191
|
+
log('error', 'Push failed unexpectedly', { queue, jobId: String(id) });
|
|
192
|
+
throw new Error('Push failed');
|
|
126
193
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
194
|
+
if (result.persisted) {
|
|
195
|
+
ctx.storage?.insertJob(result.job, input.durable);
|
|
196
|
+
ctx.totalPushed.value++;
|
|
197
|
+
ctx.broadcast({
|
|
198
|
+
eventType: 'pushed',
|
|
199
|
+
queue,
|
|
200
|
+
jobId: result.job.id,
|
|
201
|
+
timestamp: now,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return result.job;
|
|
133
205
|
}
|
|
134
206
|
/**
|
|
135
207
|
* Push multiple jobs to queue
|
|
208
|
+
* NOTE: customId check happens INSIDE lock (safer for concurrent batch inserts)
|
|
136
209
|
*/
|
|
137
210
|
export async function pushJobBatch(queue, inputs, ctx) {
|
|
138
|
-
const jobs = [];
|
|
139
211
|
const now = Date.now();
|
|
140
|
-
// Generate all jobs
|
|
141
|
-
for (const input of inputs) {
|
|
142
|
-
const id = generateJobId();
|
|
143
|
-
jobs.push(createJob(id, queue, input, now));
|
|
144
|
-
}
|
|
145
|
-
// Insert into shard
|
|
146
212
|
const idx = shardIndex(queue);
|
|
213
|
+
const resultIds = [];
|
|
214
|
+
const jobsToInsert = [];
|
|
147
215
|
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
148
216
|
const shard = ctx.shards[idx];
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
217
|
+
for (const input of inputs) {
|
|
218
|
+
// Check custom ID idempotency
|
|
219
|
+
const customIdResult = handleCustomId(input, shard, ctx);
|
|
220
|
+
if (customIdResult.skip) {
|
|
221
|
+
resultIds.push(customIdResult.existingJob.id);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const job = createJob(customIdResult.id, queue, input, now);
|
|
225
|
+
// Check deduplication
|
|
226
|
+
const dedupResult = handleDeduplication(job, input, queue, shard, ctx);
|
|
227
|
+
if (dedupResult.skip) {
|
|
228
|
+
resultIds.push(dedupResult.existingId);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Insert to shard
|
|
232
|
+
insertJobToShard(job, queue, shard, idx, ctx);
|
|
233
|
+
jobsToInsert.push(job);
|
|
234
|
+
resultIds.push(job.id);
|
|
235
|
+
}
|
|
236
|
+
if (jobsToInsert.length > 0) {
|
|
237
|
+
shard.notify();
|
|
157
238
|
}
|
|
158
|
-
shard.notify();
|
|
159
239
|
});
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
240
|
+
if (jobsToInsert.length > 0) {
|
|
241
|
+
ctx.storage?.insertJobsBatch(jobsToInsert);
|
|
242
|
+
ctx.totalPushed.value += BigInt(jobsToInsert.length);
|
|
243
|
+
log('info', 'Batch push completed', {
|
|
244
|
+
queue,
|
|
245
|
+
inserted: jobsToInsert.length,
|
|
246
|
+
duplicates: inputs.length - jobsToInsert.length,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return resultIds;
|
|
165
250
|
}
|
|
166
251
|
//# sourceMappingURL=push.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,SAAS,EACT,aAAa,EACb,KAAK,GACN,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,SAAS,EACT,aAAa,EACb,KAAK,GACN,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,4BAA4B;AAC5B,SAAS,GAAG,CACV,KAAgC,EAChC,OAAe,EACf,IAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACpD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACjC,MAAM;IACV,CAAC;AACH,CAAC;AAyBD;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAe,EAAE,KAAY,EAAE,GAAgB;IACrE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAErD,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,WAAW,GACf,QAAQ,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExF,IAAI,WAAW,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,EAAE,4CAA4C,EAAE;YACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,GAAQ,EACR,KAAe,EACf,KAAa,EACb,KAAY,EACZ,GAAgB;IAEhB,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,aAAa,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAEpE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAE9B,2CAA2C;IAC3C,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACzC,GAAG,CAAC,MAAM,EAAE,qCAAqC,EAAE;gBACjD,KAAK;gBACL,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;gBACzC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,8CAA8C;IAC9C,IAAI,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;QACxC,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,QAAQ;YAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,EAAE,oDAAoD,EAAE;gBAChE,KAAK;gBACL,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;gBAC1C,GAAG,EAAE,SAAS,CAAC,GAAG;aACnB,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,8CAA8C;IAC9C,IAAI,KAAK,CAAC,QAAQ;QAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,WAAW,EAAE,CAAC;QAChB,GAAG,CAAC,SAAS,CAAC;YACZ,SAAS,yCAAsB;YAC/B,KAAK;YACL,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IACzD,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,GAAQ,EACR,KAAa,EACb,KAAY,EACZ,QAAgB,EAChB,GAAgB;IAEhB,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9F,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,GAAG,CAAC,MAAM,EAAE,8BAA8B,EAAE;YAC1C,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;SAChF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,KAAe,EAAE,GAAgB;IAC5E,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,+DAA+D;IAC/D,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,QAAQ,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtE,IAAI,WAAW,EAAE,CAAC;oBAChB,GAAG,CAAC,MAAM,EAAE,4CAA4C,EAAE;wBACxD,KAAK;wBACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC;qBAChC,CAAC,CAAC;oBACH,OAAO,WAAW,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,MAAoD,CAAC;IAEzD,MAAM,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,sBAAsB;QACtB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACvE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9C,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC;YACZ,SAAS,EAAE,QAAqB;YAChC,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;YACpB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,MAAkB,EAClB,GAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAY,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAU,EAAE,CAAC;IAE/B,MAAM,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,8BAA8B;YAC9B,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAE5D,sBAAsB;YACtB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACvE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,kBAAkB;YAClB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;QAC3C,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACrD,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE;YAClC,KAAK;YACL,QAAQ,EAAE,YAAY,CAAC,MAAM;YAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhookManager.d.ts","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhookManager.d.ts","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAC;AAgBjC;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IAErD,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAK;IAEzB,oBAAoB;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU5E,uBAAuB;IACvB,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAY9B,wBAAwB;IACxB,GAAG,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAIvC,qEAAqE;IACrE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAWpD,wBAAwB;IACxB,IAAI,IAAI,OAAO,EAAE;IAIjB,oCAAoC;IAC9B,OAAO,CACX,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,IAAI,CAAC;IAqBhB,gCAAgC;YAClB,WAAW;IA4CzB,qDAAqD;IACrD,kBAAkB,IAAI,OAAO;IAI7B,6CAA6C;IAC7C,QAAQ;;;;CAMT"}
|
|
@@ -4,34 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { createWebhook, } from '../domain/types/webhook';
|
|
6
6
|
import { webhookLog } from '../shared/logger';
|
|
7
|
-
/** Singleton TextEncoder for HMAC operations */
|
|
8
|
-
const textEncoder = new TextEncoder();
|
|
9
7
|
/** Maximum webhook delivery retries (configurable via WEBHOOK_MAX_RETRIES env var) */
|
|
10
8
|
const WEBHOOK_MAX_RETRIES = parseInt(Bun.env.WEBHOOK_MAX_RETRIES ?? '3', 10);
|
|
11
9
|
/** Delay between webhook retries in ms (configurable via WEBHOOK_RETRY_DELAY_MS env var) */
|
|
12
10
|
const WEBHOOK_RETRY_DELAY_MS = parseInt(Bun.env.WEBHOOK_RETRY_DELAY_MS ?? '1000', 10);
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
async function signPayload(payload, secret) {
|
|
19
|
-
// Get cached key or import new one
|
|
20
|
-
let key = keyCache.get(secret);
|
|
21
|
-
if (!key) {
|
|
22
|
-
// Evict oldest entry if cache is full (LRU-style using Map insertion order)
|
|
23
|
-
if (keyCache.size >= MAX_KEY_CACHE_SIZE) {
|
|
24
|
-
const firstKey = keyCache.keys().next().value;
|
|
25
|
-
if (firstKey)
|
|
26
|
-
keyCache.delete(firstKey);
|
|
27
|
-
}
|
|
28
|
-
key = await crypto.subtle.importKey('raw', textEncoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
29
|
-
keyCache.set(secret, key);
|
|
30
|
-
}
|
|
31
|
-
const signature = await crypto.subtle.sign('HMAC', key, textEncoder.encode(payload));
|
|
32
|
-
return Array.from(new Uint8Array(signature))
|
|
33
|
-
.map((b) => b.toString(16).padStart(2, '0'))
|
|
34
|
-
.join('');
|
|
11
|
+
/** HMAC-SHA256 signature using Bun native CryptoHasher (2-3x faster than WebCrypto) */
|
|
12
|
+
function signPayload(payload, secret) {
|
|
13
|
+
const hasher = new Bun.CryptoHasher('sha256', secret);
|
|
14
|
+
hasher.update(payload);
|
|
15
|
+
return hasher.digest('hex');
|
|
35
16
|
}
|
|
36
17
|
/**
|
|
37
18
|
* Webhook Manager
|
|
@@ -58,10 +39,6 @@ export class WebhookManager {
|
|
|
58
39
|
if (webhook?.enabled) {
|
|
59
40
|
this.enabledCount--;
|
|
60
41
|
}
|
|
61
|
-
// Clean up cached crypto key for this webhook's secret
|
|
62
|
-
if (webhook?.secret) {
|
|
63
|
-
keyCache.delete(webhook.secret);
|
|
64
|
-
}
|
|
65
42
|
const removed = this.webhooks.delete(id);
|
|
66
43
|
if (removed) {
|
|
67
44
|
webhookLog.info('Removed webhook', { webhookId: id });
|
|
@@ -114,7 +91,7 @@ export class WebhookManager {
|
|
|
114
91
|
};
|
|
115
92
|
// Add signature if secret is set
|
|
116
93
|
if (webhook.secret) {
|
|
117
|
-
headers['X-Webhook-Signature'] =
|
|
94
|
+
headers['X-Webhook-Signature'] = signPayload(body, webhook.secret);
|
|
118
95
|
}
|
|
119
96
|
let lastError = null;
|
|
120
97
|
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhookManager.js","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,
|
|
1
|
+
{"version":3,"file":"webhookManager.js","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,8 +54,8 @@ export interface IPCRequest {
|
|
|
54
54
|
}
|
|
55
55
|
/** IPC message from worker to main */
|
|
56
56
|
export interface IPCResponse {
|
|
57
|
-
type: 'result' | 'error' | 'progress';
|
|
58
|
-
jobId
|
|
57
|
+
type: 'result' | 'error' | 'progress' | 'ready';
|
|
58
|
+
jobId?: string;
|
|
59
59
|
result?: unknown;
|
|
60
60
|
error?: string;
|
|
61
61
|
progress?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,sBAAsB,EAKvB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,sBAAsB,EAKvB,MAAM,SAAS,CAAC;AAyBjB;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB;IAe9D,sCAAsC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,kCAAkC;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,4BAA4B;IAC5B,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAM3E,iCAAiC;IACjC,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,WAAW;YAmDL,QAAQ;IAatB,OAAO,CAAC,QAAQ;IA0BhB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;CAwBpB"}
|