@uploadbox/nextjs 0.1.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.
Files changed (57) hide show
  1. package/dist/analytics.d.ts +11 -0
  2. package/dist/analytics.d.ts.map +1 -0
  3. package/dist/analytics.js +50 -0
  4. package/dist/analytics.js.map +1 -0
  5. package/dist/auth.d.ts +4 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +46 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/create-hosted-handler.d.ts +17 -0
  10. package/dist/create-hosted-handler.d.ts.map +1 -0
  11. package/dist/create-hosted-handler.js +13 -0
  12. package/dist/create-hosted-handler.js.map +1 -0
  13. package/dist/create-route-handler.d.ts +7 -0
  14. package/dist/create-route-handler.d.ts.map +1 -0
  15. package/dist/create-route-handler.js +469 -0
  16. package/dist/create-route-handler.js.map +1 -0
  17. package/dist/extract-router-config.d.ts +3 -0
  18. package/dist/extract-router-config.d.ts.map +1 -0
  19. package/dist/extract-router-config.js +8 -0
  20. package/dist/extract-router-config.js.map +1 -0
  21. package/dist/hosted-hooks.d.ts +9 -0
  22. package/dist/hosted-hooks.d.ts.map +1 -0
  23. package/dist/hosted-hooks.js +105 -0
  24. package/dist/hosted-hooks.js.map +1 -0
  25. package/dist/index.d.ts +10 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/processing-pipeline.d.ts +3 -0
  30. package/dist/processing-pipeline.d.ts.map +1 -0
  31. package/dist/processing-pipeline.js +68 -0
  32. package/dist/processing-pipeline.js.map +1 -0
  33. package/dist/quota.d.ts +5 -0
  34. package/dist/quota.d.ts.map +1 -0
  35. package/dist/quota.js +68 -0
  36. package/dist/quota.js.map +1 -0
  37. package/dist/rate-limiter.d.ts +17 -0
  38. package/dist/rate-limiter.d.ts.map +1 -0
  39. package/dist/rate-limiter.js +47 -0
  40. package/dist/rate-limiter.js.map +1 -0
  41. package/dist/types.d.ts +104 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +2 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/webhooks.d.ts +7 -0
  46. package/dist/webhooks.d.ts.map +1 -0
  47. package/dist/webhooks.js +151 -0
  48. package/dist/webhooks.js.map +1 -0
  49. package/package.json +53 -0
  50. package/src/create-hosted-handler.ts +27 -0
  51. package/src/create-route-handler.ts +654 -0
  52. package/src/extract-router-config.ts +9 -0
  53. package/src/hosted-hooks.ts +132 -0
  54. package/src/index.ts +19 -0
  55. package/src/processing-pipeline.ts +77 -0
  56. package/src/rate-limiter.ts +64 -0
  57. package/src/types.ts +129 -0
