@voltro/plugin-storage 0.67.0 → 0.69.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/CHANGELOG.md +437 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +387 -376
- package/dist/rpc.js +7 -7
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -4,39 +4,39 @@ import { Chunk as y, Effect as b, Exit as x, Layer as S, Schedule as C, Stream a
|
|
|
4
4
|
import { definePlugin as T, pluginInstanceName as re } from "@voltro/protocol";
|
|
5
5
|
import { readCookie as E, resolveSessionSecret as ie, verifySession as ae } from "@voltro/protocol/session";
|
|
6
6
|
import { and as D, bytes as oe, eq as O, generateId as k, id as A, integer as j, json as M, mixin as se, reference as ce, table as N, text as P, timestamp as F } from "@voltro/database";
|
|
7
|
-
import { pluginEnv as
|
|
8
|
-
import { createHmac as
|
|
9
|
-
import { spawn as
|
|
10
|
-
import { mkdtemp as
|
|
11
|
-
import { tmpdir as
|
|
12
|
-
import { join as
|
|
13
|
-
import { statSync as
|
|
7
|
+
import { pluginEnv as I } from "@voltro/env";
|
|
8
|
+
import { createHmac as L, randomBytes as le, randomUUID as ue, scryptSync as R, timingSafeEqual as z } from "node:crypto";
|
|
9
|
+
import { spawn as de } from "node:child_process";
|
|
10
|
+
import { mkdtemp as fe, readFile as pe, rm as me, writeFile as B } from "node:fs/promises";
|
|
11
|
+
import { tmpdir as V } from "node:os";
|
|
12
|
+
import { join as he } from "node:path";
|
|
13
|
+
import { statSync as ge } from "node:fs";
|
|
14
14
|
//#region src/streamBridge.ts
|
|
15
|
-
var
|
|
15
|
+
var _e = 1 << 20, ve = (e, n, r = !1) => new t({
|
|
16
16
|
provider: e,
|
|
17
17
|
message: n,
|
|
18
18
|
transient: r
|
|
19
|
-
}),
|
|
19
|
+
}), ye = (e) => {
|
|
20
20
|
let t = 0;
|
|
21
21
|
for (let n of e) t += n.byteLength;
|
|
22
22
|
let n = new Uint8Array(t), r = 0;
|
|
23
23
|
for (let t of e) n.set(t, r), r += t.byteLength;
|
|
24
24
|
return n;
|
|
25
|
-
},
|
|
25
|
+
}, be = (e, t = _e) => {
|
|
26
26
|
let n = [];
|
|
27
27
|
for (let r = 0; r < e.byteLength; r += t) n.push(e.subarray(r, Math.min(r + t, e.byteLength)));
|
|
28
28
|
return w.fromIterable(n);
|
|
29
|
-
},
|
|
29
|
+
}, xe = (e) => e.pipe(w.runCollect, b.map((e) => ye(y.toReadonlyArray(e)))), Se = (e, t) => w.suspend(() => w.fromAsyncIterable(t(), (t) => ve(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(w.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), Ce = async (e) => {
|
|
30
30
|
let { Readable: t } = await import("node:stream");
|
|
31
31
|
return t.fromWeb(w.toReadableStream(e));
|
|
32
32
|
}, we = (e, t) => e.getStream ? e.getStream(t) : e.get(t).pipe(b.map((e) => ({
|
|
33
|
-
stream:
|
|
33
|
+
stream: be(e.bytes),
|
|
34
34
|
contentType: e.contentType,
|
|
35
35
|
size: e.bytes.byteLength
|
|
36
|
-
}))), Te = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) :
|
|
36
|
+
}))), Te = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) : xe(n).pipe(b.flatMap((n) => e.put(t, n, {
|
|
37
37
|
contentType: r.contentType,
|
|
38
38
|
...r.public === void 0 ? {} : { public: r.public }
|
|
39
|
-
}))), H = "_voltro_storage_refs", U = "_voltro_storage_grants", W = "_voltro_storage_blobs",
|
|
39
|
+
}))), H = "_voltro_storage_refs", U = "_voltro_storage_grants", W = "_voltro_storage_blobs", Ee = "_voltro_storage_usage", De = N(H, {
|
|
40
40
|
id: A({ prefix: "file" }),
|
|
41
41
|
tenantId: P().nullable(),
|
|
42
42
|
ownerId: P().nullable(),
|
|
@@ -59,7 +59,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
59
59
|
derivedFrom: P().nullable(),
|
|
60
60
|
kind: P().nullable(),
|
|
61
61
|
createdAt: F()
|
|
62
|
-
}).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]),
|
|
62
|
+
}).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]), Oe = N(U, {
|
|
63
63
|
id: A({ prefix: "sgrant" }),
|
|
64
64
|
refId: P(),
|
|
65
65
|
principalType: P(),
|
|
@@ -68,19 +68,19 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
68
68
|
createdAt: F(),
|
|
69
69
|
expiresAt: F().nullable(),
|
|
70
70
|
createdBy: P().nullable()
|
|
71
|
-
}).index(["refId"]).index(["principalId"]),
|
|
71
|
+
}).index(["refId"]).index(["principalId"]), ke = N(Ee, {
|
|
72
72
|
id: A({ prefix: "susage" }),
|
|
73
73
|
tenantId: P().maxLength(191),
|
|
74
74
|
bytes: j().default(0),
|
|
75
75
|
count: j().default(0),
|
|
76
76
|
updatedAt: F()
|
|
77
|
-
}).unique("byStorageUsageTenant", ["tenantId"]),
|
|
77
|
+
}).unique("byStorageUsageTenant", ["tenantId"]), Ae = N(W, {
|
|
78
78
|
id: A({ prefix: "blob" }),
|
|
79
79
|
key: P(),
|
|
80
80
|
data: oe(),
|
|
81
81
|
contentType: P(),
|
|
82
82
|
size: j()
|
|
83
|
-
}).index(["key"]),
|
|
83
|
+
}).index(["key"]), G = I([
|
|
84
84
|
{
|
|
85
85
|
name: "STORAGE_PROVIDER",
|
|
86
86
|
required: !1,
|
|
@@ -231,16 +231,16 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
231
231
|
secret: !1,
|
|
232
232
|
description: "clamd port for the optional clamav virus scanner. Default 3310."
|
|
233
233
|
}
|
|
234
|
-
]),
|
|
234
|
+
]), K = (e, n, r, i) => new t({
|
|
235
235
|
provider: e,
|
|
236
236
|
message: n,
|
|
237
237
|
transient: r,
|
|
238
238
|
...i === void 0 ? {} : { status: i }
|
|
239
|
-
}),
|
|
240
|
-
|
|
241
|
-
},
|
|
242
|
-
let t =
|
|
243
|
-
return
|
|
239
|
+
}), je = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, Me = /* @__PURE__ */ new Map(), Ne = (e, t) => Me.get(e)?.get(t)?.bytes, Pe = (e) => {
|
|
240
|
+
Me.get(e)?.clear();
|
|
241
|
+
}, Fe = (e = "default") => {
|
|
242
|
+
let t = Me.get(e) ?? /* @__PURE__ */ new Map();
|
|
243
|
+
return Me.set(e, t), {
|
|
244
244
|
name: "memory",
|
|
245
245
|
presigns: !1,
|
|
246
246
|
put: (e, n, r) => b.sync(() => (t.set(e, {
|
|
@@ -252,7 +252,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
252
252
|
return n ? b.succeed({
|
|
253
253
|
bytes: n.bytes,
|
|
254
254
|
contentType: n.contentType
|
|
255
|
-
}) : b.fail(
|
|
255
|
+
}) : b.fail(K("memory", `no object at key '${e}'`, !1, 404));
|
|
256
256
|
}),
|
|
257
257
|
delete: (e) => b.sync(() => {
|
|
258
258
|
t.delete(e);
|
|
@@ -264,14 +264,14 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
264
264
|
return n ? { size: n.bytes.byteLength } : null;
|
|
265
265
|
})
|
|
266
266
|
};
|
|
267
|
-
},
|
|
267
|
+
}, Ie = (e) => {
|
|
268
268
|
let t = e.root, n = async (e) => {
|
|
269
269
|
let { join: n, resolve: r, sep: i } = await import("node:path"), a = r(t), o = r(a, e);
|
|
270
270
|
if (o !== a && !o.startsWith(a + i)) throw Error(`key '${e}' escapes the storage root`);
|
|
271
271
|
return n(o);
|
|
272
272
|
}, r = (e, t, n = !1) => b.tryPromise({
|
|
273
273
|
try: e,
|
|
274
|
-
catch: (e) => e?.code === "ENOENT" ?
|
|
274
|
+
catch: (e) => e?.code === "ENOENT" ? K("filesystem", `no object at key '${t}'`, !1, 404) : K("filesystem", String(e?.message ?? e), n)
|
|
275
275
|
});
|
|
276
276
|
return {
|
|
277
277
|
root: t,
|
|
@@ -310,12 +310,12 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
310
310
|
throw e;
|
|
311
311
|
}
|
|
312
312
|
},
|
|
313
|
-
catch: (e) =>
|
|
313
|
+
catch: (e) => K("filesystem", String(e?.message ?? e), !1)
|
|
314
314
|
}),
|
|
315
315
|
getStream: (e) => r(async () => {
|
|
316
316
|
let t = await import("node:fs/promises"), { createReadStream: r } = await import("node:fs"), i = await n(e), a = await t.stat(i);
|
|
317
317
|
return {
|
|
318
|
-
stream:
|
|
318
|
+
stream: Se("filesystem", () => r(i)),
|
|
319
319
|
contentType: "application/octet-stream",
|
|
320
320
|
size: a.size
|
|
321
321
|
};
|
|
@@ -325,7 +325,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
325
325
|
await r.mkdir(i(c), { recursive: !0 });
|
|
326
326
|
let l = `${c}.tmp-${a()}`;
|
|
327
327
|
try {
|
|
328
|
-
await s(await
|
|
328
|
+
await s(await Ce(t), o(l));
|
|
329
329
|
let e = await r.stat(l);
|
|
330
330
|
return await r.rename(l, c), { size: e.size };
|
|
331
331
|
} catch (e) {
|
|
@@ -340,10 +340,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
340
340
|
end: i
|
|
341
341
|
});
|
|
342
342
|
s.on("data", (e) => o.push(e)), s.on("end", () => e()), s.on("error", n);
|
|
343
|
-
}),
|
|
343
|
+
}), ye(o);
|
|
344
344
|
}, e)
|
|
345
345
|
};
|
|
346
|
-
},
|
|
346
|
+
}, Le = (e) => {
|
|
347
347
|
let t = e.name ?? "s3", n = e.publicAcl ?? !0, r = null, i = () => r || (r = (async () => {
|
|
348
348
|
let t, n;
|
|
349
349
|
try {
|
|
@@ -368,7 +368,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
368
368
|
try: e,
|
|
369
369
|
catch: (e) => {
|
|
370
370
|
let n = e?.$metadata?.httpStatusCode;
|
|
371
|
-
return
|
|
371
|
+
return K(t, String(e?.message ?? e), je(n), n);
|
|
372
372
|
}
|
|
373
373
|
}), o = async (e) => {
|
|
374
374
|
let t = e;
|
|
@@ -483,7 +483,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
483
483
|
},
|
|
484
484
|
catch: (e) => {
|
|
485
485
|
let n = e?.$metadata?.httpStatusCode;
|
|
486
|
-
return
|
|
486
|
+
return K(t, String(e?.message ?? e), je(n), n);
|
|
487
487
|
}
|
|
488
488
|
}),
|
|
489
489
|
getStream: (n) => a(async () => {
|
|
@@ -492,7 +492,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
492
492
|
Key: n
|
|
493
493
|
})), s = o.Body;
|
|
494
494
|
return {
|
|
495
|
-
stream:
|
|
495
|
+
stream: Se(t, () => s),
|
|
496
496
|
contentType: o.ContentType ?? "application/octet-stream",
|
|
497
497
|
...o.ContentLength === void 0 ? {} : { size: o.ContentLength }
|
|
498
498
|
};
|
|
@@ -504,7 +504,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
504
504
|
} catch (e) {
|
|
505
505
|
throw Error("s3/minio `putStream` requires the '@aws-sdk/lib-storage' optional dependency (multipart upload). Install it to enable streamed uploads.", { cause: e });
|
|
506
506
|
}
|
|
507
|
-
let l = await
|
|
507
|
+
let l = await Ce(r);
|
|
508
508
|
return await new c.Upload({
|
|
509
509
|
client: a,
|
|
510
510
|
params: {
|
|
@@ -528,13 +528,13 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
528
528
|
return o(c.Body);
|
|
529
529
|
})
|
|
530
530
|
};
|
|
531
|
-
},
|
|
531
|
+
}, Re = (e) => e instanceof Uint8Array ? e : typeof e == "string" ? new Uint8Array(Buffer.from(e, "base64")) : new Uint8Array(e), ze = () => {
|
|
532
532
|
let e = null, t = () => {
|
|
533
533
|
if (!e) throw Error("the 'database' storage provider isn't bound to a DataStore yet");
|
|
534
534
|
return e;
|
|
535
535
|
}, n = (e) => b.tryPromise({
|
|
536
536
|
try: e,
|
|
537
|
-
catch: (e) =>
|
|
537
|
+
catch: (e) => K("database", String(e?.message ?? e), !0)
|
|
538
538
|
}), r = async (e) => (await t().query({
|
|
539
539
|
table: W,
|
|
540
540
|
predicate: {
|
|
@@ -571,9 +571,9 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
571
571
|
}), { size: i.byteLength };
|
|
572
572
|
}),
|
|
573
573
|
get: (e) => b.suspend(() => n(() => r(e)).pipe(b.flatMap((t) => t ? b.succeed({
|
|
574
|
-
bytes:
|
|
574
|
+
bytes: Re(t.data),
|
|
575
575
|
contentType: String(t.contentType)
|
|
576
|
-
}) : b.fail(
|
|
576
|
+
}) : b.fail(K("database", `no object at key '${e}'`, !1, 404))))),
|
|
577
577
|
delete: (e) => n(async () => {
|
|
578
578
|
let n = await r(e);
|
|
579
579
|
n && await t().delete(W, String(n.id));
|
|
@@ -585,7 +585,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
585
585
|
return t ? { size: Number(t.size) } : null;
|
|
586
586
|
})
|
|
587
587
|
};
|
|
588
|
-
},
|
|
588
|
+
}, Be = (e) => {
|
|
589
589
|
let t = null, n = () => t || (t = (async () => {
|
|
590
590
|
let t;
|
|
591
591
|
try {
|
|
@@ -593,7 +593,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
593
593
|
} catch (e) {
|
|
594
594
|
throw Error("the 'azure' storage provider requires the '@azure/storage-blob' optional dependency. Install it to enable it.", { cause: e });
|
|
595
595
|
}
|
|
596
|
-
let n =
|
|
596
|
+
let n = G.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = G.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = G.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
|
|
597
597
|
return {
|
|
598
598
|
container: (a ? t.BlobServiceClient.fromConnectionString(a) : new t.BlobServiceClient(e.endpoint ?? `https://${n}.blob.core.windows.net`, i ?? void 0)).getContainerClient(e.container),
|
|
599
599
|
sdk: t,
|
|
@@ -603,7 +603,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
603
603
|
try: e,
|
|
604
604
|
catch: (e) => {
|
|
605
605
|
let t = e?.statusCode;
|
|
606
|
-
return
|
|
606
|
+
return K("azure", String(e?.message ?? e), je(t), t);
|
|
607
607
|
}
|
|
608
608
|
}), i = async (e) => {
|
|
609
609
|
if (!e) return /* @__PURE__ */ new Uint8Array();
|
|
@@ -661,19 +661,19 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
661
661
|
},
|
|
662
662
|
catch: (e) => {
|
|
663
663
|
let t = e?.statusCode;
|
|
664
|
-
return
|
|
664
|
+
return K("azure", String(e?.message ?? e), je(t), t);
|
|
665
665
|
}
|
|
666
666
|
}),
|
|
667
667
|
getStream: (e) => r(async () => {
|
|
668
668
|
let { container: t } = await n(), r = await t.getBlockBlobClient(e).download();
|
|
669
669
|
return {
|
|
670
|
-
stream:
|
|
670
|
+
stream: Se("azure", () => r.readableStreamBody),
|
|
671
671
|
contentType: r.contentType ?? "application/octet-stream",
|
|
672
672
|
...r.contentLength === void 0 ? {} : { size: r.contentLength }
|
|
673
673
|
};
|
|
674
674
|
}),
|
|
675
675
|
putStream: (e, t, i) => r(async () => {
|
|
676
|
-
let { container: r } = await n(), a = await
|
|
676
|
+
let { container: r } = await n(), a = await Ce(t);
|
|
677
677
|
return await r.getBlockBlobClient(e).uploadStream(a, 4194304, 5, { blobHTTPHeaders: { blobContentType: i.contentType } }), { size: i.totalSize ?? (await r.getBlockBlobClient(e).getProperties()).contentLength ?? 0 };
|
|
678
678
|
}),
|
|
679
679
|
getRange: (e, t, a) => r(async () => {
|
|
@@ -681,13 +681,13 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
681
681
|
return i(o.readableStreamBody);
|
|
682
682
|
})
|
|
683
683
|
};
|
|
684
|
-
},
|
|
684
|
+
}, Ve = {
|
|
685
685
|
webp: "image/webp",
|
|
686
686
|
avif: "image/avif",
|
|
687
687
|
jpeg: "image/jpeg",
|
|
688
688
|
jpg: "image/jpeg",
|
|
689
689
|
png: "image/png"
|
|
690
|
-
},
|
|
690
|
+
}, He = (e) => {
|
|
691
691
|
if (!e) return null;
|
|
692
692
|
let t = new URLSearchParams(e), n = (e) => {
|
|
693
693
|
let n = t.get(e);
|
|
@@ -702,18 +702,18 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
702
702
|
...a === void 0 ? {} : { q: a },
|
|
703
703
|
...s ? { fit: s } : {}
|
|
704
704
|
};
|
|
705
|
-
},
|
|
706
|
-
if (
|
|
705
|
+
}, Ue = (e) => e.startsWith("image/") && !e.includes("svg"), q, We = async () => {
|
|
706
|
+
if (q !== void 0) return q;
|
|
707
707
|
try {
|
|
708
708
|
let e = await import("sharp");
|
|
709
|
-
|
|
709
|
+
q = e.default ?? e;
|
|
710
710
|
} catch {
|
|
711
|
-
|
|
711
|
+
q = null;
|
|
712
712
|
}
|
|
713
|
-
return
|
|
714
|
-
},
|
|
715
|
-
if (!
|
|
716
|
-
let r = await
|
|
713
|
+
return q;
|
|
714
|
+
}, Ge = async (e, t, n) => {
|
|
715
|
+
if (!Ue(t)) return null;
|
|
716
|
+
let r = await We();
|
|
717
717
|
if (!r) return null;
|
|
718
718
|
try {
|
|
719
719
|
let i = r(Buffer.from(e), { failOn: "none" });
|
|
@@ -723,10 +723,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
723
723
|
fit: n.fit ?? "cover",
|
|
724
724
|
withoutEnlargement: !0
|
|
725
725
|
}));
|
|
726
|
-
let a = n.format &&
|
|
726
|
+
let a = n.format && Ve[n.format] ? n.format : void 0, o = t;
|
|
727
727
|
if (a) {
|
|
728
728
|
let e = a === "jpg" ? "jpeg" : a;
|
|
729
|
-
i = i.toFormat(e, n.q === void 0 ? {} : { quality: n.q }), o =
|
|
729
|
+
i = i.toFormat(e, n.q === void 0 ? {} : { quality: n.q }), o = Ve[a];
|
|
730
730
|
} else n.q !== void 0 && (t === "image/jpeg" || t === "image/webp") && (i = i.toFormat(t === "image/webp" ? "webp" : "jpeg", { quality: n.q }));
|
|
731
731
|
let s = await i.toBuffer();
|
|
732
732
|
return {
|
|
@@ -736,43 +736,43 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
736
736
|
} catch {
|
|
737
737
|
return null;
|
|
738
738
|
}
|
|
739
|
-
},
|
|
740
|
-
let i = `${e}::${JSON.stringify(r)}`, a =
|
|
739
|
+
}, Ke = 200, J = /* @__PURE__ */ new Map(), qe = async (e, t, n, r) => {
|
|
740
|
+
let i = `${e}::${JSON.stringify(r)}`, a = J.get(i);
|
|
741
741
|
if (a) return a;
|
|
742
|
-
let o = await
|
|
743
|
-
if (o && (
|
|
744
|
-
let e =
|
|
745
|
-
e !== void 0 &&
|
|
742
|
+
let o = await Ge(t, n, r);
|
|
743
|
+
if (o && (J.set(i, o), J.size > Ke)) {
|
|
744
|
+
let e = J.keys().next().value;
|
|
745
|
+
e !== void 0 && J.delete(e);
|
|
746
746
|
}
|
|
747
747
|
return o;
|
|
748
|
-
},
|
|
749
|
-
let t =
|
|
750
|
-
return `${t}:${
|
|
751
|
-
},
|
|
748
|
+
}, Je = (e) => {
|
|
749
|
+
let t = le(16).toString("hex");
|
|
750
|
+
return `${t}:${R(e, t, 32).toString("hex")}`;
|
|
751
|
+
}, Ye = (e, t) => {
|
|
752
752
|
if (!e || !t) return !1;
|
|
753
753
|
let [n, r] = t.split(":");
|
|
754
754
|
if (!n || !r) return !1;
|
|
755
|
-
let i = Buffer.from(r, "hex"), a =
|
|
756
|
-
return a.length === i.length &&
|
|
757
|
-
},
|
|
755
|
+
let i = Buffer.from(r, "hex"), a = R(e, n, i.length);
|
|
756
|
+
return a.length === i.length && z(a, i);
|
|
757
|
+
}, Xe = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], Ze = (e) => Xe(e.metadata?.roles), Qe = (e) => Xe(e.scopes), $e = (e, t) => e.some((e) => t.includes(e)), et = (e) => Xe(e.metadata?.groups), tt = (e) => typeof e == "boolean" ? b.succeed(e) : b.isEffect(e) ? e : b.promise(() => e), nt = (e, t, n = {}) => b.gen(function* () {
|
|
758
758
|
if (t.id && e.ownerId && t.id === e.ownerId) return !0;
|
|
759
759
|
let r = e.accessPolicy ?? [];
|
|
760
760
|
if (r.length === 0) return !1;
|
|
761
|
-
let i = n.resolveGroups ? yield* b.promise(async () => await n.resolveGroups(t)) :
|
|
762
|
-
for (let a of r) if (yield*
|
|
761
|
+
let i = n.resolveGroups ? yield* b.promise(async () => await n.resolveGroups(t)) : et(t);
|
|
762
|
+
for (let a of r) if (yield* rt(a, e, t, i, n)) return !0;
|
|
763
763
|
return !1;
|
|
764
|
-
}),
|
|
764
|
+
}), rt = (e, t, n, r, i) => b.gen(function* () {
|
|
765
765
|
let a = !1, o = (e) => (a = !0, e);
|
|
766
|
-
if (e.owner !== void 0 && e.owner && !o(!!n.id && !!t.ownerId && n.id === t.ownerId) || e.tenant !== void 0 && e.tenant && !o(!!n.tenantId && n.tenantId === t.tenantId) || e.apiKey !== void 0 && e.apiKey && !o(n.type === "apiKey") || e.roles && e.roles.length > 0 && !o(
|
|
766
|
+
if (e.owner !== void 0 && e.owner && !o(!!n.id && !!t.ownerId && n.id === t.ownerId) || e.tenant !== void 0 && e.tenant && !o(!!n.tenantId && n.tenantId === t.tenantId) || e.apiKey !== void 0 && e.apiKey && !o(n.type === "apiKey") || e.roles && e.roles.length > 0 && !o($e(Ze(n), e.roles)) || e.groups && e.groups.length > 0 && !o($e(r, e.groups)) || e.scopes && e.scopes.length > 0 && !o($e(Qe(n), e.scopes)) || e.password !== void 0 && e.password && !o(Ye(i.password, t.passwordHash))) return !1;
|
|
767
767
|
if (e.guard) {
|
|
768
768
|
let r = i.guards?.[e.guard];
|
|
769
|
-
if (!o(r ? yield*
|
|
769
|
+
if (!o(r ? yield* tt(r({
|
|
770
770
|
subject: n,
|
|
771
771
|
ref: t
|
|
772
772
|
})) : !1)) return !1;
|
|
773
773
|
}
|
|
774
774
|
return a;
|
|
775
|
-
}),
|
|
775
|
+
}), it = (e, t) => {
|
|
776
776
|
let n = [];
|
|
777
777
|
e.id && n.push({
|
|
778
778
|
type: e.type === "apiKey" ? "apiKey" : "user",
|
|
@@ -783,115 +783,115 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
783
783
|
id: e
|
|
784
784
|
});
|
|
785
785
|
return n;
|
|
786
|
-
},
|
|
787
|
-
let a =
|
|
786
|
+
}, at = (e, t, n, r, i) => {
|
|
787
|
+
let a = it(t, n);
|
|
788
788
|
return e.some((e) => e.expiresAt && e.expiresAt.getTime() < i || r === "write" && e.permission !== "write" ? !1 : a.some((t) => t.type === e.principalType && t.id === e.principalId));
|
|
789
|
-
},
|
|
789
|
+
}, ot = (e, t) => t.resolveGroups ? b.promise(async () => await t.resolveGroups(e)) : b.succeed(et(e)), Y = () => G.read("VOLTRO_STORAGE_SECRET") ?? ie(), X = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Z = (e) => {
|
|
790
790
|
let t = e.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - e.length % 4) % 4);
|
|
791
791
|
return Buffer.from(t, "base64");
|
|
792
|
-
},
|
|
792
|
+
}, st = (e, t, n = Y()) => {
|
|
793
793
|
if (!n) throw Error("signGrant: secret must be a non-empty string");
|
|
794
794
|
let r = {
|
|
795
795
|
refId: e,
|
|
796
796
|
exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
|
|
797
|
-
}, i =
|
|
798
|
-
return `${i}.${
|
|
799
|
-
},
|
|
797
|
+
}, i = X(JSON.stringify(r));
|
|
798
|
+
return `${i}.${X(L("sha256", n).update(i).digest())}`;
|
|
799
|
+
}, ct = (e, t = Y()) => {
|
|
800
800
|
if (!e || !t) return null;
|
|
801
801
|
let n = e.indexOf(".");
|
|
802
802
|
if (n <= 0 || n === e.length - 1) return null;
|
|
803
|
-
let r = e.slice(0, n), i = e.slice(n + 1), a =
|
|
804
|
-
if (o.length !== a.length || !
|
|
803
|
+
let r = e.slice(0, n), i = e.slice(n + 1), a = L("sha256", t).update(r).digest(), o = Z(i);
|
|
804
|
+
if (o.length !== a.length || !z(o, a)) return null;
|
|
805
805
|
try {
|
|
806
|
-
let e = JSON.parse(
|
|
806
|
+
let e = JSON.parse(Z(r).toString("utf8"));
|
|
807
807
|
return typeof e.refId != "string" || typeof e.exp != "number" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
|
|
808
808
|
} catch {
|
|
809
809
|
return null;
|
|
810
810
|
}
|
|
811
|
-
},
|
|
811
|
+
}, lt = (e, t, n = Y()) => {
|
|
812
812
|
if (!n) throw Error("signUploadTicket: secret must be a non-empty string");
|
|
813
813
|
let r = {
|
|
814
814
|
...e,
|
|
815
815
|
exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
|
|
816
|
-
}, i =
|
|
817
|
-
return `${i}.${
|
|
818
|
-
},
|
|
816
|
+
}, i = X(JSON.stringify(r));
|
|
817
|
+
return `${i}.${X(L("sha256", n).update(`u:${i}`).digest())}`;
|
|
818
|
+
}, ut = (e, t = Y()) => {
|
|
819
819
|
if (!e || !t) return null;
|
|
820
820
|
let n = e.indexOf(".");
|
|
821
821
|
if (n <= 0 || n === e.length - 1) return null;
|
|
822
|
-
let r = e.slice(0, n), i = e.slice(n + 1), a =
|
|
823
|
-
if (o.length !== a.length || !
|
|
822
|
+
let r = e.slice(0, n), i = e.slice(n + 1), a = L("sha256", t).update(`u:${r}`).digest(), o = Z(i);
|
|
823
|
+
if (o.length !== a.length || !z(o, a)) return null;
|
|
824
824
|
try {
|
|
825
|
-
let e = JSON.parse(
|
|
825
|
+
let e = JSON.parse(Z(r).toString("utf8"));
|
|
826
826
|
return typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
|
|
827
827
|
} catch {
|
|
828
828
|
return null;
|
|
829
829
|
}
|
|
830
|
-
},
|
|
830
|
+
}, dt = (e, t, n = Y()) => {
|
|
831
831
|
if (!n) throw Error("signFinalizeTicket: secret must be a non-empty string");
|
|
832
832
|
let r = {
|
|
833
833
|
...e,
|
|
834
834
|
exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
|
|
835
|
-
}, i =
|
|
836
|
-
return `${i}.${
|
|
837
|
-
},
|
|
835
|
+
}, i = X(JSON.stringify(r));
|
|
836
|
+
return `${i}.${X(L("sha256", n).update(`f:${i}`).digest())}`;
|
|
837
|
+
}, ft = (e, t = Y()) => {
|
|
838
838
|
if (!e || !t) return null;
|
|
839
839
|
let n = e.indexOf(".");
|
|
840
840
|
if (n <= 0 || n === e.length - 1) return null;
|
|
841
|
-
let r = e.slice(0, n), i = e.slice(n + 1), a =
|
|
842
|
-
if (o.length !== a.length || !
|
|
841
|
+
let r = e.slice(0, n), i = e.slice(n + 1), a = L("sha256", t).update(`f:${r}`).digest(), o = Z(i);
|
|
842
|
+
if (o.length !== a.length || !z(o, a)) return null;
|
|
843
843
|
try {
|
|
844
|
-
let e = JSON.parse(
|
|
844
|
+
let e = JSON.parse(Z(r).toString("utf8"));
|
|
845
845
|
return typeof e.key != "string" || e.key.length === 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
|
|
846
846
|
} catch {
|
|
847
847
|
return null;
|
|
848
848
|
}
|
|
849
|
-
},
|
|
849
|
+
}, pt = (e, t, n = Y()) => {
|
|
850
850
|
if (!n) throw Error("signResumableTicket: secret must be a non-empty string");
|
|
851
851
|
let r = {
|
|
852
852
|
...e,
|
|
853
853
|
exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
|
|
854
|
-
}, i =
|
|
855
|
-
return `${i}.${
|
|
856
|
-
},
|
|
854
|
+
}, i = X(JSON.stringify(r));
|
|
855
|
+
return `${i}.${X(L("sha256", n).update(`r:${i}`).digest())}`;
|
|
856
|
+
}, mt = (e, t = Y()) => {
|
|
857
857
|
if (!e || !t) return null;
|
|
858
858
|
let n = e.indexOf(".");
|
|
859
859
|
if (n <= 0 || n === e.length - 1) return null;
|
|
860
|
-
let r = e.slice(0, n), i = e.slice(n + 1), a =
|
|
861
|
-
if (o.length !== a.length || !
|
|
860
|
+
let r = e.slice(0, n), i = e.slice(n + 1), a = L("sha256", t).update(`r:${r}`).digest(), o = Z(i);
|
|
861
|
+
if (o.length !== a.length || !z(o, a)) return null;
|
|
862
862
|
try {
|
|
863
|
-
let e = JSON.parse(
|
|
863
|
+
let e = JSON.parse(Z(r).toString("utf8"));
|
|
864
864
|
return typeof e.id != "string" || e.id.length === 0 || typeof e.size != "number" || e.size < 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
|
|
865
865
|
} catch {
|
|
866
866
|
return null;
|
|
867
867
|
}
|
|
868
|
-
},
|
|
868
|
+
}, ht = (e, t, n = Y()) => {
|
|
869
869
|
if (!n) throw Error("signMultipartTicket: secret must be a non-empty string");
|
|
870
870
|
let r = {
|
|
871
871
|
...e,
|
|
872
872
|
exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
|
|
873
|
-
}, i =
|
|
874
|
-
return `${i}.${
|
|
875
|
-
},
|
|
873
|
+
}, i = X(JSON.stringify(r));
|
|
874
|
+
return `${i}.${X(L("sha256", n).update(`m:${i}`).digest())}`;
|
|
875
|
+
}, gt = (e, t = Y()) => {
|
|
876
876
|
if (!e || !t) return null;
|
|
877
877
|
let n = e.indexOf(".");
|
|
878
878
|
if (n <= 0 || n === e.length - 1) return null;
|
|
879
|
-
let r = e.slice(0, n), i = e.slice(n + 1), a =
|
|
880
|
-
if (o.length !== a.length || !
|
|
879
|
+
let r = e.slice(0, n), i = e.slice(n + 1), a = L("sha256", t).update(`m:${r}`).digest(), o = Z(i);
|
|
880
|
+
if (o.length !== a.length || !z(o, a)) return null;
|
|
881
881
|
try {
|
|
882
|
-
let e = JSON.parse(
|
|
882
|
+
let e = JSON.parse(Z(r).toString("utf8"));
|
|
883
883
|
return typeof e.key != "string" || e.key.length === 0 || typeof e.uploadId != "string" || e.uploadId.length === 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
|
|
884
884
|
} catch {
|
|
885
885
|
return null;
|
|
886
886
|
}
|
|
887
|
-
},
|
|
887
|
+
}, _t = (e, t) => {
|
|
888
888
|
if (!t || t.length === 0) return !0;
|
|
889
889
|
let n = e.toLowerCase();
|
|
890
890
|
return t.some((e) => {
|
|
891
891
|
let t = e.toLowerCase();
|
|
892
892
|
return t.endsWith("/*") ? n.startsWith(t.slice(0, -1)) : n === t;
|
|
893
893
|
});
|
|
894
|
-
},
|
|
894
|
+
}, vt = [
|
|
895
895
|
{
|
|
896
896
|
ct: /^image\/png$/,
|
|
897
897
|
offset: 0,
|
|
@@ -961,21 +961,21 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
961
961
|
offset: 0,
|
|
962
962
|
magic: [31, 139]
|
|
963
963
|
}
|
|
964
|
-
],
|
|
965
|
-
let n = t.toLowerCase(), r =
|
|
964
|
+
], yt = (e, t) => {
|
|
965
|
+
let n = t.toLowerCase(), r = vt.find((e) => e.ct.test(n));
|
|
966
966
|
return r ? e.length < r.offset + r.magic.length ? !1 : r.magic.every((t, n) => e[r.offset + n] === t) : !0;
|
|
967
|
-
},
|
|
967
|
+
}, bt = (e, t, n) => n ? n.maxBytes !== void 0 && e.byteLength > n.maxBytes ? {
|
|
968
968
|
reason: "too-large",
|
|
969
969
|
detail: `${e.byteLength} bytes exceeds the ${n.maxBytes}-byte limit`
|
|
970
|
-
} :
|
|
970
|
+
} : _t(t, n.allowedContentTypes) ? n.sniff && !yt(e, t) ? {
|
|
971
971
|
reason: "content-mismatch",
|
|
972
972
|
detail: `bytes do not match the declared content type '${t}'`
|
|
973
973
|
} : null : {
|
|
974
974
|
reason: "content-type-not-allowed",
|
|
975
975
|
detail: `content type '${t}' is not in the allow-list`
|
|
976
|
-
} : null,
|
|
977
|
-
if (!
|
|
978
|
-
let r = await
|
|
976
|
+
} : null, xt = async (e, t, n) => {
|
|
977
|
+
if (!Ue(t)) return { bytes: e };
|
|
978
|
+
let r = await We();
|
|
979
979
|
if (!r) return { bytes: e };
|
|
980
980
|
try {
|
|
981
981
|
let t = e;
|
|
@@ -998,10 +998,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
998
998
|
} catch {
|
|
999
999
|
return { bytes: e };
|
|
1000
1000
|
}
|
|
1001
|
-
},
|
|
1001
|
+
}, St = async (e) => {
|
|
1002
1002
|
let { createHash: t } = await import("node:crypto");
|
|
1003
1003
|
return t("sha256").update(e).digest("hex");
|
|
1004
|
-
},
|
|
1004
|
+
}, Ct = (e, t) => e ? `${e.replace(/\/+$/, "")}/_voltro/storage/${t}` : `/_voltro/storage/${t}`, wt = (e, t) => {
|
|
1005
1005
|
if (t.tenantId !== void 0 && (e.tenantId ?? null) !== (t.tenantId ?? null) || t.ownerId !== void 0 && e.ownerId !== t.ownerId || !t.includeDerived && e.derivedFrom != null) return !1;
|
|
1006
1006
|
if (t.folder !== void 0) {
|
|
1007
1007
|
let n = t.folder.replace(/\/+$/, ""), r = (e.folder ?? "").replace(/\/+$/, "");
|
|
@@ -1012,7 +1012,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1012
1012
|
if (!t.tags.every((e) => n.includes(e))) return !1;
|
|
1013
1013
|
}
|
|
1014
1014
|
return !0;
|
|
1015
|
-
},
|
|
1015
|
+
}, Tt = (e) => e ?? "global", Et = () => {
|
|
1016
1016
|
let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map();
|
|
1017
1017
|
return {
|
|
1018
1018
|
insert: (t) => b.sync(() => {
|
|
@@ -1031,7 +1031,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1031
1031
|
};
|
|
1032
1032
|
}),
|
|
1033
1033
|
consumeUsage: (e, n, r) => b.sync(() => {
|
|
1034
|
-
let i =
|
|
1034
|
+
let i = Tt(e), a = t.get(i) ?? {
|
|
1035
1035
|
bytes: 0,
|
|
1036
1036
|
count: 0
|
|
1037
1037
|
}, o = (r?.maxBytes === void 0 || a.bytes + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || a.count + n.count <= r.maxCount);
|
|
@@ -1045,16 +1045,16 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1045
1045
|
};
|
|
1046
1046
|
}),
|
|
1047
1047
|
releaseUsage: (e, n) => b.sync(() => {
|
|
1048
|
-
let r =
|
|
1048
|
+
let r = Tt(e), i = t.get(r);
|
|
1049
1049
|
i && t.set(r, {
|
|
1050
1050
|
bytes: Math.max(0, i.bytes - n.bytes),
|
|
1051
1051
|
count: Math.max(0, i.count - n.count)
|
|
1052
1052
|
});
|
|
1053
1053
|
}),
|
|
1054
1054
|
listByDerivedFrom: (t) => b.sync(() => [...e.values()].filter((e) => (e.derivedFrom ?? null) === t)),
|
|
1055
|
-
listRefs: (t) => b.sync(() => [...e.values()].filter((e) =>
|
|
1055
|
+
listRefs: (t) => b.sync(() => [...e.values()].filter((e) => wt(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(t.offset, t.offset + t.limit))
|
|
1056
1056
|
};
|
|
1057
|
-
},
|
|
1057
|
+
}, Dt = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, Ot = (e) => ({
|
|
1058
1058
|
id: String(e.id),
|
|
1059
1059
|
tenantId: e.tenantId ?? null,
|
|
1060
1060
|
ownerId: e.ownerId ?? null,
|
|
@@ -1072,19 +1072,19 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1072
1072
|
duration: e.duration ?? null,
|
|
1073
1073
|
placeholder: e.placeholder ?? null,
|
|
1074
1074
|
folder: e.folder ?? null,
|
|
1075
|
-
tags:
|
|
1075
|
+
tags: Dt(e.tags),
|
|
1076
1076
|
alt: e.alt ?? null,
|
|
1077
1077
|
caption: e.caption ?? null,
|
|
1078
1078
|
derivedFrom: e.derivedFrom ?? null,
|
|
1079
1079
|
kind: e.kind ?? null
|
|
1080
|
-
}),
|
|
1080
|
+
}), Q = (e) => b.tryPromise({
|
|
1081
1081
|
try: e,
|
|
1082
1082
|
catch: (e) => new t({
|
|
1083
1083
|
provider: "refstore",
|
|
1084
1084
|
message: String(e?.message ?? e),
|
|
1085
1085
|
transient: !0
|
|
1086
1086
|
})
|
|
1087
|
-
}),
|
|
1087
|
+
}), kt = async (e, t) => (await e.query({
|
|
1088
1088
|
table: "_voltro_storage_usage",
|
|
1089
1089
|
predicate: {
|
|
1090
1090
|
column: "tenantId",
|
|
@@ -1095,9 +1095,9 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1095
1095
|
take: 1,
|
|
1096
1096
|
skip: void 0,
|
|
1097
1097
|
projection: void 0
|
|
1098
|
-
}))[0] ?? null,
|
|
1099
|
-
insert: (t) =>
|
|
1100
|
-
getById: (t) =>
|
|
1098
|
+
}))[0] ?? null, At = (e) => ({
|
|
1099
|
+
insert: (t) => Q(() => e.insert(H, { ...t })),
|
|
1100
|
+
getById: (t) => Q(async () => {
|
|
1101
1101
|
let n = await e.query({
|
|
1102
1102
|
table: H,
|
|
1103
1103
|
predicate: {
|
|
@@ -1110,10 +1110,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1110
1110
|
skip: void 0,
|
|
1111
1111
|
projection: void 0
|
|
1112
1112
|
});
|
|
1113
|
-
return n[0] ?
|
|
1113
|
+
return n[0] ? Ot(n[0]) : null;
|
|
1114
1114
|
}),
|
|
1115
|
-
delete: (t) =>
|
|
1116
|
-
listRecent: (t) =>
|
|
1115
|
+
delete: (t) => Q(() => e.delete(H, t)),
|
|
1116
|
+
listRecent: (t) => Q(async () => (await e.query({
|
|
1117
1117
|
table: H,
|
|
1118
1118
|
predicate: void 0,
|
|
1119
1119
|
order: [{
|
|
@@ -1123,8 +1123,8 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1123
1123
|
take: t,
|
|
1124
1124
|
skip: void 0,
|
|
1125
1125
|
projection: void 0
|
|
1126
|
-
})).map(
|
|
1127
|
-
countByKey: (t, n) =>
|
|
1126
|
+
})).map(Ot)),
|
|
1127
|
+
countByKey: (t, n) => Q(async () => (await e.query({
|
|
1128
1128
|
table: H,
|
|
1129
1129
|
predicate: { and: [{
|
|
1130
1130
|
column: "bucket",
|
|
@@ -1140,7 +1140,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1140
1140
|
skip: void 0,
|
|
1141
1141
|
projection: void 0
|
|
1142
1142
|
})).length),
|
|
1143
|
-
usageByTenant: (t) =>
|
|
1143
|
+
usageByTenant: (t) => Q(async () => {
|
|
1144
1144
|
let n = await e.query({
|
|
1145
1145
|
table: H,
|
|
1146
1146
|
predicate: {
|
|
@@ -1159,11 +1159,11 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1159
1159
|
count: n.length
|
|
1160
1160
|
};
|
|
1161
1161
|
}),
|
|
1162
|
-
consumeUsage: (t, n, r) =>
|
|
1163
|
-
let i =
|
|
1162
|
+
consumeUsage: (t, n, r) => Q(async () => {
|
|
1163
|
+
let i = Tt(t);
|
|
1164
1164
|
for (let t = 0; t < 32; t++) {
|
|
1165
1165
|
t > 0 && await new Promise((e) => setTimeout(e, t));
|
|
1166
|
-
let a = await
|
|
1166
|
+
let a = await kt(e, i), o = a ? Number(a.bytes ?? 0) : 0, s = a ? Number(a.count ?? 0) : 0;
|
|
1167
1167
|
if (!((r?.maxBytes === void 0 || o + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || s + n.count <= r.maxCount))) return {
|
|
1168
1168
|
allowed: !1,
|
|
1169
1169
|
bytes: o,
|
|
@@ -1183,7 +1183,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1183
1183
|
let t = k({
|
|
1184
1184
|
kind: "typeid",
|
|
1185
1185
|
prefix: "susage"
|
|
1186
|
-
},
|
|
1186
|
+
}, Ee), r = await e.insertIgnore(Ee, {
|
|
1187
1187
|
id: t,
|
|
1188
1188
|
tenantId: i,
|
|
1189
1189
|
bytes: n.bytes,
|
|
@@ -1199,11 +1199,11 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1199
1199
|
}
|
|
1200
1200
|
throw Error(`storage usage consume: contention on tenant '${i}' exceeded 32 attempts`);
|
|
1201
1201
|
}),
|
|
1202
|
-
releaseUsage: (t, n) =>
|
|
1203
|
-
let r =
|
|
1202
|
+
releaseUsage: (t, n) => Q(async () => {
|
|
1203
|
+
let r = Tt(t);
|
|
1204
1204
|
for (let t = 0; t < 32; t++) {
|
|
1205
1205
|
t > 0 && await new Promise((e) => setTimeout(e, t));
|
|
1206
|
-
let i = await
|
|
1206
|
+
let i = await kt(e, r);
|
|
1207
1207
|
if (!i) return;
|
|
1208
1208
|
let a = Number(i.bytes ?? 0), o = Number(i.count ?? 0);
|
|
1209
1209
|
if (await e.updateMany("_voltro_storage_usage", {
|
|
@@ -1214,7 +1214,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1214
1214
|
}
|
|
1215
1215
|
throw Error(`storage usage release: contention on tenant '${r}' exceeded 32 attempts`);
|
|
1216
1216
|
}),
|
|
1217
|
-
listByDerivedFrom: (t) =>
|
|
1217
|
+
listByDerivedFrom: (t) => Q(async () => (await e.query({
|
|
1218
1218
|
table: H,
|
|
1219
1219
|
predicate: {
|
|
1220
1220
|
column: "derivedFrom",
|
|
@@ -1228,8 +1228,8 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1228
1228
|
take: void 0,
|
|
1229
1229
|
skip: void 0,
|
|
1230
1230
|
projection: void 0
|
|
1231
|
-
})).map(
|
|
1232
|
-
listRefs: (t) =>
|
|
1231
|
+
})).map(Ot)),
|
|
1232
|
+
listRefs: (t) => Q(async () => {
|
|
1233
1233
|
let n = [];
|
|
1234
1234
|
t.tenantId !== void 0 && n.push({
|
|
1235
1235
|
column: "tenantId",
|
|
@@ -1251,9 +1251,9 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1251
1251
|
take: void 0,
|
|
1252
1252
|
skip: void 0,
|
|
1253
1253
|
projection: void 0
|
|
1254
|
-
})).map(
|
|
1254
|
+
})).map(Ot).filter((e) => wt(e, t)).slice(t.offset, t.offset + t.limit);
|
|
1255
1255
|
})
|
|
1256
|
-
}),
|
|
1256
|
+
}), jt = () => {
|
|
1257
1257
|
let e = /* @__PURE__ */ new Map();
|
|
1258
1258
|
return {
|
|
1259
1259
|
insert: (t) => b.sync(() => {
|
|
@@ -1268,7 +1268,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1268
1268
|
for (let [n, r] of e) r.refId === t && e.delete(n);
|
|
1269
1269
|
})
|
|
1270
1270
|
};
|
|
1271
|
-
},
|
|
1271
|
+
}, Mt = (e) => ({
|
|
1272
1272
|
id: String(e.id),
|
|
1273
1273
|
refId: String(e.refId),
|
|
1274
1274
|
principalType: e.principalType,
|
|
@@ -1277,10 +1277,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1277
1277
|
createdAt: e.createdAt instanceof Date ? e.createdAt : new Date(String(e.createdAt)),
|
|
1278
1278
|
expiresAt: e.expiresAt ? e.expiresAt instanceof Date ? e.expiresAt : new Date(String(e.expiresAt)) : null,
|
|
1279
1279
|
createdBy: e.createdBy ?? null
|
|
1280
|
-
}),
|
|
1281
|
-
insert: (t) =>
|
|
1282
|
-
delete: (t) =>
|
|
1283
|
-
getById: (t) =>
|
|
1280
|
+
}), Nt = (e) => ({
|
|
1281
|
+
insert: (t) => Q(() => e.insert(U, { ...t })),
|
|
1282
|
+
delete: (t) => Q(() => e.delete(U, t)),
|
|
1283
|
+
getById: (t) => Q(async () => {
|
|
1284
1284
|
let n = (await e.query({
|
|
1285
1285
|
table: U,
|
|
1286
1286
|
predicate: {
|
|
@@ -1293,9 +1293,9 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1293
1293
|
skip: void 0,
|
|
1294
1294
|
projection: void 0
|
|
1295
1295
|
}))[0];
|
|
1296
|
-
return n ?
|
|
1296
|
+
return n ? Mt(n) : null;
|
|
1297
1297
|
}),
|
|
1298
|
-
listByRef: (t) =>
|
|
1298
|
+
listByRef: (t) => Q(async () => (await e.query({
|
|
1299
1299
|
table: U,
|
|
1300
1300
|
predicate: {
|
|
1301
1301
|
column: "refId",
|
|
@@ -1309,8 +1309,8 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1309
1309
|
take: void 0,
|
|
1310
1310
|
skip: void 0,
|
|
1311
1311
|
projection: void 0
|
|
1312
|
-
})).map(
|
|
1313
|
-
deleteByRef: (t) =>
|
|
1312
|
+
})).map(Mt)),
|
|
1313
|
+
deleteByRef: (t) => Q(async () => {
|
|
1314
1314
|
let n = await e.query({
|
|
1315
1315
|
table: U,
|
|
1316
1316
|
predicate: {
|
|
@@ -1325,14 +1325,14 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1325
1325
|
});
|
|
1326
1326
|
for (let t of n) await e.delete(U, String(t.id));
|
|
1327
1327
|
})
|
|
1328
|
-
}),
|
|
1328
|
+
}), Pt = () => k({
|
|
1329
1329
|
kind: "typeid",
|
|
1330
1330
|
prefix: "file"
|
|
1331
|
-
}, H),
|
|
1331
|
+
}, H), Ft = () => k({
|
|
1332
1332
|
kind: "typeid",
|
|
1333
1333
|
prefix: "grant"
|
|
1334
|
-
}, U),
|
|
1335
|
-
let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) =>
|
|
1334
|
+
}, U), It = (i) => {
|
|
1335
|
+
let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) => Ct(i.publicBaseUrl, e), p = C.recurs(Math.max(0, u - 1)).pipe(C.intersect(C.exponential("100 millis")), C.whileInput((e) => e.transient)), m = (e, t, n) => [
|
|
1336
1336
|
i.tenantPrefix,
|
|
1337
1337
|
e ?? "global",
|
|
1338
1338
|
n ?? t
|
|
@@ -1385,7 +1385,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1385
1385
|
catch: () => null
|
|
1386
1386
|
}).pipe(b.catchAll(() => b.succeed(null)));
|
|
1387
1387
|
}), v = (e) => b.gen(function* () {
|
|
1388
|
-
let t =
|
|
1388
|
+
let t = bt(e.bytes, e.contentType, i.limits);
|
|
1389
1389
|
if (t) return yield* b.fail(new n(t));
|
|
1390
1390
|
if (i.scan) {
|
|
1391
1391
|
let t = yield* te({
|
|
@@ -1395,10 +1395,10 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1395
1395
|
});
|
|
1396
1396
|
if (!t.clean) return yield* b.fail(new r({ threat: t.threat ?? "unknown" }));
|
|
1397
1397
|
}
|
|
1398
|
-
let s = yield* b.promise(() =>
|
|
1398
|
+
let s = yield* b.promise(() => xt(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* ne({
|
|
1399
1399
|
bytes: l,
|
|
1400
1400
|
contentType: e.contentType
|
|
1401
|
-
}), d = s.width ?? u?.width, f = s.height ?? u?.height, h = s.placeholder ?? u?.poster, g = e.duration ?? u?.duration, _ = yield* b.promise(() =>
|
|
1401
|
+
}), d = s.width ?? u?.width, f = s.height ?? u?.height, h = s.placeholder ?? u?.poster, g = e.duration ?? u?.duration, _ = yield* b.promise(() => St(l)), v = e.tenantId ?? null, y = e.visibility ?? "private", C = m(v, _, yield* ee(e.key)), w = {
|
|
1402
1402
|
bytes: l.byteLength,
|
|
1403
1403
|
count: 1
|
|
1404
1404
|
}, T = yield* o.consumeUsage(v, w, i.quota);
|
|
@@ -1409,8 +1409,8 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1409
1409
|
detail: t
|
|
1410
1410
|
}));
|
|
1411
1411
|
}
|
|
1412
|
-
let re = e.password ? yield* b.sync(() =>
|
|
1413
|
-
id:
|
|
1412
|
+
let re = e.password ? yield* b.sync(() => Je(e.password)) : null, E = {
|
|
1413
|
+
id: Pt(),
|
|
1414
1414
|
tenantId: v,
|
|
1415
1415
|
ownerId: e.ownerId ?? null,
|
|
1416
1416
|
bucket: c,
|
|
@@ -1471,12 +1471,12 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1471
1471
|
}
|
|
1472
1472
|
return r;
|
|
1473
1473
|
}), w = (e, t, n) => b.gen(function* () {
|
|
1474
|
-
if (e.visibility === "public" || (yield*
|
|
1474
|
+
if (e.visibility === "public" || (yield* nt(e, t, {
|
|
1475
1475
|
...l,
|
|
1476
1476
|
...n?.password === void 0 ? {} : { password: n.password }
|
|
1477
1477
|
}))) return !0;
|
|
1478
|
-
let r = yield*
|
|
1479
|
-
return
|
|
1478
|
+
let r = yield* ot(t, l);
|
|
1479
|
+
return at(yield* s.listByRef(e.id), t, r, n?.permission ?? "read", Date.now());
|
|
1480
1480
|
}), T = (e) => {
|
|
1481
1481
|
if (e.visibility === "public") {
|
|
1482
1482
|
let t = a.publicUrl?.(e.key);
|
|
@@ -1530,7 +1530,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1530
1530
|
}));
|
|
1531
1531
|
let c = i?.expiresInSec ?? d;
|
|
1532
1532
|
if (a.presigns) return yield* a.getUrl(s.key, c);
|
|
1533
|
-
let l = yield* b.sync(() =>
|
|
1533
|
+
let l = yield* b.sync(() => st(s.id, c));
|
|
1534
1534
|
return `${f(s.id)}?t=${l}`;
|
|
1535
1535
|
}),
|
|
1536
1536
|
mintUploadUrl: (e) => b.gen(function* () {
|
|
@@ -1546,7 +1546,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1546
1546
|
checkAccess: w,
|
|
1547
1547
|
grant: (e) => b.gen(function* () {
|
|
1548
1548
|
let t = {
|
|
1549
|
-
id:
|
|
1549
|
+
id: Ft(),
|
|
1550
1550
|
refId: e.refId,
|
|
1551
1551
|
principalType: e.principalType,
|
|
1552
1552
|
principalId: e.principalId,
|
|
@@ -1728,7 +1728,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1728
1728
|
detail: `multipart upload of ${l} bytes exceeds tenant quota`
|
|
1729
1729
|
}));
|
|
1730
1730
|
let m = {
|
|
1731
|
-
id:
|
|
1731
|
+
id: Pt(),
|
|
1732
1732
|
tenantId: e.tenantId ?? null,
|
|
1733
1733
|
ownerId: e.ownerId ?? null,
|
|
1734
1734
|
bucket: c,
|
|
@@ -1749,7 +1749,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1749
1749
|
}),
|
|
1750
1750
|
abortMultipart: (e) => b.suspend(() => a.abortMultipartUpload ? a.abortMultipartUpload(e.key, e.uploadId).pipe(b.retry(p)) : b.void)
|
|
1751
1751
|
};
|
|
1752
|
-
},
|
|
1752
|
+
}, Lt = (e) => S.succeed(i, It(e)), Rt = (e, t = 65536) => {
|
|
1753
1753
|
let n = [Buffer.from("zINSTREAM\0", "utf8")];
|
|
1754
1754
|
for (let r = 0; r < e.length; r += t) {
|
|
1755
1755
|
let i = e.subarray(r, Math.min(r + t, e.length)), a = Buffer.alloc(4);
|
|
@@ -1757,7 +1757,7 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1757
1757
|
}
|
|
1758
1758
|
let r = Buffer.alloc(4);
|
|
1759
1759
|
return r.writeUInt32BE(0, 0), n.push(r), Buffer.concat(n);
|
|
1760
|
-
},
|
|
1760
|
+
}, zt = (e) => {
|
|
1761
1761
|
let t = e.replace(/\0+$/, "").trim();
|
|
1762
1762
|
if (/\bOK$/.test(t)) return { clean: !0 };
|
|
1763
1763
|
let n = /:\s*(.+?)\s+FOUND$/.exec(t);
|
|
@@ -1766,8 +1766,8 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1766
1766
|
threat: n[1] ?? "unknown"
|
|
1767
1767
|
};
|
|
1768
1768
|
throw Error(`clamav: unexpected response: ${t}`);
|
|
1769
|
-
},
|
|
1770
|
-
let n = await import("node:net"), r =
|
|
1769
|
+
}, Bt = async (e, t) => {
|
|
1770
|
+
let n = await import("node:net"), r = G.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = G.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
|
|
1771
1771
|
return new Promise((i, s) => {
|
|
1772
1772
|
let c = n.createConnection({
|
|
1773
1773
|
host: r,
|
|
@@ -1778,20 +1778,20 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1778
1778
|
c.on("error", (e) => {
|
|
1779
1779
|
clearTimeout(u), s(e);
|
|
1780
1780
|
}), c.on("connect", () => {
|
|
1781
|
-
c.end(
|
|
1781
|
+
c.end(Rt(e, t.chunkSize));
|
|
1782
1782
|
}), c.on("data", (e) => {
|
|
1783
1783
|
l += e.toString("utf8");
|
|
1784
1784
|
}), c.on("close", () => {
|
|
1785
1785
|
clearTimeout(u);
|
|
1786
1786
|
try {
|
|
1787
|
-
i(
|
|
1787
|
+
i(zt(l));
|
|
1788
1788
|
} catch (e) {
|
|
1789
1789
|
s(e);
|
|
1790
1790
|
}
|
|
1791
1791
|
});
|
|
1792
1792
|
});
|
|
1793
|
-
},
|
|
1794
|
-
let a =
|
|
1793
|
+
}, Vt = (e = {}) => (t) => Bt(t.bytes, e), Ht = (e, t, n) => new Promise((r, i) => {
|
|
1794
|
+
let a = de(e, [...t], { stdio: [
|
|
1795
1795
|
"ignore",
|
|
1796
1796
|
"ignore",
|
|
1797
1797
|
"pipe"
|
|
@@ -1805,31 +1805,31 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1805
1805
|
}), a.on("close", (e) => {
|
|
1806
1806
|
clearTimeout(s), e === 0 ? r() : i(/* @__PURE__ */ Error(`ffmpeg exited ${String(e)}: ${o.slice(-400)}`));
|
|
1807
1807
|
});
|
|
1808
|
-
}),
|
|
1809
|
-
let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await
|
|
1808
|
+
}), Ut = (e) => async ({ bytes: t }) => {
|
|
1809
|
+
let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await fe(he(V(), "voltro-tc-")), a = he(i, "in"), o = [];
|
|
1810
1810
|
try {
|
|
1811
|
-
await
|
|
1811
|
+
await B(a, t);
|
|
1812
1812
|
for (let t of e.renditions) {
|
|
1813
|
-
let e =
|
|
1813
|
+
let e = he(i, `out.${t.ext}`);
|
|
1814
1814
|
try {
|
|
1815
|
-
await
|
|
1815
|
+
await Ht(n, [
|
|
1816
1816
|
"-y",
|
|
1817
1817
|
"-i",
|
|
1818
1818
|
a,
|
|
1819
1819
|
...t.args,
|
|
1820
1820
|
e
|
|
1821
1821
|
], r);
|
|
1822
|
-
let i = await
|
|
1822
|
+
let i = await pe(e);
|
|
1823
1823
|
o.push({
|
|
1824
1824
|
bytes: new Uint8Array(i),
|
|
1825
1825
|
contentType: t.contentType,
|
|
1826
1826
|
kind: t.kind,
|
|
1827
1827
|
...t.label === void 0 ? {} : { label: t.label }
|
|
1828
|
-
}), await
|
|
1828
|
+
}), await me(e, { force: !0 });
|
|
1829
1829
|
} catch {}
|
|
1830
1830
|
}
|
|
1831
1831
|
} finally {
|
|
1832
|
-
await
|
|
1832
|
+
await me(i, {
|
|
1833
1833
|
recursive: !0,
|
|
1834
1834
|
force: !0
|
|
1835
1835
|
}).catch(() => void 0);
|
|
@@ -1838,21 +1838,21 @@ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
|
|
|
1838
1838
|
};
|
|
1839
1839
|
//#endregion
|
|
1840
1840
|
//#region src/assetRef.ts
|
|
1841
|
-
function
|
|
1842
|
-
let t = e.nullable ?? !0, n = e.fk === !1 ? P().externalId() : ce(() =>
|
|
1841
|
+
function Wt(e = {}) {
|
|
1842
|
+
let t = e.nullable ?? !0, n = e.fk === !1 ? P().externalId() : ce(() => De, { onDelete: e.onDelete ?? "setNull" });
|
|
1843
1843
|
return t ? n.nullable() : n;
|
|
1844
1844
|
}
|
|
1845
|
-
var
|
|
1845
|
+
var Gt = () => se({
|
|
1846
1846
|
id: "@voltro/plugin-storage/withStorage",
|
|
1847
|
-
fields: { asset:
|
|
1848
|
-
}),
|
|
1847
|
+
fields: { asset: Wt() }
|
|
1848
|
+
}), Kt = {
|
|
1849
1849
|
"image/png": "png",
|
|
1850
1850
|
"image/jpeg": "jpg",
|
|
1851
1851
|
"image/jpg": "jpg",
|
|
1852
1852
|
"image/gif": "gif",
|
|
1853
1853
|
"image/webp": "webp",
|
|
1854
1854
|
"image/svg+xml": "svg"
|
|
1855
|
-
},
|
|
1855
|
+
}, qt = (e) => {
|
|
1856
1856
|
let t = /^data:([^;,]+)(;base64)?,(.*)$/s.exec(e);
|
|
1857
1857
|
if (!t) throw Error("not a data URI");
|
|
1858
1858
|
let n = t[1] || "application/octet-stream", r = !!t[2], i = t[3] ?? "";
|
|
@@ -1860,16 +1860,16 @@ var Wt = () => se({
|
|
|
1860
1860
|
bytes: r ? new Uint8Array(Buffer.from(i, "base64")) : new Uint8Array(Buffer.from(decodeURIComponent(i), "utf8")),
|
|
1861
1861
|
contentType: n
|
|
1862
1862
|
};
|
|
1863
|
-
},
|
|
1863
|
+
}, Jt = (e, n) => b.gen(function* () {
|
|
1864
1864
|
let r = yield* b.try({
|
|
1865
|
-
try: () =>
|
|
1865
|
+
try: () => qt(n.dataUri),
|
|
1866
1866
|
catch: (e) => new t({
|
|
1867
1867
|
provider: "avatar",
|
|
1868
1868
|
message: String(e?.message ?? e),
|
|
1869
1869
|
transient: !1,
|
|
1870
1870
|
status: 400
|
|
1871
1871
|
})
|
|
1872
|
-
}), i =
|
|
1872
|
+
}), i = Kt[r.contentType] ?? "bin";
|
|
1873
1873
|
return yield* e.put({
|
|
1874
1874
|
bytes: r.bytes,
|
|
1875
1875
|
contentType: r.contentType,
|
|
@@ -1878,27 +1878,27 @@ var Wt = () => se({
|
|
|
1878
1878
|
visibility: "public",
|
|
1879
1879
|
key: `avatars/${n.userId}/avatar.${i}`
|
|
1880
1880
|
});
|
|
1881
|
-
}),
|
|
1881
|
+
}), Yt = (e) => {
|
|
1882
1882
|
try {
|
|
1883
|
-
let t =
|
|
1883
|
+
let t = ge(e), n = ge("/");
|
|
1884
1884
|
return typeof t.dev != "number" || typeof n.dev != "number" ? "unknown" : t.dev === n.dev ? "same-device-as-root" : "separate-mount";
|
|
1885
1885
|
} catch {
|
|
1886
1886
|
return "unknown";
|
|
1887
1887
|
}
|
|
1888
|
-
},
|
|
1889
|
-
if (
|
|
1888
|
+
}, Xt = (e) => {
|
|
1889
|
+
if (Yt(e) === "same-device-as-root") return `the capture is going to ${e}, which is on the SAME filesystem as \`/\`.\n A mounted volume would be a separate one. If this process is a container, that means the capture
|
|
1890
1890
|
dies with it — which is the exact failure it exists for. On a development machine this is normal
|
|
1891
1891
|
and can be ignored.`;
|
|
1892
|
-
},
|
|
1893
|
-
|
|
1894
|
-
},
|
|
1892
|
+
}, Zt = G.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", Qt, $t = (e) => {
|
|
1893
|
+
Qt = e;
|
|
1894
|
+
}, en = () => Qt ?? nn({}), tn = () => Qt === void 0 ? G.read("STORAGE_PROVIDER") === void 0 ? void 0 : nn({}) : Qt, nn = (e) => {
|
|
1895
1895
|
if (e.provider && typeof e.provider == "object") return e.provider;
|
|
1896
|
-
let t = (e.provider ??
|
|
1896
|
+
let t = (e.provider ?? G.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = G.read("S3_BUCKET", e.bucket) ?? G.read("STORAGE_BUCKET") ?? "voltro";
|
|
1897
1897
|
switch (t) {
|
|
1898
1898
|
case "s3":
|
|
1899
1899
|
case "minio": {
|
|
1900
|
-
let r =
|
|
1901
|
-
return
|
|
1900
|
+
let r = G.read("S3_REGION", e.region) ?? G.read("AWS_REGION"), i = G.read("S3_ENDPOINT", e.endpoint) ?? G.read("MINIO_ENDPOINT"), a = G.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? G.read("AWS_ACCESS_KEY_ID"), o = G.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? G.read("AWS_SECRET_ACCESS_KEY"), s = G.read("STORAGE_CDN_URL", e.cdnBaseUrl);
|
|
1901
|
+
return Le({
|
|
1902
1902
|
bucket: n,
|
|
1903
1903
|
name: t,
|
|
1904
1904
|
...r ? { region: r } : {},
|
|
@@ -1907,13 +1907,13 @@ var Wt = () => se({
|
|
|
1907
1907
|
...o ? { secretAccessKey: o } : {},
|
|
1908
1908
|
...s ? { cdnBaseUrl: s } : {},
|
|
1909
1909
|
...e.publicAcl === void 0 ? {} : { publicAcl: e.publicAcl },
|
|
1910
|
-
...t === "minio" ||
|
|
1910
|
+
...t === "minio" || G.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
|
|
1911
1911
|
});
|
|
1912
1912
|
}
|
|
1913
1913
|
case "azure": {
|
|
1914
|
-
let t =
|
|
1915
|
-
return
|
|
1916
|
-
container:
|
|
1914
|
+
let t = G.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = G.read("AZURE_STORAGE_KEY", e.accountKey), i = G.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = G.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = G.read("STORAGE_CDN_URL", e.cdnBaseUrl);
|
|
1915
|
+
return Be({
|
|
1916
|
+
container: G.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
|
|
1917
1917
|
...t ? { accountName: t } : {},
|
|
1918
1918
|
...r ? { accountKey: r } : {},
|
|
1919
1919
|
...i ? { connectionString: i } : {},
|
|
@@ -1921,15 +1921,15 @@ var Wt = () => se({
|
|
|
1921
1921
|
...o ? { cdnBaseUrl: o } : {}
|
|
1922
1922
|
});
|
|
1923
1923
|
}
|
|
1924
|
-
case "database": return
|
|
1925
|
-
case "filesystem": return
|
|
1926
|
-
default: return
|
|
1924
|
+
case "database": return ze();
|
|
1925
|
+
case "filesystem": return Ie({ root: G.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
|
|
1926
|
+
default: return Fe(e.name ?? "default");
|
|
1927
1927
|
}
|
|
1928
|
-
},
|
|
1928
|
+
}, rn = (e) => {
|
|
1929
1929
|
if (e !== void 0) return e;
|
|
1930
|
-
let t =
|
|
1930
|
+
let t = G.read("STORAGE_ALLOWED_ORIGINS");
|
|
1931
1931
|
return t ? t.trim() === "*" ? "*" : t.split(",").map((e) => e.trim()).filter(Boolean) : [];
|
|
1932
|
-
},
|
|
1932
|
+
}, an = (e, t) => {
|
|
1933
1933
|
if (!e || t !== "*" && !t.includes(e)) return {};
|
|
1934
1934
|
let n = {
|
|
1935
1935
|
"access-control-allow-origin": t === "*" ? "*" : e,
|
|
@@ -1939,7 +1939,7 @@ var Wt = () => se({
|
|
|
1939
1939
|
vary: "Origin"
|
|
1940
1940
|
};
|
|
1941
1941
|
return t !== "*" && (n["access-control-allow-credentials"] = "true"), n;
|
|
1942
|
-
},
|
|
1942
|
+
}, on = (e) => ({
|
|
1943
1943
|
id: e.id,
|
|
1944
1944
|
tenantId: e.tenantId,
|
|
1945
1945
|
ownerId: e.ownerId,
|
|
@@ -1962,18 +1962,29 @@ var Wt = () => se({
|
|
|
1962
1962
|
caption: e.caption ?? null,
|
|
1963
1963
|
derivedFrom: e.derivedFrom ?? null,
|
|
1964
1964
|
kind: e.kind ?? null
|
|
1965
|
-
}),
|
|
1965
|
+
}), sn = () => new t({
|
|
1966
1966
|
provider: "storage",
|
|
1967
1967
|
message: "not permitted to administer sharing for this object",
|
|
1968
1968
|
transient: !1,
|
|
1969
1969
|
status: 403
|
|
1970
|
-
}),
|
|
1970
|
+
}), cn = (e, t, n) => {
|
|
1971
1971
|
let r = n.request.subject;
|
|
1972
|
-
return (r.scopes ?? []).includes("admin:full") ? b.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(b.catchAll(() => b.fail(
|
|
1972
|
+
return (r.scopes ?? []).includes("admin:full") ? b.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(b.catchAll(() => b.fail(sn())), b.flatMap((e) => {
|
|
1973
1973
|
let t = e?.ownerId;
|
|
1974
|
-
return t != null && t === r.id ? b.void : b.fail(
|
|
1974
|
+
return t != null && t === r.id ? b.void : b.fail(sn());
|
|
1975
1975
|
}));
|
|
1976
|
-
},
|
|
1976
|
+
}, ln = () => new t({
|
|
1977
|
+
provider: "storage",
|
|
1978
|
+
message: "an upload needs an identified caller: this request carries no subject, and the app has not set `anonymousUploads: true` on storagePlugin. The ticket attributes the object to whoever minted it — with no subject there is nobody to attribute it to, so the finalized object would carry no owner and no tenant and no later owner check, tenant filter or quota could reach it.",
|
|
1979
|
+
transient: !1,
|
|
1980
|
+
status: 401
|
|
1981
|
+
}), $ = (e, t) => {
|
|
1982
|
+
let n = e.request.subject.id ?? null, r = e.request.subject.tenantId ?? null;
|
|
1983
|
+
return n === null && !t ? b.fail(ln()) : b.succeed({
|
|
1984
|
+
id: n,
|
|
1985
|
+
tenantId: r
|
|
1986
|
+
});
|
|
1987
|
+
}, un = (e, t) => e !== null && e !== (t ?? null), dn = (e) => ({
|
|
1977
1988
|
id: e.id,
|
|
1978
1989
|
refId: e.refId,
|
|
1979
1990
|
principalType: e.principalType,
|
|
@@ -1982,30 +1993,30 @@ var Wt = () => se({
|
|
|
1982
1993
|
createdAt: e.createdAt.toISOString(),
|
|
1983
1994
|
expiresAt: e.expiresAt ? e.expiresAt.toISOString() : null,
|
|
1984
1995
|
createdBy: e.createdBy
|
|
1985
|
-
}),
|
|
1986
|
-
let y =
|
|
1987
|
-
|
|
1988
|
-
let x =
|
|
1989
|
-
insert: (e) => A.current.insert(e),
|
|
1990
|
-
getById: (e) => A.current.getById(e),
|
|
1991
|
-
delete: (e) => A.current.delete(e),
|
|
1992
|
-
listRecent: (e) => A.current.listRecent(e),
|
|
1993
|
-
countByKey: (e, t) => A.current.countByKey(e, t),
|
|
1994
|
-
usageByTenant: (e) => A.current.usageByTenant(e),
|
|
1995
|
-
consumeUsage: (e, t, n) => A.current.consumeUsage(e, t, n),
|
|
1996
|
-
releaseUsage: (e, t) => A.current.releaseUsage(e, t),
|
|
1997
|
-
listByDerivedFrom: (e) => A.current.listByDerivedFrom(e),
|
|
1998
|
-
listRefs: (e) => A.current.listRefs(e)
|
|
1999
|
-
}, se = {
|
|
1996
|
+
}), fn = "@voltro/plugin-storage", pn = (i = {}) => {
|
|
1997
|
+
let y = nn(i);
|
|
1998
|
+
$t(y);
|
|
1999
|
+
let x = G.read("S3_BUCKET", i.bucket) ?? G.read("STORAGE_BUCKET") ?? "voltro", S = G.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), C = rn(i.allowedOrigins), w = i.limits?.maxBytes, D = i.anonymousUploads === !0, oe = 5242880, O = 21600, k = i.refStore === void 0 || i.refStore === "memory", A = i.grantStore === void 0 || i.grantStore === "memory", j = { current: k ? Et() : i.refStore }, M = { current: A ? jt() : i.grantStore }, se = {
|
|
2000
2000
|
insert: (e) => j.current.insert(e),
|
|
2001
|
-
delete: (e) => j.current.delete(e),
|
|
2002
2001
|
getById: (e) => j.current.getById(e),
|
|
2003
|
-
|
|
2004
|
-
|
|
2002
|
+
delete: (e) => j.current.delete(e),
|
|
2003
|
+
listRecent: (e) => j.current.listRecent(e),
|
|
2004
|
+
countByKey: (e, t) => j.current.countByKey(e, t),
|
|
2005
|
+
usageByTenant: (e) => j.current.usageByTenant(e),
|
|
2006
|
+
consumeUsage: (e, t, n) => j.current.consumeUsage(e, t, n),
|
|
2007
|
+
releaseUsage: (e, t) => j.current.releaseUsage(e, t),
|
|
2008
|
+
listByDerivedFrom: (e) => j.current.listByDerivedFrom(e),
|
|
2009
|
+
listRefs: (e) => j.current.listRefs(e)
|
|
2005
2010
|
}, ce = {
|
|
2011
|
+
insert: (e) => M.current.insert(e),
|
|
2012
|
+
delete: (e) => M.current.delete(e),
|
|
2013
|
+
getById: (e) => M.current.getById(e),
|
|
2014
|
+
listByRef: (e) => M.current.listByRef(e),
|
|
2015
|
+
deleteByRef: (e) => M.current.deleteByRef(e)
|
|
2016
|
+
}, N = {
|
|
2006
2017
|
provider: y,
|
|
2007
|
-
refStore:
|
|
2008
|
-
grantStore:
|
|
2018
|
+
refStore: se,
|
|
2019
|
+
grantStore: ce,
|
|
2009
2020
|
bucket: x,
|
|
2010
2021
|
...i.tenantPrefix === void 0 ? {} : { tenantPrefix: i.tenantPrefix },
|
|
2011
2022
|
...i.attempts === void 0 ? {} : { attempts: i.attempts },
|
|
@@ -2019,7 +2030,7 @@ var Wt = () => se({
|
|
|
2019
2030
|
...S ? { publicBaseUrl: S } : {},
|
|
2020
2031
|
...i.normalizeImages === void 0 ? {} : { normalizeImages: i.normalizeImages },
|
|
2021
2032
|
...i.quota === void 0 ? {} : { quota: i.quota }
|
|
2022
|
-
},
|
|
2033
|
+
}, P = Lt(N), F = It(N), I = (e) => b.runPromise(e.pipe(b.catchAll(() => b.succeed(null)))), L = (e, t) => {
|
|
2023
2034
|
if (!e) return "invalid";
|
|
2024
2035
|
let n = /^bytes=(\d*)-(\d*)$/.exec(e.trim());
|
|
2025
2036
|
if (!n) return "invalid";
|
|
@@ -2040,30 +2051,30 @@ var Wt = () => se({
|
|
|
2040
2051
|
start: a,
|
|
2041
2052
|
endInclusive: o
|
|
2042
2053
|
};
|
|
2043
|
-
},
|
|
2054
|
+
}, le = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, R = (e) => ({
|
|
2044
2055
|
"x-content-type-options": "nosniff",
|
|
2045
|
-
"content-disposition":
|
|
2046
|
-
}),
|
|
2056
|
+
"content-disposition": le.test(e) ? "inline" : "attachment"
|
|
2057
|
+
}), z = async (e, t, n, r) => {
|
|
2047
2058
|
if (n) {
|
|
2048
|
-
let r = await F
|
|
2059
|
+
let r = await I(F.get(e.id));
|
|
2049
2060
|
if (!r) return {
|
|
2050
2061
|
status: 404,
|
|
2051
2062
|
body: "not found",
|
|
2052
2063
|
contentType: "text/plain"
|
|
2053
2064
|
};
|
|
2054
|
-
let i = await
|
|
2065
|
+
let i = await qe(e.id, r.bytes, e.contentType, n).catch(() => null), a = i ? i.bytes : r.bytes, o = i ? i.contentType : e.contentType;
|
|
2055
2066
|
return {
|
|
2056
2067
|
status: 200,
|
|
2057
2068
|
body: a,
|
|
2058
2069
|
contentType: o,
|
|
2059
2070
|
headers: {
|
|
2060
|
-
...
|
|
2071
|
+
...R(o),
|
|
2061
2072
|
"cache-control": t,
|
|
2062
2073
|
"accept-ranges": "none"
|
|
2063
2074
|
}
|
|
2064
2075
|
};
|
|
2065
2076
|
}
|
|
2066
|
-
let i = r === void 0 ? "invalid" :
|
|
2077
|
+
let i = r === void 0 ? "invalid" : L(r, e.size);
|
|
2067
2078
|
if (i === "unsatisfiable") return {
|
|
2068
2079
|
status: 416,
|
|
2069
2080
|
body: "range not satisfiable",
|
|
@@ -2074,13 +2085,13 @@ var Wt = () => se({
|
|
|
2074
2085
|
}
|
|
2075
2086
|
};
|
|
2076
2087
|
if (i !== "invalid") {
|
|
2077
|
-
let n = await F
|
|
2088
|
+
let n = await I(F.getRange(e.id, i));
|
|
2078
2089
|
return n ? {
|
|
2079
2090
|
status: 206,
|
|
2080
2091
|
body: n.bytes,
|
|
2081
2092
|
contentType: e.contentType,
|
|
2082
2093
|
headers: {
|
|
2083
|
-
...
|
|
2094
|
+
...R(e.contentType),
|
|
2084
2095
|
"cache-control": t,
|
|
2085
2096
|
"accept-ranges": "bytes",
|
|
2086
2097
|
"content-range": `bytes ${i.start}-${i.endInclusive}/${n.totalSize}`
|
|
@@ -2091,7 +2102,7 @@ var Wt = () => se({
|
|
|
2091
2102
|
contentType: "text/plain"
|
|
2092
2103
|
};
|
|
2093
2104
|
}
|
|
2094
|
-
let a = await F
|
|
2105
|
+
let a = await I(F.get(e.id));
|
|
2095
2106
|
if (!a) return {
|
|
2096
2107
|
status: 404,
|
|
2097
2108
|
body: "not found",
|
|
@@ -2102,7 +2113,7 @@ var Wt = () => se({
|
|
|
2102
2113
|
status: 200,
|
|
2103
2114
|
contentType: e.contentType,
|
|
2104
2115
|
headers: {
|
|
2105
|
-
...
|
|
2116
|
+
...R(e.contentType),
|
|
2106
2117
|
"cache-control": t,
|
|
2107
2118
|
"accept-ranges": "bytes"
|
|
2108
2119
|
},
|
|
@@ -2120,20 +2131,20 @@ var Wt = () => se({
|
|
|
2120
2131
|
}
|
|
2121
2132
|
}
|
|
2122
2133
|
};
|
|
2123
|
-
},
|
|
2134
|
+
}, de = async (e) => {
|
|
2124
2135
|
let t = e.path.startsWith("/_voltro/storage/") ? e.path.slice(17).split("/")[0] ?? "" : "";
|
|
2125
2136
|
if (!t) return {
|
|
2126
2137
|
status: 404,
|
|
2127
2138
|
body: "not found",
|
|
2128
2139
|
contentType: "text/plain"
|
|
2129
2140
|
};
|
|
2130
|
-
let n = await F
|
|
2141
|
+
let n = await I(F.head(t));
|
|
2131
2142
|
if (!n) return {
|
|
2132
2143
|
status: 404,
|
|
2133
2144
|
body: "not found",
|
|
2134
2145
|
contentType: "text/plain"
|
|
2135
2146
|
};
|
|
2136
|
-
let r =
|
|
2147
|
+
let r = He(e.query), i = e.headers.range;
|
|
2137
2148
|
if (n.visibility === "public") {
|
|
2138
2149
|
let e = y.publicUrl?.(n.key) ?? null;
|
|
2139
2150
|
return e && !r ? {
|
|
@@ -2142,16 +2153,16 @@ var Wt = () => se({
|
|
|
2142
2153
|
location: e,
|
|
2143
2154
|
"cache-control": "public, max-age=300"
|
|
2144
2155
|
}
|
|
2145
|
-
} :
|
|
2156
|
+
} : z(n, "public, max-age=31536000, immutable", r, i);
|
|
2146
2157
|
}
|
|
2147
2158
|
let a = !1, o = e.query ? new URLSearchParams(e.query).get("t") : null;
|
|
2148
2159
|
if (o) {
|
|
2149
|
-
let e =
|
|
2160
|
+
let e = ct(o);
|
|
2150
2161
|
a = !!e && e.refId === t;
|
|
2151
2162
|
}
|
|
2152
2163
|
if (!a) {
|
|
2153
|
-
let t = E(e.headers.cookie,
|
|
2154
|
-
r && (a = await F
|
|
2164
|
+
let t = E(e.headers.cookie, Zt), r = t ? ae(t, ie()) : null;
|
|
2165
|
+
r && (a = await I(F.checkAccess(n, r)) === !0);
|
|
2155
2166
|
}
|
|
2156
2167
|
if (!a) return {
|
|
2157
2168
|
status: 403,
|
|
@@ -2159,7 +2170,7 @@ var Wt = () => se({
|
|
|
2159
2170
|
contentType: "text/plain"
|
|
2160
2171
|
};
|
|
2161
2172
|
if (y.presigns && !r) {
|
|
2162
|
-
let e = await
|
|
2173
|
+
let e = await I(y.getUrl(n.key, 300));
|
|
2163
2174
|
if (e && /^https?:/.test(e)) return {
|
|
2164
2175
|
status: 302,
|
|
2165
2176
|
headers: {
|
|
@@ -2168,12 +2179,12 @@ var Wt = () => se({
|
|
|
2168
2179
|
}
|
|
2169
2180
|
};
|
|
2170
2181
|
}
|
|
2171
|
-
return
|
|
2172
|
-
},
|
|
2182
|
+
return z(n, "private, no-store", r, i);
|
|
2183
|
+
}, fe = {
|
|
2173
2184
|
method: "GET",
|
|
2174
2185
|
path: "/_voltro/storage",
|
|
2175
2186
|
handle: async (e) => {
|
|
2176
|
-
let t = await
|
|
2187
|
+
let t = await de(e), n = an(e.headers.origin, C);
|
|
2177
2188
|
return Object.keys(n).length === 0 ? t : {
|
|
2178
2189
|
...t,
|
|
2179
2190
|
headers: {
|
|
@@ -2182,12 +2193,12 @@ var Wt = () => se({
|
|
|
2182
2193
|
}
|
|
2183
2194
|
};
|
|
2184
2195
|
}
|
|
2185
|
-
},
|
|
2196
|
+
}, pe = {
|
|
2186
2197
|
method: "*",
|
|
2187
2198
|
path: "/_voltro/storage/upload",
|
|
2188
2199
|
originGuard: "exempt",
|
|
2189
2200
|
handle: async (e) => {
|
|
2190
|
-
let t =
|
|
2201
|
+
let t = an(e.headers.origin, C);
|
|
2191
2202
|
if (e.method === "OPTIONS") return {
|
|
2192
2203
|
status: 204,
|
|
2193
2204
|
headers: t
|
|
@@ -2198,7 +2209,7 @@ var Wt = () => se({
|
|
|
2198
2209
|
contentType: "text/plain",
|
|
2199
2210
|
headers: t
|
|
2200
2211
|
};
|
|
2201
|
-
let n = e.query ? new URLSearchParams(e.query).get("ticket") : null, r = n ?
|
|
2212
|
+
let n = e.query ? new URLSearchParams(e.query).get("ticket") : null, r = n ? ut(n) : null;
|
|
2202
2213
|
if (!r) return {
|
|
2203
2214
|
status: 401,
|
|
2204
2215
|
body: "invalid or expired upload ticket",
|
|
@@ -2217,7 +2228,7 @@ var Wt = () => se({
|
|
|
2217
2228
|
contentType: "text/plain",
|
|
2218
2229
|
headers: t
|
|
2219
2230
|
};
|
|
2220
|
-
let i = await b.runPromise(
|
|
2231
|
+
let i = await b.runPromise(F.put({
|
|
2221
2232
|
bytes: e.rawBody,
|
|
2222
2233
|
contentType: r.ct,
|
|
2223
2234
|
tenantId: r.tenant,
|
|
@@ -2228,7 +2239,7 @@ var Wt = () => se({
|
|
|
2228
2239
|
...r.tags === void 0 ? {} : { tags: r.tags },
|
|
2229
2240
|
...r.alt === void 0 ? {} : { alt: r.alt },
|
|
2230
2241
|
...r.caption === void 0 ? {} : { caption: r.caption }
|
|
2231
|
-
}).pipe(b.flatMap((e) =>
|
|
2242
|
+
}).pipe(b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2232
2243
|
kind: "ok",
|
|
2233
2244
|
ref: e,
|
|
2234
2245
|
url: t
|
|
@@ -2274,17 +2285,17 @@ var Wt = () => se({
|
|
|
2274
2285
|
headers: t
|
|
2275
2286
|
};
|
|
2276
2287
|
}
|
|
2277
|
-
},
|
|
2288
|
+
}, me = {
|
|
2278
2289
|
method: "*",
|
|
2279
2290
|
path: "/_voltro/storage/upload/resumable",
|
|
2280
2291
|
originGuard: "exempt",
|
|
2281
2292
|
handle: async (e) => {
|
|
2282
|
-
let t =
|
|
2293
|
+
let t = an(e.headers.origin, C);
|
|
2283
2294
|
if (e.method === "OPTIONS") return {
|
|
2284
2295
|
status: 204,
|
|
2285
2296
|
headers: t
|
|
2286
2297
|
};
|
|
2287
|
-
let n = new URLSearchParams(e.query || ""), r =
|
|
2298
|
+
let n = new URLSearchParams(e.query || ""), r = mt(n.get("token") ?? "");
|
|
2288
2299
|
if (!r) return {
|
|
2289
2300
|
status: 401,
|
|
2290
2301
|
body: "invalid or expired resumable token",
|
|
@@ -2292,7 +2303,7 @@ var Wt = () => se({
|
|
|
2292
2303
|
headers: t
|
|
2293
2304
|
};
|
|
2294
2305
|
if (e.method === "GET" || e.method === "HEAD") {
|
|
2295
|
-
let e = await b.runPromise(
|
|
2306
|
+
let e = await b.runPromise(F.resumableStatus({
|
|
2296
2307
|
uploadId: r.id,
|
|
2297
2308
|
tenantId: r.tenant
|
|
2298
2309
|
}).pipe(b.match({
|
|
@@ -2333,12 +2344,12 @@ var Wt = () => se({
|
|
|
2333
2344
|
contentType: "text/plain",
|
|
2334
2345
|
headers: t
|
|
2335
2346
|
};
|
|
2336
|
-
let a = n.get("final") === "1", o = await b.runPromise(
|
|
2347
|
+
let a = n.get("final") === "1", o = await b.runPromise(F.putResumableChunk({
|
|
2337
2348
|
uploadId: r.id,
|
|
2338
2349
|
tenantId: r.tenant,
|
|
2339
2350
|
index: i,
|
|
2340
2351
|
bytes: e.rawBody
|
|
2341
|
-
}).pipe(b.flatMap(() => a ?
|
|
2352
|
+
}).pipe(b.flatMap(() => a ? F.finalizeResumable({
|
|
2342
2353
|
uploadId: r.id,
|
|
2343
2354
|
count: i + 1,
|
|
2344
2355
|
contentType: r.ct,
|
|
@@ -2349,7 +2360,7 @@ var Wt = () => se({
|
|
|
2349
2360
|
...r.tags === void 0 ? {} : { tags: r.tags },
|
|
2350
2361
|
...r.alt === void 0 ? {} : { alt: r.alt },
|
|
2351
2362
|
...r.caption === void 0 ? {} : { caption: r.caption }
|
|
2352
|
-
}).pipe(b.flatMap((e) =>
|
|
2363
|
+
}).pipe(b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2353
2364
|
kind: "done",
|
|
2354
2365
|
ref: e,
|
|
2355
2366
|
url: t
|
|
@@ -2401,31 +2412,31 @@ var Wt = () => se({
|
|
|
2401
2412
|
headers: t
|
|
2402
2413
|
};
|
|
2403
2414
|
}
|
|
2404
|
-
},
|
|
2415
|
+
}, B = (e) => ({
|
|
2405
2416
|
kind: "json",
|
|
2406
2417
|
data: e
|
|
2407
|
-
}),
|
|
2418
|
+
}), V = (e, t) => ({
|
|
2408
2419
|
kind: "json",
|
|
2409
2420
|
status: e,
|
|
2410
2421
|
data: { error: t }
|
|
2411
|
-
}),
|
|
2422
|
+
}), he = (e, t) => {
|
|
2412
2423
|
try {
|
|
2413
2424
|
return new URL(e, "http://localhost").searchParams.get(t);
|
|
2414
2425
|
} catch {
|
|
2415
2426
|
return null;
|
|
2416
2427
|
}
|
|
2417
|
-
},
|
|
2428
|
+
}, ge = [
|
|
2418
2429
|
{
|
|
2419
2430
|
method: "GET",
|
|
2420
2431
|
path: "/refs",
|
|
2421
2432
|
description: "Recent storage refs (newest first)",
|
|
2422
|
-
handler: () =>
|
|
2433
|
+
handler: () => se.listRecent(100).pipe(b.map((e) => B({ refs: e.map(on) })), b.catchAll((e) => b.succeed(V(500, e.message))))
|
|
2423
2434
|
},
|
|
2424
2435
|
{
|
|
2425
2436
|
method: "GET",
|
|
2426
2437
|
path: "/stats",
|
|
2427
2438
|
description: "Object count + total bytes per tenant + visibility split",
|
|
2428
|
-
handler: () =>
|
|
2439
|
+
handler: () => se.listRecent(1e4).pipe(b.map((e) => {
|
|
2429
2440
|
let t = {}, n = 0, r = 0;
|
|
2430
2441
|
for (let i of e) {
|
|
2431
2442
|
let e = i.tenantId ?? "(global)", a = t[e] ?? {
|
|
@@ -2434,7 +2445,7 @@ var Wt = () => se({
|
|
|
2434
2445
|
};
|
|
2435
2446
|
a.count++, a.bytes += i.size, t[e] = a, i.visibility === "public" ? n++ : r++;
|
|
2436
2447
|
}
|
|
2437
|
-
return
|
|
2448
|
+
return B({
|
|
2438
2449
|
provider: y.name,
|
|
2439
2450
|
bucket: x,
|
|
2440
2451
|
byTenant: t,
|
|
@@ -2443,15 +2454,15 @@ var Wt = () => se({
|
|
|
2443
2454
|
private: r
|
|
2444
2455
|
}
|
|
2445
2456
|
});
|
|
2446
|
-
}), b.catchAll((e) => b.succeed(
|
|
2457
|
+
}), b.catchAll((e) => b.succeed(V(500, e.message))))
|
|
2447
2458
|
},
|
|
2448
2459
|
{
|
|
2449
2460
|
method: "GET",
|
|
2450
2461
|
path: "/grants",
|
|
2451
2462
|
description: "Grants for a ref (?refId=…)",
|
|
2452
2463
|
handler: (e) => {
|
|
2453
|
-
let t =
|
|
2454
|
-
return t ?
|
|
2464
|
+
let t = he(e.url, "refId");
|
|
2465
|
+
return t ? ce.listByRef(t).pipe(b.map((e) => B({ grants: e.map(dn) })), b.catchAll((e) => b.succeed(V(500, e.message)))) : b.succeed(V(400, "refId query param required"));
|
|
2455
2466
|
}
|
|
2456
2467
|
},
|
|
2457
2468
|
{
|
|
@@ -2468,16 +2479,16 @@ var Wt = () => se({
|
|
|
2468
2479
|
status: 400
|
|
2469
2480
|
})
|
|
2470
2481
|
});
|
|
2471
|
-
if (!n.refId || !n.principalType || !n.principalId) return
|
|
2472
|
-
let r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null, i = yield*
|
|
2482
|
+
if (!n.refId || !n.principalType || !n.principalId) return V(400, "refId, principalType, principalId required");
|
|
2483
|
+
let r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null, i = yield* F.grant({
|
|
2473
2484
|
refId: n.refId,
|
|
2474
2485
|
principalType: n.principalType,
|
|
2475
2486
|
principalId: n.principalId,
|
|
2476
2487
|
...n.permission ? { permission: n.permission } : {},
|
|
2477
2488
|
expiresAt: r
|
|
2478
2489
|
});
|
|
2479
|
-
return
|
|
2480
|
-
}).pipe(b.catchAll((e) => b.succeed(
|
|
2490
|
+
return B({ grant: dn(i) });
|
|
2491
|
+
}).pipe(b.catchAll((e) => b.succeed(V(e.status ?? 500, e.message ?? "share failed"))))
|
|
2481
2492
|
},
|
|
2482
2493
|
{
|
|
2483
2494
|
method: "POST",
|
|
@@ -2493,15 +2504,15 @@ var Wt = () => se({
|
|
|
2493
2504
|
status: 400
|
|
2494
2505
|
})
|
|
2495
2506
|
});
|
|
2496
|
-
return n.grantId ? (yield*
|
|
2497
|
-
}).pipe(b.catchAll((e) => b.succeed(
|
|
2507
|
+
return n.grantId ? (yield* F.revoke(n.grantId), B({ ok: !0 })) : V(400, "grantId required");
|
|
2508
|
+
}).pipe(b.catchAll((e) => b.succeed(V(e.status ?? 500, e.message ?? "revoke failed"))))
|
|
2498
2509
|
}
|
|
2499
2510
|
], _e = [
|
|
2500
2511
|
{
|
|
2501
2512
|
...h,
|
|
2502
2513
|
execute: (e, t) => {
|
|
2503
2514
|
let n = e;
|
|
2504
|
-
return
|
|
2515
|
+
return F.mintUrl(n.id, t.request.subject, {
|
|
2505
2516
|
...n.password === void 0 ? {} : { password: n.password },
|
|
2506
2517
|
...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
|
|
2507
2518
|
}).pipe(b.map((e) => ({ url: e })));
|
|
@@ -2511,7 +2522,7 @@ var Wt = () => se({
|
|
|
2511
2522
|
...ee,
|
|
2512
2523
|
execute: (e, t) => {
|
|
2513
2524
|
let n = e;
|
|
2514
|
-
return
|
|
2525
|
+
return F.mintUploadUrl({
|
|
2515
2526
|
key: n.key,
|
|
2516
2527
|
contentType: n.contentType,
|
|
2517
2528
|
tenantId: t.request.subject.tenantId,
|
|
@@ -2523,10 +2534,10 @@ var Wt = () => se({
|
|
|
2523
2534
|
...m,
|
|
2524
2535
|
execute: (e, t) => {
|
|
2525
2536
|
let n = e;
|
|
2526
|
-
return b.
|
|
2527
|
-
let
|
|
2528
|
-
sub:
|
|
2529
|
-
tenant:
|
|
2537
|
+
return $(t, D).pipe(b.map((e) => {
|
|
2538
|
+
let t = n.expiresInSec ?? 900, r = lt({
|
|
2539
|
+
sub: e.id,
|
|
2540
|
+
tenant: e.tenantId,
|
|
2530
2541
|
ct: n.contentType,
|
|
2531
2542
|
vis: n.visibility ?? "private",
|
|
2532
2543
|
...n.key === void 0 ? {} : { key: n.key },
|
|
@@ -2535,27 +2546,27 @@ var Wt = () => se({
|
|
|
2535
2546
|
...n.alt === void 0 ? {} : { alt: n.alt },
|
|
2536
2547
|
...n.caption === void 0 ? {} : { caption: n.caption },
|
|
2537
2548
|
...w === void 0 ? {} : { max: w }
|
|
2538
|
-
},
|
|
2549
|
+
}, t);
|
|
2539
2550
|
return {
|
|
2540
2551
|
uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload?ticket=${encodeURIComponent(r)}`,
|
|
2541
|
-
expiresInSec:
|
|
2552
|
+
expiresInSec: t
|
|
2542
2553
|
};
|
|
2543
|
-
});
|
|
2554
|
+
}));
|
|
2544
2555
|
}
|
|
2545
2556
|
},
|
|
2546
2557
|
{
|
|
2547
2558
|
...p,
|
|
2548
2559
|
execute: (e, t) => {
|
|
2549
2560
|
let n = e;
|
|
2550
|
-
return
|
|
2561
|
+
return $(t, D).pipe(b.flatMap((e) => F.mintPresignedUpload({
|
|
2551
2562
|
contentType: n.contentType,
|
|
2552
|
-
tenantId:
|
|
2563
|
+
tenantId: e.tenantId,
|
|
2553
2564
|
...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
|
|
2554
|
-
}).pipe(b.map((
|
|
2555
|
-
let r =
|
|
2556
|
-
key:
|
|
2557
|
-
sub:
|
|
2558
|
-
tenant:
|
|
2565
|
+
}).pipe(b.map((t) => {
|
|
2566
|
+
let r = dt({
|
|
2567
|
+
key: t.key,
|
|
2568
|
+
sub: e.id,
|
|
2569
|
+
tenant: e.tenantId,
|
|
2559
2570
|
ct: n.contentType,
|
|
2560
2571
|
vis: n.visibility ?? "private",
|
|
2561
2572
|
...n.folder === void 0 ? {} : { folder: n.folder },
|
|
@@ -2563,25 +2574,25 @@ var Wt = () => se({
|
|
|
2563
2574
|
...n.alt === void 0 ? {} : { alt: n.alt },
|
|
2564
2575
|
...n.caption === void 0 ? {} : { caption: n.caption },
|
|
2565
2576
|
...w === void 0 ? {} : { max: w }
|
|
2566
|
-
},
|
|
2577
|
+
}, t.expiresInSec);
|
|
2567
2578
|
return {
|
|
2568
|
-
uploadUrl:
|
|
2579
|
+
uploadUrl: t.uploadUrl,
|
|
2569
2580
|
finalizeToken: r,
|
|
2570
|
-
expiresInSec:
|
|
2581
|
+
expiresInSec: t.expiresInSec
|
|
2571
2582
|
};
|
|
2572
|
-
}));
|
|
2583
|
+
}))));
|
|
2573
2584
|
}
|
|
2574
2585
|
},
|
|
2575
2586
|
{
|
|
2576
2587
|
...l,
|
|
2577
2588
|
execute: (e, n) => {
|
|
2578
|
-
let r =
|
|
2579
|
-
return r ? r.sub
|
|
2589
|
+
let r = ft(e.finalizeToken);
|
|
2590
|
+
return r ? un(r.sub, n.request.subject.id) ? b.fail(new t({
|
|
2580
2591
|
provider: "storage",
|
|
2581
2592
|
message: "finalize token belongs to another subject",
|
|
2582
2593
|
transient: !1,
|
|
2583
2594
|
status: 403
|
|
2584
|
-
})) :
|
|
2595
|
+
})) : F.finalizeUpload({
|
|
2585
2596
|
key: r.key,
|
|
2586
2597
|
contentType: r.ct,
|
|
2587
2598
|
tenantId: r.tenant,
|
|
@@ -2591,7 +2602,7 @@ var Wt = () => se({
|
|
|
2591
2602
|
...r.tags === void 0 ? {} : { tags: r.tags },
|
|
2592
2603
|
...r.alt === void 0 ? {} : { alt: r.alt },
|
|
2593
2604
|
...r.caption === void 0 ? {} : { caption: r.caption }
|
|
2594
|
-
}).pipe(b.flatMap((e) =>
|
|
2605
|
+
}).pipe(b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2595
2606
|
id: e.id,
|
|
2596
2607
|
url: t,
|
|
2597
2608
|
contentType: e.contentType,
|
|
@@ -2610,14 +2621,14 @@ var Wt = () => se({
|
|
|
2610
2621
|
...s,
|
|
2611
2622
|
execute: (e, t) => {
|
|
2612
2623
|
let n = e;
|
|
2613
|
-
return b.
|
|
2614
|
-
let
|
|
2624
|
+
return $(t, D).pipe(b.map((e) => {
|
|
2625
|
+
let t = n.expiresInSec ?? O, r = ue(), i = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : oe;
|
|
2615
2626
|
return {
|
|
2616
2627
|
uploadId: r,
|
|
2617
|
-
resumableToken:
|
|
2628
|
+
resumableToken: pt({
|
|
2618
2629
|
id: r,
|
|
2619
|
-
sub:
|
|
2620
|
-
tenant:
|
|
2630
|
+
sub: e.id,
|
|
2631
|
+
tenant: e.tenantId,
|
|
2621
2632
|
ct: n.contentType,
|
|
2622
2633
|
vis: n.visibility ?? "private",
|
|
2623
2634
|
size: n.size,
|
|
@@ -2626,29 +2637,29 @@ var Wt = () => se({
|
|
|
2626
2637
|
...n.alt === void 0 ? {} : { alt: n.alt },
|
|
2627
2638
|
...n.caption === void 0 ? {} : { caption: n.caption },
|
|
2628
2639
|
...w === void 0 ? {} : { max: w }
|
|
2629
|
-
},
|
|
2640
|
+
}, t),
|
|
2630
2641
|
uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload/resumable`,
|
|
2631
2642
|
chunkSize: i,
|
|
2632
|
-
expiresInSec:
|
|
2643
|
+
expiresInSec: t
|
|
2633
2644
|
};
|
|
2634
|
-
});
|
|
2645
|
+
}));
|
|
2635
2646
|
}
|
|
2636
2647
|
},
|
|
2637
2648
|
{
|
|
2638
2649
|
...o,
|
|
2639
2650
|
execute: (e, t) => {
|
|
2640
|
-
let n = e, r = n.expiresInSec ??
|
|
2641
|
-
return
|
|
2651
|
+
let n = e, r = n.expiresInSec ?? O;
|
|
2652
|
+
return $(t, D).pipe(b.flatMap((e) => F.beginMultipartUpload({
|
|
2642
2653
|
contentType: n.contentType,
|
|
2643
|
-
tenantId:
|
|
2654
|
+
tenantId: e.tenantId,
|
|
2644
2655
|
visibility: n.visibility ?? "private",
|
|
2645
2656
|
expiresInSec: r
|
|
2646
|
-
}).pipe(b.map((
|
|
2647
|
-
multipartToken:
|
|
2648
|
-
key:
|
|
2649
|
-
uploadId:
|
|
2650
|
-
sub:
|
|
2651
|
-
tenant:
|
|
2657
|
+
}).pipe(b.map((t) => ({
|
|
2658
|
+
multipartToken: ht({
|
|
2659
|
+
key: t.key,
|
|
2660
|
+
uploadId: t.uploadId,
|
|
2661
|
+
sub: e.id,
|
|
2662
|
+
tenant: e.tenantId,
|
|
2652
2663
|
ct: n.contentType,
|
|
2653
2664
|
vis: n.visibility ?? "private",
|
|
2654
2665
|
size: n.size,
|
|
@@ -2657,21 +2668,21 @@ var Wt = () => se({
|
|
|
2657
2668
|
...n.alt === void 0 ? {} : { alt: n.alt },
|
|
2658
2669
|
...n.caption === void 0 ? {} : { caption: n.caption }
|
|
2659
2670
|
}, r),
|
|
2660
|
-
partSize: n.partSize && n.partSize >=
|
|
2671
|
+
partSize: n.partSize && n.partSize >= oe ? n.partSize : oe,
|
|
2661
2672
|
expiresInSec: r
|
|
2662
|
-
})));
|
|
2673
|
+
})))));
|
|
2663
2674
|
}
|
|
2664
2675
|
},
|
|
2665
2676
|
{
|
|
2666
2677
|
...te,
|
|
2667
2678
|
execute: (e) => {
|
|
2668
|
-
let n = e, r =
|
|
2679
|
+
let n = e, r = gt(n.multipartToken);
|
|
2669
2680
|
return r ? !Number.isInteger(n.partNumber) || n.partNumber < 1 ? b.fail(new t({
|
|
2670
2681
|
provider: "storage",
|
|
2671
2682
|
message: "partNumber must be a positive integer",
|
|
2672
2683
|
transient: !1,
|
|
2673
2684
|
status: 400
|
|
2674
|
-
})) :
|
|
2685
|
+
})) : F.signMultipartPart({
|
|
2675
2686
|
key: r.key,
|
|
2676
2687
|
uploadId: r.uploadId,
|
|
2677
2688
|
partNumber: n.partNumber
|
|
@@ -2686,13 +2697,13 @@ var Wt = () => se({
|
|
|
2686
2697
|
{
|
|
2687
2698
|
...c,
|
|
2688
2699
|
execute: (e, n) => {
|
|
2689
|
-
let r = e, i =
|
|
2690
|
-
return i ? i.sub
|
|
2700
|
+
let r = e, i = gt(r.multipartToken);
|
|
2701
|
+
return i ? un(i.sub, n.request.subject.id) ? b.fail(new t({
|
|
2691
2702
|
provider: "storage",
|
|
2692
2703
|
message: "multipart token belongs to another subject",
|
|
2693
2704
|
transient: !1,
|
|
2694
2705
|
status: 403
|
|
2695
|
-
})) :
|
|
2706
|
+
})) : F.completeMultipart({
|
|
2696
2707
|
key: i.key,
|
|
2697
2708
|
uploadId: i.uploadId,
|
|
2698
2709
|
parts: r.parts,
|
|
@@ -2704,7 +2715,7 @@ var Wt = () => se({
|
|
|
2704
2715
|
...i.tags === void 0 ? {} : { tags: i.tags },
|
|
2705
2716
|
...i.alt === void 0 ? {} : { alt: i.alt },
|
|
2706
2717
|
...i.caption === void 0 ? {} : { caption: i.caption }
|
|
2707
|
-
}).pipe(b.flatMap((e) =>
|
|
2718
|
+
}).pipe(b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2708
2719
|
id: e.id,
|
|
2709
2720
|
url: t,
|
|
2710
2721
|
size: e.size
|
|
@@ -2719,8 +2730,8 @@ var Wt = () => se({
|
|
|
2719
2730
|
{
|
|
2720
2731
|
...a,
|
|
2721
2732
|
execute: (e) => {
|
|
2722
|
-
let n =
|
|
2723
|
-
return n ?
|
|
2733
|
+
let n = gt(e.multipartToken);
|
|
2734
|
+
return n ? F.abortMultipart({
|
|
2724
2735
|
key: n.key,
|
|
2725
2736
|
uploadId: n.uploadId
|
|
2726
2737
|
}).pipe(b.as({ ok: !0 })) : b.fail(new t({
|
|
@@ -2735,15 +2746,15 @@ var Wt = () => se({
|
|
|
2735
2746
|
...v,
|
|
2736
2747
|
execute: (e, t) => {
|
|
2737
2748
|
let n = e, r = new Uint8Array(Buffer.from(n.bytesBase64, "base64"));
|
|
2738
|
-
return
|
|
2749
|
+
return $(t, D).pipe(b.flatMap((e) => F.put({
|
|
2739
2750
|
bytes: r,
|
|
2740
2751
|
contentType: n.contentType,
|
|
2741
|
-
tenantId:
|
|
2742
|
-
ownerId:
|
|
2752
|
+
tenantId: e.tenantId,
|
|
2753
|
+
ownerId: e.id,
|
|
2743
2754
|
...n.visibility ? { visibility: n.visibility } : {},
|
|
2744
2755
|
...n.key ? { key: n.key } : {},
|
|
2745
2756
|
...n.password ? { password: n.password } : {}
|
|
2746
|
-
})
|
|
2757
|
+
})), b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2747
2758
|
id: e.id,
|
|
2748
2759
|
url: t
|
|
2749
2760
|
})))));
|
|
@@ -2753,16 +2764,16 @@ var Wt = () => se({
|
|
|
2753
2764
|
...u,
|
|
2754
2765
|
execute: (e, t) => {
|
|
2755
2766
|
let n = e;
|
|
2756
|
-
return
|
|
2757
|
-
tenantId:
|
|
2758
|
-
ownerId:
|
|
2767
|
+
return $(t, D).pipe(b.flatMap((e) => F.ingestUrl(n.url, {
|
|
2768
|
+
tenantId: e.tenantId,
|
|
2769
|
+
ownerId: e.id,
|
|
2759
2770
|
...n.visibility ? { visibility: n.visibility } : {},
|
|
2760
2771
|
...n.folder === void 0 ? {} : { folder: n.folder },
|
|
2761
2772
|
...n.tags === void 0 ? {} : { tags: n.tags },
|
|
2762
2773
|
...n.alt === void 0 ? {} : { alt: n.alt },
|
|
2763
2774
|
...n.caption === void 0 ? {} : { caption: n.caption },
|
|
2764
2775
|
...n.key === void 0 ? {} : { key: n.key }
|
|
2765
|
-
})
|
|
2776
|
+
})), b.flatMap((e) => F.getUrl(e.id).pipe(b.map((t) => ({
|
|
2766
2777
|
id: e.id,
|
|
2767
2778
|
url: t
|
|
2768
2779
|
})))));
|
|
@@ -2772,7 +2783,7 @@ var Wt = () => se({
|
|
|
2772
2783
|
..._,
|
|
2773
2784
|
execute: (e, t) => {
|
|
2774
2785
|
let n = e, r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null;
|
|
2775
|
-
return
|
|
2786
|
+
return cn(F, n.refId, t).pipe(b.flatMap(() => F.grant({
|
|
2776
2787
|
refId: n.refId,
|
|
2777
2788
|
principalType: n.principalType,
|
|
2778
2789
|
principalId: n.principalId,
|
|
@@ -2786,21 +2797,21 @@ var Wt = () => se({
|
|
|
2786
2797
|
...g,
|
|
2787
2798
|
execute: (e, t) => {
|
|
2788
2799
|
let n = e;
|
|
2789
|
-
return
|
|
2800
|
+
return F.getGrant(n.grantId).pipe(b.flatMap((e) => e === null ? b.fail(sn()) : cn(F, e.refId, t)), b.flatMap(() => F.revoke(n.grantId)), b.map(() => ({ ok: !0 })));
|
|
2790
2801
|
}
|
|
2791
2802
|
},
|
|
2792
2803
|
{
|
|
2793
2804
|
...d,
|
|
2794
2805
|
execute: (e, t) => {
|
|
2795
2806
|
let n = e;
|
|
2796
|
-
return
|
|
2807
|
+
return cn(F, n.refId, t).pipe(b.flatMap(() => F.listGrants(n.refId)), b.map((e) => ({ grants: e.map(dn) })));
|
|
2797
2808
|
}
|
|
2798
2809
|
},
|
|
2799
2810
|
{
|
|
2800
2811
|
...f,
|
|
2801
2812
|
execute: (e, t) => {
|
|
2802
2813
|
let n = e;
|
|
2803
|
-
return
|
|
2814
|
+
return F.listRefs({
|
|
2804
2815
|
tenantId: t.request.subject.tenantId,
|
|
2805
2816
|
...n.folder === void 0 ? {} : { folder: n.folder },
|
|
2806
2817
|
...n.tags === void 0 ? {} : { tags: n.tags },
|
|
@@ -2809,7 +2820,7 @@ var Wt = () => se({
|
|
|
2809
2820
|
...n.limit === void 0 ? {} : { limit: n.limit },
|
|
2810
2821
|
...n.offset === void 0 ? {} : { offset: n.offset }
|
|
2811
2822
|
}).pipe(b.map((e) => ({
|
|
2812
|
-
refs: e.refs.map(
|
|
2823
|
+
refs: e.refs.map(on),
|
|
2813
2824
|
nextOffset: e.nextOffset
|
|
2814
2825
|
})));
|
|
2815
2826
|
}
|
|
@@ -2817,24 +2828,24 @@ var Wt = () => se({
|
|
|
2817
2828
|
];
|
|
2818
2829
|
return T({
|
|
2819
2830
|
name: re({
|
|
2820
|
-
base:
|
|
2831
|
+
base: fn,
|
|
2821
2832
|
alias: i.alias,
|
|
2822
2833
|
instance: i.name
|
|
2823
2834
|
}),
|
|
2824
|
-
baseName:
|
|
2835
|
+
baseName: fn,
|
|
2825
2836
|
description: "File storage — StorageService over S3 / MinIO / filesystem / memory. Public objects served direct from bucket/CDN; private objects gated by an access policy + per-object grants. Checksums, tenant key-prefixing, _voltro_storage_refs + _voltro_storage_grants, retry.",
|
|
2826
2837
|
permissions: [
|
|
2827
2838
|
"network:outbound:*",
|
|
2828
2839
|
"inspect:read",
|
|
2829
2840
|
"inspect:write"
|
|
2830
2841
|
],
|
|
2831
|
-
declaredEnv:
|
|
2832
|
-
services:
|
|
2833
|
-
inspectEndpoints:
|
|
2842
|
+
declaredEnv: G.declared,
|
|
2843
|
+
services: P,
|
|
2844
|
+
inspectEndpoints: ge,
|
|
2834
2845
|
httpRoutes: [
|
|
2846
|
+
fe,
|
|
2835
2847
|
pe,
|
|
2836
|
-
me
|
|
2837
|
-
he
|
|
2848
|
+
me
|
|
2838
2849
|
],
|
|
2839
2850
|
routes: _e,
|
|
2840
2851
|
rpcClientDescriptors: ne,
|
|
@@ -2869,18 +2880,18 @@ var Wt = () => se({
|
|
|
2869
2880
|
}
|
|
2870
2881
|
],
|
|
2871
2882
|
bindDataStore: (e) => {
|
|
2872
|
-
|
|
2883
|
+
k && (j.current = At(e)), A && (M.current = Nt(e)), y.bindDataStore?.(e);
|
|
2873
2884
|
},
|
|
2874
2885
|
onActivate: (e) => b.sync(() => {
|
|
2875
|
-
let t = !!S || !!
|
|
2886
|
+
let t = !!S || !!G.read("STORAGE_CDN_URL", i.cdnBaseUrl);
|
|
2876
2887
|
e.logger.info(`storage: provider=${y.name} presign=${y.presigns ? "yes" : "no"} publicUrl=${t ? "yes" : "no"} transforms=yes`, {
|
|
2877
2888
|
provider: y.name,
|
|
2878
2889
|
bucket: x,
|
|
2879
|
-
refStore:
|
|
2890
|
+
refStore: k ? "memory" : "custom"
|
|
2880
2891
|
}), y.name === "memory" && process.env.NODE_ENV !== "test" && e.logger.warn("storage: provider=memory — uploads are IN-MEMORY and LOST on restart. Set STORAGE_PROVIDER (filesystem / s3 / r2 / azure / gcs) for anything but throwaway dev. (Empty/placeholder storage env silently falls back to memory.)"), !t && !y.presigns && e.logger.warn("storage: no VOLTRO_PUBLIC_URL / STORAGE_CDN_URL and this provider can't presign — serve URLs are RELATIVE and will not resolve cross-origin (browser <img> / server-to-server AI fetches). Set VOLTRO_PUBLIC_URL to this api's absolute base URL.");
|
|
2881
2892
|
}),
|
|
2882
2893
|
onDeactivate: () => b.void
|
|
2883
2894
|
});
|
|
2884
2895
|
};
|
|
2885
2896
|
//#endregion
|
|
2886
|
-
export { W as STORAGE_BLOBS_TABLE, U as STORAGE_GRANTS_TABLE, H as STORAGE_REFS_TABLE,
|
|
2897
|
+
export { W as STORAGE_BLOBS_TABLE, U as STORAGE_GRANTS_TABLE, H as STORAGE_REFS_TABLE, Ee as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, Ae as _voltroStorageBlobsTable, Oe as _voltroStorageGrantsTable, De as _voltroStorageRefsTable, ke as _voltroStorageUsageTable, en as appStorageProvider, Wt as assetRef, Be as azureProvider, It as buildStorageService, be as bytesToStream, bt as checkLimits, Vt as clamavScanner, Pe as clearStorageBuffer, xe as collectStream, ye as concatBytes, tn as configuredStorageProvider, _t as contentTypeAllowed, Nt as dataStoreGrantStore, At as dataStoreRefStore, ze as databaseProvider, qt as decodeDataUri, Xt as durabilityNotice, Rt as encodeInstream, Ut as ffmpegTranscoder, Ie as filesystemProvider, Se as fromNodeReadable, we as getObjectStream, Je as hashPassword, jt as memoryGrantStore, Fe as memoryProvider, Et as memoryRefStore, zt as parseClamavResponse, He as parseTransformParams, Yt as pathDurability, Jt as putAvatar, Te as putObjectStream, Ne as readStorageBuffer, wt as refMatchesListQuery, nn as resolveStorageProvider, Y as resolveStorageSecret, Le as s3Provider, $t as setActiveStorageProvider, dt as signFinalizeTicket, st as signGrant, ht as signMultipartTicket, pt as signResumableTicket, lt as signUploadTicket, yt as sniffMatches, pn as storagePlugin, Lt as storageServiceLayer, Ce as toNodeReadable, qe as transformCached, Ge as transformImage, ft as verifyFinalizeTicket, ct as verifyGrant, gt as verifyMultipartTicket, Ye as verifyPassword, mt as verifyResumableTicket, ut as verifyUploadTicket, Gt as withStorage };
|