@voltro/plugin-storage 0.68.0 → 0.69.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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 le } from "@voltro/env";
8
- import { createHmac as I, randomBytes as ue, randomUUID as de, scryptSync as fe, timingSafeEqual as L } from "node:crypto";
9
- import { spawn as pe } from "node:child_process";
10
- import { mkdtemp as me, readFile as he, rm as R, writeFile as z } from "node:fs/promises";
11
- import { tmpdir as ge } from "node:os";
12
- import { join as B } from "node:path";
13
- import { statSync as _e } from "node:fs";
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 ve = 1 << 20, ye = (e, n, r = !1) => new t({
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
- }), be = (e) => {
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
- }, xe = (e, t = ve) => {
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
- }, Se = (e) => e.pipe(w.runCollect, b.map((e) => be(y.toReadonlyArray(e)))), Ce = (e, t) => w.suspend(() => w.fromAsyncIterable(t(), (t) => ye(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(w.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), V = async (e) => {
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: xe(e.bytes),
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) : Se(n).pipe(b.flatMap((n) => e.put(t, n, {
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", G = "_voltro_storage_usage", Ee = N(H, {
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"]), De = N(U, {
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"]), Oe = N(G, {
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"]), ke = N(W, {
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"]), K = le([
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
- ]), q = (e, n, r, i) => new t({
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
- }), Ae = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, je = /* @__PURE__ */ new Map(), Me = (e, t) => je.get(e)?.get(t)?.bytes, Ne = (e) => {
240
- je.get(e)?.clear();
241
- }, Pe = (e = "default") => {
242
- let t = je.get(e) ?? /* @__PURE__ */ new Map();
243
- return je.set(e, t), {
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(q("memory", `no object at key '${e}'`, !1, 404));
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
- }, Fe = (e) => {
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" ? q("filesystem", `no object at key '${t}'`, !1, 404) : q("filesystem", String(e?.message ?? e), n)
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) => q("filesystem", String(e?.message ?? e), !1)
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: Ce("filesystem", () => r(i)),
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 V(t), o(l));
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
- }), be(o);
343
+ }), ye(o);
344
344
  }, e)
345
345
  };
346
- }, Ie = (e) => {
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 q(t, String(e?.message ?? e), Ae(n), n);
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 q(t, String(e?.message ?? e), Ae(n), n);
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: Ce(t, () => s),
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 V(r);
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
- }, Le = (e) => e instanceof Uint8Array ? e : typeof e == "string" ? new Uint8Array(Buffer.from(e, "base64")) : new Uint8Array(e), Re = () => {
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) => q("database", String(e?.message ?? e), !0)
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: Le(t.data),
574
+ bytes: Re(t.data),
575
575
  contentType: String(t.contentType)
576
- }) : b.fail(q("database", `no object at key '${e}'`, !1, 404))))),
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
- }, ze = (e) => {
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 = K.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = K.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = K.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
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 q("azure", String(e?.message ?? e), Ae(t), t);
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 q("azure", String(e?.message ?? e), Ae(t), t);
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: Ce("azure", () => r.readableStreamBody),
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 V(t);
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
- }, Be = {
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
- }, Ve = (e) => {
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
- }, He = (e) => e.startsWith("image/") && !e.includes("svg"), J, Ue = async () => {
706
- if (J !== void 0) return J;
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
- J = e.default ?? e;
709
+ q = e.default ?? e;
710
710
  } catch {
711
- J = null;
711
+ q = null;
712
712
  }
