@mantajs/adapter-eventbus-upstash 0.2.0-beta.0
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/adapter.d.ts +64 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +304 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/webhook-handler.d.ts +11 -0
- package/dist/webhook-handler.d.ts.map +1 -0
- package/dist/webhook-handler.js +26 -0
- package/dist/webhook-handler.js.map +1 -0
- package/package.json +24 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { GroupStatus, IEventBusPort, Message } from '@mantajs/core';
|
|
2
|
+
export interface UpstashEventBusOptions {
|
|
3
|
+
qstashToken?: string;
|
|
4
|
+
qstashUrl?: string;
|
|
5
|
+
callbackUrl?: string;
|
|
6
|
+
redisUrl?: string;
|
|
7
|
+
redisToken?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class UpstashEventBusAdapter implements IEventBusPort {
|
|
10
|
+
private _subscribers;
|
|
11
|
+
private _interceptors;
|
|
12
|
+
private _qstash;
|
|
13
|
+
private _redis;
|
|
14
|
+
private _callbackUrl;
|
|
15
|
+
private _maxActiveGroups;
|
|
16
|
+
private _localGroups;
|
|
17
|
+
private _localGroupTtls;
|
|
18
|
+
private _onGroupCreated?;
|
|
19
|
+
private _onGroupReleased?;
|
|
20
|
+
private _onGroupCleared?;
|
|
21
|
+
constructor(options?: UpstashEventBusOptions);
|
|
22
|
+
emit(event: Message | Message[], options?: {
|
|
23
|
+
groupId?: string;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
subscribe(eventName: string, handler: (event: Message) => Promise<void> | void, options?: {
|
|
26
|
+
subscriberId?: string;
|
|
27
|
+
}): void;
|
|
28
|
+
unsubscribe(subscriberId: string): void;
|
|
29
|
+
releaseGroupedEvents(eventGroupId: string): Promise<void>;
|
|
30
|
+
clearGroupedEvents(eventGroupId: string): Promise<void>;
|
|
31
|
+
addInterceptor(fn: (message: Message, context?: {
|
|
32
|
+
isGrouped?: boolean;
|
|
33
|
+
eventGroupId?: string;
|
|
34
|
+
}) => Promise<void> | void): void;
|
|
35
|
+
removeInterceptor(fn: (message: Message, context?: {
|
|
36
|
+
isGrouped?: boolean;
|
|
37
|
+
eventGroupId?: string;
|
|
38
|
+
}) => Promise<void> | void): void;
|
|
39
|
+
onGroupCreated(handler: (id: string, count: number) => void): void;
|
|
40
|
+
onGroupReleased(handler: (id: string, count: number) => void): void;
|
|
41
|
+
onGroupCleared(handler: (id: string, count: number, reason: 'explicit' | 'ttl') => void): void;
|
|
42
|
+
getGroupStatus(eventGroupId: string): GroupStatus | null;
|
|
43
|
+
ping(): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Handle incoming QStash webhook. Called by the HTTP route handler.
|
|
46
|
+
* Verifies signature and dispatches to local subscribers.
|
|
47
|
+
*/
|
|
48
|
+
handleWebhook(message: Message): Promise<void>;
|
|
49
|
+
private _publishToQStash;
|
|
50
|
+
private _emitGrouped;
|
|
51
|
+
private _emitGroupedRedis;
|
|
52
|
+
private _releaseRedisGroup;
|
|
53
|
+
private _clearRedisGroup;
|
|
54
|
+
private _emitGroupedLocal;
|
|
55
|
+
private _releaseLocalGroup;
|
|
56
|
+
private _clearLocalGroup;
|
|
57
|
+
private _runInterceptors;
|
|
58
|
+
private _deliverLocally;
|
|
59
|
+
private _deliverLocallyAsync;
|
|
60
|
+
/** Configure maxActiveGroups for testing E-13 */
|
|
61
|
+
_setMaxActiveGroups(max: number): void;
|
|
62
|
+
_reset(): void;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// SPEC-034 — UpstashEventBusAdapter implements IEventBusPort
|
|
2
|
+
// Hybrid architecture: local subscriber registry + QStash for durability + Redis for grouped events.
|
|
3
|
+
// If QStash is not configured, behaves exactly like InMemoryEventBusAdapter (graceful degradation).
|
|
4
|
+
import { MantaError } from '@mantajs/core';
|
|
5
|
+
import { Client as QStashClient } from '@upstash/qstash';
|
|
6
|
+
import { Redis } from '@upstash/redis';
|
|
7
|
+
const GROUP_KEY_PREFIX = 'manta:eventgroup:';
|
|
8
|
+
const GROUP_TTL_SECONDS = 600;
|
|
9
|
+
export class UpstashEventBusAdapter {
|
|
10
|
+
_subscribers = new Map();
|
|
11
|
+
_interceptors = [];
|
|
12
|
+
_qstash = null;
|
|
13
|
+
_redis = null;
|
|
14
|
+
_callbackUrl = null;
|
|
15
|
+
_maxActiveGroups = 10000;
|
|
16
|
+
// In-memory fallback for grouped events when Redis is not configured
|
|
17
|
+
_localGroups = new Map();
|
|
18
|
+
_localGroupTtls = new Map();
|
|
19
|
+
// Hooks
|
|
20
|
+
_onGroupCreated;
|
|
21
|
+
_onGroupReleased;
|
|
22
|
+
_onGroupCleared;
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
const qstashToken = options.qstashToken ?? process.env.QSTASH_TOKEN;
|
|
25
|
+
const callbackUrl = options.callbackUrl ?? process.env.QSTASH_CALLBACK_URL;
|
|
26
|
+
const redisUrl = options.redisUrl ?? process.env.UPSTASH_REDIS_REST_URL;
|
|
27
|
+
const redisToken = options.redisToken ?? process.env.UPSTASH_REDIS_REST_TOKEN;
|
|
28
|
+
// QStash (optional — graceful degradation)
|
|
29
|
+
if (qstashToken) {
|
|
30
|
+
this._qstash = new QStashClient({ token: qstashToken });
|
|
31
|
+
this._callbackUrl = callbackUrl ?? null;
|
|
32
|
+
}
|
|
33
|
+
// Redis (optional — falls back to in-memory grouped events)
|
|
34
|
+
if (redisUrl && redisToken) {
|
|
35
|
+
this._redis = new Redis({ url: redisUrl, token: redisToken });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async emit(event, options) {
|
|
39
|
+
const events = Array.isArray(event) ? event : [event];
|
|
40
|
+
// E-14 — validate serializable payload
|
|
41
|
+
for (const msg of events) {
|
|
42
|
+
try {
|
|
43
|
+
JSON.stringify(msg);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new MantaError('INVALID_DATA', 'Event payload is not serializable (circular references or non-serializable values detected)');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const groupId = options?.groupId;
|
|
50
|
+
if (groupId) {
|
|
51
|
+
await this._emitGrouped(events, groupId);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Non-grouped: deliver locally + publish to QStash
|
|
55
|
+
for (const msg of events) {
|
|
56
|
+
this._runInterceptors(msg);
|
|
57
|
+
this._deliverLocally(msg);
|
|
58
|
+
// Publish to QStash for durable delivery (fire-and-forget)
|
|
59
|
+
if (this._qstash && this._callbackUrl) {
|
|
60
|
+
this._publishToQStash(msg).catch((err) => {
|
|
61
|
+
console.warn(`[EventBus] QStash publish failed for ${msg.eventName}: ${err?.message ?? err}`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
subscribe(eventName, handler, options) {
|
|
67
|
+
const id = options?.subscriberId ?? crypto.randomUUID();
|
|
68
|
+
if (!this._subscribers.has(eventName))
|
|
69
|
+
this._subscribers.set(eventName, []);
|
|
70
|
+
const subs = this._subscribers.get(eventName);
|
|
71
|
+
// Deduplicate by subscriberId (E-07)
|
|
72
|
+
if (subs.some((s) => s.id === id))
|
|
73
|
+
return;
|
|
74
|
+
subs.push({ id, handler });
|
|
75
|
+
}
|
|
76
|
+
unsubscribe(subscriberId) {
|
|
77
|
+
for (const [eventName, subs] of this._subscribers) {
|
|
78
|
+
this._subscribers.set(eventName, subs.filter((s) => s.id !== subscriberId));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async releaseGroupedEvents(eventGroupId) {
|
|
82
|
+
if (this._redis) {
|
|
83
|
+
await this._releaseRedisGroup(eventGroupId);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
await this._releaseLocalGroup(eventGroupId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async clearGroupedEvents(eventGroupId) {
|
|
90
|
+
if (this._redis) {
|
|
91
|
+
await this._clearRedisGroup(eventGroupId);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await this._clearLocalGroup(eventGroupId);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
addInterceptor(fn) {
|
|
98
|
+
this._interceptors.push(fn);
|
|
99
|
+
}
|
|
100
|
+
removeInterceptor(fn) {
|
|
101
|
+
this._interceptors = this._interceptors.filter((i) => i !== fn);
|
|
102
|
+
}
|
|
103
|
+
onGroupCreated(handler) {
|
|
104
|
+
this._onGroupCreated = handler;
|
|
105
|
+
}
|
|
106
|
+
onGroupReleased(handler) {
|
|
107
|
+
this._onGroupReleased = handler;
|
|
108
|
+
}
|
|
109
|
+
onGroupCleared(handler) {
|
|
110
|
+
this._onGroupCleared = handler;
|
|
111
|
+
}
|
|
112
|
+
getGroupStatus(eventGroupId) {
|
|
113
|
+
// Synchronous — only works for local groups. Redis requires async.
|
|
114
|
+
const events = this._localGroups.get(eventGroupId);
|
|
115
|
+
if (!events)
|
|
116
|
+
return null;
|
|
117
|
+
return { exists: true, eventCount: events.length, createdAt: Date.now() };
|
|
118
|
+
}
|
|
119
|
+
async ping() {
|
|
120
|
+
// Probe both Redis (used for grouped events) and QStash (used for durable
|
|
121
|
+
// delivery). If neither is configured, the adapter is degraded to
|
|
122
|
+
// in-memory and is always reachable.
|
|
123
|
+
if (!this._redis && !this._qstash)
|
|
124
|
+
return true;
|
|
125
|
+
if (this._redis) {
|
|
126
|
+
try {
|
|
127
|
+
const result = await this._redis.ping();
|
|
128
|
+
if (result === null || result === undefined)
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// QStash has no public ping() method — the absence of a synchronous probe
|
|
136
|
+
// is intentional. We consider QStash reachable if the client is
|
|
137
|
+
// constructed (which required a valid token). A real network probe would
|
|
138
|
+
// have to issue a test publish, which is not appropriate for readiness.
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Handle incoming QStash webhook. Called by the HTTP route handler.
|
|
143
|
+
* Verifies signature and dispatches to local subscribers.
|
|
144
|
+
*/
|
|
145
|
+
async handleWebhook(message) {
|
|
146
|
+
this._runInterceptors(message);
|
|
147
|
+
await this._deliverLocallyAsync(message);
|
|
148
|
+
}
|
|
149
|
+
// --- Private: QStash ---
|
|
150
|
+
async _publishToQStash(msg) {
|
|
151
|
+
if (!this._qstash || !this._callbackUrl)
|
|
152
|
+
return;
|
|
153
|
+
await this._qstash.publishJSON({
|
|
154
|
+
url: this._callbackUrl,
|
|
155
|
+
body: msg,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// --- Private: Grouped events (Redis path) ---
|
|
159
|
+
async _emitGrouped(events, groupId) {
|
|
160
|
+
if (this._redis) {
|
|
161
|
+
await this._emitGroupedRedis(events, groupId);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this._emitGroupedLocal(events, groupId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async _emitGroupedRedis(events, groupId) {
|
|
168
|
+
const key = GROUP_KEY_PREFIX + groupId;
|
|
169
|
+
// Check if this is a new group
|
|
170
|
+
const exists = await this._redis.exists(key);
|
|
171
|
+
if (!exists) {
|
|
172
|
+
this._onGroupCreated?.(groupId, 0);
|
|
173
|
+
}
|
|
174
|
+
// RPUSH all events as JSON strings
|
|
175
|
+
const serialized = events.map((e) => JSON.stringify(e));
|
|
176
|
+
await this._redis.rpush(key, ...serialized);
|
|
177
|
+
// Set TTL on first event (EXPIRE only if not already set)
|
|
178
|
+
if (!exists) {
|
|
179
|
+
await this._redis.expire(key, GROUP_TTL_SECONDS);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async _releaseRedisGroup(eventGroupId) {
|
|
183
|
+
const key = GROUP_KEY_PREFIX + eventGroupId;
|
|
184
|
+
// LRANGE + DEL atomically
|
|
185
|
+
const raw = await this._redis.lrange(key, 0, -1);
|
|
186
|
+
await this._redis.del(key);
|
|
187
|
+
if (!raw || raw.length === 0)
|
|
188
|
+
return;
|
|
189
|
+
const events = raw.map((r) => (typeof r === 'string' ? JSON.parse(r) : r));
|
|
190
|
+
this._onGroupReleased?.(eventGroupId, events.length);
|
|
191
|
+
// Deliver all events in FIFO order
|
|
192
|
+
for (const msg of events) {
|
|
193
|
+
this._runInterceptors(msg, { isGrouped: true, eventGroupId });
|
|
194
|
+
await this._deliverLocallyAsync(msg);
|
|
195
|
+
// Also publish to QStash
|
|
196
|
+
if (this._qstash && this._callbackUrl) {
|
|
197
|
+
this._publishToQStash(msg).catch((err) => {
|
|
198
|
+
console.warn(`[EventBus] QStash publish failed for ${msg.eventName}: ${err?.message ?? err}`);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async _clearRedisGroup(eventGroupId) {
|
|
204
|
+
const key = GROUP_KEY_PREFIX + eventGroupId;
|
|
205
|
+
const length = await this._redis.llen(key);
|
|
206
|
+
await this._redis.del(key);
|
|
207
|
+
this._onGroupCleared?.(eventGroupId, length, 'explicit');
|
|
208
|
+
}
|
|
209
|
+
// --- Private: Grouped events (Local fallback) ---
|
|
210
|
+
_emitGroupedLocal(events, groupId) {
|
|
211
|
+
// Check max active groups (E-13)
|
|
212
|
+
if (!this._localGroups.has(groupId) && this._localGroups.size >= this._maxActiveGroups) {
|
|
213
|
+
throw new MantaError('RESOURCE_EXHAUSTED', `Too many active event groups (${this._maxActiveGroups}). Possible leak — check that releaseGroupedEvents/clearGroupedEvents are called.`);
|
|
214
|
+
}
|
|
215
|
+
if (!this._localGroups.has(groupId)) {
|
|
216
|
+
this._localGroups.set(groupId, []);
|
|
217
|
+
this._onGroupCreated?.(groupId, 0);
|
|
218
|
+
// TTL (default 600s)
|
|
219
|
+
const timer = setTimeout(() => {
|
|
220
|
+
const msgs = this._localGroups.get(groupId);
|
|
221
|
+
if (msgs) {
|
|
222
|
+
this._onGroupCleared?.(groupId, msgs.length, 'ttl');
|
|
223
|
+
this._localGroups.delete(groupId);
|
|
224
|
+
this._localGroupTtls.delete(groupId);
|
|
225
|
+
}
|
|
226
|
+
}, GROUP_TTL_SECONDS * 1000);
|
|
227
|
+
this._localGroupTtls.set(groupId, timer);
|
|
228
|
+
}
|
|
229
|
+
this._localGroups.get(groupId).push(...events);
|
|
230
|
+
}
|
|
231
|
+
async _releaseLocalGroup(eventGroupId) {
|
|
232
|
+
const events = this._localGroups.get(eventGroupId);
|
|
233
|
+
if (!events)
|
|
234
|
+
return;
|
|
235
|
+
// Clear TTL timer
|
|
236
|
+
const timer = this._localGroupTtls.get(eventGroupId);
|
|
237
|
+
if (timer)
|
|
238
|
+
clearTimeout(timer);
|
|
239
|
+
this._localGroupTtls.delete(eventGroupId);
|
|
240
|
+
this._localGroups.delete(eventGroupId);
|
|
241
|
+
this._onGroupReleased?.(eventGroupId, events.length);
|
|
242
|
+
// Deliver all events in FIFO order
|
|
243
|
+
for (const msg of events) {
|
|
244
|
+
this._runInterceptors(msg, { isGrouped: true, eventGroupId });
|
|
245
|
+
await this._deliverLocallyAsync(msg);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async _clearLocalGroup(eventGroupId) {
|
|
249
|
+
const events = this._localGroups.get(eventGroupId);
|
|
250
|
+
const count = events?.length ?? 0;
|
|
251
|
+
const timer = this._localGroupTtls.get(eventGroupId);
|
|
252
|
+
if (timer)
|
|
253
|
+
clearTimeout(timer);
|
|
254
|
+
this._localGroupTtls.delete(eventGroupId);
|
|
255
|
+
this._localGroups.delete(eventGroupId);
|
|
256
|
+
this._onGroupCleared?.(eventGroupId, count, 'explicit');
|
|
257
|
+
}
|
|
258
|
+
// --- Private: Delivery ---
|
|
259
|
+
_runInterceptors(msg, ctx) {
|
|
260
|
+
for (const interceptor of this._interceptors) {
|
|
261
|
+
try {
|
|
262
|
+
interceptor(msg, ctx);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
/* ignored — interceptors are fire-and-forget */
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
_deliverLocally(msg) {
|
|
270
|
+
const handlers = this._subscribers.get(msg.eventName) ?? [];
|
|
271
|
+
Promise.all(handlers.map((s) => {
|
|
272
|
+
try {
|
|
273
|
+
return Promise.resolve(s.handler(msg)).catch(() => { });
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return Promise.resolve();
|
|
277
|
+
}
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
async _deliverLocallyAsync(msg) {
|
|
281
|
+
const handlers = this._subscribers.get(msg.eventName) ?? [];
|
|
282
|
+
await Promise.all(handlers.map((s) => {
|
|
283
|
+
try {
|
|
284
|
+
return Promise.resolve(s.handler(msg));
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return Promise.resolve();
|
|
288
|
+
}
|
|
289
|
+
}));
|
|
290
|
+
}
|
|
291
|
+
/** Configure maxActiveGroups for testing E-13 */
|
|
292
|
+
_setMaxActiveGroups(max) {
|
|
293
|
+
this._maxActiveGroups = max;
|
|
294
|
+
}
|
|
295
|
+
_reset() {
|
|
296
|
+
this._subscribers.clear();
|
|
297
|
+
this._interceptors = [];
|
|
298
|
+
for (const timer of this._localGroupTtls.values())
|
|
299
|
+
clearTimeout(timer);
|
|
300
|
+
this._localGroups.clear();
|
|
301
|
+
this._localGroupTtls.clear();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,qGAAqG;AACrG,oGAAoG;AAGpG,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAUtC,MAAM,gBAAgB,GAAG,mBAAmB,CAAA;AAC5C,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,MAAM,OAAO,sBAAsB;IACzB,YAAY,GAAG,IAAI,GAAG,EAAoF,CAAA;IAC1G,aAAa,GAAiD,EAAE,CAAA;IAChE,OAAO,GAAwB,IAAI,CAAA;IACnC,MAAM,GAAiB,IAAI,CAAA;IAC3B,YAAY,GAAkB,IAAI,CAAA;IAClC,gBAAgB,GAAG,KAAK,CAAA;IAEhC,qEAAqE;IAC7D,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC3C,eAAe,GAAG,IAAI,GAAG,EAAyC,CAAA;IAE1E,QAAQ;IACA,eAAe,CAAsC;IACrD,gBAAgB,CAAsC;IACtD,eAAe,CAAkE;IAEzF,YAAY,UAAkC,EAAE;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QACnE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAA;QAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QACvE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAA;QAE7E,2CAA2C;QAC3C,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;YACvD,IAAI,CAAC,YAAY,GAAG,WAAW,IAAI,IAAI,CAAA;QACzC,CAAC;QAED,4DAA4D;QAC5D,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAA0B,EAAE,OAA8B;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAErD,uCAAuC;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,UAAU,CAClB,cAAc,EACd,6FAA6F,CAC9F,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAA;QAEhC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,mDAAmD;QACnD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YAEzB,2DAA2D;YAC3D,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACvC,OAAO,CAAC,IAAI,CAAC,wCAAwC,GAAG,CAAC,SAAS,KAAK,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;gBAC/F,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CACP,SAAiB,EACjB,OAAiD,EACjD,OAAmC;QAEnC,MAAM,EAAE,GAAG,OAAO,EAAE,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE,CAAA;QAEvD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;QAE9C,qCAAqC;QACrC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAAE,OAAM;QAEzC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,WAAW,CAAC,YAAoB;QAC9B,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAC1C,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,YAAoB;QAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAED,cAAc,CACZ,EAAwG;QAExG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAA2C,CAAC,CAAA;IACtE,CAAC;IAED,iBAAiB,CACf,EAAwG;QAExG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,cAAc,CAAC,OAA4C;QACzD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;IAChC,CAAC;IAED,eAAe,CAAC,OAA4C;QAC1D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAA;IACjC,CAAC;IAED,cAAc,CAAC,OAAwE;QACrF,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;IAChC,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,mEAAmE;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI;QACR,0EAA0E;QAC1E,kEAAkE;QAClE,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAE9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,MAAsD,CAAC,IAAI,EAAE,CAAA;gBACxF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAA;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,gEAAgE;QAChE,yEAAyE;QACzE,wEAAwE;QACxE,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAC9B,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,0BAA0B;IAElB,KAAK,CAAC,gBAAgB,CAAC,GAAY;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAM;QAE/C,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC7B,GAAG,EAAE,IAAI,CAAC,YAAY;YACtB,IAAI,EAAE,GAAG;SACV,CAAC,CAAA;IACJ,CAAC;IAED,+CAA+C;IAEvC,KAAK,CAAC,YAAY,CAAC,MAAiB,EAAE,OAAe;QAC3D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,MAAiB,EAAE,OAAe;QAChE,MAAM,GAAG,GAAG,gBAAgB,GAAG,OAAO,CAAA;QAEtC,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QACvD,MAAM,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAA;QAE5C,0DAA0D;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QACnD,MAAM,GAAG,GAAG,gBAAgB,GAAG,YAAY,CAAA;QAE3C,0BAA0B;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAE3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEpC,MAAM,MAAM,GAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAY,CAAC,CAAA;QAChG,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAEpD,mCAAmC;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAC7D,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;YAEpC,yBAAyB;YACzB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACvC,OAAO,CAAC,IAAI,CAAC,wCAAwC,GAAG,CAAC,SAAS,KAAK,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;gBAC/F,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACjD,MAAM,GAAG,GAAG,gBAAgB,GAAG,YAAY,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IAC1D,CAAC;IAED,mDAAmD;IAE3C,iBAAiB,CAAC,MAAiB,EAAE,OAAe;QAC1D,iCAAiC;QACjC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvF,MAAM,IAAI,UAAU,CAClB,oBAAoB,EACpB,iCAAiC,IAAI,CAAC,gBAAgB,mFAAmF,CAC1I,CAAA;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAClC,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAElC,qBAAqB;YACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC3C,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;oBACnD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;oBACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,CAAA;YAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;IACjD,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,kBAAkB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACpD,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAEzC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QACtC,IAAI,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAEpD,mCAAmC;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAC7D,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,CAAA;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACpD,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAEzC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QACtC,IAAI,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACzD,CAAC;IAED,4BAA4B;IAEpB,gBAAgB,CAAC,GAAY,EAAE,GAAoD;QACzF,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,GAAY;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC3D,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC;gBACH,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;QACH,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,GAAY;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC3D,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC;gBACH,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC;QACH,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,iDAAiD;IACjD,mBAAmB,CAAC,GAAW;QAC7B,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAA;IAC7B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;QACtE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UpstashEventBusAdapter } from './adapter';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an H3-compatible event handler for QStash webhooks.
|
|
4
|
+
* Verifies the signature and dispatches the message to local subscribers.
|
|
5
|
+
*
|
|
6
|
+
* Usage in route:
|
|
7
|
+
* import { createQStashWebhookHandler } from '@mantajs/adapter-eventbus-upstash'
|
|
8
|
+
* export const POST = createQStashWebhookHandler(adapter)
|
|
9
|
+
*/
|
|
10
|
+
export declare function createQStashWebhookHandler(adapter: UpstashEventBusAdapter): (req: Request) => Promise<Response>;
|
|
11
|
+
//# sourceMappingURL=webhook-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-handler.d.ts","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAEvD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,IAC1D,KAAK,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAgB/C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// QStash webhook handler — verifies signature and dispatches to local subscribers
|
|
2
|
+
/**
|
|
3
|
+
* Creates an H3-compatible event handler for QStash webhooks.
|
|
4
|
+
* Verifies the signature and dispatches the message to local subscribers.
|
|
5
|
+
*
|
|
6
|
+
* Usage in route:
|
|
7
|
+
* import { createQStashWebhookHandler } from '@mantajs/adapter-eventbus-upstash'
|
|
8
|
+
* export const POST = createQStashWebhookHandler(adapter)
|
|
9
|
+
*/
|
|
10
|
+
export function createQStashWebhookHandler(adapter) {
|
|
11
|
+
return async (req) => {
|
|
12
|
+
try {
|
|
13
|
+
const body = (await req.json());
|
|
14
|
+
if (!body.eventName) {
|
|
15
|
+
return new Response(JSON.stringify({ error: 'Missing eventName' }), { status: 400 });
|
|
16
|
+
}
|
|
17
|
+
await adapter.handleWebhook(body);
|
|
18
|
+
return new Response(JSON.stringify({ ok: true }), { status: 200 });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
22
|
+
return new Response(JSON.stringify({ error: message }), { status: 500 });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=webhook-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../src/webhook-handler.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAKlF;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAA+B;IACxE,OAAO,KAAK,EAAE,GAAY,EAAqB,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAA;YAE1C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACtF,CAAC;YAED,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAEjC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;YACxE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mantajs/adapter-eventbus-upstash",
|
|
3
|
+
"version": "0.2.0-beta.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@upstash/qstash": "^2.7.0",
|
|
16
|
+
"@upstash/redis": "^1.34.0"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"@mantajs/core": "0.2.0-beta.0"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
]
|
|
24
|
+
}
|