@@ -0,0 +1,151 @@
1
+ import { createHmac, randomBytes } from "crypto";
2
+ import { webhooks, webhookDeliveries, eq, and, sql } from "@uploadbox/db";
3
+ export function generateWebhookSecret() {
4
+ return `whsec_${randomBytes(24).toString("base64url")}`;
5
+ }
6
+ function signPayload(payload, secret) {
7
+ return createHmac("sha256", secret).update(payload).digest("hex");
8
+ }
9
+ export async function dispatchWebhooks(db, event, data) {
10
+ // Find all active webhooks that listen for this event
11
+ const activeWebhooks = await db
12
+ .select()
13
+ .from(webhooks)
14
+ .where(eq(webhooks.isActive, true));
15
+ const matchingWebhooks = activeWebhooks.filter((wh) => {
16
+ const events = wh.events;
17
+ return events.includes(event);
18
+ });
19
+ if (matchingWebhooks.length === 0)
20
+ return;
21
+ const payload = JSON.stringify({
22
+ event,
23
+ data,
24
+ timestamp: new Date().toISOString(),
25
+ });
26
+ for (const webhook of matchingWebhooks) {
27
+ // Create delivery record
28
+ const [delivery] = await db
29
+ .insert(webhookDeliveries)
30
+ .values({
31
+ webhookId: webhook.id,
32
+ event,
33
+ payload: { event, data, timestamp: new Date().toISOString() },
34
+ status: "pending",
35
+ maxAttempts: 5,
36
+ })
37
+ .returning();
38
+ if (!delivery)
39
+ continue;
40
+ // Attempt delivery
41
+ try {
42
+ const signature = signPayload(payload, webhook.secret);
43
+ const response = await fetch(webhook.url, {
44
+ method: "POST",
45
+ headers: {
46
+ "Content-Type": "application/json",
47
+ "X-Uploadbox-Signature": signature,
48
+ "X-Uploadbox-Event": event,
49
+ "X-Uploadbox-Delivery": delivery.id,
50
+ },
51
+ body: payload,
52
+ signal: AbortSignal.timeout(10000),
53
+ });
54
+ const responseBody = await response.text().catch(() => "");
55
+ await db
56
+ .update(webhookDeliveries)
57
+ .set({
58
+ status: response.ok ? "success" : "failed",
59
+ httpStatus: response.status,
60
+ responseBody: responseBody.slice(0, 1000),
61
+ attempts: 1,
62
+ lastAttemptAt: new Date(),
63
+ nextRetryAt: response.ok ? null : new Date(Date.now() + 60_000),
64
+ })
65
+ .where(eq(webhookDeliveries.id, delivery.id));
66
+ }
67
+ catch (err) {
68
+ await db
69
+ .update(webhookDeliveries)
70
+ .set({
71
+ status: "failed",
72
+ responseBody: err.message.slice(0, 1000),
73
+ attempts: 1,
74
+ lastAttemptAt: new Date(),
75
+ nextRetryAt: new Date(Date.now() + 60_000),
76
+ })
77
+ .where(eq(webhookDeliveries.id, delivery.id));
78
+ }
79
+ }
80
+ }
81
+ export async function retryFailedDeliveries(db) {
82
+ const failedDeliveries = await db
83
+ .select()
84
+ .from(webhookDeliveries)
85
+ .where(and(eq(webhookDeliveries.status, "failed"), sql `${webhookDeliveries.attempts} < ${webhookDeliveries.maxAttempts}`, sql `${webhookDeliveries.nextRetryAt} IS NOT NULL AND ${webhookDeliveries.nextRetryAt} <= NOW()`))
86
+ .limit(100);
87
+ let retried = 0;
88
+ for (const delivery of failedDeliveries) {
89
+ const [webhook] = await db
90
+ .select()
91
+ .from(webhooks)
92
+ .where(eq(webhooks.id, delivery.webhookId))
93
+ .limit(1);
94
+ if (!webhook || !webhook.isActive) {
95
+ await db
96
+ .update(webhookDeliveries)
97
+ .set({ status: "failed", nextRetryAt: null })
98
+ .where(eq(webhookDeliveries.id, delivery.id));
99
+ continue;
100
+ }
101
+ const payload = JSON.stringify(delivery.payload);
102
+ try {
103
+ const signature = signPayload(payload, webhook.secret);
104
+ const response = await fetch(webhook.url, {
105
+ method: "POST",
106
+ headers: {
107
+ "Content-Type": "application/json",
108
+ "X-Uploadbox-Signature": signature,
109
+ "X-Uploadbox-Event": delivery.event,
110
+ "X-Uploadbox-Delivery": delivery.id,
111
+ },
112
+ body: payload,
113
+ signal: AbortSignal.timeout(10000),
114
+ });
115
+ const responseBody = await response.text().catch(() => "");
116
+ const newAttempts = delivery.attempts + 1;
117
+ // Exponential backoff: 1m, 5m, 30m, 2h, 12h
118
+ const backoffs = [60_000, 300_000, 1_800_000, 7_200_000, 43_200_000];
119
+ const nextDelay = backoffs[Math.min(newAttempts, backoffs.length - 1)];
120
+ await db
121
+ .update(webhookDeliveries)
122
+ .set({
123
+ status: response.ok ? "success" : "failed",
124
+ httpStatus: response.status,
125
+ responseBody: responseBody.slice(0, 1000),
126
+ attempts: newAttempts,
127
+ lastAttemptAt: new Date(),
128
+ nextRetryAt: response.ok ? null : (newAttempts >= delivery.maxAttempts ? null : new Date(Date.now() + nextDelay)),
129
+ })
130
+ .where(eq(webhookDeliveries.id, delivery.id));
131
+ retried++;
132
+ }
133
+ catch (err) {
134
+ const newAttempts = delivery.attempts + 1;
135
+ const backoffs = [60_000, 300_000, 1_800_000, 7_200_000, 43_200_000];
136
+ const nextDelay = backoffs[Math.min(newAttempts, backoffs.length - 1)];
137
+ await db
138
+ .update(webhookDeliveries)
139
+ .set({
140
+ responseBody: err.message.slice(0, 1000),
141
+ attempts: newAttempts,
142
+ lastAttemptAt: new Date(),
143
+ nextRetryAt: newAttempts >= delivery.maxAttempts ? null : new Date(Date.now() + nextDelay),
144
+ })
145
+ .where(eq(webhookDeliveries.id, delivery.id));
146
+ retried++;
147
+ }
148
+ }
149
+ return retried;
150
+ }
151
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@uploadbox/nextjs",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@uploadbox/core": "0.1.0"
16
+ },
17
+ "peerDependencies": {
18
+ "next": "^14.0.0 || ^15.0.0 || ^16.0.0"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "^5.7.0",
22
+ "@types/node": "^22.0.0",
23
+ "next": "^15.1.0"
24
+ },
25
+ "description": "Next.js route handler for Uploadbox — presigned URL uploads with your own S3 bucket",
26
+ "keywords": [
27
+ "uploadbox",
28
+ "nextjs",
29
+ "upload",
30
+ "s3",
31
+ "file-upload",
32
+ "presigned-url"
33
+ ],
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/federicostarace/uploadbox",
38
+ "directory": "packages/nextjs"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "src"
43
+ ],
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "tsc --watch",
50
+ "typecheck": "tsc --noEmit",
51
+ "clean": "rm -rf dist"
52
+ }
53
+ }
@@ -0,0 +1,27 @@
1
+ import type { FileRouter, UploadboxConfig } from "@uploadbox/core";
2
+ import type { ProcessingPipelineConfig } from "@uploadbox/core";
3
+ import type { RateLimitConfig } from "./rate-limiter.js";
4
+ import { createRouteHandler } from "./create-route-handler.js";
5
+ import { createHostedHooks, type HostedModeConfig } from "./hosted-hooks.js";
6
+
7
+ interface CreateHostedHandlerOpts<TRouter extends FileRouter> {
8
+ router: TRouter;
9
+ config?: Partial<UploadboxConfig>;
10
+ platform: HostedModeConfig;
11
+ rateLimit?: RateLimitConfig;
12
+ processing?: ProcessingPipelineConfig;
13
+ }
14
+
15
+ export function createHostedHandler<TRouter extends FileRouter>(
16
+ opts: CreateHostedHandlerOpts<TRouter>
17
+ ) {
18
+ const hooks = createHostedHooks(opts.platform);
19
+
20
+ return createRouteHandler({
21
+ router: opts.router,
22
+ config: opts.config,
23
+ hooks,
24
+ rateLimit: opts.rateLimit,
25
+ processing: opts.processing,
26
+ });
27
+ }