713
- return J;
714
- }, We = async (e, t, n) => {
715
- if (!He(t)) return null;
716
- let r = await Ue();
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 && Be[n.format] ? n.format : void 0, o = t;
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 = Be[a];
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
- }, Ge = 200, Y = /* @__PURE__ */ new Map(), Ke = async (e, t, n, r) => {
740
- let i = `${e}::${JSON.stringify(r)}`, a = Y.get(i);
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 We(t, n, r);
743
- if (o && (Y.set(i, o), Y.size > Ge)) {
744
- let e = Y.keys().next().value;
745
- e !== void 0 && Y.delete(e);
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
- }, qe = (e) => {
749
- let t = ue(16).toString("hex");
750
- return `${t}:${fe(e, t, 32).toString("hex")}`;
751
- }, Je = (e, t) => {
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 = fe(e, n, i.length);
756
- return a.length === i.length && L(a, i);
757
- }, Ye = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], Xe = (e) => Ye(e.metadata?.roles), Ze = (e) => Ye(e.scopes), Qe = (e, t) => e.some((e) => t.includes(e)), $e = (e) => Ye(e.metadata?.groups), et = (e) => typeof e == "boolean" ? b.succeed(e) : b.isEffect(e) ? e : b.promise(() => e), tt = (e, t, n = {}) => b.gen(function* () {
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)) : $e(t);
762
- for (let a of r) if (yield* nt(a, e, t, i, n)) return !0;
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
- }), nt = (e, t, n, r, i) => b.gen(function* () {
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(Qe(Xe(n), e.roles)) || e.groups && e.groups.length > 0 && !o(Qe(r, e.groups)) || e.scopes && e.scopes.length > 0 && !o(Qe(Ze(n), e.scopes)) || e.password !== void 0 && e.password && !o(Je(i.password, t.passwordHash))) return !1;
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* et(r({
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
- }), rt = (e, t) => {
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
- }, it = (e, t, n, r, i) => {
787
- let a = rt(t, n);
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
- }, at = (e, t) => t.resolveGroups ? b.promise(async () => await t.resolveGroups(e)) : b.succeed($e(e)), X = () => K.read("VOLTRO_STORAGE_SECRET") ?? ie(), Z = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Q = (e) => {
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
- }, ot = (e, t, n = X()) => {
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 = Z(JSON.stringify(r));
798
- return `${i}.${Z(I("sha256", n).update(i).digest())}`;
799
- }, st = (e, t = X()) => {
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 = I("sha256", t).update(r).digest(), o = Q(i);
804
- if (o.length !== a.length || !L(o, a)) return null;
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(Q(r).toString("utf8"));
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
- }, ct = (e, t, n = X()) => {
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 = Z(JSON.stringify(r));
817
- return `${i}.${Z(I("sha256", n).update(`u:${i}`).digest())}`;
818
- }, lt = (e, t = X()) => {
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 = I("sha256", t).update(`u:${r}`).digest(), o = Q(i);
823
- if (o.length !== a.length || !L(o, a)) return null;
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(Q(r).toString("utf8"));
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
- }, ut = (e, t, n = X()) => {
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 = Z(JSON.stringify(r));
836
- return `${i}.${Z(I("sha256", n).update(`f:${i}`).digest())}`;
837
- }, dt = (e, t = X()) => {
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 = I("sha256", t).update(`f:${r}`).digest(), o = Q(i);
842
- if (o.length !== a.length || !L(o, a)) return null;
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(Q(r).toString("utf8"));
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
- }, ft = (e, t, n = X()) => {
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 = Z(JSON.stringify(r));
855
- return `${i}.${Z(I("sha256", n).update(`r:${i}`).digest())}`;
856
- }, pt = (e, t = X()) => {
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 = I("sha256", t).update(`r:${r}`).digest(), o = Q(i);
861
- if (o.length !== a.length || !L(o, a)) return null;
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(Q(r).toString("utf8"));
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
- }, mt = (e, t, n = X()) => {
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 = Z(JSON.stringify(r));
874
- return `${i}.${Z(I("sha256", n).update(`m:${i}`).digest())}`;
875
- }, ht = (e, t = X()) => {
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 = I("sha256", t).update(`m:${r}`).digest(), o = Q(i);
880
- if (o.length !== a.length || !L(o, a)) return null;
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(Q(r).toString("utf8"));
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
- }, gt = (e, t) => {
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
- }, _t = [
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
- ], vt = (e, t) => {
965
- let n = t.toLowerCase(), r = _t.find((e) => e.ct.test(n));
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
- }, yt = (e, t, n) => n ? n.maxBytes !== void 0 && e.byteLength > n.maxBytes ? {
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
- } : gt(t, n.allowedContentTypes) ? n.sniff && !vt(e, t) ? {
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, bt = async (e, t, n) => {
977
- if (!He(t)) return { bytes: e };
978
- let r = await Ue();
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
- }, xt = async (e) => {
1001
+ }, St = async (e) => {
1002
1002
  let { createHash: t } = await import("node:crypto");
1003
1003
  return t("sha256").update(e).digest("hex");
1004
- }, St = (e, t) => e ? `${e.replace(/\/+$/, "")}/_voltro/storage/${t}` : `/_voltro/storage/${t}`, Ct = (e, t) => {
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
- }, wt = (e) => e ?? "global", Tt = () => {
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 = wt(e), a = t.get(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 = wt(e), i = t.get(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) => Ct(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(t.offset, t.offset + t.limit))
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
- }, Et = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, Dt = (e) => ({
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: Et(e.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
- }), $ = (e) => b.tryPromise({
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
- }), Ot = async (e, t) => (await e.query({
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, kt = (e) => ({
1099
- insert: (t) => $(() => e.insert(H, { ...t })),
1100
- getById: (t) => $(async () => {
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] ? Dt(n[0]) : null;
1113
+ return n[0] ? Ot(n[0]) : null;
1114
1114
  }),
1115
- delete: (t) => $(() => e.delete(H, t)),
1116
- listRecent: (t) => $(async () => (await e.query({
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(Dt)),
1127
- countByKey: (t, n) => $(async () => (await e.query({
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) => $(async () => {
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) => $(async () => {
1163
- let i = wt(t);
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 Ot(e, i), o = a ? Number(a.bytes ?? 0) : 0, s = a ? Number(a.count ?? 0) : 0;
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
- }, G), r = await e.insertIgnore(G, {
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) => $(async () => {
1203
- let r = wt(t);
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 Ot(e, r);
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) => $(async () => (await e.query({
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(Dt)),
1232
- listRefs: (t) => $(async () => {
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(Dt).filter((e) => Ct(e, t)).slice(t.offset, t.offset + t.limit);
1254
+ })).map(Ot).filter((e) => wt(e, t)).slice(t.offset, t.offset + t.limit);
1255
1255
  })
1256
- }), At = () => {
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
- }, jt = (e) => ({
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
- }), Mt = (e) => ({
1281
- insert: (t) => $(() => e.insert(U, { ...t })),
1282
- delete: (t) => $(() => e.delete(U, t)),
1283
- getById: (t) => $(async () => {
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 ? jt(n) : null;
1296
+ return n ? Mt(n) : null;
1297
1297
  }),
1298
- listByRef: (t) => $(async () => (await e.query({
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(jt)),
1313
- deleteByRef: (t) => $(async () => {
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
- }), Nt = () => k({
1328
+ }), Pt = () => k({
1329
1329
  kind: "typeid",
1330
1330
  prefix: "file"
1331
- }, H), Pt = () => k({
1331
+ }, H), Ft = () => k({
1332
1332
  kind: "typeid",
1333
1333
  prefix: "grant"
1334
- }, U), Ft = (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) => St(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) => [
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 = yt(e.bytes, e.contentType, i.limits);
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(() => bt(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* ne({
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(() => xt(l)), v = e.tenantId ?? null, y = e.visibility ?? "private", C = m(v, _, yield* ee(e.key)), w = {
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(() => qe(e.password)) : null, E = {
1413
- id: Nt(),
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* tt(e, t, {
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* at(t, l);
1479
- return it(yield* s.listByRef(e.id), t, r, n?.permission ?? "read", Date.now());
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(() => ot(s.id, c));
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: Pt(),
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: Nt(),
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
- }, It = (e) => S.succeed(i, Ft(e)), Lt = (e, t = 65536) => {
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
- }, Rt = (e) => {
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
- }, zt = async (e, t) => {
1770
- let n = await import("node:net"), r = K.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = K.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
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(Lt(e, t.chunkSize));
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(Rt(l));
1787
+ i(zt(l));
1788
1788
  } catch (e) {
1789
1789
  s(e);
1790
1790
  }
1791
1791
  });
1792
1792
  });
1793
- }, Bt = (e = {}) => (t) => zt(t.bytes, e), Vt = (e, t, n) => new Promise((r, i) => {
1794
- let a = pe(e, [...t], { stdio: [
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
- }), Ht = (e) => async ({ bytes: t }) => {
1809
- let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await me(B(ge(), "voltro-tc-")), a = B(i, "in"), o = [];
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 z(a, t);
1811
+ await B(a, t);
1812
1812
  for (let t of e.renditions) {
1813
- let e = B(i, `out.${t.ext}`);
1813
+ let e = he(i, `out.${t.ext}`);
1814
1814
  try {
1815
- await Vt(n, [
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 he(e);
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 R(e, { force: !0 });
1828
+ }), await me(e, { force: !0 });
1829
1829
  } catch {}
1830
1830
  }
1831
1831
  } finally {
1832
- await R(i, {
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 Ut(e = {}) {
1842
- let t = e.nullable ?? !0, n = e.fk === !1 ? P().externalId() : ce(() => Ee, { onDelete: e.onDelete ?? "setNull" });
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 Wt = () => se({
1845
+ var Gt = () => se({
1846
1846
  id: "@voltro/plugin-storage/withStorage",
1847
- fields: { asset: Ut() }
1848
- }), Gt = {
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
- }, Kt = (e) => {
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
- }, qt = (e, n) => b.gen(function* () {
1863
+ }, Jt = (e, n) => b.gen(function* () {
1864
1864
  let r = yield* b.try({
1865
- try: () => Kt(n.dataUri),
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 = Gt[r.contentType] ?? "bin";
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
- }), Jt = (e) => {
1881
+ }), Yt = (e) => {
1882
1882
  try {
1883
- let t = _e(e), n = _e("/");
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
- }, Yt = (e) => {
1889
- if (Jt(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
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
- }, Xt = K.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", Zt, Qt = (e) => {
1893
- Zt = e;
1894
- }, $t = () => Zt ?? tn({}), en = () => Zt === void 0 ? K.read("STORAGE_PROVIDER") === void 0 ? void 0 : tn({}) : Zt, tn = (e) => {
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 ?? K.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = K.read("S3_BUCKET", e.bucket) ?? K.read("STORAGE_BUCKET") ?? "voltro";
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 = K.read("S3_REGION", e.region) ?? K.read("AWS_REGION"), i = K.read("S3_ENDPOINT", e.endpoint) ?? K.read("MINIO_ENDPOINT"), a = K.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? K.read("AWS_ACCESS_KEY_ID"), o = K.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? K.read("AWS_SECRET_ACCESS_KEY"), s = K.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1901
- return Ie({
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" || K.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
1910
+ ...t === "minio" || G.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
1911
1911
  });
1912
1912
  }
1913
1913
  case "azure": {
1914
- let t = K.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = K.read("AZURE_STORAGE_KEY", e.accountKey), i = K.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = K.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = K.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1915
- return ze({
1916
- container: K.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
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 Re();
1925
- case "filesystem": return Fe({ root: K.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
1926
- default: return Pe(e.name ?? "default");
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
- }, nn = (e) => {
1928
+ }, rn = (e) => {
1929
1929
  if (e !== void 0) return e;
1930
- let t = K.read("STORAGE_ALLOWED_ORIGINS");
1930
+ let t = G.read("STORAGE_ALLOWED_ORIGINS");
1931
1931
  return t ? t.trim() === "*" ? "*" : t.split(",").map((e) => e.trim()).filter(Boolean) : [];
1932
- }, rn = (e, t) => {
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
- }, an = (e) => ({
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
- }), on = () => new t({
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
- }), sn = (e, t, n) => {
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(on())), b.flatMap((e) => {
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(on());
1974
+ return t != null && t === r.id ? b.void : b.fail(sn());
1975
1975
  }));
1976
- }, cn = (e) => ({
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
- }), ln = "@voltro/plugin-storage", un = (i = {}) => {
1986
- let y = tn(i);
1987
- Qt(y);
1988
- let x = K.read("S3_BUCKET", i.bucket) ?? K.read("STORAGE_BUCKET") ?? "voltro", S = K.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), C = nn(i.allowedOrigins), w = i.limits?.maxBytes, D = 5242880, oe = 21600, O = i.refStore === void 0 || i.refStore === "memory", k = i.grantStore === void 0 || i.grantStore === "memory", A = { current: O ? Tt() : i.refStore }, j = { current: k ? At() : i.grantStore }, M = {
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
- listByRef: (e) => j.current.listByRef(e),
2004
- deleteByRef: (e) => j.current.deleteByRef(e)
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: M,
2008
- grantStore: se,
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
- }, N = It(ce), P = Ft(ce), F = (e) => b.runPromise(e.pipe(b.catchAll(() => b.succeed(null)))), le = (e, t) => {
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
- }, I = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, ue = (e) => ({
2054
+ }, le = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, R = (e) => ({
2044
2055
  "x-content-type-options": "nosniff",
2045
- "content-disposition": I.test(e) ? "inline" : "attachment"
2046
- }), fe = async (e, t, n, r) => {
2056
+ "content-disposition": le.test(e) ? "inline" : "attachment"
2057
+ }), z = async (e, t, n, r) => {
2047
2058
  if (n) {
2048
- let r = await F(P.get(e.id));
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 Ke(e.id, r.bytes, e.contentType, n).catch(() => null), a = i ? i.bytes : r.bytes, o = i ? i.contentType : e.contentType;
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
- ...ue(o),
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" : le(r, e.size);
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(P.getRange(e.id, i));
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
- ...ue(e.contentType),
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(P.get(e.id));
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
- ...ue(e.contentType),
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
- }, L = async (e) => {
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(P.head(t));
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 = Ve(e.query), i = e.headers.range;
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
- } : fe(n, "public, max-age=31536000, immutable", r, i);
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 = st(o);
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, Xt), r = t ? ae(t, ie()) : null;
2154
- r && (a = await F(P.checkAccess(n, r)) === !0);
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 F(y.getUrl(n.key, 300));
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 fe(n, "private, no-store", r, i);
2172
- }, pe = {
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 L(e), n = rn(e.headers.origin, C);
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
- }, me = {
2196
+ }, pe = {
2186
2197
  method: "*",
2187
2198
  path: "/_voltro/storage/upload",
2188
2199
  originGuard: "exempt",
2189
2200
  handle: async (e) => {
2190
- let t = rn(e.headers.origin, C);
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 ? lt(n) : null;
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(P.put({
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) => P.getUrl(e.id).pipe(b.map((t) => ({
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
- }, he = {
2288
+ }, me = {
2278
2289
  method: "*",
2279
2290
  path: "/_voltro/storage/upload/resumable",
2280
2291
  originGuard: "exempt",
2281
2292
  handle: async (e) => {
2282
- let t = rn(e.headers.origin, C);
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 = pt(n.get("token") ?? "");
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(P.resumableStatus({
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(P.putResumableChunk({
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 ? P.finalizeResumable({
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) => P.getUrl(e.id).pipe(b.map((t) => ({
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
- }, R = (e) => ({
2415
+ }, B = (e) => ({
2405
2416
  kind: "json",
2406
2417
  data: e
2407
- }), z = (e, t) => ({
2418
+ }), V = (e, t) => ({
2408
2419
  kind: "json",
2409
2420
  status: e,
2410
2421
  data: { error: t }
2411
- }), ge = (e, t) => {
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
- }, B = [
2428
+ }, ge = [
2418
2429
  {
2419
2430
  method: "GET",
2420
2431
  path: "/refs",
2421
2432
  description: "Recent storage refs (newest first)",
2422
- handler: () => M.listRecent(100).pipe(b.map((e) => R({ refs: e.map(an) })), b.catchAll((e) => b.succeed(z(500, e.message))))
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: () => M.listRecent(1e4).pipe(b.map((e) => {
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 R({
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(z(500, e.message))))
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 = ge(e.url, "refId");
2454
- return t ? se.listByRef(t).pipe(b.map((e) => R({ grants: e.map(cn) })), b.catchAll((e) => b.succeed(z(500, e.message)))) : b.succeed(z(400, "refId query param required"));
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 z(400, "refId, principalType, principalId required");
2472
- let r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null, i = yield* P.grant({
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 R({ grant: cn(i) });
2480
- }).pipe(b.catchAll((e) => b.succeed(z(e.status ?? 500, e.message ?? "share failed"))))
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* P.revoke(n.grantId), R({ ok: !0 })) : z(400, "grantId required");
2497
- }).pipe(b.catchAll((e) => b.succeed(z(e.status ?? 500, e.message ?? "revoke failed"))))
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 P.mintUrl(n.id, t.request.subject, {
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 P.mintUploadUrl({
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.sync(() => {
2527
- let e = n.expiresInSec ?? 900, r = ct({
2528
- sub: t.request.subject.id,
2529
- tenant: t.request.subject.tenantId,
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
- }, e);
2549
+ }, t);
2539
2550
  return {
2540
2551
  uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload?ticket=${encodeURIComponent(r)}`,
2541
- expiresInSec: e
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 P.mintPresignedUpload({
2561
+ return $(t, D).pipe(b.flatMap((e) => F.mintPresignedUpload({
2551
2562
  contentType: n.contentType,
2552
- tenantId: t.request.subject.tenantId,
2563
+ tenantId: e.tenantId,
2553
2564
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
2554
- }).pipe(b.map((e) => {
2555
- let r = ut({
2556
- key: e.key,
2557
- sub: t.request.subject.id,
2558
- tenant: t.request.subject.tenantId,
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
- }, e.expiresInSec);
2577
+ }, t.expiresInSec);
2567
2578
  return {
2568
- uploadUrl: e.uploadUrl,
2579
+ uploadUrl: t.uploadUrl,
2569
2580
  finalizeToken: r,
2570
- expiresInSec: e.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 = dt(e.finalizeToken);
2579
- return r ? r.sub !== null && r.sub !== n.request.subject.id ? b.fail(new t({
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
- })) : P.finalizeUpload({
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) => P.getUrl(e.id).pipe(b.map((t) => ({
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.sync(() => {
2614
- let e = n.expiresInSec ?? oe, r = de(), i = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : D;
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: ft({
2628
+ resumableToken: pt({
2618
2629
  id: r,
2619
- sub: t.request.subject.id,
2620
- tenant: t.request.subject.tenantId,
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
- }, e),
2640
+ }, t),
2630
2641
  uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload/resumable`,
2631
2642
  chunkSize: i,
2632
- expiresInSec: e
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 ?? oe;
2641
- return P.beginMultipartUpload({
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: t.request.subject.tenantId,
2654
+ tenantId: e.tenantId,
2644
2655
  visibility: n.visibility ?? "private",
2645
2656
  expiresInSec: r
2646
- }).pipe(b.map((e) => ({
2647
- multipartToken: mt({
2648
- key: e.key,
2649
- uploadId: e.uploadId,
2650
- sub: t.request.subject.id,
2651
- tenant: t.request.subject.tenantId,
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 >= D ? n.partSize : D,
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 = ht(n.multipartToken);
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
- })) : P.signMultipartPart({
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 = ht(r.multipartToken);
2690
- return i ? i.sub !== null && i.sub !== n.request.subject.id ? b.fail(new t({
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
- })) : P.completeMultipart({
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) => P.getUrl(e.id).pipe(b.map((t) => ({
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 = ht(e.multipartToken);
2723
- return n ? P.abortMultipart({
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 P.put({
2749
+ return $(t, D).pipe(b.flatMap((e) => F.put({
2739
2750
  bytes: r,
2740
2751
  contentType: n.contentType,
2741
- tenantId: t.request.subject.tenantId,
2742
- ownerId: t.request.subject.id,
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
- }).pipe(b.flatMap((e) => P.getUrl(e.id).pipe(b.map((t) => ({
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 P.ingestUrl(n.url, {
2757
- tenantId: t.request.subject.tenantId,
2758
- ownerId: t.request.subject.id,
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
- }).pipe(b.flatMap((e) => P.getUrl(e.id).pipe(b.map((t) => ({
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 sn(P, n.refId, t).pipe(b.flatMap(() => P.grant({
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 P.getGrant(n.grantId).pipe(b.flatMap((e) => e === null ? b.fail(on()) : sn(P, e.refId, t)), b.flatMap(() => P.revoke(n.grantId)), b.map(() => ({ ok: !0 })));
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 sn(P, n.refId, t).pipe(b.flatMap(() => P.listGrants(n.refId)), b.map((e) => ({ grants: e.map(cn) })));
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 P.listRefs({
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(an),
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: ln,
2831
+ base: fn,
2821
2832
  alias: i.alias,
2822
2833
  instance: i.name
2823
2834
  }),
2824
- baseName: ln,
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: K.declared,
2832
- services: N,
2833
- inspectEndpoints: B,
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
- O && (A.current = kt(e)), k && (j.current = Mt(e)), y.bindDataStore?.(e);
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 || !!K.read("STORAGE_CDN_URL", i.cdnBaseUrl);
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: O ? "memory" : "custom"
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, G as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, ke as _voltroStorageBlobsTable, De as _voltroStorageGrantsTable, Ee as _voltroStorageRefsTable, Oe as _voltroStorageUsageTable, $t as appStorageProvider, Ut as assetRef, ze as azureProvider, Ft as buildStorageService, xe as bytesToStream, yt as checkLimits, Bt as clamavScanner, Ne as clearStorageBuffer, Se as collectStream, be as concatBytes, en as configuredStorageProvider, gt as contentTypeAllowed, Mt as dataStoreGrantStore, kt as dataStoreRefStore, Re as databaseProvider, Kt as decodeDataUri, Yt as durabilityNotice, Lt as encodeInstream, Ht as ffmpegTranscoder, Fe as filesystemProvider, Ce as fromNodeReadable, we as getObjectStream, qe as hashPassword, At as memoryGrantStore, Pe as memoryProvider, Tt as memoryRefStore, Rt as parseClamavResponse, Ve as parseTransformParams, Jt as pathDurability, qt as putAvatar, Te as putObjectStream, Me as readStorageBuffer, Ct as refMatchesListQuery, tn as resolveStorageProvider, X as resolveStorageSecret, Ie as s3Provider, Qt as setActiveStorageProvider, ut as signFinalizeTicket, ot as signGrant, mt as signMultipartTicket, ft as signResumableTicket, ct as signUploadTicket, vt as sniffMatches, un as storagePlugin, It as storageServiceLayer, V as toNodeReadable, Ke as transformCached, We as transformImage, dt as verifyFinalizeTicket, st as verifyGrant, ht as verifyMultipartTicket, Je as verifyPassword, pt as verifyResumableTicket, lt as verifyUploadTicket, Wt as withStorage };
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 };