@voltro/plugin-storage 0.84.0 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { StorageAccessDenied as e, StorageError as t, StorageRejected as n, StorageScanRejected as r, StorageService as i } from "./types.js";
2
- import { abortMultipartUploadDescriptor as a, beginMultipartUploadDescriptor as o, beginResumableUploadDescriptor as s, completeMultipartUploadDescriptor as c, finalizeUploadDescriptor as l, ingestUrlDescriptor as u, listGrantsDescriptor as d, listRefsDescriptor as f, mintPresignedUploadDescriptor as p, mintUploadTicketDescriptor as m, mintUploadUrlDescriptor as ee, mintUrlDescriptor as te, revokeDescriptor as h, shareDescriptor as ne, signMultipartPartDescriptor as g, storageRpcClientImports as re, uploadDescriptor as ie } from "./rpc.js";
3
- import { processIdentity as _ } from "@voltro/protocol/identity";
4
- import { Chunk as v, Effect as y, Exit as b, Layer as x, Schedule as S, Schema as C, Stream as w } from "effect";
5
- import { definePlugin as ae, pluginInstanceName as oe } from "@voltro/protocol";
2
+ import { abortMultipartUploadDescriptor as a, beginMultipartUploadDescriptor as o, beginResumableUploadDescriptor as s, completeMultipartUploadDescriptor as c, finalizeUploadDescriptor as l, ingestUrlDescriptor as u, listGrantsDescriptor as d, listRefsDescriptor as f, mintPresignedUploadDescriptor as p, mintUploadTicketDescriptor as m, mintUploadUrlDescriptor as ee, mintUrlDescriptor as te, revokeDescriptor as ne, shareDescriptor as h, signMultipartPartDescriptor as g, storageRpcClientImports as _, uploadDescriptor as re } from "./rpc.js";
3
+ import { processIdentity as ie } from "@voltro/protocol/identity";
4
+ import { Effect as v, Exit as y, Layer as b, Schedule as x, Schema as S, Stream as C } from "effect";
5
+ import { StorageAccessPolicySchema as ae, definePlugin as oe, pluginInstanceName as w } from "@voltro/protocol";
6
6
  import { readCookie as se, resolveSessionSecret as ce, verifySession as le } from "@voltro/protocol/session";
7
- import { and as T, authoredError as ue, bigint as E, bytes as D, causeBranches as de, column as fe, contains as pe, eq as O, extractDbCause as me, generateId as k, id as A, integer as j, isTransientContention as he, json as ge, mixin as _e, neq as ve, or as M, reference as ye, table as N, text as P, timestamp as be, wireSafeCause as xe } from "@voltro/database";
7
+ import { and as ue, authoredError as T, bigint as E, bytes as D, causeBranches as O, column as de, contains as fe, eq as k, extractDbCause as pe, generateId as A, id as j, integer as M, isNull as me, isTransientContention as he, json as ge, mixin as _e, neq as ve, or as N, reference as ye, table as P, text as F, timestamp as be, wireSafeCause as xe } from "@voltro/database";
8
8
  import { pluginEnv as Se } from "@voltro/env";
9
- import { createHash as Ce, createHmac as F, randomBytes as we, randomUUID as Te, scryptSync as Ee, timingSafeEqual as I } from "node:crypto";
10
- import { ssrfReason as L } from "@voltro/runtime";
11
- import { spawn as R } from "node:child_process";
12
- import { mkdtemp as De, readFile as Oe, rm as ke, writeFile as Ae } from "node:fs/promises";
9
+ import { createHash as Ce, createHmac as I, randomBytes as we, randomUUID as Te, scryptSync as Ee, timingSafeEqual as L } from "node:crypto";
10
+ import { ssrfReason as De } from "@voltro/runtime";
11
+ import { spawn as Oe } from "node:child_process";
12
+ import { mkdtemp as R, readFile as z, rm as ke, writeFile as Ae } from "node:fs/promises";
13
13
  import { tmpdir as je } from "node:os";
14
14
  import { join as Me } from "node:path";
15
15
  import { statSync as Ne } from "node:fs";
@@ -27,62 +27,62 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
27
27
  }, Le = (e, t = Pe) => {
28
28
  let n = [];
29
29
  for (let r = 0; r < e.byteLength; r += t) n.push(e.subarray(r, Math.min(r + t, e.byteLength)));
30
- return w.fromIterable(n);
31
- }, Re = (e) => e.pipe(w.runCollect, y.map((e) => Ie(v.toReadonlyArray(e)))), ze = (e, t) => w.suspend(() => w.fromAsyncIterable(t(), (t) => Fe(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(w.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), Be = async (e) => {
30
+ return C.fromIterable(n);
31
+ }, Re = (e) => e.pipe(C.runCollect, v.map((e) => Ie(e))), ze = (e, t) => C.suspend(() => C.fromAsyncIterable(t(), (t) => Fe(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(C.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), Be = async (e) => {
32
32
  let { Readable: t } = await import("node:stream");
33
- return t.fromWeb(w.toReadableStream(e));
34
- }, Ve = (e, t) => e.getStream ? e.getStream(t) : e.get(t).pipe(y.map((e) => ({
33
+ return t.fromWeb(C.toReadableStream(e));
34
+ }, Ve = (e, t) => e.getStream ? e.getStream(t) : e.get(t).pipe(v.map((e) => ({
35
35
  stream: Le(e.bytes),
36
36
  contentType: e.contentType,
37
37
  size: e.bytes.byteLength
38
- }))), He = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) : Re(n).pipe(y.flatMap((n) => e.put(t, n, {
38
+ }))), He = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) : Re(n).pipe(v.flatMap((n) => e.put(t, n, {
39
39
  contentType: r.contentType,
40
40
  ...r.public === void 0 ? {} : { public: r.public }
41
- }))), z = "_voltro_storage_refs", B = "_voltro_storage_grants", V = "_voltro_storage_blobs", Ue = "_voltro_storage_usage", We = N(z, {
42
- id: A({ prefix: "file" }),
43
- tenantId: P().nullable(),
44
- ownerId: P().nullable(),
45
- bucket: P(),
46
- key: P(),
47
- contentType: P(),
41
+ }))), B = "_voltro_storage_refs", V = "_voltro_storage_grants", H = "_voltro_storage_blobs", Ue = "_voltro_storage_usage", We = P(B, {
42
+ id: j({ prefix: "file" }),
43
+ tenantId: F().nullable(),
44
+ ownerId: F().nullable(),
45
+ bucket: F(),
46
+ key: F(),
47
+ contentType: F(),
48
48
  size: E(),
49
- checksum: P(),
50
- visibility: P(),
49
+ checksum: F(),
50
+ visibility: F(),
51
51
  accessPolicy: ge().nullable(),
52
- passwordHash: P().nullable(),
53
- width: j().nullable(),
54
- height: j().nullable(),
55
- duration: j().nullable(),
56
- placeholder: P().nullable(),
57
- folder: P().nullable(),
52
+ passwordHash: F().nullable(),
53
+ width: M().nullable(),
54
+ height: M().nullable(),
55
+ duration: M().nullable(),
56
+ placeholder: F().nullable(),
57
+ folder: F().nullable(),
58
58
  tags: ge().nullable(),
59
- alt: P().nullable(),
60
- caption: P().nullable(),
61
- derivedFrom: P().nullable(),
62
- kind: P().nullable(),
59
+ alt: F().nullable(),
60
+ caption: F().nullable(),
61
+ derivedFrom: F().nullable(),
62
+ kind: F().nullable(),
63
63
  createdAt: be()
64
- }).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]), Ge = N(B, {
65
- id: A({ prefix: "sgrant" }),
66
- refId: P(),
67
- principalType: P(),
68
- principalId: P(),
69
- permission: P(),
64
+ }).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]), Ge = P(V, {
65
+ id: j({ prefix: "sgrant" }),
66
+ refId: F(),
67
+ principalType: F(),
68
+ principalId: F(),
69
+ permission: F(),
70
70
  createdAt: be(),
71
71
  expiresAt: be().nullable(),
72
- createdBy: P().nullable()
73
- }).index(["refId"]).index(["principalId"]), Ke = N(Ue, {
74
- id: A({ prefix: "susage" }),
75
- tenantId: P().maxLength(191),
72
+ createdBy: F().nullable()
73
+ }).index(["refId"]).index(["principalId"]), Ke = P(Ue, {
74
+ id: j({ prefix: "susage" }),
75
+ tenantId: F().maxLength(191),
76
76
  bytes: E().default("0"),
77
77
  count: E().default("0"),
78
78
  updatedAt: be()
79
- }).unique("byStorageUsageTenant", ["tenantId"]), qe = N(V, {
80
- id: A({ prefix: "blob" }),
81
- key: P(),
79
+ }).unique("byStorageUsageTenant", ["tenantId"]), qe = P(H, {
80
+ id: j({ prefix: "blob" }),
81
+ key: F(),
82
82
  data: D(),
83
- contentType: P(),
83
+ contentType: F(),
84
84
  size: E()
85
- }).index(["key"]), H = Se([
85
+ }).index(["key"]), U = Se([
86
86
  {
87
87
  name: "STORAGE_PROVIDER",
88
88
  required: !1,
@@ -233,7 +233,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
233
233
  secret: !1,
234
234
  description: "clamd port for the optional clamav virus scanner. Default 3310."
235
235
  }
236
- ]), U = (e, n) => {
236
+ ]), W = (e, n) => {
237
237
  let r = typeof e == "number" ? e : typeof e == "bigint" || typeof e == "string" && /^\d+$/.test(e) ? Number(e) : NaN;
238
238
  if (!Number.isSafeInteger(r) || r < 0) throw new t({
239
239
  provider: "metadata",
@@ -241,10 +241,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
241
241
  transient: !1
242
242
  });
243
243
  return r;
244
- }, W = (e, t, n) => U(e + t, n), G = (e, n, r = !1) => {
245
- let i = de(e).find(C.is(t));
244
+ }, Je = (e, t, n) => W(e + t, n), G = (e, n, r = !1) => {
245
+ let i = O(e).find(S.is(t));
246
246
  if (i !== void 0) return i;
247
- let a = me(e), o = a.dbCode === "22003" || a.dbSqlState === "22003" || a.dbCode === "ER_WARN_DATA_OUT_OF_RANGE" || a.dbErrno === 1264 || a.dbNumber === 8115 || a.dbNumber === 248, s = new t({
247
+ let a = pe(e), o = a.dbCode === "22003" || a.dbSqlState === "22003" || a.dbCode === "ER_WARN_DATA_OUT_OF_RANGE" || a.dbErrno === 1264 || a.dbNumber === 8115 || a.dbNumber === 248, s = new t({
248
248
  provider: n,
249
249
  message: `${o ? "Storage metadata numeric value out of range: " : ""}${xe(e)}`,
250
250
  transient: o ? !1 : he(e) || r
@@ -253,45 +253,45 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
253
253
  value: e,
254
254
  configurable: !0
255
255
  }), s;
256
- }, Je = (e) => de(e).find(C.is(n)), K = (e, n, r, i) => new t({
256
+ }, Ye = (e) => O(e).find(S.is(n)), K = (e, n, r, i) => new t({
257
257
  provider: e,
258
258
  message: n,
259
259
  transient: r,
260
260
  ...i === void 0 ? {} : { status: i }
261
- }), Ye = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, Xe = /* @__PURE__ */ new Map(), Ze = (e, t) => Xe.get(e)?.get(t)?.bytes, Qe = (e) => {
262
- Xe.get(e)?.clear();
263
- }, $e = (e = "default") => {
264
- let t = Xe.get(e) ?? /* @__PURE__ */ new Map();
265
- return Xe.set(e, t), {
261
+ }), Xe = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, Ze = /* @__PURE__ */ new Map(), Qe = (e, t) => Ze.get(e)?.get(t)?.bytes, $e = (e) => {
262
+ Ze.get(e)?.clear();
263
+ }, et = (e = "default") => {
264
+ let t = Ze.get(e) ?? /* @__PURE__ */ new Map();
265
+ return Ze.set(e, t), {
266
266
  name: "memory",
267
267
  presigns: !1,
268
- put: (e, n, r) => y.sync(() => (t.set(e, {
268
+ put: (e, n, r) => v.sync(() => (t.set(e, {
269
269
  bytes: n,
270
270
  contentType: r.contentType
271
271
  }), { size: n.byteLength })),
272
- get: (e) => y.suspend(() => {
272
+ get: (e) => v.suspend(() => {
273
273
  let n = t.get(e);
274
- return n ? y.succeed({
274
+ return n ? v.succeed({
275
275
  bytes: n.bytes,
276
276
  contentType: n.contentType
277
- }) : y.fail(K("memory", `no object at key '${e}'`, !1, 404));
277
+ }) : v.fail(K("memory", `no object at key '${e}'`, !1, 404));
278
278
  }),
279
- delete: (e) => y.sync(() => {
279
+ delete: (e) => v.sync(() => {
280
280
  t.delete(e);
281
281
  }),
282
282
  publicUrl: () => null,
283
- getUrl: () => y.succeed(""),
284
- head: (e) => y.sync(() => {
283
+ getUrl: () => v.succeed(""),
284
+ head: (e) => v.sync(() => {
285
285
  let n = t.get(e);
286
286
  return n ? { size: n.bytes.byteLength } : null;
287
287
  })
288
288
  };
289
- }, et = (e) => {
289
+ }, tt = (e) => {
290
290
  let t = e.root, n = async (e) => {
291
291
  let { join: n, resolve: r, sep: i } = await import("node:path"), a = r(t), o = r(a, e);
292
292
  if (o !== a && !o.startsWith(a + i)) throw Error(`key '${e}' escapes the storage root`);
293
293
  return n(o);
294
- }, r = (e, t, n = !1) => y.tryPromise({
294
+ }, r = (e, t, n = !1) => v.tryPromise({
295
295
  try: e,
296
296
  catch: (e) => e?.code === "ENOENT" ? K("filesystem", `no object at key '${t}'`, !1, 404) : K("filesystem", String(e?.message ?? e), n)
297
297
  });
@@ -321,8 +321,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
321
321
  await (await import("node:fs/promises")).rm(await n(e), { force: !0 });
322
322
  }, e),
323
323
  publicUrl: () => null,
324
- getUrl: () => y.succeed(""),
325
- head: (e) => y.tryPromise({
324
+ getUrl: () => v.succeed(""),
325
+ head: (e) => v.tryPromise({
326
326
  try: async () => {
327
327
  let t = await import("node:fs/promises");
328
328
  try {
@@ -365,7 +365,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
365
365
  }), Ie(o);
366
366
  }, e)
367
367
  };
368
- }, tt = (e) => {
368
+ }, nt = (e) => {
369
369
  let t = e.name ?? "s3", n = e.publicAcl ?? !0, r = null, i = () => r || (r = (async () => {
370
370
  let t, n;
371
371
  try {
@@ -386,11 +386,11 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
386
386
  cmds: t,
387
387
  presign: n.getSignedUrl
388
388
  };
389
- })(), r), a = (e) => y.tryPromise({
389
+ })(), r), a = (e) => v.tryPromise({
390
390
  try: e,
391
391
  catch: (e) => {
392
392
  let n = e?.$metadata?.httpStatusCode;
393
- return K(t, String(e?.message ?? e), Ye(n), n);
393
+ return K(t, String(e?.message ?? e), Xe(n), n);
394
394
  }
395
395
  }), o = async (e) => {
396
396
  let t = e;
@@ -494,7 +494,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
494
494
  UploadId: n
495
495
  }));
496
496
  }),
497
- head: (n) => y.tryPromise({
497
+ head: (n) => v.tryPromise({
498
498
  try: async () => {
499
499
  let { client: t, cmds: r } = await i();
500
500
  try {
@@ -513,7 +513,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
513
513
  },
514
514
  catch: (e) => {
515
515
  let n = e?.$metadata?.httpStatusCode;
516
- return K(t, String(e?.message ?? e), Ye(n), n);
516
+ return K(t, String(e?.message ?? e), Xe(n), n);
517
517
  }
518
518
  }),
519
519
  getStream: (n) => a(async () => {
@@ -558,15 +558,15 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
558
558
  return o(c.Body);
559
559
  })
560
560
  };
561
- }, nt = (e) => e instanceof Uint8Array ? e : typeof e == "string" ? new Uint8Array(Buffer.from(e, "base64")) : new Uint8Array(e), rt = () => {
561
+ }, rt = (e) => e instanceof Uint8Array ? e : typeof e == "string" ? new Uint8Array(Buffer.from(e, "base64")) : new Uint8Array(e), it = () => {
562
562
  let e = null, t = () => {
563
- if (!e) throw ue("the 'database' storage provider isn't bound to a DataStore yet");
563
+ if (!e) throw T("the 'database' storage provider isn't bound to a DataStore yet");
564
564
  return e;
565
- }, n = (e) => y.tryPromise({
565
+ }, n = (e) => v.tryPromise({
566
566
  try: e,
567
567
  catch: (e) => G(e, "database", !0)
568
568
  }), r = async (e, n) => (await t().query({
569
- table: V,
569
+ table: H,
570
570
  predicate: {
571
571
  column: "key",
572
572
  op: "eq",
@@ -585,37 +585,37 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
585
585
  },
586
586
  put: (e, i, a) => n(async () => {
587
587
  let n = await r(e);
588
- return n ? await t().update(V, String(n.id), {
588
+ return n ? await t().update(H, String(n.id), {
589
589
  data: i,
590
590
  contentType: a.contentType,
591
591
  size: String(i.byteLength)
592
- }) : await t().insert(V, {
593
- id: k({
592
+ }) : await t().insert(H, {
593
+ id: A({
594
594
  kind: "typeid",
595
595
  prefix: "blob"
596
- }, V),
596
+ }, H),
597
597
  key: e,
598
598
  data: i,
599
599
  contentType: a.contentType,
600
600
  size: String(i.byteLength)
601
601
  }), { size: i.byteLength };
602
602
  }),
603
- get: (e) => y.suspend(() => n(() => r(e)).pipe(y.flatMap((t) => t ? y.succeed({
604
- bytes: nt(t.data),
603
+ get: (e) => v.suspend(() => n(() => r(e)).pipe(v.flatMap((t) => t ? v.succeed({
604
+ bytes: rt(t.data),
605
605
  contentType: String(t.contentType)
606
- }) : y.fail(K("database", `no object at key '${e}'`, !1, 404))))),
606
+ }) : v.fail(K("database", `no object at key '${e}'`, !1, 404))))),
607
607
  delete: (e) => n(async () => {
608
608
  let n = await r(e, ["id"]);
609
- n && await t().delete(V, String(n.id));
609
+ n && await t().delete(H, String(n.id));
610
610
  }),
611
611
  publicUrl: () => null,
612
- getUrl: () => y.succeed(""),
612
+ getUrl: () => v.succeed(""),
613
613
  head: (e) => n(async () => {
614
614
  let t = await r(e, ["size"]);
615
- return t ? { size: U(t.size, "blob size") } : null;
615
+ return t ? { size: W(t.size, "blob size") } : null;
616
616
  })
617
617
  };
618
- }, it = (e) => {
618
+ }, at = (e) => {
619
619
  let t = null, n = () => t || (t = (async () => {
620
620
  let t;
621
621
  try {
@@ -623,17 +623,17 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
623
623
  } catch (e) {
624
624
  throw Error("the 'azure' storage provider requires the '@azure/storage-blob' optional dependency. Install it to enable it.", { cause: e });
625
625
  }
626
- let n = H.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = H.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = H.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
626
+ let n = U.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = U.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = U.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
627
627
  return {
628
628
  container: (a ? t.BlobServiceClient.fromConnectionString(a) : new t.BlobServiceClient(e.endpoint ?? `https://${n}.blob.core.windows.net`, i ?? void 0)).getContainerClient(e.container),
629
629
  sdk: t,
630
630
  cred: i
631
631
  };
632
- })(), t), r = (e) => y.tryPromise({
632
+ })(), t), r = (e) => v.tryPromise({
633
633
  try: e,
634
634
  catch: (e) => {
635
635
  let t = e?.statusCode;
636
- return K("azure", String(e?.message ?? e), Ye(t), t);
636
+ return K("azure", String(e?.message ?? e), Xe(t), t);
637
637
  }
638
638
  }), i = async (e) => {
639
639
  if (!e) return /* @__PURE__ */ new Uint8Array();
@@ -675,7 +675,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
675
675
  publicUrl: (t) => e.cdnBaseUrl ? `${e.cdnBaseUrl.replace(/\/$/, "")}/${t}` : null,
676
676
  getUrl: (e, t) => r(() => a(e, "r", t)),
677
677
  getUploadUrl: (e, t, n) => r(() => a(e, "cw", t)),
678
- head: (e) => y.tryPromise({
678
+ head: (e) => v.tryPromise({
679
679
  try: async () => {
680
680
  let { container: t } = await n();
681
681
  try {
@@ -691,7 +691,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
691
691
  },
692
692
  catch: (e) => {
693
693
  let t = e?.statusCode;
694
- return K("azure", String(e?.message ?? e), Ye(t), t);
694
+ return K("azure", String(e?.message ?? e), Xe(t), t);
695
695
  }
696
696
  }),
697
697
  getStream: (e) => r(async () => {
@@ -711,7 +711,34 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
711
711
  return i(o.readableStreamBody);
712
712
  })
713
713
  };
714
- }, at = (e, t, n, r, i, a) => {
714
+ }, ot = (e = {
715
+ entries: 200,
716
+ bytes: 67108864,
717
+ pending: 32
718
+ }) => {
719
+ let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = 0;
720
+ return { getOrCreate: (i, a) => {
721
+ let o = t.get(i);
722
+ if (o) return Promise.resolve(o);
723
+ let s = n.get(i);
724
+ if (s) return s;
725
+ if (n.size >= e.pending) return Promise.resolve(null);
726
+ let c = Promise.resolve().then(a).then((n) => {
727
+ if (n && e.entries > 0 && n.bytes.byteLength <= e.bytes) {
728
+ for (; t.size >= e.entries || r + n.bytes.byteLength > e.bytes;) {
729
+ let e = t.keys().next().value;
730
+ if (e === void 0) break;
731
+ r -= t.get(e).bytes.byteLength, t.delete(e);
732
+ }
733
+ t.set(i, n), r += n.bytes.byteLength;
734
+ }
735
+ return n;
736
+ }).finally(() => {
737
+ n.delete(i);
738
+ });
739
+ return n.set(i, c), c;
740
+ } };
741
+ }, st = (e, t, n, r, i, a) => {
715
742
  let o = n / r, s = Math.min(e, Math.round(t * o)), c = Math.min(t, Math.round(s / o)), l = (e, t) => Math.max(0, Math.min(t, e));
716
743
  return {
717
744
  left: l(Math.round(i * e - s / 2), e - s),
@@ -719,13 +746,13 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
719
746
  width: s,
720
747
  height: c
721
748
  };
722
- }, ot = {
749
+ }, ct = {
723
750
  webp: "image/webp",
724
751
  avif: "image/avif",
725
752
  jpeg: "image/jpeg",
726
753
  jpg: "image/jpeg",
727
754
  png: "image/png"
728
- }, st = (e) => {
755
+ }, lt = (e) => {
729
756
  if (!e) return null;
730
757
  let t = new URLSearchParams(e), n = (e) => {
731
758
  let n = t.get(e);
@@ -744,24 +771,15 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
744
771
  ...s ? { fit: s } : {},
745
772
  ...l ? { fp: l } : {}
746
773
  };
747
- }, ct = (e) => e.startsWith("image/") && !e.includes("svg"), lt, ut = async () => {
748
- if (lt !== void 0) return lt;
749
- try {
750
- let e = await import("sharp");
751
- lt = e.default ?? e;
752
- } catch {
753
- lt = null;
754
- }
755
- return lt;
756
- }, dt = async (e, t) => t ? null : ct(e) ? await ut() === null ? "no-sharp" : "failed" : "not-an-image", ft = async (e, t, n) => {
757
- if (!ct(t)) return null;
758
- let r = await ut();
774
+ }, ut = (e) => e.startsWith("image/") && !e.includes("svg"), dt, ft = async () => (dt ??= import("sharp").then((e) => e.default ?? e, () => null), dt), pt = async (e, t) => t ? null : ut(e) ? await ft() === null ? "no-sharp" : "failed" : "not-an-image", mt = async (e, t, n) => {
775
+ if (!ut(t)) return null;
776
+ let r = await ft();
759
777
  if (!r) return null;
760
778
  try {
761
779
  let i = r(Buffer.from(e), { failOn: "none" }), a = n.fit ?? "cover";
762
780
  if (n.fp !== void 0 && n.w !== void 0 && n.h !== void 0 && a === "cover") {
763
781
  let e = await i.metadata();
764
- e.width !== void 0 && e.height !== void 0 && (i = i.extract(at(e.width, e.height, n.w, n.h, n.fp.x, n.fp.y)));
782
+ e.width !== void 0 && e.height !== void 0 && (i = i.extract(st(e.width, e.height, n.w, n.h, n.fp.x, n.fp.y)));
765
783
  }
766
784
  (n.w !== void 0 || n.h !== void 0) && (i = i.resize({
767
785
  ...n.w === void 0 ? {} : { width: n.w },
@@ -769,10 +787,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
769
787
  fit: n.fit ?? "cover",
770
788
  withoutEnlargement: !0
771
789
  }));
772
- let o = n.format && ot[n.format] ? n.format : void 0, s = t;
790
+ let o = n.format && ct[n.format] ? n.format : void 0, s = t;
773
791
  if (o) {
774
792
  let e = o === "jpg" ? "jpeg" : o;
775
- i = i.toFormat(e, n.q === void 0 ? {} : { quality: n.q }), s = ot[o];
793
+ i = i.toFormat(e, n.q === void 0 ? {} : { quality: n.q }), s = ct[o];
776
794
  } else n.q !== void 0 && (t === "image/jpeg" || t === "image/webp") && (i = i.toFormat(t === "image/webp" ? "webp" : "jpeg", { quality: n.q }));
777
795
  let c = await i.toBuffer();
778
796
  return {
@@ -782,43 +800,57 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
782
800
  } catch {
783
801
  return null;
784
802
  }
785
- }, pt = 200, mt = /* @__PURE__ */ new Map(), ht = async (e, t, n, r) => {
786
- let i = `${e}::${JSON.stringify(r)}`, a = mt.get(i);
787
- if (a) return a;
788
- let o = await ft(t, n, r);
789
- if (o && (mt.set(i, o), mt.size > pt)) {
790
- let e = mt.keys().next().value;
791
- e !== void 0 && mt.delete(e);
803
+ }, ht = async (e, t, n) => {
804
+ if (!ut(t) || n.rotate === void 0 && n.flip !== !0 && n.flop !== !0 && n.grayscale !== !0 && n.crop === void 0) return null;
805
+ let r = await ft();
806
+ if (!r) return null;
807
+ try {
808
+ let i = r(Buffer.from(e), { failOn: "none" });
809
+ return n.crop !== void 0 && (i = i.extract(n.crop)), n.rotate !== void 0 && (i = i.rotate(n.rotate)), n.flip === !0 && (i = i.flip()), n.flop === !0 && (i = i.flop()), n.grayscale === !0 && (i = i.grayscale()), {
810
+ bytes: new Uint8Array(await i.toBuffer()),
811
+ contentType: t
812
+ };
813
+ } catch {
814
+ return null;
792
815
  }
793
- return o;
794
- }, gt = (e) => {
816
+ }, gt = ot(), _t = (e, t, n) => JSON.stringify([
817
+ e,
818
+ t,
819
+ n.w,
820
+ n.h,
821
+ n.format,
822
+ n.q,
823
+ n.fit,
824
+ n.fp?.x,
825
+ n.fp?.y
826
+ ]), vt = async (e, t, n, r) => gt.getOrCreate(_t(e, n, r), () => mt(t, n, r)), yt = (e) => {
795
827
  let t = we(16).toString("hex");
796
828
  return `${t}:${Ee(e, t, 32).toString("hex")}`;
797
- }, _t = (e, t) => {
829
+ }, bt = (e, t) => {
798
830
  if (!e || !t) return !1;
799
831
  let [n, r] = t.split(":");
800
832
  if (!n || !r) return !1;
801
833
  let i = Buffer.from(r, "hex"), a = Ee(e, n, i.length);
802
- return a.length === i.length && I(a, i);
803
- }, vt = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], yt = (e) => vt(e.metadata?.roles), bt = (e) => vt(e.scopes), xt = (e, t) => e.some((e) => t.includes(e)), St = (e) => vt(e.metadata?.groups), Ct = (e) => typeof e == "boolean" ? y.succeed(e) : y.isEffect(e) ? e : y.promise(() => e), wt = (e, t, n = {}) => y.gen(function* () {
834
+ return a.length === i.length && L(a, i);
835
+ }, xt = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], St = (e) => xt(e.metadata?.roles), Ct = (e) => xt(e.scopes), wt = (e, t) => e.some((e) => t.includes(e)), Tt = (e) => xt(e.metadata?.groups), Et = (e) => typeof e == "boolean" ? v.succeed(e) : v.isEffect(e) ? e : v.promise(() => e), Dt = (e, t, n = {}) => v.gen(function* () {
804
836
  if (t.id && e.ownerId && t.id === e.ownerId) return !0;
805
837
  let r = e.accessPolicy ?? [];
806
838
  if (r.length === 0) return !1;
807
- let i = n.resolveGroups ? yield* y.promise(async () => await n.resolveGroups(t)) : St(t);
808
- for (let a of r) if (yield* Tt(a, e, t, i, n)) return !0;
839
+ let i = n.resolveGroups ? yield* v.promise(async () => await n.resolveGroups(t)) : Tt(t);
840
+ for (let a of r) if (yield* Ot(a, e, t, i, n)) return !0;
809
841
  return !1;
810
- }), Tt = (e, t, n, r, i) => y.gen(function* () {
842
+ }), Ot = (e, t, n, r, i) => v.gen(function* () {
811
843
  let a = !1, o = (e) => (a = !0, e);
812
- 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(xt(yt(n), e.roles)) || e.groups && e.groups.length > 0 && !o(xt(r, e.groups)) || e.scopes && e.scopes.length > 0 && !o(xt(bt(n), e.scopes)) || e.password !== void 0 && e.password && !o(_t(i.password, t.passwordHash))) return !1;
844
+ 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(wt(St(n), e.roles)) || e.groups && e.groups.length > 0 && !o(wt(r, e.groups)) || e.scopes && e.scopes.length > 0 && !o(wt(Ct(n), e.scopes)) || e.password !== void 0 && e.password && !o(bt(i.password, t.passwordHash))) return !1;
813
845
  if (e.guard) {
814
846
  let r = i.guards?.[e.guard];
815
- if (!o(r ? yield* Ct(r({
847
+ if (!o(r ? yield* Et(r({
816
848
  subject: n,
817
849
  ref: t
818
850
  })) : !1)) return !1;
819
851
  }
820
852
  return a;
821
- }), Et = (e, t) => {
853
+ }), kt = (e, t) => {
822
854
  let n = [];
823
855
  e.id && n.push({
824
856
  type: e.type === "apiKey" ? "apiKey" : "user",
@@ -829,116 +861,120 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
829
861
  id: e
830
862
  });
831
863
  return n;
832
- }, Dt = (e, t, n, r, i) => {
833
- let a = Et(t, n);
864
+ }, At = (e, t, n, r, i) => {
865
+ let a = kt(t, n);
834
866
  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));
835
- }, Ot = (e, t) => t.resolveGroups ? y.promise(async () => await t.resolveGroups(e)) : y.succeed(St(e)), q = () => H.read("VOLTRO_STORAGE_SECRET") ?? ce(), J = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Y = (e) => {
867
+ }, jt = (e, t) => t.resolveGroups ? v.promise(async () => await t.resolveGroups(e)) : v.succeed(Tt(e)), q = () => U.read("VOLTRO_STORAGE_SECRET") ?? ce(), J = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Y = (e) => {
836
868
  let t = e.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - e.length % 4) % 4);
837
869
  return Buffer.from(t, "base64");
838
- }, kt = (e, t, n = q(), r = "/_voltro/storage") => {
870
+ }, Mt = (e, t, n = q(), r = "/_voltro/storage") => {
839
871
  if (!n) throw Error("signGrant: secret must be a non-empty string");
840
872
  let i = {
841
873
  refId: e,
842
874
  audience: r,
843
875
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
844
876
  }, a = J(JSON.stringify(i));
845
- return `${a}.${J(F("sha256", n).update(a).digest())}`;
846
- }, At = (e, t = q()) => {
877
+ return `${a}.${J(I("sha256", n).update(a).digest())}`;
878
+ }, Nt = (e, t = q()) => {
847
879
  if (!e || !t) return null;
848
880
  let n = e.indexOf(".");
849
881
  if (n <= 0 || n === e.length - 1) return null;
850
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(r).digest(), o = Y(i);
851
- if (o.length !== a.length || !I(o, a)) return null;
882
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(r).digest(), o = Y(i);
883
+ if (o.length !== a.length || !L(o, a)) return null;
852
884
  try {
853
885
  let e = JSON.parse(Y(r).toString("utf8"));
854
886
  return typeof e.audience != "string" || !e.audience || typeof e.refId != "string" || typeof e.exp != "number" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
855
887
  } catch {
856
888
  return null;
857
889
  }
858
- }, jt = (e, t, n = q()) => {
890
+ }, Pt = (e) => e.version === 1 ? e.access === void 0 || e.vis === "private" && y.isSuccess(S.decodeUnknownExit(ae, { onExcessProperty: "error" })(e.access)) : !1, Ft = (e, t, n = q()) => {
859
891
  if (!n) throw Error("signUploadTicket: secret must be a non-empty string");
860
892
  let r = {
861
893
  ...e,
894
+ version: 1,
862
895
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
863
896
  }, i = J(JSON.stringify(r));
864
- return `${i}.${J(F("sha256", n).update(`u:${i}`).digest())}`;
865
- }, Mt = (e, t = q()) => {
897
+ return `${i}.${J(I("sha256", n).update(`u:${i}`).digest())}`;
898
+ }, It = (e, t = q()) => {
866
899
  if (!e || !t) return null;
867
900
  let n = e.indexOf(".");
868
901
  if (n <= 0 || n === e.length - 1) return null;
869
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`u:${r}`).digest(), o = Y(i);
870
- if (o.length !== a.length || !I(o, a)) return null;
902
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`u:${r}`).digest(), o = Y(i);
903
+ if (o.length !== a.length || !L(o, a)) return null;
871
904
  try {
872
905
  let e = JSON.parse(Y(r).toString("utf8"));
873
- return e.operationId !== void 0 && (typeof e.operationId != "string" || !e.operationId.trim() || e.operationId.length > 200) || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.replicaId !== void 0 && (typeof e.replicaId != "string" || !e.replicaId.trim()) || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
906
+ return !Pt(e) || e.operationId !== void 0 && (typeof e.operationId != "string" || !e.operationId.trim() || e.operationId.length > 200) || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.replicaId !== void 0 && (typeof e.replicaId != "string" || !e.replicaId.trim()) || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
874
907
  } catch {
875
908
  return null;
876
909
  }
877
- }, Nt = (e, t, n = q()) => {
910
+ }, Lt = (e, t, n = q()) => {
878
911
  if (!n) throw Error("signFinalizeTicket: secret must be a non-empty string");
879
912
  let r = {
880
913
  ...e,
914
+ version: 1,
881
915
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
882
916
  }, i = J(JSON.stringify(r));
883
- return `${i}.${J(F("sha256", n).update(`f:${i}`).digest())}`;
884
- }, Pt = (e, t = q()) => {
917
+ return `${i}.${J(I("sha256", n).update(`f:${i}`).digest())}`;
918
+ }, Rt = (e, t = q()) => {
885
919
  if (!e || !t) return null;
886
920
  let n = e.indexOf(".");
887
921
  if (n <= 0 || n === e.length - 1) return null;
888
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`f:${r}`).digest(), o = Y(i);
889
- if (o.length !== a.length || !I(o, a)) return null;
922
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`f:${r}`).digest(), o = Y(i);
923
+ if (o.length !== a.length || !L(o, a)) return null;
890
924
  try {
891
925
  let e = JSON.parse(Y(r).toString("utf8"));
892
- return typeof e.key != "string" || e.key.length === 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
926
+ return !Pt(e) || typeof e.key != "string" || e.key.length === 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
893
927
  } catch {
894
928
  return null;
895
929
  }
896
- }, Ft = (e, t, n = q()) => {
930
+ }, zt = (e, t, n = q()) => {
897
931
  if (!n) throw Error("signResumableTicket: secret must be a non-empty string");
898
932
  let r = {
899
933
  ...e,
934
+ version: 1,
900
935
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
901
936
  }, i = J(JSON.stringify(r));
902
- return `${i}.${J(F("sha256", n).update(`r:${i}`).digest())}`;
903
- }, It = (e, t = q()) => {
937
+ return `${i}.${J(I("sha256", n).update(`r:${i}`).digest())}`;
938
+ }, Bt = (e, t = q()) => {
904
939
  if (!e || !t) return null;
905
940
  let n = e.indexOf(".");
906
941
  if (n <= 0 || n === e.length - 1) return null;
907
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`r:${r}`).digest(), o = Y(i);
908
- if (o.length !== a.length || !I(o, a)) return null;
942
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`r:${r}`).digest(), o = Y(i);
943
+ if (o.length !== a.length || !L(o, a)) return null;
909
944
  try {
910
945
  let e = JSON.parse(Y(r).toString("utf8"));
911
- return typeof e.id != "string" || e.id.length === 0 || typeof e.size != "number" || e.size < 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
946
+ return !Pt(e) || typeof e.id != "string" || e.id.length === 0 || typeof e.size != "number" || e.size < 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
912
947
  } catch {
913
948
  return null;
914
949
  }
915
- }, Lt = (e, t, n = q()) => {
950
+ }, Vt = (e, t, n = q()) => {
916
951
  if (!n) throw Error("signMultipartTicket: secret must be a non-empty string");
917
952
  let r = {
918
953
  ...e,
954
+ version: 1,
919
955
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
920
956
  }, i = J(JSON.stringify(r));
921
- return `${i}.${J(F("sha256", n).update(`m:${i}`).digest())}`;
922
- }, Rt = (e, t = q()) => {
957
+ return `${i}.${J(I("sha256", n).update(`m:${i}`).digest())}`;
958
+ }, Ht = (e, t = q()) => {
923
959
  if (!e || !t) return null;
924
960
  let n = e.indexOf(".");
925
961
  if (n <= 0 || n === e.length - 1) return null;
926
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`m:${r}`).digest(), o = Y(i);
927
- if (o.length !== a.length || !I(o, a)) return null;
962
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`m:${r}`).digest(), o = Y(i);
963
+ if (o.length !== a.length || !L(o, a)) return null;
928
964
  try {
929
965
  let e = JSON.parse(Y(r).toString("utf8"));
930
- return typeof e.key != "string" || e.key.length === 0 || typeof e.uploadId != "string" || e.uploadId.length === 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
966
+ return !Pt(e) || typeof e.key != "string" || e.key.length === 0 || typeof e.uploadId != "string" || e.uploadId.length === 0 || typeof e.instance != "string" || !e.instance || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
931
967
  } catch {
932
968
  return null;
933
969
  }
934
- }, zt = (e, t) => {
970
+ }, Ut = (e, t) => {
935
971
  if (!t || t.length === 0) return !0;
936
972
  let n = e.toLowerCase();
937
973
  return t.some((e) => {
938
974
  let t = e.toLowerCase();
939
975
  return t.endsWith("/*") ? n.startsWith(t.slice(0, -1)) : n === t;
940
976
  });
941
- }, Bt = [
977
+ }, Wt = [
942
978
  {
943
979
  ct: /^image\/png$/,
944
980
  offset: 0,
@@ -1008,21 +1044,21 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1008
1044
  offset: 0,
1009
1045
  magic: [31, 139]
1010
1046
  }
1011
- ], Vt = (e, t) => {
1012
- let n = t.toLowerCase(), r = Bt.find((e) => e.ct.test(n));
1047
+ ], Gt = (e, t) => {
1048
+ let n = t.toLowerCase(), r = Wt.find((e) => e.ct.test(n));
1013
1049
  return r ? e.length < r.offset + r.magic.length ? !1 : r.magic.every((t, n) => e[r.offset + n] === t) : !0;
1014
- }, Ht = (e, t, n) => n ? n.maxBytes !== void 0 && e.byteLength > n.maxBytes ? {
1050
+ }, Kt = (e, t, n) => n ? n.maxBytes !== void 0 && e.byteLength > n.maxBytes ? {
1015
1051
  reason: "too-large",
1016
1052
  detail: `${e.byteLength} bytes exceeds the ${n.maxBytes}-byte limit`
1017
- } : zt(t, n.allowedContentTypes) ? n.sniff && !Vt(e, t) ? {
1053
+ } : Ut(t, n.allowedContentTypes) ? n.sniff && !Gt(e, t) ? {
1018
1054
  reason: "content-mismatch",
1019
1055
  detail: `bytes do not match the declared content type '${t}'`
1020
1056
  } : null : {
1021
1057
  reason: "content-type-not-allowed",
1022
1058
  detail: `content type '${t}' is not in the allow-list`
1023
- } : null, Ut = async (e, t, n) => {
1024
- if (!ct(t)) return { bytes: e };
1025
- let r = await ut();
1059
+ } : null, qt = async (e, t, n) => {
1060
+ if (!ut(t)) return { bytes: e };
1061
+ let r = await ft();
1026
1062
  if (!r) return { bytes: e };
1027
1063
  try {
1028
1064
  let t = e;
@@ -1045,31 +1081,31 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1045
1081
  } catch {
1046
1082
  return { bytes: e };
1047
1083
  }
1048
- }, Wt = 67108864, Gt = (e) => new n({
1084
+ }, Jt = 67108864, Yt = (e) => new n({
1049
1085
  reason: "too-large",
1050
1086
  detail: `remote body exceeds the ${e}-byte ingest limit`
1051
- }), Kt = (e, t) => new n({
1087
+ }), Xt = (e, t) => new n({
1052
1088
  reason: "blocked-source",
1053
1089
  detail: `will not fetch ${e}: ${t}`
1054
- }), qt = (e, r, i = {}) => y.suspend(() => {
1055
- let a = r ?? Wt;
1056
- return !Number.isSafeInteger(a) || a < 0 ? y.fail(new t({
1090
+ }), Zt = (e, r, i = {}) => v.suspend(() => {
1091
+ let a = r ?? Jt;
1092
+ return !Number.isSafeInteger(a) || a < 0 ? v.fail(new t({
1057
1093
  provider: "ingest",
1058
1094
  message: "limits.maxBytes must be a non-negative safe integer",
1059
1095
  transient: !1
1060
- })) : y.tryPromise({
1096
+ })) : v.tryPromise({
1061
1097
  try: async (n) => {
1062
1098
  let r = e, o;
1063
1099
  for (let e = 0;; e++) {
1064
- let t = L(r, { ...i.allowHosts === void 0 ? {} : { allowHosts: i.allowHosts } });
1065
- if (t !== null) throw Kt(r, t);
1100
+ let t = De(r, { ...i.allowHosts === void 0 ? {} : { allowHosts: i.allowHosts } });
1101
+ if (t !== null) throw Xt(r, t);
1066
1102
  o = await fetch(r, {
1067
1103
  signal: n,
1068
1104
  redirect: "manual"
1069
1105
  });
1070
1106
  let a = o.headers.get("location");
1071
1107
  if (o.status < 300 || o.status >= 400 || a === null) break;
1072
- if (await o.body?.cancel().catch(() => {}), e >= (i.maxRedirects ?? 5)) throw Kt(r, "too many redirects");
1108
+ if (await o.body?.cancel().catch(() => {}), e >= (i.maxRedirects ?? 5)) throw Xt(r, "too many redirects");
1073
1109
  r = new URL(a, r).toString();
1074
1110
  }
1075
1111
  let s;
@@ -1081,12 +1117,12 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1081
1117
  status: o.status
1082
1118
  });
1083
1119
  let e = o.headers.get("content-length"), n = o.headers.get("content-encoding")?.trim().toLowerCase();
1084
- if ((!n || n === "identity") && e !== null && /^\d+$/.test(e) && BigInt(e) > BigInt(a)) throw Gt(a);
1120
+ if ((!n || n === "identity") && e !== null && /^\d+$/.test(e) && BigInt(e) > BigInt(a)) throw Yt(a);
1085
1121
  let r = /* @__PURE__ */ new Uint8Array(), i = 0;
1086
1122
  if (o.body !== null) for (s = o.body.getReader();;) {
1087
1123
  let e = await s.read();
1088
1124
  if (e.done) break;
1089
- if (e.value.byteLength > a - i) throw Gt(a);
1125
+ if (e.value.byteLength > a - i) throw Yt(a);
1090
1126
  if (e.value.byteLength !== 0) {
1091
1127
  let t = i + e.value.byteLength;
1092
1128
  if (t > r.byteLength) {
@@ -1110,19 +1146,19 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1110
1146
  transient: !0
1111
1147
  })
1112
1148
  });
1113
- }), Jt = (e, t) => y.suspend(() => {
1149
+ }), Qt = (e, t) => v.suspend(() => {
1114
1150
  if (t === void 0) return e;
1115
- if (t.aborted) return y.interrupt;
1116
- let n = y.async((e) => {
1117
- let n = () => e(y.interrupt);
1118
- return t.addEventListener("abort", n, { once: !0 }), t.aborted && n(), y.sync(() => t.removeEventListener("abort", n));
1151
+ if (t.aborted) return v.interrupt;
1152
+ let n = v.callback((e) => {
1153
+ let n = () => e(v.interrupt);
1154
+ return t.addEventListener("abort", n, { once: !0 }), t.aborted && n(), v.sync(() => t.removeEventListener("abort", n));
1119
1155
  });
1120
- return y.raceFirst(e, n);
1121
- }), Yt = (e) => {
1122
- let r = (e, n) => y.tryPromise({
1156
+ return v.raceFirst(e, n);
1157
+ }), $t = (e) => {
1158
+ let r = (e, n) => v.tryPromise({
1123
1159
  try: n,
1124
1160
  catch: (n) => {
1125
- let r = Je(n);
1161
+ let r = Ye(n);
1126
1162
  if (r !== void 0) return r;
1127
1163
  let i = G(n, "metadata"), a = new t({
1128
1164
  provider: "metadata",
@@ -1137,8 +1173,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1137
1173
  }
1138
1174
  });
1139
1175
  return {
1140
- put: (t) => y.gen(function* () {
1141
- if (t.bytes.byteLength !== t.ref.size || Ce("sha256").update(t.bytes).digest("hex") !== t.identity.checksum) return yield* y.fail(new n({
1176
+ put: (t) => v.gen(function* () {
1177
+ if (t.bytes.byteLength !== t.ref.size || Ce("sha256").update(t.bytes).digest("hex") !== t.identity.checksum) return yield* v.fail(new n({
1142
1178
  reason: "operation-content-mismatch",
1143
1179
  detail: "Storage operation bytes do not match their reserved identity"
1144
1180
  }));
@@ -1154,15 +1190,15 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1154
1190
  outcome: a
1155
1191
  });
1156
1192
  }),
1157
- delete: (t, n, i) => y.gen(function* () {
1193
+ delete: (t, n, i) => v.gen(function* () {
1158
1194
  let a = yield* r("delete acceptance", () => e.metadata.beginDelete(t, n, i));
1159
1195
  "operation" in a && (a.operation.deleteKey !== null && (yield* e.provider.delete(a.operation.deleteKey)), yield* r("delete confirmation", () => e.metadata.confirmDelete(a.identity)));
1160
1196
  })
1161
1197
  };
1162
- }, Xt = async (e) => {
1198
+ }, en = async (e) => {
1163
1199
  let { createHash: t } = await import("node:crypto");
1164
1200
  return t("sha256").update(e).digest("hex");
1165
- }, Zt = (e, t, n) => `${e?.replace(/\/+$/, "") ?? ""}${n}/${t}`, Qt = (e) => {
1201
+ }, tn = (e, t, n) => `${e?.replace(/\/+$/, "") ?? ""}${n}/${t}`, nn = (e) => {
1166
1202
  let t = /* @__PURE__ */ new Map(), n = {
1167
1203
  public: 0,
1168
1204
  private: 0
@@ -1172,13 +1208,13 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1172
1208
  count: 0,
1173
1209
  bytes: 0
1174
1210
  };
1175
- i.count = W(i.count, r.count, "ref count"), i.bytes = W(i.bytes, r.bytes, "usage bytes"), t.set(e, i), r.visibility === "public" ? n.public = W(n.public, r.count, "public ref count") : n.private = W(n.private, r.count, "private ref count");
1211
+ i.count = Je(i.count, r.count, "ref count"), i.bytes = Je(i.bytes, r.bytes, "usage bytes"), t.set(e, i), r.visibility === "public" ? n.public = Je(n.public, r.count, "public ref count") : n.private = Je(n.private, r.count, "private ref count");
1176
1212
  }
1177
1213
  return {
1178
1214
  byTenant: Object.fromEntries(t),
1179
1215
  visibility: n
1180
1216
  };
1181
- }, $t = (e, t) => {
1217
+ }, rn = (e, t) => {
1182
1218
  if (t.search && ![
1183
1219
  e.id,
1184
1220
  e.key,
@@ -1195,11 +1231,11 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1195
1231
  if (!t.tags.every((e) => n.includes(e))) return !1;
1196
1232
  }
1197
1233
  return !0;
1198
- }, en = (e) => e ?? "global", tn = () => {
1234
+ }, an = (e) => e ?? "global", on = () => {
1199
1235
  let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map();
1200
1236
  return {
1201
- statistics: () => y.try({
1202
- try: () => Qt((function* () {
1237
+ statistics: () => v.try({
1238
+ try: () => nn((function* () {
1203
1239
  for (let t of e.values()) yield {
1204
1240
  tenantId: t.tenantId,
1205
1241
  visibility: t.visibility,
@@ -1209,18 +1245,18 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1209
1245
  })()),
1210
1246
  catch: (e) => G(e, "refstore")
1211
1247
  }),
1212
- insert: (t) => y.try({
1248
+ insert: (t) => v.try({
1213
1249
  try: () => {
1214
- U(t.size, "ref size"), e.set(t.id, t);
1250
+ W(t.size, "ref size"), e.set(t.id, t);
1215
1251
  },
1216
1252
  catch: (e) => G(e, "refstore")
1217
1253
  }),
1218
- getById: (t) => y.sync(() => e.get(t) ?? null),
1219
- delete: (t) => y.sync(() => e.delete(t)),
1220
- listRecent: (t) => y.sync(() => [...e.values()].sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime() || t.id.localeCompare(e.id)).slice(0, t)),
1221
- countByKey: (t, n) => y.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n).length),
1222
- countPublicByKey: (t, n) => y.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n && e.visibility === "public").length),
1223
- setVisibility: (t, n) => y.sync(() => {
1254
+ getById: (t) => v.sync(() => e.get(t) ?? null),
1255
+ delete: (t) => v.sync(() => e.delete(t)),
1256
+ listRecent: (t) => v.sync(() => [...e.values()].sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime() || t.id.localeCompare(e.id)).slice(0, t)),
1257
+ countByKey: (t, n) => v.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n).length),
1258
+ countPublicByKey: (t, n) => v.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n && e.visibility === "public").length),
1259
+ setVisibility: (t, n) => v.sync(() => {
1224
1260
  let r = e.get(t);
1225
1261
  if (r === void 0) return null;
1226
1262
  let i = {
@@ -1229,10 +1265,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1229
1265
  };
1230
1266
  return e.set(t, i), i;
1231
1267
  }),
1232
- usageByTenant: (t) => y.try({
1268
+ usageByTenant: (t) => v.try({
1233
1269
  try: () => {
1234
1270
  let n = 0, r = 0;
1235
- for (let i of e.values()) (i.tenantId ?? null) === (t ?? null) && (n = W(n, i.size, "usage bytes"), r++);
1271
+ for (let i of e.values()) (i.tenantId ?? null) === (t ?? null) && (n = Je(n, i.size, "usage bytes"), r++);
1236
1272
  return {
1237
1273
  bytes: n,
1238
1274
  count: r
@@ -1240,13 +1276,13 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1240
1276
  },
1241
1277
  catch: (e) => G(e, "refstore")
1242
1278
  }),
1243
- consumeUsage: (e, n, r) => y.try({
1279
+ consumeUsage: (e, n, r) => v.try({
1244
1280
  try: () => {
1245
- let i = en(e), a = t.get(i) ?? {
1281
+ let i = an(e), a = t.get(i) ?? {
1246
1282
  bytes: 0,
1247
1283
  count: 0
1248
1284
  };
1249
- U(n.bytes, "usage byte delta"), U(n.count, "usage count delta");
1285
+ W(n.bytes, "usage byte delta"), W(n.count, "usage count delta");
1250
1286
  let o = Number.isSafeInteger(a.bytes + n.bytes) && Number.isSafeInteger(a.count + n.count) && (r?.maxBytes === void 0 || a.bytes + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || a.count + n.count <= r.maxCount);
1251
1287
  return o && t.set(i, {
1252
1288
  bytes: a.bytes + n.bytes,
@@ -1259,27 +1295,27 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1259
1295
  },
1260
1296
  catch: (e) => G(e, "refstore")
1261
1297
  }),
1262
- releaseUsage: (e, n) => y.try({
1298
+ releaseUsage: (e, n) => v.try({
1263
1299
  try: () => {
1264
- let r = en(e), i = t.get(r);
1265
- U(n.bytes, "usage byte delta"), U(n.count, "usage count delta"), i && t.set(r, {
1300
+ let r = an(e), i = t.get(r);
1301
+ W(n.bytes, "usage byte delta"), W(n.count, "usage count delta"), i && t.set(r, {
1266
1302
  bytes: Math.max(0, i.bytes - n.bytes),
1267
1303
  count: Math.max(0, i.count - n.count)
1268
1304
  });
1269
1305
  },
1270
1306
  catch: (e) => G(e, "refstore")
1271
1307
  }),
1272
- listByDerivedFrom: (t) => y.sync(() => [...e.values()].filter((e) => (e.derivedFrom ?? null) === t)),
1273
- listRefs: (t) => y.sync(() => [...e.values()].filter((e) => $t(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime() || t.id.localeCompare(e.id)).slice(t.offset, t.offset + t.limit))
1308
+ listByDerivedFrom: (t) => v.sync(() => [...e.values()].filter((e) => (e.derivedFrom ?? null) === t)),
1309
+ listRefs: (t) => v.sync(() => [...e.values()].filter((e) => rn(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime() || t.id.localeCompare(e.id)).slice(t.offset, t.offset + t.limit))
1274
1310
  };
1275
- }, nn = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, X = (e) => ({
1311
+ }, sn = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, X = (e) => ({
1276
1312
  id: String(e.id),
1277
1313
  tenantId: e.tenantId ?? null,
1278
1314
  ownerId: e.ownerId ?? null,
1279
1315
  bucket: String(e.bucket),
1280
1316
  key: String(e.key),
1281
1317
  contentType: String(e.contentType),
1282
- size: U(e.size, "ref size"),
1318
+ size: W(e.size, "ref size"),
1283
1319
  checksum: String(e.checksum),
1284
1320
  visibility: e.visibility === "public" ? "public" : "private",
1285
1321
  accessPolicy: e.accessPolicy ?? null,
@@ -1290,15 +1326,15 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1290
1326
  duration: e.duration ?? null,
1291
1327
  placeholder: e.placeholder ?? null,
1292
1328
  folder: e.folder ?? null,
1293
- tags: nn(e.tags),
1329
+ tags: sn(e.tags),
1294
1330
  alt: e.alt ?? null,
1295
1331
  caption: e.caption ?? null,
1296
1332
  derivedFrom: e.derivedFrom ?? null,
1297
1333
  kind: e.kind ?? null
1298
- }), Z = (e) => y.tryPromise({
1334
+ }), Z = (e) => v.tryPromise({
1299
1335
  try: e,
1300
1336
  catch: (e) => G(e, "refstore", !0)
1301
- }), rn = async (e, t) => (await e.query({
1337
+ }), cn = async (e, t) => (await e.query({
1302
1338
  table: "_voltro_storage_usage",
1303
1339
  predicate: {
1304
1340
  column: "tenantId",
@@ -1309,9 +1345,9 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1309
1345
  take: 1,
1310
1346
  skip: void 0,
1311
1347
  projection: void 0
1312
- }))[0] ?? null, an = (e) => ({
1313
- statistics: () => Z(async () => Qt((await e.query({
1314
- table: z,
1348
+ }))[0] ?? null, ln = (e) => ({
1349
+ statistics: () => Z(async () => nn((await e.query({
1350
+ table: B,
1315
1351
  predicate: void 0,
1316
1352
  order: [],
1317
1353
  take: void 0,
@@ -1319,8 +1355,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1319
1355
  projection: void 0,
1320
1356
  groupBy: ["tenantId", "visibility"],
1321
1357
  aggregations: [
1322
- fe("tenantId"),
1323
- fe("visibility"),
1358
+ de("tenantId"),
1359
+ de("visibility"),
1324
1360
  {
1325
1361
  op: "count",
1326
1362
  alias: "count"
@@ -1334,16 +1370,16 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1334
1370
  })).map((e) => ({
1335
1371
  tenantId: e.tenantId == null ? null : String(e.tenantId),
1336
1372
  visibility: String(e.visibility),
1337
- count: U(e.count, "ref count"),
1338
- bytes: U(e.bytes ?? 0, "usage bytes")
1373
+ count: W(e.count, "ref count"),
1374
+ bytes: W(e.bytes ?? 0, "usage bytes")
1339
1375
  })))),
1340
- insert: (t) => Z(() => e.insert(z, {
1376
+ insert: (t) => Z(() => e.insert(B, {
1341
1377
  ...t,
1342
- size: String(U(t.size, "ref size"))
1378
+ size: String(W(t.size, "ref size"))
1343
1379
  })),
1344
1380
  getById: (t) => Z(async () => {
1345
1381
  let n = await e.query({
1346
- table: z,
1382
+ table: B,
1347
1383
  predicate: {
1348
1384
  column: "id",
1349
1385
  op: "eq",
@@ -1356,9 +1392,9 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1356
1392
  });
1357
1393
  return n[0] ? X(n[0]) : null;
1358
1394
  }),
1359
- delete: (t) => Z(() => e.delete(z, t)),
1395
+ delete: (t) => Z(() => e.delete(B, t)),
1360
1396
  listRecent: (t) => Z(async () => (await e.query({
1361
- table: z,
1397
+ table: B,
1362
1398
  predicate: void 0,
1363
1399
  order: [{
1364
1400
  column: "createdAt",
@@ -1368,8 +1404,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1368
1404
  skip: void 0,
1369
1405
  projection: void 0
1370
1406
  })).map(X)),
1371
- countByKey: (t, n) => Z(async () => (await e.query({
1372
- table: z,
1407
+ countByKey: (t, n) => Z(async () => W((await e.query({
1408
+ table: B,
1373
1409
  predicate: { and: [{
1374
1410
  column: "bucket",
1375
1411
  op: "eq",
@@ -1382,10 +1418,14 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1382
1418
  order: [],
1383
1419
  take: void 0,
1384
1420
  skip: void 0,
1385
- projection: void 0
1386
- })).length),
1387
- countPublicByKey: (t, n) => Z(async () => (await e.query({
1388
- table: z,
1421
+ projection: void 0,
1422
+ aggregations: [{
1423
+ op: "count",
1424
+ alias: "count"
1425
+ }]
1426
+ }))[0]?.count ?? 0, "ref count")),
1427
+ countPublicByKey: (t, n) => Z(async () => W((await e.query({
1428
+ table: B,
1389
1429
  predicate: { and: [
1390
1430
  {
1391
1431
  column: "bucket",
@@ -1406,15 +1446,19 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1406
1446
  order: [],
1407
1447
  take: void 0,
1408
1448
  skip: void 0,
1409
- projection: ["id"]
1410
- })).length),
1449
+ projection: void 0,
1450
+ aggregations: [{
1451
+ op: "count",
1452
+ alias: "count"
1453
+ }]
1454
+ }))[0]?.count ?? 0, "ref count")),
1411
1455
  setVisibility: (t, n) => Z(async () => {
1412
- let r = await e.update(z, t, { visibility: n });
1456
+ let r = await e.update(B, t, { visibility: n });
1413
1457
  return r ? X(r) : null;
1414
1458
  }),
1415
1459
  usageByTenant: (t) => Z(async () => {
1416
1460
  let n = await e.query({
1417
- table: z,
1461
+ table: B,
1418
1462
  predicate: {
1419
1463
  column: "tenantId",
1420
1464
  op: "eq",
@@ -1423,20 +1467,40 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1423
1467
  order: [],
1424
1468
  take: void 0,
1425
1469
  skip: void 0,
1426
- projection: void 0
1427
- }), r = 0;
1428
- for (let e of n) r = W(r, U(e.size, "ref size"), "usage bytes");
1429
- return {
1430
- bytes: r,
1431
- count: n.length
1470
+ projection: void 0,
1471
+ aggregations: [
1472
+ {
1473
+ op: "count",
1474
+ alias: "count"
1475
+ },
1476
+ {
1477
+ op: "sum",
1478
+ column: "size",
1479
+ alias: "bytes"
1480
+ },
1481
+ {
1482
+ op: "min",
1483
+ column: "size",
1484
+ alias: "minSize"
1485
+ },
1486
+ {
1487
+ op: "max",
1488
+ column: "size",
1489
+ alias: "maxSize"
1490
+ }
1491
+ ]
1492
+ });
1493
+ return W(n[0]?.count ?? 0, "ref count") > 0 && (W(n[0]?.minSize, "ref size"), W(n[0]?.maxSize, "ref size")), {
1494
+ bytes: W(n[0]?.bytes ?? 0, "usage bytes"),
1495
+ count: W(n[0]?.count ?? 0, "ref count")
1432
1496
  };
1433
1497
  }),
1434
1498
  consumeUsage: (t, n, r) => Z(async () => {
1435
- let i = en(t);
1436
- U(n.bytes, "usage byte delta"), U(n.count, "usage count delta");
1499
+ let i = an(t);
1500
+ W(n.bytes, "usage byte delta"), W(n.count, "usage count delta");
1437
1501
  for (let t = 0; t < 32; t++) {
1438
1502
  t > 0 && await new Promise((e) => setTimeout(e, t));
1439
- let a = await rn(e, i), o = a ? U(a.bytes, "usage bytes") : 0, s = a ? U(a.count, "ref count") : 0;
1503
+ let a = await cn(e, i), o = a ? W(a.bytes, "usage bytes") : 0, s = a ? W(a.count, "ref count") : 0;
1440
1504
  if (!(Number.isSafeInteger(o + n.bytes) && Number.isSafeInteger(s + n.count) && (r?.maxBytes === void 0 || o + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || s + n.count <= r.maxCount))) return {
1441
1505
  allowed: !1,
1442
1506
  bytes: o,
@@ -1447,13 +1511,13 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1447
1511
  bytes: String(o + n.bytes),
1448
1512
  count: String(s + n.count),
1449
1513
  updatedAt: /* @__PURE__ */ new Date()
1450
- }, { where: T(O("id", String(a.id)), O("bytes", a.bytes), O("count", a.count)) }) === 1) return {
1514
+ }, { where: ue(k("id", String(a.id)), k("bytes", a.bytes), k("count", a.count)) }) === 1) return {
1451
1515
  allowed: !0,
1452
1516
  bytes: o,
1453
1517
  count: s
1454
1518
  };
1455
1519
  } else {
1456
- let t = k({
1520
+ let t = A({
1457
1521
  kind: "typeid",
1458
1522
  prefix: "susage"
1459
1523
  }, Ue), r = await e.insertIgnore(Ue, {
@@ -1470,26 +1534,26 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1470
1534
  };
1471
1535
  }
1472
1536
  }
1473
- throw ue("Storage quota reservation contended after 32 attempts; retry");
1537
+ throw T("Storage quota reservation contended after 32 attempts; retry");
1474
1538
  }),
1475
1539
  releaseUsage: (t, n) => Z(async () => {
1476
- let r = en(t);
1477
- U(n.bytes, "usage byte delta"), U(n.count, "usage count delta");
1540
+ let r = an(t);
1541
+ W(n.bytes, "usage byte delta"), W(n.count, "usage count delta");
1478
1542
  for (let t = 0; t < 32; t++) {
1479
1543
  t > 0 && await new Promise((e) => setTimeout(e, t));
1480
- let i = await rn(e, r);
1544
+ let i = await cn(e, r);
1481
1545
  if (!i) return;
1482
- let a = U(i.bytes, "usage bytes"), o = U(i.count, "ref count");
1546
+ let a = W(i.bytes, "usage bytes"), o = W(i.count, "ref count");
1483
1547
  if (await e.updateMany("_voltro_storage_usage", {
1484
1548
  bytes: String(Math.max(0, a - n.bytes)),
1485
1549
  count: String(Math.max(0, o - n.count)),
1486
1550
  updatedAt: /* @__PURE__ */ new Date()
1487
- }, { where: T(O("id", String(i.id)), O("bytes", i.bytes), O("count", i.count)) }) === 1) return;
1551
+ }, { where: ue(k("id", String(i.id)), k("bytes", i.bytes), k("count", i.count)) }) === 1) return;
1488
1552
  }
1489
- throw ue("Storage quota release contended after 32 attempts; retry");
1553
+ throw T("Storage quota release contended after 32 attempts; retry");
1490
1554
  }),
1491
1555
  listByDerivedFrom: (t) => Z(async () => (await e.query({
1492
- table: z,
1556
+ table: B,
1493
1557
  predicate: {
1494
1558
  column: "derivedFrom",
1495
1559
  op: "eq",
@@ -1505,15 +1569,15 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1505
1569
  })).map(X)),
1506
1570
  listRefs: (t) => Z(async () => {
1507
1571
  let n = [];
1508
- t.tenantId !== void 0 && n.push(O("tenantId", t.tenantId)), t.ownerId !== void 0 && n.push(O("ownerId", t.ownerId)), t.search && n.push(M(...[
1572
+ t.tenantId !== void 0 && n.push(k("tenantId", t.tenantId)), t.ownerId !== void 0 && n.push(k("ownerId", t.ownerId)), t.search && n.push(N(...[
1509
1573
  "id",
1510
1574
  "key",
1511
1575
  "contentType",
1512
1576
  "ownerId",
1513
1577
  "tenantId"
1514
- ].map((e) => pe(e, t.search))));
1515
- let r = t.folder === void 0 && t.tags.length === 0 && t.includeDerived, i = n.length ? T(...n) : void 0, a = await e.query({
1516
- table: z,
1578
+ ].map((e) => fe(e, t.search)))), t.includeDerived || n.push(me("derivedFrom"));
1579
+ let r = t.folder === void 0 && t.tags.length === 0, i = n.length ? ue(...n) : void 0, a = await e.query({
1580
+ table: B,
1517
1581
  predicate: i,
1518
1582
  order: [{
1519
1583
  column: "createdAt",
@@ -1526,24 +1590,24 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1526
1590
  skip: r ? t.offset : void 0,
1527
1591
  projection: void 0
1528
1592
  });
1529
- return r ? a.map(X) : a.map(X).filter((e) => $t(e, t)).slice(t.offset, t.offset + t.limit);
1593
+ return r ? a.map(X) : a.map(X).filter((e) => rn(e, t)).slice(t.offset, t.offset + t.limit);
1530
1594
  })
1531
- }), on = () => {
1595
+ }), un = () => {
1532
1596
  let e = /* @__PURE__ */ new Map();
1533
1597
  return {
1534
- insert: (t) => y.sync(() => {
1598
+ insert: (t) => v.sync(() => {
1535
1599
  e.set(t.id, t);
1536
1600
  }),
1537
- delete: (t) => y.sync(() => {
1601
+ delete: (t) => v.sync(() => {
1538
1602
  e.delete(t);
1539
1603
  }),
1540
- getById: (t) => y.sync(() => e.get(t) ?? null),
1541
- listByRef: (t) => y.sync(() => [...e.values()].filter((e) => e.refId === t)),
1542
- deleteByRef: (t) => y.sync(() => {
1604
+ getById: (t) => v.sync(() => e.get(t) ?? null),
1605
+ listByRef: (t) => v.sync(() => [...e.values()].filter((e) => e.refId === t)),
1606
+ deleteByRef: (t) => v.sync(() => {
1543
1607
  for (let [n, r] of e) r.refId === t && e.delete(n);
1544
1608
  })
1545
1609
  };
1546
- }, sn = (e) => ({
1610
+ }, dn = (e) => ({
1547
1611
  id: String(e.id),
1548
1612
  refId: String(e.refId),
1549
1613
  principalType: e.principalType,
@@ -1552,12 +1616,12 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1552
1616
  createdAt: e.createdAt instanceof Date ? e.createdAt : new Date(String(e.createdAt)),
1553
1617
  expiresAt: e.expiresAt ? e.expiresAt instanceof Date ? e.expiresAt : new Date(String(e.expiresAt)) : null,
1554
1618
  createdBy: e.createdBy ?? null
1555
- }), cn = (e) => ({
1556
- insert: (t) => Z(() => e.insert(B, { ...t })),
1557
- delete: (t) => Z(() => e.delete(B, t)),
1619
+ }), fn = (e) => ({
1620
+ insert: (t) => Z(() => e.insert(V, { ...t })),
1621
+ delete: (t) => Z(() => e.delete(V, t)),
1558
1622
  getById: (t) => Z(async () => {
1559
1623
  let n = (await e.query({
1560
- table: B,
1624
+ table: V,
1561
1625
  predicate: {
1562
1626
  column: "id",
1563
1627
  op: "eq",
@@ -1568,10 +1632,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1568
1632
  skip: void 0,
1569
1633
  projection: void 0
1570
1634
  }))[0];
1571
- return n ? sn(n) : null;
1635
+ return n ? dn(n) : null;
1572
1636
  }),
1573
1637
  listByRef: (t) => Z(async () => (await e.query({
1574
- table: B,
1638
+ table: V,
1575
1639
  predicate: {
1576
1640
  column: "refId",
1577
1641
  op: "eq",
@@ -1584,10 +1648,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1584
1648
  take: void 0,
1585
1649
  skip: void 0,
1586
1650
  projection: void 0
1587
- })).map(sn)),
1651
+ })).map(dn)),
1588
1652
  deleteByRef: (t) => Z(async () => {
1589
1653
  let n = await e.query({
1590
- table: B,
1654
+ table: V,
1591
1655
  predicate: {
1592
1656
  column: "refId",
1593
1657
  op: "eq",
@@ -1598,23 +1662,23 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1598
1662
  skip: void 0,
1599
1663
  projection: void 0
1600
1664
  });
1601
- for (let t of n) await e.delete(B, String(t.id));
1665
+ for (let t of n) await e.delete(V, String(t.id));
1602
1666
  })
1603
- }), ln = () => k({
1667
+ }), pn = () => A({
1604
1668
  kind: "typeid",
1605
1669
  prefix: "file"
1606
- }, z), un = () => k({
1670
+ }, B), mn = () => A({
1607
1671
  kind: "typeid",
1608
1672
  prefix: "grant"
1609
- }, B), dn = (i) => {
1610
- let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) => Zt(i.publicBaseUrl, e, i.httpPath ?? "/_voltro/storage"), p = S.recurs(Math.max(0, u - 1)).pipe(S.intersect(S.exponential("100 millis")), S.whileInput((e) => e.transient)), m = (e, t, n) => [
1673
+ }, V), hn = (i) => {
1674
+ let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) => tn(i.publicBaseUrl, e, i.httpPath ?? "/_voltro/storage"), p = x.max([x.recurs(Math.max(0, u - 1)), x.exponential("100 millis")]).pipe(x.while(({ input: e }) => e.transient)), m = (e, t, n) => [
1611
1675
  i.tenantPrefix,
1612
1676
  e ?? "global",
1613
1677
  n ?? t
1614
1678
  ].filter(Boolean).join("/"), ee = (e) => {
1615
- if (e === void 0) return y.succeed(void 0);
1679
+ if (e === void 0) return v.succeed(void 0);
1616
1680
  let n = e.length === 0 ? "empty" : e.includes("\0") ? "contains NUL" : e.startsWith("/") || e.startsWith("\\") ? "starts with a path separator" : e.includes("\\") ? "contains a backslash" : e.split("/").some((e) => e === "" || e === "." || e === "..") ? "contains an empty, \".\" or \"..\" segment" : void 0;
1617
- return n === void 0 ? y.succeed(e) : y.fail(new t({
1681
+ return n === void 0 ? v.succeed(e) : v.fail(new t({
1618
1682
  provider: a.name,
1619
1683
  message: `storage key rejected: ${n}`,
1620
1684
  transient: !1,
@@ -1626,20 +1690,20 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1626
1690
  "_incoming",
1627
1691
  t,
1628
1692
  String(n).padStart(6, "0")
1629
- ].filter(Boolean).join("/"), h = (e, n) => n !== void 0 && e.tenantId !== n ? y.fail(new t({
1693
+ ].filter(Boolean).join("/"), ne = (e, t) => t === void 0 || e.tenantId === t, h = (e, n) => ne(e, n) ? v.succeed(e) : v.fail(new t({
1630
1694
  provider: a.name,
1631
1695
  message: "cross-tenant access denied",
1632
1696
  transient: !1,
1633
1697
  status: 403
1634
- })) : y.succeed(e), ne = (e, n, r) => y.gen(function* () {
1698
+ })), g = (e, n, r) => v.gen(function* () {
1635
1699
  let o = i.objects?.(), s = (e) => new t({
1636
1700
  provider: "metadata",
1637
1701
  message: e,
1638
1702
  transient: !1,
1639
1703
  status: 409
1640
1704
  });
1641
- if (o === void 0) return r === void 0 ? !1 : yield* y.fail(s(`claim '${r}' cannot be released: no data store is bound, so ref '${e}' holds no claims`));
1642
- let c = yield* y.tryPromise({
1705
+ if (o === void 0) return r === void 0 ? !1 : yield* v.fail(s(`claim '${r}' cannot be released: no data store is bound, so ref '${e}' holds no claims`));
1706
+ let c = yield* v.tryPromise({
1643
1707
  try: () => o.intent(e),
1644
1708
  catch: (e) => new t({
1645
1709
  provider: "metadata",
@@ -1647,25 +1711,25 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1647
1711
  transient: !1
1648
1712
  })
1649
1713
  });
1650
- return c === void 0 ? r === void 0 ? !1 : yield* y.fail(s(`claim '${r}' cannot be released: ref '${e}' was not written through an operation and holds no claims`)) : (yield* h(c.ref, n), yield* Yt({
1714
+ return c === void 0 ? r === void 0 ? !1 : yield* v.fail(s(`claim '${r}' cannot be released: ref '${e}' was not written through an operation and holds no claims`)) : (yield* h(c.ref, n), yield* $t({
1651
1715
  metadata: o,
1652
1716
  provider: {
1653
1717
  ...a,
1654
- delete: (e) => a.delete(e).pipe(y.retry(p))
1718
+ delete: (e) => a.delete(e).pipe(v.retry(p))
1655
1719
  }
1656
- }).delete(e, n, r).pipe(y.catchTag("StorageRejected", (e) => y.fail(e.reason === "claim-not-held" ? s(e.detail) : new t({
1720
+ }).delete(e, n, r).pipe(v.catchTag("StorageRejected", (e) => v.fail(e.reason === "claim-not-held" ? s(e.detail) : new t({
1657
1721
  provider: "metadata",
1658
1722
  message: e.detail,
1659
1723
  transient: !1
1660
1724
  })))), !0);
1661
- }), g = (e, n) => o.getById(e).pipe(y.flatMap((r) => r ? h(r, n) : y.fail(new t({
1725
+ }), _ = (e, n) => o.getById(e).pipe(v.flatMap((r) => r ? h(r, n) : v.fail(new t({
1662
1726
  provider: a.name,
1663
1727
  message: `no ref '${e}'`,
1664
1728
  transient: !1,
1665
1729
  status: 404
1666
- })))), re = (e) => y.suspend(() => {
1730
+ })))), re = (e) => v.suspend(() => {
1667
1731
  let n = i.scan(e);
1668
- return y.isEffect(n) ? n : y.tryPromise({
1732
+ return v.isEffect(n) ? n : v.tryPromise({
1669
1733
  try: () => Promise.resolve(n),
1670
1734
  catch: (e) => new t({
1671
1735
  provider: "scan",
@@ -1673,23 +1737,23 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1673
1737
  transient: !0
1674
1738
  })
1675
1739
  });
1676
- }), ie = (e) => y.suspend(() => {
1740
+ }), ie = (e) => v.suspend(() => {
1677
1741
  let t = e.contentType;
1678
- if (!i.videoProbe || !(t.startsWith("video/") || t.startsWith("audio/"))) return y.succeed(null);
1742
+ if (!i.videoProbe || !(t.startsWith("video/") || t.startsWith("audio/"))) return v.succeed(null);
1679
1743
  let n;
1680
1744
  try {
1681
1745
  n = i.videoProbe(e);
1682
1746
  } catch {
1683
- return y.succeed(null);
1747
+ return v.succeed(null);
1684
1748
  }
1685
- return y.isEffect(n) ? n.pipe(y.catchAll(() => y.succeed(null))) : y.tryPromise({
1749
+ return v.isEffect(n) ? n.pipe(v.catch(() => v.succeed(null))) : v.tryPromise({
1686
1750
  try: () => Promise.resolve(n),
1687
1751
  catch: () => null
1688
- }).pipe(y.catchAll(() => y.succeed(null)));
1689
- }), _ = (e) => y.gen(function* () {
1690
- let t = Ht(e.bytes, e.contentType, i.limits);
1691
- if (t) return yield* y.fail(new n(t));
1692
- if (e.claim !== void 0 && e.operationId === void 0) return yield* y.fail(new n({
1752
+ }).pipe(v.catch(() => v.succeed(null)));
1753
+ }), b = (e) => v.gen(function* () {
1754
+ let t = Kt(e.bytes, e.contentType, i.limits);
1755
+ if (t) return yield* v.fail(new n(t));
1756
+ if (e.claim !== void 0 && e.operationId === void 0) return yield* v.fail(new n({
1693
1757
  reason: "claim-without-operation",
1694
1758
  detail: "a put with a claim needs an operationId; the claim names this caller's hold on that operation's object"
1695
1759
  }));
@@ -1699,38 +1763,38 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1699
1763
  contentType: e.contentType,
1700
1764
  ...e.key ? { key: e.key } : {}
1701
1765
  });
1702
- if (!t.clean) return yield* y.fail(new r({ threat: t.threat ?? "unknown" }));
1766
+ if (!t.clean) return yield* v.fail(new r({ threat: t.threat ?? "unknown" }));
1703
1767
  }
1704
- let s = yield* y.promise(() => Ut(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* ie({
1768
+ let s = yield* v.promise(() => qt(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* ie({
1705
1769
  bytes: l,
1706
1770
  contentType: e.contentType
1707
- }), d = s.width ?? u?.width, f = s.height ?? u?.height, te = s.placeholder ?? u?.poster, h = e.duration ?? u?.duration, ne = yield* y.promise(() => Xt(l)), g = e.tenantId ?? null, _ = e.visibility ?? "private", v = m(g, ne, yield* ee(e.key)), S = e.password ? yield* y.sync(() => gt(e.password)) : null, C = {
1708
- id: ln(),
1771
+ }), d = s.width ?? u?.width, f = s.height ?? u?.height, te = s.placeholder ?? u?.poster, ne = e.duration ?? u?.duration, h = yield* v.promise(() => en(l)), g = e.tenantId ?? null, _ = e.visibility ?? "private", b = m(g, h, yield* ee(e.key)), x = e.password ? yield* v.sync(() => yt(e.password)) : null, S = {
1772
+ id: pn(),
1709
1773
  tenantId: g,
1710
1774
  ownerId: e.ownerId ?? null,
1711
1775
  bucket: c,
1712
- key: v,
1776
+ key: b,
1713
1777
  contentType: e.contentType,
1714
1778
  size: l.byteLength,
1715
- checksum: ne,
1779
+ checksum: h,
1716
1780
  visibility: _,
1717
1781
  accessPolicy: e.access ?? null,
1718
- passwordHash: S,
1782
+ passwordHash: x,
1719
1783
  createdAt: /* @__PURE__ */ new Date(),
1720
1784
  ...d === void 0 ? {} : { width: d },
1721
1785
  ...f === void 0 ? {} : { height: f },
1722
1786
  ...te === void 0 ? {} : { placeholder: te },
1723
- ...h === void 0 ? {} : { duration: h },
1787
+ ...ne === void 0 ? {} : { duration: ne },
1724
1788
  ...e.folder === void 0 ? {} : { folder: e.folder },
1725
1789
  ...e.tags === void 0 ? {} : { tags: e.tags },
1726
1790
  ...e.alt === void 0 ? {} : { alt: e.alt },
1727
1791
  ...e.caption === void 0 ? {} : { caption: e.caption },
1728
1792
  ...e.derivedFrom === void 0 ? {} : { derivedFrom: e.derivedFrom },
1729
1793
  ...e.kind === void 0 ? {} : { kind: e.kind }
1730
- }, w = i.transcode !== void 0 && i.autoTranscode !== !1, ae = (t) => w && t.derivedFrom == null && (e.contentType.startsWith("video/") || e.contentType.startsWith("audio/")) ? y.forkDaemon(x(t).pipe(y.ignore)) : y.void;
1794
+ }, C = i.transcode !== void 0 && i.autoTranscode !== !1, oe = (t) => C && t.derivedFrom == null && (e.contentType.startsWith("video/") || e.contentType.startsWith("audio/")) ? v.forkDetach(ae(t).pipe(v.ignore)) : v.void;
1731
1795
  if (e.operationId !== void 0) {
1732
1796
  let t = i.objects?.();
1733
- if (t === void 0) return yield* y.fail(new n({
1797
+ if (t === void 0) return yield* v.fail(new n({
1734
1798
  reason: "operation-store-unbound",
1735
1799
  detail: "a put with an operationId needs a bound data store; the in-memory ref store cannot hold operation intents"
1736
1800
  }));
@@ -1738,10 +1802,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1738
1802
  tenantId: g,
1739
1803
  bucket: c,
1740
1804
  operationId: e.operationId,
1741
- checksum: ne,
1742
- logicalKey: v,
1743
- fingerprint: yield* y.promise(() => Xt(new TextEncoder().encode(JSON.stringify([
1744
- ne,
1805
+ checksum: h,
1806
+ logicalKey: b,
1807
+ fingerprint: yield* v.promise(() => en(new TextEncoder().encode(JSON.stringify([
1808
+ h,
1745
1809
  e.contentType,
1746
1810
  _,
1747
1811
  e.access ?? null,
@@ -1753,66 +1817,66 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1753
1817
  e.caption ?? null,
1754
1818
  e.derivedFrom ?? null,
1755
1819
  e.kind ?? null,
1756
- h ?? null,
1820
+ ne ?? null,
1757
1821
  e.password !== void 0
1758
1822
  ]))))
1759
- }, o = yield* Yt({
1823
+ }, o = yield* $t({
1760
1824
  metadata: t,
1761
1825
  provider: {
1762
1826
  ...a,
1763
- put: (e, t, n) => a.put(e, t, n).pipe(y.retry(p))
1827
+ put: (e, t, n) => a.put(e, t, n).pipe(v.retry(p))
1764
1828
  }
1765
1829
  }).put({
1766
1830
  identity: r,
1767
- ref: C,
1831
+ ref: S,
1768
1832
  bytes: l,
1769
1833
  ...i.quota === void 0 ? {} : { quota: i.quota },
1770
1834
  ...e.claim === void 0 ? {} : { claim: e.claim }
1771
1835
  });
1772
- return yield* ae(o.ref), {
1836
+ return yield* oe(o.ref), {
1773
1837
  ...o.ref,
1774
1838
  outcome: o.outcome
1775
1839
  };
1776
1840
  }
1777
- let oe = {
1841
+ let w = {
1778
1842
  bytes: l.byteLength,
1779
1843
  count: 1
1780
- }, se = yield* o.consumeUsage(g, oe, i.quota);
1844
+ }, se = yield* o.consumeUsage(g, w, i.quota);
1781
1845
  if (!se.allowed) {
1782
1846
  let e = i.quota ?? {}, t = e.maxCount !== void 0 && se.count + 1 > e.maxCount ? `tenant object count ${se.count} + 1 exceeds max ${e.maxCount}` : `tenant usage ${se.bytes} + ${l.byteLength} bytes exceeds max ${e.maxBytes}`;
1783
- return yield* y.fail(new n({
1847
+ return yield* v.fail(new n({
1784
1848
  reason: "quota-exceeded",
1785
1849
  detail: t
1786
1850
  }));
1787
1851
  }
1788
- return yield* ((e) => e.pipe(y.onExit((e) => b.isSuccess(e) ? y.void : o.delete(C.id).pipe(y.zipRight(o.releaseUsage(g, oe)), y.ignore))))(o.insert(C).pipe(y.zipRight(a.put(v, l, {
1852
+ return yield* ((e) => e.pipe(v.onExit((e) => y.isSuccess(e) ? v.void : o.delete(S.id).pipe(v.andThen(o.releaseUsage(g, w)), v.ignore))))(o.insert(S).pipe(v.andThen(a.put(b, l, {
1789
1853
  contentType: e.contentType,
1790
1854
  public: _ === "public"
1791
- }).pipe(y.retry(p))))), yield* ae(C), {
1792
- ...C,
1855
+ }).pipe(v.retry(p))))), yield* oe(S), {
1856
+ ...S,
1793
1857
  outcome: "created"
1794
1858
  };
1795
- }), v = (e) => y.suspend(() => {
1796
- if (!i.transcode) return y.succeed([]);
1859
+ }), S = (e) => v.suspend(() => {
1860
+ if (!i.transcode) return v.succeed([]);
1797
1861
  let t;
1798
1862
  try {
1799
1863
  t = i.transcode(e);
1800
1864
  } catch {
1801
- return y.succeed([]);
1865
+ return v.succeed([]);
1802
1866
  }
1803
- return y.isEffect(t) ? t.pipe(y.catchAll(() => y.succeed([]))) : y.tryPromise({
1867
+ return v.isEffect(t) ? t.pipe(v.catch(() => v.succeed([]))) : v.tryPromise({
1804
1868
  try: () => Promise.resolve(t),
1805
1869
  catch: () => []
1806
- }).pipe(y.catchAll(() => y.succeed([])));
1807
- }), x = (e) => y.gen(function* () {
1870
+ }).pipe(v.catch(() => v.succeed([])));
1871
+ }), ae = (e) => v.gen(function* () {
1808
1872
  if (!i.transcode || e.derivedFrom != null) return [];
1809
- let t = yield* a.get(e.key).pipe(y.retry(p)), n = yield* v({
1873
+ let t = yield* a.get(e.key).pipe(v.retry(p)), n = yield* S({
1810
1874
  bytes: t.bytes,
1811
1875
  contentType: e.contentType,
1812
1876
  ref: e
1813
1877
  }), r = [];
1814
1878
  for (let t of n) {
1815
- let n = yield* _({
1879
+ let n = yield* b({
1816
1880
  bytes: t.bytes,
1817
1881
  contentType: t.contentType,
1818
1882
  tenantId: e.tenantId,
@@ -1825,14 +1889,20 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1825
1889
  r.push(n);
1826
1890
  }
1827
1891
  return r;
1828
- }), C = (e, t, n) => y.gen(function* () {
1829
- if (e.visibility === "public" || (yield* wt(e, t, {
1892
+ }), oe = (e, t, n) => v.gen(function* () {
1893
+ if (e.derivedFrom != null) {
1894
+ let r = yield* o.getById(e.derivedFrom);
1895
+ return r === null ? !1 : yield* oe(r, t, n);
1896
+ }
1897
+ if (e.visibility === "public") return !0;
1898
+ if (e.tenantId !== null && !ne(e, t.tenantId ?? null)) return !1;
1899
+ if (yield* Dt(e, t, {
1830
1900
  ...l,
1831
1901
  ...n?.password === void 0 ? {} : { password: n.password }
1832
- }))) return !0;
1833
- let r = yield* Ot(t, l);
1834
- return Dt(yield* s.listByRef(e.id), t, r, n?.permission ?? "read", Date.now());
1835
- }), ae = (e) => {
1902
+ })) return !0;
1903
+ let r = yield* jt(t, l);
1904
+ return At(yield* s.listByRef(e.id), t, r, n?.permission ?? "read", Date.now());
1905
+ }), w = (e) => {
1836
1906
  if (e.visibility === "public") {
1837
1907
  let t = a.publicUrl?.(e.key);
1838
1908
  if (t != null) return t;
@@ -1840,94 +1910,99 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1840
1910
  return f(e.id);
1841
1911
  };
1842
1912
  return {
1843
- put: _,
1844
- get: (e, t) => g(e, t?.tenantId).pipe(y.flatMap((e) => a.get(e.key).pipe(y.retry(p), y.map((t) => ({
1913
+ put: b,
1914
+ get: (e, t) => _(e, t?.tenantId).pipe(v.flatMap((e) => a.get(e.key).pipe(v.retry(p), v.map((t) => ({
1845
1915
  bytes: t.bytes,
1846
1916
  ref: e
1847
1917
  }))))),
1848
- getStream: (e, t) => g(e, t?.tenantId).pipe(y.map((e) => ({
1918
+ getStream: (e, t) => _(e, t?.tenantId).pipe(v.map((e) => ({
1849
1919
  ref: e,
1850
- stream: w.unwrap(y.suspend(() => a.getStream ? a.getStream(e.key).pipe(y.retry(p), y.map((e) => e.stream)) : a.get(e.key).pipe(y.retry(p), y.map((e) => w.make(e.bytes)))))
1920
+ stream: C.unwrap(v.suspend(() => a.getStream ? a.getStream(e.key).pipe(v.retry(p), v.map((e) => e.stream)) : a.get(e.key).pipe(v.retry(p), v.map((e) => C.make(e.bytes)))))
1851
1921
  }))),
1852
- getRange: (e, n, r) => g(e, r?.tenantId).pipe(y.flatMap((e) => {
1922
+ getRange: (e, n, r) => _(e, r?.tenantId).pipe(v.flatMap((e) => {
1853
1923
  let r = e.size, i = Math.max(0, Math.trunc(n.start));
1854
- if (r > 0 && i >= r) return y.fail(new t({
1924
+ if (r > 0 && i >= r) return v.fail(new t({
1855
1925
  provider: a.name,
1856
1926
  message: `range start ${i} past end ${r}`,
1857
1927
  transient: !1,
1858
1928
  status: 416
1859
1929
  }));
1860
1930
  let o = Math.min(Math.trunc(n.endInclusive), Math.max(0, r - 1));
1861
- return o < i ? y.fail(new t({
1931
+ return o < i ? v.fail(new t({
1862
1932
  provider: a.name,
1863
1933
  message: `empty range ${i}-${o}`,
1864
1934
  transient: !1,
1865
1935
  status: 416
1866
- })) : (a.getRange ? a.getRange(e.key, i, o).pipe(y.retry(p)) : a.get(e.key).pipe(y.retry(p), y.map((e) => e.bytes.subarray(i, o + 1)))).pipe(y.map((t) => ({
1936
+ })) : (a.getRange ? a.getRange(e.key, i, o).pipe(v.retry(p)) : a.get(e.key).pipe(v.retry(p), v.map((e) => e.bytes.subarray(i, o + 1)))).pipe(v.map((t) => ({
1867
1937
  bytes: t,
1868
1938
  ref: e,
1869
1939
  totalSize: r
1870
1940
  })));
1871
1941
  })),
1872
- getUrl: (e, t) => g(e, t?.tenantId).pipe(y.flatMap((e) => e.visibility === "public" ? y.succeed(ae(e)) : a.presigns ? a.getUrl(e.key, t?.expiresInSec ?? d) : y.succeed(f(e.id)))),
1873
- head: (e, t) => o.getById(e).pipe(y.flatMap((e) => e ? h(e, t?.tenantId).pipe(y.map((e) => e)) : y.succeed(null))),
1874
- delete: (e, t) => ne(e, t?.tenantId, t?.claim).pipe(y.flatMap((n) => n ? y.void : g(e, t?.tenantId).pipe(y.flatMap((t) => s.deleteByRef(e).pipe(y.flatMap(() => o.delete(e)), y.flatMap((e) => e ? o.countByKey(t.bucket, t.key).pipe(y.flatMap((e) => e === 0 ? a.delete(t.key).pipe(y.retry(p)) : y.void), y.flatMap(() => o.releaseUsage(t.tenantId, {
1942
+ getUrl: (e, t) => _(e, t?.tenantId).pipe(v.flatMap((e) => e.visibility === "public" ? v.succeed(w(e)) : a.presigns ? a.getUrl(e.key, t?.expiresInSec ?? d) : v.succeed(f(e.id)))),
1943
+ head: (e, t) => o.getById(e).pipe(v.flatMap((e) => e ? h(e, t?.tenantId).pipe(v.map((e) => e)) : v.succeed(null))),
1944
+ delete: (e, t) => g(e, t?.tenantId, t?.claim).pipe(v.flatMap((n) => n ? v.void : _(e, t?.tenantId).pipe(v.flatMap((t) => s.deleteByRef(e).pipe(v.flatMap(() => o.delete(e)), v.flatMap((e) => e ? o.countByKey(t.bucket, t.key).pipe(v.flatMap((e) => e === 0 ? a.delete(t.key).pipe(v.retry(p)) : v.void), v.flatMap(() => o.releaseUsage(t.tenantId, {
1875
1945
  bytes: t.size,
1876
1946
  count: 1
1877
- }))) : y.void), y.asVoid))))),
1878
- signedUrl: (e, t) => g(e, t?.tenantId).pipe(y.flatMap((e) => {
1879
- if (e.visibility === "public") return y.succeed(ae(e));
1947
+ }))) : v.void), v.asVoid))))),
1948
+ signedUrl: (e, t) => _(e, t?.tenantId).pipe(v.flatMap((e) => {
1949
+ if (e.visibility === "public") return v.succeed(w(e));
1880
1950
  let n = t?.expiresInSec ?? d;
1881
- return a.presigns ? a.getUrl(e.key, n) : y.sync(() => `${f(e.id)}?t=${kt(e.id, n, void 0, i.httpPath ?? "/_voltro/storage")}`);
1951
+ return a.presigns ? a.getUrl(e.key, n) : v.sync(() => `${f(e.id)}?t=${Mt(e.id, n, void 0, i.httpPath ?? "/_voltro/storage")}`);
1882
1952
  })),
1883
- setVisibility: (e, r, i) => y.gen(function* () {
1884
- let s = yield* g(e, i?.tenantId);
1953
+ setVisibility: (e, r, i) => v.gen(function* () {
1954
+ let s = yield* _(e, i?.tenantId);
1885
1955
  if (s.visibility === r) return s;
1886
1956
  let c = o.setVisibility;
1887
- if (c === void 0) return yield* y.fail(new n({
1957
+ if (c === void 0) return yield* v.fail(new n({
1888
1958
  reason: "visibility-unsupported",
1889
1959
  detail: "the ref store cannot change a stored object's visibility"
1890
1960
  }));
1891
- if (r === "private" && a.publicUrl?.(s.key) != null) return yield* y.fail(new n({
1961
+ if (r === "private" && a.publicUrl?.(s.key) != null) return yield* v.fail(new n({
1892
1962
  reason: "visibility-unsupported",
1893
1963
  detail: `objects are served from a public base (${a.name} cdnBaseUrl); a public object cannot be made private there`
1894
1964
  }));
1895
- if (r === "private" && a.setObjectPublic !== void 0 && o.countPublicByKey === void 0) return yield* y.fail(new n({
1965
+ if (r === "private" && a.setObjectPublic !== void 0 && o.countPublicByKey === void 0) return yield* v.fail(new n({
1896
1966
  reason: "visibility-unsupported",
1897
1967
  detail: "the ref store cannot tell whether other refs keep these bytes public"
1898
1968
  }));
1899
1969
  let l = yield* c(s.id, r);
1900
- if (l === null) return yield* y.fail(new t({
1970
+ if (l === null) return yield* v.fail(new t({
1901
1971
  provider: a.name,
1902
1972
  message: `no ref '${e}'`,
1903
1973
  transient: !1,
1904
1974
  status: 404
1905
1975
  }));
1976
+ let u = s.derivedFrom == null ? yield* o.listByDerivedFrom(s.id) : [];
1977
+ for (let e of u) e.visibility !== r && (yield* c(e.id, r));
1906
1978
  if (a.setObjectPublic !== void 0) {
1907
- let e = o.countPublicByKey, t = r === "public" || e !== void 0 && (yield* e(s.bucket, s.key)) > 0;
1908
- yield* a.setObjectPublic(s.key, t);
1979
+ let e = o.countPublicByKey;
1980
+ for (let t of [s, ...u]) {
1981
+ let n = r === "public" || e !== void 0 && (yield* e(t.bucket, t.key)) > 0;
1982
+ yield* a.setObjectPublic(t.key, n);
1983
+ }
1909
1984
  }
1910
1985
  return l;
1911
1986
  }),
1912
- mintUrl: (n, r, s) => y.gen(function* () {
1913
- let c = yield* o.getById(n).pipe(y.flatMap((e) => e ? y.succeed(e) : y.fail(new t({
1987
+ mintUrl: (n, r, s) => v.gen(function* () {
1988
+ let c = yield* o.getById(n).pipe(v.flatMap((e) => e ? v.succeed(e) : v.fail(new t({
1914
1989
  provider: a.name,
1915
1990
  message: `no ref '${n}'`,
1916
1991
  transient: !1,
1917
1992
  status: 404
1918
1993
  }))));
1919
- if (c.visibility === "public") return ae(c);
1920
- if (!(yield* C(c, r, s?.password === void 0 ? {} : { password: s.password }))) return yield* y.fail(new e({
1994
+ if (c.visibility === "public" && c.derivedFrom == null) return w(c);
1995
+ if (!(yield* oe(c, r, s?.password === void 0 ? {} : { password: s.password }))) return yield* v.fail(new e({
1921
1996
  refId: n,
1922
1997
  reason: "access denied"
1923
1998
  }));
1924
1999
  let l = s?.expiresInSec ?? d;
1925
2000
  if (a.presigns) return yield* a.getUrl(c.key, l);
1926
- let u = yield* y.sync(() => kt(c.id, l, void 0, i.httpPath ?? "/_voltro/storage"));
2001
+ let u = yield* v.sync(() => Mt(c.id, l, void 0, i.httpPath ?? "/_voltro/storage"));
1927
2002
  return `${f(c.id)}?t=${u}`;
1928
2003
  }),
1929
- mintUploadUrl: (e) => y.gen(function* () {
1930
- if (!a.getUploadUrl) return yield* y.fail(new t({
2004
+ mintUploadUrl: (e) => v.gen(function* () {
2005
+ if (!a.getUploadUrl) return yield* v.fail(new t({
1931
2006
  provider: a.name,
1932
2007
  message: `provider '${a.name}' does not support presigned uploads`,
1933
2008
  transient: !1,
@@ -1936,10 +2011,10 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1936
2011
  let n = m(e.tenantId ?? null, "", yield* ee(e.key));
1937
2012
  return yield* a.getUploadUrl(n, e.expiresInSec ?? d, e.contentType);
1938
2013
  }),
1939
- checkAccess: C,
1940
- grant: (e) => y.gen(function* () {
2014
+ checkAccess: oe,
2015
+ grant: (e) => v.gen(function* () {
1941
2016
  let t = {
1942
- id: un(),
2017
+ id: mn(),
1943
2018
  refId: e.refId,
1944
2019
  principalType: e.principalType,
1945
2020
  principalId: e.principalId,
@@ -1950,7 +2025,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1950
2025
  };
1951
2026
  return yield* s.insert(t), t;
1952
2027
  }),
1953
- listRefs: (e) => y.suspend(() => {
2028
+ listRefs: (e) => v.suspend(() => {
1954
2029
  let t = Math.min(500, Math.max(1, Math.trunc(e?.limit ?? 50))), n = Math.max(0, Math.trunc(e?.offset ?? 0)), r = {
1955
2030
  tenantId: e && "tenantId" in e ? e.tenantId : void 0,
1956
2031
  folder: e?.folder,
@@ -1960,7 +2035,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1960
2035
  limit: t + 1,
1961
2036
  offset: n
1962
2037
  };
1963
- return o.listRefs(r).pipe(y.map((e) => {
2038
+ return o.listRefs(r).pipe(v.map((e) => {
1964
2039
  let r = e.length > t;
1965
2040
  return {
1966
2041
  refs: r ? e.slice(0, t) : e,
@@ -1972,7 +2047,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1972
2047
  getGrant: (e) => s.getById(e),
1973
2048
  listGrants: (e) => s.listByRef(e),
1974
2049
  usage: (e) => o.usageByTenant(e),
1975
- sweepOrphans: (e) => y.gen(function* () {
2050
+ sweepOrphans: (e) => v.gen(function* () {
1976
2051
  let t = e?.limit ?? 1e3, n = e?.dryRun ?? !1, r = yield* o.listRecent(t), i = [];
1977
2052
  for (let e of r) if ((yield* a.head(e.key)) === null) {
1978
2053
  if (!n) {
@@ -1989,9 +2064,9 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
1989
2064
  removed: i
1990
2065
  };
1991
2066
  }),
1992
- ingestUrl: (e, t) => Jt(y.gen(function* () {
1993
- let n = yield* qt(e, i.limits?.maxBytes, i.ingest);
1994
- return yield* _({
2067
+ ingestUrl: (e, t) => Qt(v.gen(function* () {
2068
+ let n = yield* Zt(e, i.limits?.maxBytes, i.ingest);
2069
+ return yield* b({
1995
2070
  bytes: n.bytes,
1996
2071
  contentType: t?.contentType ?? n.contentType,
1997
2072
  ...t?.tenantId === void 0 ? {} : { tenantId: t.tenantId },
@@ -2006,39 +2081,40 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2006
2081
  ...t?.caption === void 0 ? {} : { caption: t.caption }
2007
2082
  });
2008
2083
  }), t?.abortSignal),
2009
- mintPresignedUpload: (e) => y.gen(function* () {
2010
- if (!a.getUploadUrl) return yield* y.fail(new t({
2084
+ mintPresignedUpload: (e) => v.gen(function* () {
2085
+ if (!a.getUploadUrl) return yield* v.fail(new t({
2011
2086
  provider: a.name,
2012
2087
  message: `provider '${a.name}' does not support presigned uploads`,
2013
2088
  transient: !1,
2014
2089
  status: 400
2015
2090
  }));
2016
- let n = e.expiresInSec ?? d, r = `_incoming/${k({
2091
+ let n = e.expiresInSec ?? d, r = `_incoming/${A({
2017
2092
  kind: "typeid",
2018
2093
  prefix: "up"
2019
- }, z)}`, i = m(e.tenantId ?? null, "", r);
2094
+ }, B)}`, i = m(e.tenantId ?? null, "", r);
2020
2095
  return {
2021
2096
  uploadUrl: yield* a.getUploadUrl(i, n, e.contentType),
2022
2097
  key: i,
2023
2098
  expiresInSec: n
2024
2099
  };
2025
2100
  }),
2026
- finalizeUpload: (e) => a.get(e.key).pipe(y.retry(p), y.flatMap((t) => _({
2101
+ finalizeUpload: (e) => a.get(e.key).pipe(v.retry(p), v.flatMap((t) => b({
2027
2102
  bytes: t.bytes,
2028
2103
  contentType: e.contentType,
2029
2104
  ...e.tenantId === void 0 ? {} : { tenantId: e.tenantId },
2030
2105
  ...e.ownerId === void 0 ? {} : { ownerId: e.ownerId },
2031
2106
  ...e.visibility === void 0 ? {} : { visibility: e.visibility },
2107
+ ...e.access === void 0 ? {} : { access: e.access },
2032
2108
  ...e.folder === void 0 ? {} : { folder: e.folder },
2033
2109
  ...e.tags === void 0 ? {} : { tags: e.tags },
2034
2110
  ...e.alt === void 0 ? {} : { alt: e.alt },
2035
2111
  ...e.caption === void 0 ? {} : { caption: e.caption }
2036
- })), y.ensuring(a.delete(e.key).pipe(y.retry(p), y.ignore))),
2037
- putResumableChunk: (e) => a.put(te(e.tenantId ?? null, e.uploadId, e.index), e.bytes, { contentType: "application/octet-stream" }).pipe(y.retry(p), y.asVoid),
2038
- resumableStatus: (e) => y.gen(function* () {
2112
+ })), v.ensuring(a.delete(e.key).pipe(v.retry(p), v.ignore))),
2113
+ putResumableChunk: (e) => a.put(te(e.tenantId ?? null, e.uploadId, e.index), e.bytes, { contentType: "application/octet-stream" }).pipe(v.retry(p), v.asVoid),
2114
+ resumableStatus: (e) => v.gen(function* () {
2039
2115
  let t = 0, n = 0;
2040
2116
  for (; t < 1e6;) {
2041
- let r = yield* a.head(te(e.tenantId ?? null, e.uploadId, t)).pipe(y.retry(p), y.catchAll(() => y.succeed(null)));
2117
+ let r = yield* a.head(te(e.tenantId ?? null, e.uploadId, t)).pipe(v.retry(p), v.catch(() => v.succeed(null)));
2042
2118
  if (r === null) break;
2043
2119
  n += r.size, t += 1;
2044
2120
  }
@@ -2047,42 +2123,42 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2047
2123
  nextIndex: t
2048
2124
  };
2049
2125
  }),
2050
- finalizeResumable: (e) => y.gen(function* () {
2126
+ finalizeResumable: (e) => v.gen(function* () {
2051
2127
  let r = i.limits?.maxBytes ?? 2 ** 53 - 1;
2052
- if (!Number.isSafeInteger(r) || r < 0 || !Number.isSafeInteger(e.count) || e.count < 0) return yield* y.fail(new t({
2128
+ if (!Number.isSafeInteger(r) || r < 0 || !Number.isSafeInteger(e.count) || e.count < 0) return yield* v.fail(new t({
2053
2129
  provider: a.name,
2054
2130
  message: "resumable count and limits.maxBytes must be non-negative safe integers",
2055
2131
  transient: !1,
2056
2132
  status: 400
2057
2133
  }));
2058
- let o = (t) => te(e.tenantId ?? null, e.uploadId, t), s = y.gen(function* () {
2059
- for (let t = 0; t < e.count; t++) yield* a.delete(o(t)).pipe(y.retry(p), y.ignore);
2134
+ let o = (t) => te(e.tenantId ?? null, e.uploadId, t), s = v.gen(function* () {
2135
+ for (let t = 0; t < e.count; t++) yield* a.delete(o(t)).pipe(v.retry(p), v.ignore);
2060
2136
  }), c = () => new n({
2061
2137
  reason: "too-large",
2062
2138
  detail: `resumable upload exceeds ${r}-byte limit`
2063
- }), l = yield* y.gen(function* () {
2139
+ }), l = yield* v.gen(function* () {
2064
2140
  let n = 0;
2065
2141
  for (let i = 0; i < e.count; i++) {
2066
- let e = yield* a.head(o(i)).pipe(y.retry(p));
2067
- if (e === null) return yield* y.fail(new t({
2142
+ let e = yield* a.head(o(i)).pipe(v.retry(p));
2143
+ if (e === null) return yield* v.fail(new t({
2068
2144
  provider: a.name,
2069
2145
  message: `no resumable chunk at '${o(i)}'`,
2070
2146
  transient: !1,
2071
2147
  status: 404
2072
2148
  }));
2073
- if (!Number.isSafeInteger(e.size) || e.size < 0) return yield* y.fail(new t({
2149
+ if (!Number.isSafeInteger(e.size) || e.size < 0) return yield* v.fail(new t({
2074
2150
  provider: a.name,
2075
2151
  message: "resumable chunk metadata has an invalid size",
2076
2152
  transient: !1
2077
2153
  }));
2078
- if (e.size > r - n) return yield* y.fail(c());
2154
+ if (e.size > r - n) return yield* v.fail(c());
2079
2155
  n += e.size;
2080
2156
  }
2081
2157
  let i = /* @__PURE__ */ new Uint8Array(), s = 0;
2082
2158
  for (let t = 0; t < e.count; t++) {
2083
- let e = yield* Ve(a, o(t)).pipe(y.retry(p));
2084
- yield* w.runForEach(e.stream, (e) => y.gen(function* () {
2085
- if (e.byteLength > r - s) return yield* y.fail(c());
2159
+ let e = yield* Ve(a, o(t)).pipe(v.retry(p));
2160
+ yield* C.runForEach(e.stream, (e) => v.gen(function* () {
2161
+ if (e.byteLength > r - s) return yield* v.fail(c());
2086
2162
  let t = s + e.byteLength;
2087
2163
  if (t > i.byteLength) {
2088
2164
  let e = new Uint8Array(Math.min(r, Math.max(65536, i.byteLength * 2, t)));
@@ -2092,60 +2168,61 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2092
2168
  }));
2093
2169
  }
2094
2170
  return i.subarray(0, s);
2095
- }).pipe(y.tapError((e) => e._tag === "StorageRejected" ? s : y.void));
2096
- return yield* _({
2171
+ }).pipe(v.tapError((e) => e._tag === "StorageRejected" ? s : v.void));
2172
+ return yield* b({
2097
2173
  bytes: l,
2098
2174
  contentType: e.contentType,
2099
2175
  ...e.tenantId === void 0 ? {} : { tenantId: e.tenantId },
2100
2176
  ...e.ownerId === void 0 ? {} : { ownerId: e.ownerId },
2101
2177
  ...e.visibility === void 0 ? {} : { visibility: e.visibility },
2178
+ ...e.access === void 0 ? {} : { access: e.access },
2102
2179
  ...e.folder === void 0 ? {} : { folder: e.folder },
2103
2180
  ...e.tags === void 0 ? {} : { tags: e.tags },
2104
2181
  ...e.alt === void 0 ? {} : { alt: e.alt },
2105
2182
  ...e.caption === void 0 ? {} : { caption: e.caption }
2106
- }).pipe(y.ensuring(s));
2183
+ }).pipe(v.ensuring(s));
2107
2184
  }),
2108
- transcode: (e, t) => g(e, t?.tenantId).pipe(y.flatMap((e) => x(e))),
2109
- renditions: (e, t) => g(e, t?.tenantId).pipe(y.flatMap(() => o.listByDerivedFrom(e))),
2110
- beginMultipartUpload: (e) => y.gen(function* () {
2111
- if (!a.createMultipartUpload || !a.presignUploadPart || !a.completeMultipartUpload) return yield* y.fail(new t({
2185
+ transcode: (e, t) => _(e, t?.tenantId).pipe(v.flatMap((e) => ae(e))),
2186
+ renditions: (e, t) => _(e, t?.tenantId).pipe(v.flatMap(() => o.listByDerivedFrom(e))),
2187
+ beginMultipartUpload: (e) => v.gen(function* () {
2188
+ if (!a.createMultipartUpload || !a.presignUploadPart || !a.completeMultipartUpload) return yield* v.fail(new t({
2112
2189
  provider: a.name,
2113
2190
  message: `provider '${a.name}' does not support multipart uploads`,
2114
2191
  transient: !1,
2115
2192
  status: 400
2116
2193
  }));
2117
- let n = m(e.tenantId ?? null, "", `multipart/${k({
2194
+ let n = m(e.tenantId ?? null, "", `multipart/${A({
2118
2195
  kind: "typeid",
2119
2196
  prefix: "mp"
2120
- }, z)}`);
2197
+ }, B)}`);
2121
2198
  return {
2122
2199
  uploadId: (yield* a.createMultipartUpload(n, e.contentType, { public: (e.visibility ?? "private") === "public" })).uploadId,
2123
2200
  key: n
2124
2201
  };
2125
2202
  }),
2126
- signMultipartPart: (e) => y.suspend(() => a.presignUploadPart ? a.presignUploadPart(e.key, e.uploadId, e.partNumber, e.expiresInSec ?? d) : y.fail(new t({
2203
+ signMultipartPart: (e) => v.suspend(() => a.presignUploadPart ? a.presignUploadPart(e.key, e.uploadId, e.partNumber, e.expiresInSec ?? d) : v.fail(new t({
2127
2204
  provider: a.name,
2128
2205
  message: "provider does not support multipart uploads",
2129
2206
  transient: !1,
2130
2207
  status: 400
2131
2208
  }))),
2132
- completeMultipart: (e) => y.gen(function* () {
2133
- if (!a.completeMultipartUpload) return yield* y.fail(new t({
2209
+ completeMultipart: (e) => v.gen(function* () {
2210
+ if (!a.completeMultipartUpload) return yield* v.fail(new t({
2134
2211
  provider: a.name,
2135
2212
  message: "provider does not support multipart uploads",
2136
2213
  transient: !1,
2137
2214
  status: 400
2138
2215
  }));
2139
- let r = yield* a.completeMultipartUpload(e.key, e.uploadId, e.parts), s = yield* a.head(e.key).pipe(y.retry(p)), l = s?.size ?? 0, u = (r.etag ?? s?.etag ?? "").replace(/"/g, ""), d = e.tenantId ?? null, f = {
2216
+ let r = yield* a.completeMultipartUpload(e.key, e.uploadId, e.parts), s = yield* a.head(e.key).pipe(v.retry(p)), l = s?.size ?? 0, u = (r.etag ?? s?.etag ?? "").replace(/"/g, ""), d = e.tenantId ?? null, f = {
2140
2217
  bytes: l,
2141
2218
  count: 1
2142
2219
  };
2143
- if (!(yield* o.consumeUsage(d, f, i.quota)).allowed) return yield* a.delete(e.key).pipe(y.retry(p), y.ignore), yield* y.fail(new n({
2220
+ if (!(yield* o.consumeUsage(d, f, i.quota)).allowed) return yield* a.delete(e.key).pipe(v.retry(p), v.ignore), yield* v.fail(new n({
2144
2221
  reason: "quota-exceeded",
2145
2222
  detail: `multipart upload of ${l} bytes exceeds tenant quota`
2146
2223
  }));
2147
2224
  let m = {
2148
- id: ln(),
2225
+ id: pn(),
2149
2226
  tenantId: e.tenantId ?? null,
2150
2227
  ownerId: e.ownerId ?? null,
2151
2228
  bucket: c,
@@ -2154,7 +2231,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2154
2231
  size: l,
2155
2232
  checksum: u,
2156
2233
  visibility: e.visibility ?? "private",
2157
- accessPolicy: null,
2234
+ accessPolicy: e.access ?? null,
2158
2235
  passwordHash: null,
2159
2236
  createdAt: /* @__PURE__ */ new Date(),
2160
2237
  ...e.folder === void 0 ? {} : { folder: e.folder },
@@ -2162,114 +2239,119 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2162
2239
  ...e.alt === void 0 ? {} : { alt: e.alt },
2163
2240
  ...e.caption === void 0 ? {} : { caption: e.caption }
2164
2241
  };
2165
- return yield* o.insert(m).pipe(y.onExit((e) => b.isSuccess(e) ? y.void : o.releaseUsage(d, f).pipe(y.ignore))), m;
2242
+ return yield* o.insert(m).pipe(v.onExit((e) => y.isSuccess(e) ? v.void : o.releaseUsage(d, f).pipe(v.ignore))), m;
2166
2243
  }),
2167
- abortMultipart: (e) => y.suspend(() => a.abortMultipartUpload ? a.abortMultipartUpload(e.key, e.uploadId).pipe(y.retry(p)) : y.void)
2244
+ abortMultipart: (e) => v.suspend(() => a.abortMultipartUpload ? a.abortMultipartUpload(e.key, e.uploadId).pipe(v.retry(p)) : v.void)
2168
2245
  };
2169
- }, fn = (e) => x.succeed(i, dn(e)), pn = "_voltro_storage_operation_locks", Q = "_voltro_storage_object_heads", mn = "_voltro_storage_operations", hn = "_voltro_storage_object_claims", gn = [
2170
- N(pn, {
2171
- id: P().maxLength(64),
2172
- nonce: P()
2246
+ }, gn = (e) => b.succeed(i, hn(e)), _n = "_voltro_storage_operation_locks", Q = "_voltro_storage_object_heads", vn = "_voltro_storage_operations", yn = "_voltro_storage_object_claims", bn = [
2247
+ P(_n, {
2248
+ id: F().maxLength(64),
2249
+ nonce: F()
2173
2250
  }).primaryKey(["id"]).nonReactive(),
2174
- N(Q, {
2175
- id: P().maxLength(64),
2176
- generation: P(),
2177
- key: P(),
2251
+ P(Q, {
2252
+ id: F().maxLength(64),
2253
+ generation: F(),
2254
+ key: F(),
2178
2255
  reservations: E()
2179
2256
  }).primaryKey(["id"]).nonReactive(),
2180
- N(mn, {
2181
- id: P().maxLength(64),
2182
- objectId: P().maxLength(64),
2183
- fingerprint: P().maxLength(64),
2184
- generation: P(),
2185
- key: P(),
2186
- refId: P(),
2187
- state: P(),
2188
- deleteKey: P().nullable()
2257
+ P(vn, {
2258
+ id: F().maxLength(64),
2259
+ objectId: F().maxLength(64),
2260
+ fingerprint: F().maxLength(64),
2261
+ generation: F(),
2262
+ key: F(),
2263
+ refId: F(),
2264
+ state: F(),
2265
+ deleteKey: F().nullable()
2189
2266
  }).primaryKey(["id"]).nonReactive(),
2190
- N(hn, {
2191
- id: P().maxLength(64),
2192
- operationId: P().maxLength(64),
2193
- claim: P()
2267
+ P(yn, {
2268
+ id: F().maxLength(64),
2269
+ operationId: F().maxLength(64),
2270
+ claim: F()
2194
2271
  }).primaryKey(["id"]).nonReactive()
2195
- ], _n = C.Struct({
2196
- id: C.String,
2197
- objectId: C.String,
2198
- fingerprint: C.String,
2199
- generation: C.String,
2200
- key: C.String,
2201
- refId: C.String,
2202
- state: C.Literal("reserved", "ready", "deleting", "deleted"),
2203
- deleteKey: C.NullOr(C.String)
2204
- }), vn = C.Struct({
2205
- id: C.String,
2206
- generation: C.String,
2207
- key: C.String,
2208
- reservations: C.Int.pipe(C.nonNegative())
2209
- }), yn = (e) => C.decodeUnknownSync(vn)({
2272
+ ], xn = S.Struct({
2273
+ id: S.String,
2274
+ objectId: S.String,
2275
+ fingerprint: S.String,
2276
+ generation: S.String,
2277
+ key: S.String,
2278
+ refId: S.String,
2279
+ state: S.Literals([
2280
+ "reserved",
2281
+ "ready",
2282
+ "deleting",
2283
+ "deleted"
2284
+ ]),
2285
+ deleteKey: S.NullOr(S.String)
2286
+ }), Sn = S.Struct({
2287
+ id: S.String,
2288
+ generation: S.String,
2289
+ key: S.String,
2290
+ reservations: S.Int.pipe(S.check(S.isGreaterThanOrEqualTo(0)))
2291
+ }), Cn = (e) => S.decodeUnknownSync(Sn)({
2210
2292
  ...e,
2211
- reservations: U(e.reservations, "shared-object reservation count")
2212
- }), bn = (e) => Ce("sha256").update(JSON.stringify(e)).digest("hex"), xn = (e, t) => bn([e, t]), Sn = (e) => {
2293
+ reservations: W(e.reservations, "shared-object reservation count")
2294
+ }), wn = (e) => Ce("sha256").update(JSON.stringify(e)).digest("hex"), Tn = (e, t) => wn([e, t]), En = (e) => {
2213
2295
  if (!e.bucket || !e.operationId || !e.logicalKey || !/^[a-f0-9]{64}$/.test(e.fingerprint) || !/^[a-f0-9]{64}$/.test(e.checksum)) throw Error("Storage operation requires a bucket, operation identity, key and SHA-256 fingerprint");
2214
2296
  return {
2215
- id: bn([
2297
+ id: wn([
2216
2298
  e.bucket,
2217
2299
  e.tenantId,
2218
2300
  e.operationId
2219
2301
  ]),
2220
- objectId: bn([
2302
+ objectId: wn([
2221
2303
  e.bucket,
2222
2304
  e.tenantId,
2223
2305
  e.logicalKey,
2224
2306
  e.checksum
2225
2307
  ]),
2226
- lockId: bn([e.tenantId])
2308
+ lockId: wn([e.tenantId])
2227
2309
  };
2228
- }, Cn = async (e, t, n) => {
2229
- let { lockId: r } = Sn(t);
2230
- return await e.insertIgnoreWithOutcome(pn, {
2310
+ }, Dn = async (e, t, n) => {
2311
+ let { lockId: r } = En(t);
2312
+ return await e.insertIgnoreWithOutcome(_n, {
2231
2313
  id: r,
2232
2314
  nonce: Te()
2233
2315
  }, { conflictColumns: ["id"] }), e.transactional(async (e) => {
2234
2316
  if ((await e.query({
2235
- table: pn,
2236
- predicate: O("id", r),
2317
+ table: _n,
2318
+ predicate: k("id", r),
2237
2319
  lock: "update",
2238
2320
  order: [],
2239
2321
  take: 1,
2240
2322
  skip: void 0,
2241
2323
  projection: void 0
2242
- })).length !== 1 || await e.update(pn, r, { nonce: Te() }) === null) throw Error("Storage operation lock is unavailable");
2324
+ })).length !== 1 || await e.update(_n, r, { nonce: Te() }) === null) throw Error("Storage operation lock is unavailable");
2243
2325
  return n(e);
2244
2326
  });
2245
2327
  }, $ = async (e, t) => {
2246
- let r = Sn(t), i = await e.query({
2247
- table: mn,
2248
- predicate: O("id", r.id),
2328
+ let r = En(t), i = await e.query({
2329
+ table: vn,
2330
+ predicate: k("id", r.id),
2249
2331
  order: [],
2250
2332
  take: 1,
2251
2333
  skip: void 0,
2252
2334
  projection: void 0
2253
2335
  });
2254
2336
  if (!i[0]) return;
2255
- let a = C.decodeUnknownSync(_n)(i[0]);
2337
+ let a = S.decodeUnknownSync(xn)(i[0]);
2256
2338
  if (a.fingerprint !== t.fingerprint || a.objectId !== r.objectId) throw new n({
2257
2339
  reason: "operation-identity-reused",
2258
2340
  detail: `storage operation '${t.operationId}' was already used with different inputs`
2259
2341
  });
2260
2342
  return a;
2261
- }, wn = async (e, t) => {
2343
+ }, On = async (e, t) => {
2262
2344
  let n = await $(e, t);
2263
2345
  if (n) return n;
2264
- let { id: r, objectId: i } = Sn(t), a = await e.query({
2346
+ let { id: r, objectId: i } = En(t), a = await e.query({
2265
2347
  table: Q,
2266
- predicate: O("id", i),
2348
+ predicate: k("id", i),
2267
2349
  order: [],
2268
2350
  take: 1,
2269
2351
  skip: void 0,
2270
2352
  projection: void 0
2271
- }), o = a[0] ? yn(a[0]) : void 0, s = o?.generation ?? Te(), c = o?.key ?? `${t.logicalKey}/g-${s}`;
2272
- o ? await e.update(Q, i, { reservations: String(W(o.reservations, 1, "shared-object reservation count")) }) : await e.insert(Q, {
2353
+ }), o = a[0] ? Cn(a[0]) : void 0, s = o?.generation ?? Te(), c = o?.key ?? `${t.logicalKey}/g-${s}`;
2354
+ o ? await e.update(Q, i, { reservations: String(Je(o.reservations, 1, "shared-object reservation count")) }) : await e.insert(Q, {
2273
2355
  id: i,
2274
2356
  generation: s,
2275
2357
  key: c,
@@ -2285,31 +2367,31 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2285
2367
  state: "reserved",
2286
2368
  deleteKey: null
2287
2369
  };
2288
- return await e.insert(mn, l), l;
2289
- }, Tn = async (e, t) => {
2370
+ return await e.insert(vn, l), l;
2371
+ }, kn = async (e, t) => {
2290
2372
  let n = await $(e, t);
2291
2373
  if (!n) throw Error("Storage operation is missing");
2292
2374
  if (n.state === "deleting" || n.state === "deleted") throw Error("Deleted storage operation cannot be confirmed by a late put");
2293
- return await e.update(mn, n.id, { state: "ready" }), {
2375
+ return await e.update(vn, n.id, { state: "ready" }), {
2294
2376
  ...n,
2295
2377
  state: "ready"
2296
2378
  };
2297
- }, En = async (e, t) => {
2379
+ }, An = async (e, t) => {
2298
2380
  let n = await $(e, t);
2299
2381
  if (!n) throw Error("Storage operation is missing");
2300
2382
  if (n.state === "deleting" || n.state === "deleted") return n;
2301
2383
  if (n.state !== "ready") throw Error("An unconfirmed put cannot be deleted");
2302
2384
  let r = await e.query({
2303
2385
  table: Q,
2304
- predicate: O("id", n.objectId),
2386
+ predicate: k("id", n.objectId),
2305
2387
  order: [],
2306
2388
  take: 1,
2307
2389
  skip: void 0,
2308
2390
  projection: void 0
2309
- }), i = r[0] ? yn(r[0]) : void 0;
2391
+ }), i = r[0] ? Cn(r[0]) : void 0;
2310
2392
  if (!i || i.generation !== n.generation || i.reservations < 1) throw Error("Storage object generation does not own its reservation");
2311
2393
  let a = i.reservations === 1 ? i.key : null;
2312
- return a === null ? await e.update(Q, i.id, { reservations: String(i.reservations - 1) }) : await e.delete(Q, i.id), await e.update(mn, n.id, {
2394
+ return a === null ? await e.update(Q, i.id, { reservations: String(i.reservations - 1) }) : await e.delete(Q, i.id), await e.update(vn, n.id, {
2313
2395
  state: "deleting",
2314
2396
  deleteKey: a
2315
2397
  }), {
@@ -2317,46 +2399,46 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2317
2399
  state: "deleting",
2318
2400
  deleteKey: a
2319
2401
  };
2320
- }, Dn = async (e, t) => {
2402
+ }, jn = async (e, t) => {
2321
2403
  let n = await $(e, t);
2322
2404
  if (!n || n.state !== "deleting" && n.state !== "deleted") throw Error("Storage deletion has not been accepted");
2323
- return n.state !== "deleted" && (await e.update(mn, n.id, { state: "deleted" }), !0);
2324
- }, On = async (e, t, n) => {
2405
+ return n.state !== "deleted" && (await e.update(vn, n.id, { state: "deleted" }), !0);
2406
+ }, Mn = async (e, t, n) => {
2325
2407
  if (!n) throw Error("Storage object claim must be a non-empty string");
2326
- await e.insertIgnoreWithOutcome(hn, {
2327
- id: xn(t, n),
2408
+ await e.insertIgnoreWithOutcome(yn, {
2409
+ id: Tn(t, n),
2328
2410
  operationId: t,
2329
2411
  claim: n
2330
2412
  }, { conflictColumns: ["id"] });
2331
- }, kn = async (e, t, n) => {
2332
- let r = xn(t, n);
2413
+ }, Nn = async (e, t, n) => {
2414
+ let r = Tn(t, n);
2333
2415
  return {
2334
- held: await e.delete(hn, r),
2416
+ held: await e.delete(yn, r),
2335
2417
  others: (await e.query({
2336
- table: hn,
2337
- predicate: T(O("operationId", t), ve("claim", n)),
2418
+ table: yn,
2419
+ predicate: ue(k("operationId", t), ve("claim", n)),
2338
2420
  order: [],
2339
2421
  take: 1,
2340
2422
  skip: void 0,
2341
2423
  projection: void 0
2342
2424
  })).length > 0
2343
2425
  };
2344
- }, An = (e, t) => e.deleteMany(hn, { where: O("operationId", t) }), jn = "_voltro_storage_put_intents", Mn = N(jn, {
2345
- id: P().maxLength(64),
2346
- refId: P().maxLength(64),
2426
+ }, Pn = (e, t) => e.deleteMany(yn, { where: k("operationId", t) }), Fn = "_voltro_storage_put_intents", In = P(Fn, {
2427
+ id: F().maxLength(64),
2428
+ refId: F().maxLength(64),
2347
2429
  identity: ge(),
2348
2430
  ref: ge()
2349
- }).primaryKey(["id"]).unique("storagePutRef", ["refId"]).nonReactive(), Nn = C.Struct({
2350
- tenantId: C.NullOr(C.String),
2351
- bucket: C.String,
2352
- operationId: C.String,
2353
- fingerprint: C.String,
2354
- checksum: C.String,
2355
- logicalKey: C.String
2356
- }), Pn = async (e, t) => {
2431
+ }).primaryKey(["id"]).unique("storagePutRef", ["refId"]).nonReactive(), Ln = S.Struct({
2432
+ tenantId: S.NullOr(S.String),
2433
+ bucket: S.String,
2434
+ operationId: S.String,
2435
+ fingerprint: S.String,
2436
+ checksum: S.String,
2437
+ logicalKey: S.String
2438
+ }), Rn = async (e, t) => {
2357
2439
  let n = await e.query({
2358
- table: jn,
2359
- predicate: O("refId", t),
2440
+ table: Fn,
2441
+ predicate: k("refId", t),
2360
2442
  order: [],
2361
2443
  take: 2,
2362
2444
  skip: void 0,
@@ -2364,7 +2446,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2364
2446
  });
2365
2447
  if (n.length === 0) return;
2366
2448
  if (n.length !== 1) throw Error("Storage reference has ambiguous operation ownership");
2367
- let r = n[0], i = C.decodeUnknownSync(Nn)(r.identity);
2449
+ let r = n[0], i = S.decodeUnknownSync(Ln)(r.identity);
2368
2450
  if (typeof r.ref != "object" || r.ref === null || Array.isArray(r.ref)) throw Error("Storage operation reference is unreadable");
2369
2451
  let a = X(r.ref);
2370
2452
  if (a.id !== t || a.bucket !== i.bucket || a.tenantId !== i.tenantId || a.checksum !== i.checksum || !Number.isSafeInteger(a.size) || a.size < 0 || !Number.isFinite(a.createdAt.getTime())) throw Error("Storage operation reference does not match its identity");
@@ -2372,24 +2454,24 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2372
2454
  identity: i,
2373
2455
  ref: a
2374
2456
  };
2375
- }, Fn = (e) => ({
2376
- intent: (t) => Pn(e, t),
2377
- reserve: (t, r, i, a) => Cn(e, t, async (e) => {
2457
+ }, zn = (e) => ({
2458
+ intent: (t) => Rn(e, t),
2459
+ reserve: (t, r, i, a) => Dn(e, t, async (e) => {
2378
2460
  if (r.tenantId !== t.tenantId || r.bucket !== t.bucket || r.checksum !== t.checksum || !Number.isSafeInteger(r.size) || r.size < 0) throw Error("Storage put metadata does not match its identity");
2379
2461
  let o = await $(e, t);
2380
2462
  if (o) {
2381
2463
  if (o.state === "deleting" || o.state === "deleted") throw Error("Storage put identity has already been deleted");
2382
- let t = await Pn(e, o.refId);
2464
+ let t = await Rn(e, o.refId);
2383
2465
  if (!t) throw Error("Storage operation lost its put intent");
2384
2466
  let n = o.state === "ready";
2385
- return n && a !== void 0 && await On(e, o.id, a), {
2467
+ return n && a !== void 0 && await Mn(e, o.id, a), {
2386
2468
  ref: t.ref,
2387
2469
  ready: n,
2388
2470
  outcome: n ? "joined" : "resumed"
2389
2471
  };
2390
2472
  }
2391
- let s = await wn(e, t), c = an(e);
2392
- if (!(await y.runPromise(c.consumeUsage(t.tenantId, {
2473
+ let s = await On(e, t), c = ln(e);
2474
+ if (!(await v.runPromise(c.consumeUsage(t.tenantId, {
2393
2475
  bytes: r.size,
2394
2476
  count: 1
2395
2477
  }, i))).allowed) throw new n({
@@ -2401,7 +2483,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2401
2483
  id: s.refId,
2402
2484
  key: s.key
2403
2485
  });
2404
- return await e.insert(jn, {
2486
+ return await e.insert(Fn, {
2405
2487
  id: s.id,
2406
2488
  refId: l.id,
2407
2489
  identity: t,
@@ -2412,31 +2494,31 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2412
2494
  outcome: "created"
2413
2495
  };
2414
2496
  }),
2415
- confirm: (t, n) => Cn(e, t, async (e) => {
2497
+ confirm: (t, n) => Dn(e, t, async (e) => {
2416
2498
  let r = await $(e, t);
2417
2499
  if (!r) throw Error("Storage put operation is missing");
2418
- let i = await Pn(e, r.refId);
2500
+ let i = await Rn(e, r.refId);
2419
2501
  if (!i) throw Error("Storage put intent is missing");
2420
- if (n !== void 0 && await On(e, r.id, n), r.state === "ready") {
2421
- let n = await y.runPromise(an(e).getById(r.refId));
2502
+ if (n !== void 0 && await Mn(e, r.id, n), r.state === "ready") {
2503
+ let n = await v.runPromise(ln(e).getById(r.refId));
2422
2504
  if (!n || n.key !== r.key || n.checksum !== t.checksum) throw Error("Confirmed storage operation lost its reference");
2423
2505
  return n;
2424
2506
  }
2425
- return await Tn(e, t), await y.runPromise(an(e).insert(i.ref)), i.ref;
2507
+ return await kn(e, t), await v.runPromise(ln(e).insert(i.ref)), i.ref;
2426
2508
  }),
2427
2509
  beginDelete: async (t, r, i) => {
2428
- let a = await Pn(e, t);
2510
+ let a = await Rn(e, t);
2429
2511
  if (!a) throw Error("Storage delete operation is missing");
2430
2512
  if (r !== void 0 && a.identity.tenantId !== r) throw Error("Storage delete tenant mismatch");
2431
- return Cn(e, a.identity, async (e) => {
2432
- let r = await Pn(e, t);
2513
+ return Dn(e, a.identity, async (e) => {
2514
+ let r = await Rn(e, t);
2433
2515
  if (!r) throw Error("Storage delete intent disappeared");
2434
2516
  let a = await $(e, r.identity);
2435
2517
  if (!a) throw Error("Storage delete lost its operation");
2436
2518
  let o = a.state !== "deleting" && a.state !== "deleted";
2437
- if (i === void 0) o && await An(e, a.id);
2519
+ if (i === void 0) o && await Pn(e, a.id);
2438
2520
  else if (o) {
2439
- let o = await kn(e, a.id, i);
2521
+ let o = await Nn(e, a.id, i);
2440
2522
  if (o.others) return {
2441
2523
  released: !0,
2442
2524
  identity: r.identity
@@ -2446,11 +2528,11 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2446
2528
  detail: `claim '${i}' is not held on storage reference '${t}'; a reference put without a claim is deleted as a whole by a delete that names none`
2447
2529
  });
2448
2530
  }
2449
- let s = await En(e, r.identity);
2531
+ let s = await An(e, r.identity);
2450
2532
  if (a.state === "ready") {
2451
- let n = an(e);
2452
- if (await y.runPromise(cn(e).deleteByRef(t)), !await y.runPromise(n.delete(t))) throw Error("Storage deletion lost its confirmed reference");
2453
- await y.runPromise(n.releaseUsage(r.identity.tenantId, {
2533
+ let n = ln(e);
2534
+ if (await v.runPromise(fn(e).deleteByRef(t)), !await v.runPromise(n.delete(t))) throw Error("Storage deletion lost its confirmed reference");
2535
+ await v.runPromise(n.releaseUsage(r.identity.tenantId, {
2454
2536
  bytes: r.ref.size,
2455
2537
  count: 1
2456
2538
  }));
@@ -2462,8 +2544,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2462
2544
  };
2463
2545
  });
2464
2546
  },
2465
- confirmDelete: (t) => Cn(e, t, (e) => Dn(e, t))
2466
- }), In = (e, t = 65536) => {
2547
+ confirmDelete: (t) => Dn(e, t, (e) => jn(e, t))
2548
+ }), Bn = (e, t = 65536) => {
2467
2549
  let n = [Buffer.from("zINSTREAM\0", "utf8")];
2468
2550
  for (let r = 0; r < e.length; r += t) {
2469
2551
  let i = e.subarray(r, Math.min(r + t, e.length)), a = Buffer.alloc(4);
@@ -2471,7 +2553,7 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2471
2553
  }
2472
2554
  let r = Buffer.alloc(4);
2473
2555
  return r.writeUInt32BE(0, 0), n.push(r), Buffer.concat(n);
2474
- }, Ln = (e) => {
2556
+ }, Vn = (e) => {
2475
2557
  let t = e.replace(/\0+$/, "").trim();
2476
2558
  if (/\bOK$/.test(t)) return { clean: !0 };
2477
2559
  let n = /:\s*(.+?)\s+FOUND$/.exec(t);
@@ -2480,8 +2562,8 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2480
2562
  threat: n[1] ?? "unknown"
2481
2563
  };
2482
2564
  throw Error(`clamav: unexpected response: ${t}`);
2483
- }, Rn = async (e, t) => {
2484
- let n = await import("node:net"), r = H.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = H.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
2565
+ }, Hn = async (e, t) => {
2566
+ let n = await import("node:net"), r = U.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = U.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
2485
2567
  return new Promise((i, s) => {
2486
2568
  let c = n.createConnection({
2487
2569
  host: r,
@@ -2492,20 +2574,20 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2492
2574
  c.on("error", (e) => {
2493
2575
  clearTimeout(u), s(e);
2494
2576
  }), c.on("connect", () => {
2495
- c.end(In(e, t.chunkSize));
2577
+ c.end(Bn(e, t.chunkSize));
2496
2578
  }), c.on("data", (e) => {
2497
2579
  l += e.toString("utf8");
2498
2580
  }), c.on("close", () => {
2499
2581
  clearTimeout(u);
2500
2582
  try {
2501
- i(Ln(l));
2583
+ i(Vn(l));
2502
2584
  } catch (e) {
2503
2585
  s(e);
2504
2586
  }
2505
2587
  });
2506
2588
  });
2507
- }, zn = (e = {}) => (t) => Rn(t.bytes, e), Bn = (e, t, n) => new Promise((r, i) => {
2508
- let a = R(e, [...t], { stdio: [
2589
+ }, Un = (e = {}) => (t) => Hn(t.bytes, e), Wn = (e, t, n) => new Promise((r, i) => {
2590
+ let a = Oe(e, [...t], { stdio: [
2509
2591
  "ignore",
2510
2592
  "ignore",
2511
2593
  "pipe"
@@ -2519,21 +2601,21 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2519
2601
  }), a.on("close", (e) => {
2520
2602
  clearTimeout(s), e === 0 ? r() : i(/* @__PURE__ */ Error(`ffmpeg exited ${String(e)}: ${o.slice(-400)}`));
2521
2603
  });
2522
- }), Vn = (e) => async ({ bytes: t }) => {
2523
- let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await De(Me(je(), "voltro-tc-")), a = Me(i, "in"), o = [];
2604
+ }), Gn = (e) => async ({ bytes: t }) => {
2605
+ let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await R(Me(je(), "voltro-tc-")), a = Me(i, "in"), o = [];
2524
2606
  try {
2525
2607
  await Ae(a, t);
2526
2608
  for (let t of e.renditions) {
2527
2609
  let e = Me(i, `out.${t.ext}`);
2528
2610
  try {
2529
- await Bn(n, [
2611
+ await Wn(n, [
2530
2612
  "-y",
2531
2613
  "-i",
2532
2614
  a,
2533
2615
  ...t.args,
2534
2616
  e
2535
2617
  ], r);
2536
- let i = await Oe(e);
2618
+ let i = await z(e);
2537
2619
  o.push({
2538
2620
  bytes: new Uint8Array(i),
2539
2621
  contentType: t.contentType,
@@ -2552,21 +2634,21 @@ var Pe = 1 << 20, Fe = (e, n, r = !1) => new t({
2552
2634
  };
2553
2635
  //#endregion
2554
2636
  //#region src/assetRef.ts
2555
- function Hn(e = {}) {
2556
- let t = e.nullable ?? !0, n = e.fk === !1 ? P().externalId() : ye(() => We, { onDelete: e.onDelete ?? "setNull" });
2637
+ function Kn(e = {}) {
2638
+ let t = e.nullable ?? !0, n = e.fk === !1 ? F().externalId() : ye(() => We, { onDelete: e.onDelete ?? "setNull" });
2557
2639
  return t ? n.nullable() : n;
2558
2640
  }
2559
- var Un = () => _e({
2641
+ var qn = () => _e({
2560
2642
  id: "@voltro/plugin-storage/withStorage",
2561
- fields: { asset: Hn() }
2562
- }), Wn = {
2643
+ fields: { asset: Kn() }
2644
+ }), Jn = {
2563
2645
  "image/png": "png",
2564
2646
  "image/jpeg": "jpg",
2565
2647
  "image/jpg": "jpg",
2566
2648
  "image/gif": "gif",
2567
2649
  "image/webp": "webp",
2568
2650
  "image/svg+xml": "svg"
2569
- }, Gn = (e) => {
2651
+ }, Yn = (e) => {
2570
2652
  let t = /^data:([^;,]+)(;base64)?,(.*)$/s.exec(e);
2571
2653
  if (!t) throw Error("not a data URI");
2572
2654
  let n = t[1] || "application/octet-stream", r = !!t[2], i = t[3] ?? "";
@@ -2574,16 +2656,16 @@ var Un = () => _e({
2574
2656
  bytes: r ? new Uint8Array(Buffer.from(i, "base64")) : new Uint8Array(Buffer.from(decodeURIComponent(i), "utf8")),
2575
2657
  contentType: n
2576
2658
  };
2577
- }, Kn = (e, n) => y.gen(function* () {
2578
- let r = yield* y.try({
2579
- try: () => Gn(n.dataUri),
2659
+ }, Xn = (e, n) => v.gen(function* () {
2660
+ let r = yield* v.try({
2661
+ try: () => Yn(n.dataUri),
2580
2662
  catch: (e) => new t({
2581
2663
  provider: "avatar",
2582
2664
  message: String(e?.message ?? e),
2583
2665
  transient: !1,
2584
2666
  status: 400
2585
2667
  })
2586
- }), i = Wn[r.contentType] ?? "bin";
2668
+ }), i = Jn[r.contentType] ?? "bin";
2587
2669
  return yield* e.put({
2588
2670
  bytes: r.bytes,
2589
2671
  contentType: r.contentType,
@@ -2592,27 +2674,27 @@ var Un = () => _e({
2592
2674
  visibility: "public",
2593
2675
  key: `avatars/${n.userId}/avatar.${i}`
2594
2676
  });
2595
- }), qn = (e) => {
2677
+ }), Zn = (e) => {
2596
2678
  try {
2597
2679
  let t = Ne(e), n = Ne("/");
2598
2680
  return typeof t.dev != "number" || typeof n.dev != "number" ? "unknown" : t.dev === n.dev ? "same-device-as-root" : "separate-mount";
2599
2681
  } catch {
2600
2682
  return "unknown";
2601
2683
  }
2602
- }, Jn = (e) => {
2603
- if (qn(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
2684
+ }, Qn = (e) => {
2685
+ if (Zn(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
2604
2686
  dies with it — which is the exact failure it exists for. On a development machine this is normal
2605
2687
  and can be ignored.`;
2606
- }, Yn = H.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", Xn, Zn = (e) => {
2607
- Xn = e;
2608
- }, Qn = () => Xn ?? er({}), $n = () => Xn === void 0 ? H.read("STORAGE_PROVIDER") === void 0 ? void 0 : er({}) : Xn, er = (e) => {
2688
+ }, $n = U.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", er, tr = (e) => {
2689
+ er = e;
2690
+ }, nr = () => er ?? ir({}), rr = () => er === void 0 ? U.read("STORAGE_PROVIDER") === void 0 ? void 0 : ir({}) : er, ir = (e) => {
2609
2691
  if (e.provider && typeof e.provider == "object") return e.provider;
2610
- let t = (e.provider ?? H.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = H.read("S3_BUCKET", e.bucket) ?? H.read("STORAGE_BUCKET") ?? "voltro";
2692
+ let t = (e.provider ?? U.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = U.read("S3_BUCKET", e.bucket) ?? U.read("STORAGE_BUCKET") ?? "voltro";
2611
2693
  switch (t) {
2612
2694
  case "s3":
2613
2695
  case "minio": {
2614
- let r = H.read("S3_REGION", e.region) ?? H.read("AWS_REGION"), i = H.read("S3_ENDPOINT", e.endpoint) ?? H.read("MINIO_ENDPOINT"), a = H.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? H.read("AWS_ACCESS_KEY_ID"), o = H.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? H.read("AWS_SECRET_ACCESS_KEY"), s = H.read("STORAGE_CDN_URL", e.cdnBaseUrl);
2615
- return tt({
2696
+ let r = U.read("S3_REGION", e.region) ?? U.read("AWS_REGION"), i = U.read("S3_ENDPOINT", e.endpoint) ?? U.read("MINIO_ENDPOINT"), a = U.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? U.read("AWS_ACCESS_KEY_ID"), o = U.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? U.read("AWS_SECRET_ACCESS_KEY"), s = U.read("STORAGE_CDN_URL", e.cdnBaseUrl);
2697
+ return nt({
2616
2698
  bucket: n,
2617
2699
  name: t,
2618
2700
  ...r ? { region: r } : {},
@@ -2621,13 +2703,13 @@ var Un = () => _e({
2621
2703
  ...o ? { secretAccessKey: o } : {},
2622
2704
  ...s ? { cdnBaseUrl: s } : {},
2623
2705
  ...e.publicAcl === void 0 ? {} : { publicAcl: e.publicAcl },
2624
- ...t === "minio" || H.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
2706
+ ...t === "minio" || U.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
2625
2707
  });
2626
2708
  }
2627
2709
  case "azure": {
2628
- let t = H.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = H.read("AZURE_STORAGE_KEY", e.accountKey), i = H.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = H.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = H.read("STORAGE_CDN_URL", e.cdnBaseUrl);
2629
- return it({
2630
- container: H.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
2710
+ let t = U.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = U.read("AZURE_STORAGE_KEY", e.accountKey), i = U.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = U.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = U.read("STORAGE_CDN_URL", e.cdnBaseUrl);
2711
+ return at({
2712
+ container: U.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
2631
2713
  ...t ? { accountName: t } : {},
2632
2714
  ...r ? { accountKey: r } : {},
2633
2715
  ...i ? { connectionString: i } : {},
@@ -2635,11 +2717,11 @@ var Un = () => _e({
2635
2717
  ...o ? { cdnBaseUrl: o } : {}
2636
2718
  });
2637
2719
  }
2638
- case "database": return rt();
2639
- case "filesystem": return et({ root: H.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
2640
- default: return $e(e.name ?? "default");
2720
+ case "database": return it();
2721
+ case "filesystem": return tt({ root: U.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
2722
+ default: return et(e.name ?? "default");
2641
2723
  }
2642
- }, tr = (e) => {
2724
+ }, ar = (e) => {
2643
2725
  let t = "stored files (uploads, renditions) and their reads", n = "provider 'database' or 'filesystem' keeps the bytes inside the installation";
2644
2726
  if (e.provider && typeof e.provider == "object") return [{
2645
2727
  destination: `runtime:the '${e.provider.name}' storage provider`,
@@ -2647,9 +2729,9 @@ var Un = () => _e({
2647
2729
  data: ["files"],
2648
2730
  disable: n
2649
2731
  }];
2650
- let r = (e.provider ?? H.read("STORAGE_PROVIDER") ?? "memory").toLowerCase();
2732
+ let r = (e.provider ?? U.read("STORAGE_PROVIDER") ?? "memory").toLowerCase();
2651
2733
  if (r === "s3" || r === "minio") {
2652
- let r = H.read("S3_ENDPOINT", e.endpoint) ?? H.read("MINIO_ENDPOINT"), i = H.read("S3_REGION", e.region) ?? H.read("AWS_REGION") ?? "us-east-1";
2734
+ let r = U.read("S3_ENDPOINT", e.endpoint) ?? U.read("MINIO_ENDPOINT"), i = U.read("S3_REGION", e.region) ?? U.read("AWS_REGION") ?? "us-east-1";
2653
2735
  return [{
2654
2736
  destination: r ?? `s3.${i}.amazonaws.com`,
2655
2737
  purpose: t,
@@ -2658,7 +2740,7 @@ var Un = () => _e({
2658
2740
  }];
2659
2741
  }
2660
2742
  if (r === "azure") {
2661
- let r = H.read("AZURE_STORAGE_ENDPOINT", e.endpoint), i = H.read("AZURE_STORAGE_ACCOUNT", e.accountName);
2743
+ let r = U.read("AZURE_STORAGE_ENDPOINT", e.endpoint), i = U.read("AZURE_STORAGE_ACCOUNT", e.accountName);
2662
2744
  return [{
2663
2745
  destination: r ?? (i === void 0 ? "runtime:the Azure storage connection string" : `${i}.blob.core.windows.net`),
2664
2746
  purpose: t,
@@ -2667,11 +2749,11 @@ var Un = () => _e({
2667
2749
  }];
2668
2750
  }
2669
2751
  return [];
2670
- }, nr = (e) => {
2752
+ }, or = (e) => {
2671
2753
  if (e !== void 0) return e;
2672
- let t = H.read("STORAGE_ALLOWED_ORIGINS");
2754
+ let t = U.read("STORAGE_ALLOWED_ORIGINS");
2673
2755
  return t ? t.trim() === "*" ? "*" : t.split(",").map((e) => e.trim()).filter(Boolean) : [];
2674
- }, rr = (e, t) => {
2756
+ }, sr = (e, t) => {
2675
2757
  if (!e || t !== "*" && !t.includes(e)) return {};
2676
2758
  let n = {
2677
2759
  "access-control-allow-origin": t === "*" ? "*" : e,
@@ -2681,7 +2763,7 @@ var Un = () => _e({
2681
2763
  vary: "Origin"
2682
2764
  };
2683
2765
  return t !== "*" && (n["access-control-allow-credentials"] = "true"), n;
2684
- }, ir = (e) => ({
2766
+ }, cr = (e) => ({
2685
2767
  id: e.id,
2686
2768
  tenantId: e.tenantId,
2687
2769
  ownerId: e.ownerId,
@@ -2704,29 +2786,29 @@ var Un = () => _e({
2704
2786
  caption: e.caption ?? null,
2705
2787
  derivedFrom: e.derivedFrom ?? null,
2706
2788
  kind: e.kind ?? null
2707
- }), ar = () => new t({
2789
+ }), lr = () => new t({
2708
2790
  provider: "storage",
2709
2791
  message: "not permitted to administer sharing for this object",
2710
2792
  transient: !1,
2711
2793
  status: 403
2712
- }), or = (e, t, n) => {
2794
+ }), ur = (e, t, n) => {
2713
2795
  let r = n.request.subject;
2714
- return (r.scopes ?? []).includes("admin:full") ? y.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(y.catchAll(() => y.fail(ar())), y.flatMap((e) => {
2796
+ return (r.scopes ?? []).includes("admin:full") ? v.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(v.catch(() => v.fail(lr())), v.flatMap((e) => {
2715
2797
  let t = e?.ownerId;
2716
- return t != null && t === r.id ? y.void : y.fail(ar());
2798
+ return t != null && t === r.id ? v.void : v.fail(lr());
2717
2799
  }));
2718
- }, sr = () => new t({
2800
+ }, dr = () => new t({
2719
2801
  provider: "storage",
2720
2802
  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.",
2721
2803
  transient: !1,
2722
2804
  status: 401
2723
- }), cr = (e, t) => {
2805
+ }), fr = (e, t) => {
2724
2806
  let n = e.request.subject.id ?? null, r = e.request.subject.tenantId ?? null;
2725
- return n === null && !t ? y.fail(sr()) : y.succeed({
2807
+ return n === null && !t ? v.fail(dr()) : v.succeed({
2726
2808
  id: n,
2727
2809
  tenantId: r
2728
2810
  });
2729
- }, lr = (e, t) => e !== null && e !== (t ?? null), ur = (e) => ({
2811
+ }, pr = (e, t) => e !== null && e !== (t ?? null), mr = (e) => ({
2730
2812
  id: e.id,
2731
2813
  refId: e.refId,
2732
2814
  principalType: e.principalType,
@@ -2735,47 +2817,79 @@ var Un = () => _e({
2735
2817
  createdAt: e.createdAt.toISOString(),
2736
2818
  expiresAt: e.expiresAt ? e.expiresAt.toISOString() : null,
2737
2819
  createdBy: e.createdBy
2738
- }), dr = "@voltro/plugin-storage", fr = (e = {}) => oe({
2739
- base: dr,
2820
+ }), hr = "@voltro/plugin-storage", gr = (e = {}) => w({
2821
+ base: hr,
2740
2822
  alias: e.alias,
2741
2823
  instance: e.name
2742
- }), pr = (i = {}) => {
2743
- let v = oe({
2744
- base: dr,
2824
+ }), _r = (i = {}) => {
2825
+ let y = w({
2826
+ base: hr,
2745
2827
  alias: i.alias,
2746
2828
  instance: i.name
2747
- }), b = v === dr ? "/_voltro/storage" : `/_voltro/storage/i/${Buffer.from(v).toString("hex")}`, x = er(i);
2748
- Zn(x);
2749
- let S = H.read("S3_BUCKET", i.bucket) ?? H.read("STORAGE_BUCKET") ?? "voltro", T = H.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), ue = nr(i.allowedOrigins), E = i.limits?.maxBytes, D = i.anonymousUploads === !0, de = 5242880, fe = 21600, pe = i.refStore === void 0 || i.refStore === "memory", O = i.grantStore === void 0 || i.grantStore === "memory", me = (e) => e !== "public" && i.uploadAccess !== void 0 ? { access: i.uploadAccess } : {}, k = { current: pe ? tn() : i.refStore }, A = { current: O ? on() : i.grantStore }, j = { current: void 0 }, he = {
2750
- insert: (e) => k.current.insert(e),
2751
- getById: (e) => k.current.getById(e),
2752
- delete: (e) => k.current.delete(e),
2753
- statistics: () => k.current.statistics(),
2754
- listRecent: (e) => k.current.listRecent(e),
2755
- countByKey: (e, t) => k.current.countByKey(e, t),
2756
- usageByTenant: (e) => k.current.usageByTenant(e),
2757
- consumeUsage: (e, t, n) => k.current.consumeUsage(e, t, n),
2758
- releaseUsage: (e, t) => k.current.releaseUsage(e, t),
2759
- listByDerivedFrom: (e) => k.current.listByDerivedFrom(e),
2760
- listRefs: (e) => k.current.listRefs(e),
2829
+ }), b = y === hr ? "/_voltro/storage" : `/_voltro/storage/i/${Buffer.from(y).toString("hex")}`, x = ir(i);
2830
+ tr(x);
2831
+ let ue = U.read("S3_BUCKET", i.bucket) ?? U.read("STORAGE_BUCKET") ?? "voltro", T = U.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), E = or(i.allowedOrigins), D = i.limits?.maxBytes, O = i.anonymousUploads === !0, de = 5242880, fe = 21600, k = i.refStore === void 0 || i.refStore === "memory", pe = i.grantStore === void 0 || i.grantStore === "memory", A = (e, n) => v.gen(function* () {
2832
+ let r = (e) => S.decodeUnknownEffect(ae)(e, { onExcessProperty: "error" }).pipe(v.mapError(() => new t({
2833
+ provider: "storage",
2834
+ message: "Invalid upload access policy",
2835
+ transient: !1,
2836
+ status: 400
2837
+ }))), a = e.access === void 0 ? void 0 : yield* r(e.access), o = e.visibility ?? "private";
2838
+ if (a !== void 0 && o === "public") return yield* v.fail(new t({
2839
+ provider: "storage",
2840
+ message: "An access policy requires a private upload",
2841
+ transient: !1,
2842
+ status: 400
2843
+ }));
2844
+ let s = i.uploadAccess;
2845
+ if (a !== void 0 && typeof s != "function") return yield* v.fail(new t({
2846
+ provider: "storage",
2847
+ message: "Requested upload access requires an uploadAccess authorization function on storagePlugin",
2848
+ transient: !1,
2849
+ status: 403
2850
+ }));
2851
+ let c = typeof s == "function" ? yield* s({
2852
+ subject: n,
2853
+ requested: a,
2854
+ visibility: o,
2855
+ contentType: e.contentType
2856
+ }) : o === "private" ? s : void 0, l = c === void 0 ? void 0 : yield* r(c);
2857
+ return o === "public" ? l !== void 0 && l.length > 0 ? yield* v.fail(new t({
2858
+ provider: "storage",
2859
+ message: "A public upload cannot carry an access policy",
2860
+ transient: !1,
2861
+ status: 400
2862
+ })) : {} : l === void 0 ? {} : { access: l };
2863
+ }), j = { current: k ? on() : i.refStore }, M = { current: pe ? un() : i.grantStore }, me = { current: void 0 }, he = {
2864
+ insert: (e) => j.current.insert(e),
2865
+ getById: (e) => j.current.getById(e),
2866
+ delete: (e) => j.current.delete(e),
2867
+ statistics: () => j.current.statistics(),
2868
+ listRecent: (e) => j.current.listRecent(e),
2869
+ countByKey: (e, t) => j.current.countByKey(e, t),
2870
+ usageByTenant: (e) => j.current.usageByTenant(e),
2871
+ consumeUsage: (e, t, n) => j.current.consumeUsage(e, t, n),
2872
+ releaseUsage: (e, t) => j.current.releaseUsage(e, t),
2873
+ listByDerivedFrom: (e) => j.current.listByDerivedFrom(e),
2874
+ listRefs: (e) => j.current.listRefs(e),
2761
2875
  get setVisibility() {
2762
- return k.current.setVisibility;
2876
+ return j.current.setVisibility;
2763
2877
  },
2764
2878
  get countPublicByKey() {
2765
- return k.current.countPublicByKey;
2879
+ return j.current.countPublicByKey;
2766
2880
  }
2767
2881
  }, ge = {
2768
- insert: (e) => A.current.insert(e),
2769
- delete: (e) => A.current.delete(e),
2770
- getById: (e) => A.current.getById(e),
2771
- listByRef: (e) => A.current.listByRef(e),
2772
- deleteByRef: (e) => A.current.deleteByRef(e)
2882
+ insert: (e) => M.current.insert(e),
2883
+ delete: (e) => M.current.delete(e),
2884
+ getById: (e) => M.current.getById(e),
2885
+ listByRef: (e) => M.current.listByRef(e),
2886
+ deleteByRef: (e) => M.current.deleteByRef(e)
2773
2887
  }, _e = {
2774
2888
  httpPath: b,
2775
2889
  provider: x,
2776
2890
  refStore: he,
2777
2891
  grantStore: ge,
2778
- bucket: S,
2892
+ bucket: ue,
2779
2893
  ...i.tenantPrefix === void 0 ? {} : { tenantPrefix: i.tenantPrefix },
2780
2894
  ...i.attempts === void 0 ? {} : { attempts: i.attempts },
2781
2895
  ...i.urlExpiresInSec === void 0 ? {} : { urlExpiresInSec: i.urlExpiresInSec },
@@ -2789,8 +2903,8 @@ var Un = () => _e({
2789
2903
  ...T ? { publicBaseUrl: T } : {},
2790
2904
  ...i.normalizeImages === void 0 ? {} : { normalizeImages: i.normalizeImages },
2791
2905
  ...i.quota === void 0 ? {} : { quota: i.quota },
2792
- objects: () => j.current
2793
- }, ve = fn(_e), M = dn(_e), ye = `${b}/`, N = (e) => y.runPromise(e.pipe(y.catchAll(() => y.succeed(null)))), P = (e, t) => {
2906
+ objects: () => me.current
2907
+ }, ve = gn(_e), N = hn(_e), ye = `${b}/`, P = (e) => v.runPromise(e.pipe(v.catch(() => v.succeed(null)))), F = (e, t) => {
2794
2908
  if (!e) return "invalid";
2795
2909
  let n = /^bytes=(\d*)-(\d*)$/.exec(e.trim());
2796
2910
  if (!n) return "invalid";
@@ -2811,31 +2925,34 @@ var Un = () => _e({
2811
2925
  start: a,
2812
2926
  endInclusive: o
2813
2927
  };
2814
- }, be = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, xe = (e) => ({
2928
+ }, be = i.publicCacheSeconds === void 0 ? "public, max-age=31536000, immutable" : `public, max-age=${Math.max(0, Math.floor(i.publicCacheSeconds))}`, xe = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, Se = (e) => ({
2815
2929
  "x-content-type-options": "nosniff",
2816
- "content-disposition": be.test(e) ? "inline" : "attachment"
2817
- }), Se = async (e, t, n, r) => {
2930
+ "content-disposition": xe.test(e) ? "inline" : "attachment"
2931
+ }), I = ot(), we = async (e, t, n, r) => {
2818
2932
  if (n) {
2819
- let r = await N(M.get(e.id));
2820
- if (!r) return {
2933
+ let r, i = await I.getOrCreate(_t(JSON.stringify([e.id, e.checksum]), e.contentType, n), async () => {
2934
+ let t = await P(N.get(e.id));
2935
+ return t ? (r = t.bytes, mt(t.bytes, e.contentType, n)) : null;
2936
+ }).catch(() => null);
2937
+ if (!i && r === void 0 && (r = (await P(N.get(e.id)))?.bytes), !i && r === void 0) return {
2821
2938
  status: 404,
2822
2939
  body: "not found",
2823
2940
  contentType: "text/plain"
2824
2941
  };
2825
- let i = await ht(e.id, r.bytes, e.contentType, n).catch(() => null), a = i ? i.bytes : r.bytes, o = i ? i.contentType : e.contentType, s = await dt(e.contentType, i !== null);
2942
+ let a = i ? i.bytes : r, o = i ? i.contentType : e.contentType, s = await pt(e.contentType, i !== null);
2826
2943
  return {
2827
2944
  status: 200,
2828
2945
  body: a,
2829
2946
  contentType: o,
2830
2947
  headers: {
2831
- ...xe(o),
2948
+ ...Se(o),
2832
2949
  "cache-control": t,
2833
2950
  "accept-ranges": "none",
2834
2951
  ...s === null ? {} : { "x-voltro-transform": `original; reason=${s}` }
2835
2952
  }
2836
2953
  };
2837
2954
  }
2838
- let i = r === void 0 ? "invalid" : P(r, e.size);
2955
+ let i = r === void 0 ? "invalid" : F(r, e.size);
2839
2956
  if (i === "unsatisfiable") return {
2840
2957
  status: 416,
2841
2958
  body: "range not satisfiable",
@@ -2846,13 +2963,13 @@ var Un = () => _e({
2846
2963
  }
2847
2964
  };
2848
2965
  if (i !== "invalid") {
2849
- let n = await N(M.getRange(e.id, i));
2966
+ let n = await P(N.getRange(e.id, i));
2850
2967
  return n ? {
2851
2968
  status: 206,
2852
2969
  body: n.bytes,
2853
2970
  contentType: e.contentType,
2854
2971
  headers: {
2855
- ...xe(e.contentType),
2972
+ ...Se(e.contentType),
2856
2973
  "cache-control": t,
2857
2974
  "accept-ranges": "bytes",
2858
2975
  "content-range": `bytes ${i.start}-${i.endInclusive}/${n.totalSize}`
@@ -2863,39 +2980,44 @@ var Un = () => _e({
2863
2980
  contentType: "text/plain"
2864
2981
  };
2865
2982
  }
2866
- let a = await N(M.getStream(e.id));
2983
+ let a = await P(N.getStream(e.id));
2867
2984
  return a ? {
2868
2985
  status: 200,
2869
2986
  contentType: e.contentType,
2870
2987
  headers: {
2871
- ...xe(e.contentType),
2988
+ ...Se(e.contentType),
2872
2989
  "cache-control": t,
2873
2990
  "accept-ranges": "bytes"
2874
2991
  },
2875
2992
  byteStream: {
2876
2993
  contentLength: e.size,
2877
- stream: () => w.toReadableStream(a.stream)
2994
+ stream: () => C.toReadableStream(a.stream)
2878
2995
  }
2879
2996
  } : {
2880
2997
  status: 404,
2881
2998
  body: "not found",
2882
2999
  contentType: "text/plain"
2883
3000
  };
2884
- }, F = async (e) => {
3001
+ }, Ee = async (e) => {
2885
3002
  let t = e.path.startsWith(ye) ? e.path.slice(ye.length).split("/")[0] ?? "" : "";
2886
3003
  if (!t) return {
2887
3004
  status: 404,
2888
3005
  body: "not found",
2889
3006
  contentType: "text/plain"
2890
3007
  };
2891
- let n = await N(M.head(t));
3008
+ let n = await P(N.head(t));
2892
3009
  if (!n) return {
2893
3010
  status: 404,
2894
3011
  body: "not found",
2895
3012
  contentType: "text/plain"
2896
3013
  };
2897
- let r = st(e.query), i = e.headers.range;
2898
- if (n.visibility === "public") {
3014
+ let r = lt(e.query), i = e.headers.range, a = n.derivedFrom == null ? null : await P(N.head(n.derivedFrom));
3015
+ if (n.derivedFrom != null && a === null) return {
3016
+ status: 404,
3017
+ body: "not found",
3018
+ contentType: "text/plain"
3019
+ };
3020
+ if (n.visibility === "public" && (a === null || a.visibility === "public")) {
2899
3021
  let e = x.publicUrl?.(n.key) ?? null;
2900
3022
  return e && !r ? {
2901
3023
  status: 302,
@@ -2903,24 +3025,24 @@ var Un = () => _e({
2903
3025
  location: e,
2904
3026
  "cache-control": "public, max-age=300"
2905
3027
  }
2906
- } : Se(n, "public, max-age=31536000, immutable", r, i);
3028
+ } : we(n, be, r, i);
2907
3029
  }
2908
- let a = !1, o = e.query ? new URLSearchParams(e.query).get("t") : null;
2909
- if (o) {
2910
- let e = At(o);
2911
- a = !!e && e.refId === t && e.audience === b;
3030
+ let o = !1, s = e.query ? new URLSearchParams(e.query).get("t") : null;
3031
+ if (s) {
3032
+ let e = Nt(s);
3033
+ o = !!e && (e.refId === t || a !== null && e.refId === a.id) && e.audience === b;
2912
3034
  }
2913
- if (!a) {
2914
- let t = se(e.headers.cookie, Yn), r = t ? le(t, ce()) : null;
2915
- r && (a = await N(M.checkAccess(n, r)) === !0);
3035
+ if (!o) {
3036
+ let t = se(e.headers.cookie, $n), r = t ? le(t, ce()) : null;
3037
+ r && (o = await P(N.checkAccess(n, r)) === !0);
2916
3038
  }
2917
- if (!a) return {
3039
+ if (!o) return {
2918
3040
  status: 403,
2919
3041
  body: "forbidden",
2920
3042
  contentType: "text/plain"
2921
3043
  };
2922
3044
  if (x.presigns && !r) {
2923
- let e = await N(x.getUrl(n.key, 300));
3045
+ let e = await P(x.getUrl(n.key, 300));
2924
3046
  if (e && /^https?:/.test(e)) return {
2925
3047
  status: 302,
2926
3048
  headers: {
@@ -2929,12 +3051,12 @@ var Un = () => _e({
2929
3051
  }
2930
3052
  };
2931
3053
  }
2932
- return Se(n, "private, no-store", r, i);
2933
- }, we = {
3054
+ return we(n, "private, no-store", r, i);
3055
+ }, L = {
2934
3056
  method: "GET",
2935
3057
  path: b,
2936
3058
  handle: async (e) => {
2937
- let t = await F(e), n = rr(e.headers.origin, ue);
3059
+ let t = await Ee(e), n = sr(e.headers.origin, E);
2938
3060
  return Object.keys(n).length === 0 ? t : {
2939
3061
  ...t,
2940
3062
  headers: {
@@ -2943,12 +3065,12 @@ var Un = () => _e({
2943
3065
  }
2944
3066
  };
2945
3067
  }
2946
- }, Ee = {
3068
+ }, De = {
2947
3069
  method: "*",
2948
3070
  path: `${b}/upload`,
2949
3071
  originGuard: "exempt",
2950
3072
  handle: async (e) => {
2951
- let t = rr(e.headers.origin, ue);
3073
+ let t = sr(e.headers.origin, E);
2952
3074
  if (e.method === "OPTIONS") return {
2953
3075
  status: 204,
2954
3076
  headers: t
@@ -2959,14 +3081,14 @@ var Un = () => _e({
2959
3081
  contentType: "text/plain",
2960
3082
  headers: t
2961
3083
  };
2962
- let n = e.query ? new URLSearchParams(e.query).get("ticket") : null, r = n ? Mt(n) : null;
2963
- if (!r || r.instance !== v) return {
3084
+ let n = e.query ? new URLSearchParams(e.query).get("ticket") : null, r = n ? It(n) : null;
3085
+ if (!r || r.instance !== y) return {
2964
3086
  status: 401,
2965
3087
  body: "invalid or expired upload ticket",
2966
3088
  contentType: "text/plain",
2967
3089
  headers: t
2968
3090
  };
2969
- if (r.replicaId !== void 0 && r.replicaId !== _().replicaId) return {
3091
+ if (r.replicaId !== void 0 && r.replicaId !== ie().replicaId) return {
2970
3092
  status: 409,
2971
3093
  body: "upload ticket belongs to another replica",
2972
3094
  contentType: "text/plain",
@@ -2984,34 +3106,34 @@ var Un = () => _e({
2984
3106
  contentType: "text/plain",
2985
3107
  headers: t
2986
3108
  };
2987
- let i = await y.runPromise(M.put({
3109
+ let i = await v.runPromise(N.put({
2988
3110
  bytes: e.rawBody,
2989
3111
  contentType: r.ct,
2990
3112
  tenantId: r.tenant,
2991
3113
  ownerId: r.sub,
2992
3114
  visibility: r.vis,
2993
- ...me(r.vis),
3115
+ ...r.access === void 0 ? {} : { access: r.access },
2994
3116
  ...r.operationId === void 0 ? {} : { operationId: r.operationId },
2995
3117
  ...r.key === void 0 ? {} : { key: r.key },
2996
3118
  ...r.folder === void 0 ? {} : { folder: r.folder },
2997
3119
  ...r.tags === void 0 ? {} : { tags: r.tags },
2998
3120
  ...r.alt === void 0 ? {} : { alt: r.alt },
2999
3121
  ...r.caption === void 0 ? {} : { caption: r.caption }
3000
- }).pipe(y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3122
+ }).pipe(v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3001
3123
  kind: "ok",
3002
3124
  ref: e,
3003
3125
  url: t
3004
- })))), y.catchTags({
3005
- StorageRejected: (e) => y.succeed({
3126
+ })))), v.catchTags({
3127
+ StorageRejected: (e) => v.succeed({
3006
3128
  kind: "rejected",
3007
3129
  status: e.reason === "too-large" ? 413 : 415,
3008
3130
  detail: e.detail
3009
3131
  }),
3010
- StorageScanRejected: (e) => y.succeed({
3132
+ StorageScanRejected: (e) => v.succeed({
3011
3133
  kind: "scan",
3012
3134
  threat: e.threat
3013
3135
  }),
3014
- StorageError: (e) => y.succeed({
3136
+ StorageError: (e) => v.succeed({
3015
3137
  kind: "error",
3016
3138
  message: e.message
3017
3139
  })
@@ -3043,28 +3165,28 @@ var Un = () => _e({
3043
3165
  headers: t
3044
3166
  };
3045
3167
  }
3046
- }, I = {
3168
+ }, Oe = {
3047
3169
  method: "*",
3048
3170
  path: `${b}/upload/resumable`,
3049
3171
  originGuard: "exempt",
3050
3172
  handle: async (e) => {
3051
- let t = rr(e.headers.origin, ue);
3173
+ let t = sr(e.headers.origin, E);
3052
3174
  if (e.method === "OPTIONS") return {
3053
3175
  status: 204,
3054
3176
  headers: t
3055
3177
  };
3056
- let n = new URLSearchParams(e.query || ""), r = It(n.get("token") ?? "");
3057
- if (!r || r.instance !== v) return {
3178
+ let n = new URLSearchParams(e.query || ""), r = Bt(n.get("token") ?? "");
3179
+ if (!r || r.instance !== y) return {
3058
3180
  status: 401,
3059
3181
  body: "invalid or expired resumable token",
3060
3182
  contentType: "text/plain",
3061
3183
  headers: t
3062
3184
  };
3063
3185
  if (e.method === "GET" || e.method === "HEAD") {
3064
- let e = await y.runPromise(M.resumableStatus({
3186
+ let e = await v.runPromise(N.resumableStatus({
3065
3187
  uploadId: r.id,
3066
3188
  tenantId: r.tenant
3067
- }).pipe(y.match({
3189
+ }).pipe(v.match({
3068
3190
  onFailure: (e) => ({ error: e.message }),
3069
3191
  onSuccess: (e) => e
3070
3192
  })));
@@ -3102,38 +3224,38 @@ var Un = () => _e({
3102
3224
  contentType: "text/plain",
3103
3225
  headers: t
3104
3226
  };
3105
- let a = n.get("final") === "1", o = await y.runPromise(M.putResumableChunk({
3227
+ let a = n.get("final") === "1", o = await v.runPromise(N.putResumableChunk({
3106
3228
  uploadId: r.id,
3107
3229
  tenantId: r.tenant,
3108
3230
  index: i,
3109
3231
  bytes: e.rawBody
3110
- }).pipe(y.flatMap(() => a ? M.finalizeResumable({
3232
+ }).pipe(v.flatMap(() => a ? N.finalizeResumable({
3111
3233
  uploadId: r.id,
3112
3234
  count: i + 1,
3113
3235
  contentType: r.ct,
3114
3236
  tenantId: r.tenant,
3115
3237
  ownerId: r.sub,
3116
3238
  visibility: r.vis,
3117
- ...me(r.vis),
3239
+ ...r.access === void 0 ? {} : { access: r.access },
3118
3240
  ...r.folder === void 0 ? {} : { folder: r.folder },
3119
3241
  ...r.tags === void 0 ? {} : { tags: r.tags },
3120
3242
  ...r.alt === void 0 ? {} : { alt: r.alt },
3121
3243
  ...r.caption === void 0 ? {} : { caption: r.caption }
3122
- }).pipe(y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3244
+ }).pipe(v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3123
3245
  kind: "done",
3124
3246
  ref: e,
3125
3247
  url: t
3126
- }))))) : y.succeed({ kind: "chunk" })), y.catchTags({
3127
- StorageRejected: (e) => y.succeed({
3248
+ }))))) : v.succeed({ kind: "chunk" })), v.catchTags({
3249
+ StorageRejected: (e) => v.succeed({
3128
3250
  kind: "rejected",
3129
3251
  status: e.reason === "too-large" ? 413 : 415,
3130
3252
  detail: e.detail
3131
3253
  }),
3132
- StorageScanRejected: (e) => y.succeed({
3254
+ StorageScanRejected: (e) => v.succeed({
3133
3255
  kind: "scan",
3134
3256
  threat: e.threat
3135
3257
  }),
3136
- StorageError: (e) => y.succeed({
3258
+ StorageError: (e) => v.succeed({
3137
3259
  kind: "error",
3138
3260
  message: e.message
3139
3261
  })
@@ -3171,45 +3293,51 @@ var Un = () => _e({
3171
3293
  headers: t
3172
3294
  };
3173
3295
  }
3174
- }, L = (e) => ({
3296
+ }, R = (e) => ({
3175
3297
  kind: "json",
3176
3298
  data: e
3177
- }), R = (e, t) => ({
3299
+ }), z = (e, t) => ({
3178
3300
  kind: "json",
3179
3301
  status: e,
3180
3302
  data: { error: t }
3181
- }), De = (e, t) => {
3303
+ }), ke = (e, t) => {
3182
3304
  try {
3183
3305
  return new URL(e, "http://localhost").searchParams.get(t);
3184
3306
  } catch {
3185
3307
  return null;
3186
3308
  }
3187
- }, Oe = [
3309
+ }, Ae = [
3188
3310
  {
3189
3311
  method: "POST",
3190
3312
  path: "/upload-ticket",
3191
3313
  description: "Authorize a binary upload with explicit tenant and owner attribution",
3192
- handler: (e) => y.gen(function* () {
3193
- let n = C.String.pipe(C.filter((e) => e.trim().length > 0)), r = yield* C.decodeUnknown(C.parseJson(C.Struct({
3194
- operationId: C.optional(n.pipe(C.maxLength(200))),
3195
- tenantId: C.NullOr(n),
3196
- ownerId: C.NullOr(n),
3197
- key: n.pipe(C.maxLength(1024)),
3198
- contentType: n.pipe(C.maxLength(255), C.filter((e) => !/[\r\n]/.test(e))),
3199
- size: C.Number.pipe(C.int(), C.positive(), C.filter(Number.isSafeInteger)),
3200
- visibility: C.optional(C.Literal("public", "private"))
3201
- })))(e.body).pipe(y.mapError(() => new t({
3314
+ handler: (e) => v.gen(function* () {
3315
+ let n = S.String.pipe(S.check(S.makeFilter((e) => e.trim().length > 0))), r = yield* S.decodeUnknownEffect(S.fromJsonString(S.Struct({
3316
+ operationId: S.optional(n.pipe(S.check(S.isMaxLength(200)))),
3317
+ tenantId: S.NullOr(n),
3318
+ ownerId: S.NullOr(n),
3319
+ key: n.pipe(S.check(S.isMaxLength(1024))),
3320
+ contentType: n.pipe(S.check(S.isMaxLength(255)), S.check(S.makeFilter((e) => !/[\r\n]/.test(e)))),
3321
+ size: S.Number.pipe(S.check(S.isInt()), S.check(S.isGreaterThan(0)), S.check(S.makeFilter(Number.isSafeInteger))),
3322
+ visibility: S.optional(S.Literals(["public", "private"]))
3323
+ })))(e.body).pipe(v.mapError(() => new t({
3202
3324
  provider: "inspect",
3203
3325
  message: "Provide explicit tenantId and ownerId (or null), key, contentType and a positive file size",
3204
3326
  transient: !1,
3205
3327
  status: 400
3206
3328
  })));
3207
- if (r.operationId !== void 0 && j.current === void 0) return R(409, "Durable uploads require a bound operation store with default reference and grant stores");
3208
- if (E !== void 0 && r.size > E) return R(413, "File exceeds the configured upload limit");
3209
- let i = jt({
3210
- instance: v,
3211
- ...r.operationId === void 0 ? {} : { operationId: `inspect-upload:${Ce("sha256").update(JSON.stringify([v, r.operationId])).digest("hex")}` },
3212
- replicaId: _().replicaId,
3329
+ if (r.operationId !== void 0 && me.current === void 0) return z(409, "Durable uploads require a bound operation store with default reference and grant stores");
3330
+ if (D !== void 0 && r.size > D) return z(413, "File exceeds the configured upload limit");
3331
+ let a = r.visibility !== "public" && Array.isArray(i.uploadAccess) ? yield* S.decodeUnknownEffect(ae)(i.uploadAccess, { onExcessProperty: "error" }).pipe(v.mapError(() => new t({
3332
+ provider: "storage",
3333
+ message: "Invalid upload access policy",
3334
+ transient: !1,
3335
+ status: 400
3336
+ }))) : void 0, o = Ft({
3337
+ instance: y,
3338
+ ...a === void 0 ? {} : { access: a },
3339
+ ...r.operationId === void 0 ? {} : { operationId: `inspect-upload:${Ce("sha256").update(JSON.stringify([y, r.operationId])).digest("hex")}` },
3340
+ replicaId: ie().replicaId,
3213
3341
  sub: r.ownerId,
3214
3342
  tenant: r.tenantId,
3215
3343
  ct: r.contentType,
@@ -3217,32 +3345,32 @@ var Un = () => _e({
3217
3345
  vis: r.visibility ?? "private",
3218
3346
  max: r.size
3219
3347
  }, 300);
3220
- return L({
3221
- uploadPath: `${b}/upload?ticket=${encodeURIComponent(i)}`,
3348
+ return R({
3349
+ uploadPath: `${b}/upload?ticket=${encodeURIComponent(o)}`,
3222
3350
  expiresInSec: 300,
3223
3351
  maxBytes: r.size
3224
3352
  });
3225
- }).pipe(y.catchAll((e) => y.succeed(R(e.status ?? 500, e.message))))
3353
+ }).pipe(v.catch((e) => v.succeed(z(e.status ?? 500, e.message))))
3226
3354
  },
3227
3355
  {
3228
3356
  method: "GET",
3229
3357
  path: "/download",
3230
3358
  description: "Stream a stored file as an attachment for authorized inspect readers",
3231
- handler: (e) => y.gen(function* () {
3232
- let t = De(e.url, "refId");
3233
- if (!t?.trim()) return R(400, "A non-empty refId is required");
3234
- let { ref: n, stream: r } = yield* M.getStream(t), i = n.key.split("/").pop() || n.id, a = encodeURIComponent(i).replace(/[!'()*]/g, (e) => `%${e.charCodeAt(0).toString(16).toUpperCase()}`);
3359
+ handler: (e) => v.gen(function* () {
3360
+ let t = ke(e.url, "refId");
3361
+ if (!t?.trim()) return z(400, "A non-empty refId is required");
3362
+ let { ref: n, stream: r } = yield* N.getStream(t), i = n.key.split("/").pop() || n.id, a = encodeURIComponent(i).replace(/[!'()*]/g, (e) => `%${e.charCodeAt(0).toString(16).toUpperCase()}`);
3235
3363
  return {
3236
3364
  kind: "bytes",
3237
3365
  contentType: n.contentType,
3238
3366
  byteStream: {
3239
- stream: () => w.toReadableStream(r),
3367
+ stream: () => C.toReadableStream(r),
3240
3368
  contentLength: n.size,
3241
3369
  contentDisposition: `attachment; filename="download"; filename*=UTF-8''${a}`
3242
3370
  },
3243
3371
  headers: { "cache-control": "no-store" }
3244
3372
  };
3245
- }).pipe(y.catchAll((e) => y.succeed(R(e.status ?? 500, e.message))))
3373
+ }).pipe(v.catch((e) => v.succeed(z(e.status ?? 500, e.message))))
3246
3374
  },
3247
3375
  {
3248
3376
  method: "GET",
@@ -3250,7 +3378,7 @@ var Un = () => _e({
3250
3378
  scope: "process",
3251
3379
  description: "Searchable storage refs, newest first, paginated",
3252
3380
  handler: (e) => {
3253
- let t = Number(De(e.url, "offset") ?? 0), n = Number.isSafeInteger(t) && t >= 0 ? t : 0, r = (De(e.url, "search") ?? "").trim().slice(0, 200);
3381
+ let t = Number(ke(e.url, "offset") ?? 0), n = Number.isSafeInteger(t) && t >= 0 ? t : 0, r = (ke(e.url, "search") ?? "").trim().slice(0, 200);
3254
3382
  return he.listRefs({
3255
3383
  tenantId: void 0,
3256
3384
  ownerId: void 0,
@@ -3260,14 +3388,14 @@ var Un = () => _e({
3260
3388
  search: r,
3261
3389
  limit: 51,
3262
3390
  offset: n
3263
- }).pipe(y.map((e) => L({
3264
- refs: e.slice(0, 50).map(ir),
3391
+ }).pipe(v.map((e) => R({
3392
+ refs: e.slice(0, 50).map(cr),
3265
3393
  page: {
3266
3394
  search: r,
3267
3395
  offset: n,
3268
3396
  nextOffset: e.length > 50 ? n + 50 : null
3269
3397
  }
3270
- })), y.catchAll((e) => y.succeed(R(500, e.message))));
3398
+ })), v.catch((e) => v.succeed(z(500, e.message))));
3271
3399
  }
3272
3400
  },
3273
3401
  {
@@ -3275,11 +3403,11 @@ var Un = () => _e({
3275
3403
  path: "/stats",
3276
3404
  scope: "process",
3277
3405
  description: "Object count + total bytes per tenant + visibility split",
3278
- handler: () => he.statistics().pipe(y.map((e) => L({
3406
+ handler: () => he.statistics().pipe(v.map((e) => R({
3279
3407
  provider: x.name,
3280
- bucket: S,
3408
+ bucket: ue,
3281
3409
  ...e
3282
- })), y.catchAll((e) => y.succeed(R(500, e.message))))
3410
+ })), v.catch((e) => v.succeed(z(500, e.message))))
3283
3411
  },
3284
3412
  {
3285
3413
  method: "GET",
@@ -3287,110 +3415,118 @@ var Un = () => _e({
3287
3415
  scope: "process",
3288
3416
  description: "Grants for a ref (?refId=…)",
3289
3417
  handler: (e) => {
3290
- let t = De(e.url, "refId");
3291
- return t ? ge.listByRef(t).pipe(y.map((e) => L({ grants: e.map(ur) })), y.catchAll((e) => y.succeed(R(500, e.message)))) : y.succeed(R(400, "refId query param required"));
3418
+ let t = ke(e.url, "refId");
3419
+ return t ? ge.listByRef(t).pipe(v.map((e) => R({ grants: e.map(mr) })), v.catch((e) => v.succeed(z(500, e.message)))) : v.succeed(z(400, "refId query param required"));
3292
3420
  }
3293
3421
  },
3294
3422
  {
3295
3423
  method: "POST",
3296
3424
  path: "/share",
3297
3425
  description: "Grant a principal access to a ref",
3298
- handler: (e) => y.gen(function* () {
3299
- let n = yield* C.decodeUnknown(C.parseJson(C.Struct({
3300
- refId: C.String.pipe(C.filter((e) => e.trim().length > 0)),
3301
- principalType: C.Literal("user", "group", "apiKey"),
3302
- principalId: C.String.pipe(C.filter((e) => e.trim().length > 0)),
3303
- permission: C.optional(C.Literal("read", "write")),
3304
- expiresInDays: C.optional(C.Number.pipe(C.finite(), C.positive()))
3305
- })))(e.body).pipe(y.mapError(() => new t({
3426
+ handler: (e) => v.gen(function* () {
3427
+ let n = yield* S.decodeUnknownEffect(S.fromJsonString(S.Struct({
3428
+ refId: S.String.pipe(S.check(S.makeFilter((e) => e.trim().length > 0))),
3429
+ principalType: S.Literals([
3430
+ "user",
3431
+ "group",
3432
+ "apiKey"
3433
+ ]),
3434
+ principalId: S.String.pipe(S.check(S.makeFilter((e) => e.trim().length > 0))),
3435
+ permission: S.optional(S.Literals(["read", "write"])),
3436
+ expiresInDays: S.optional(S.Number.pipe(S.check(S.isFinite()), S.check(S.isGreaterThan(0))))
3437
+ })))(e.body).pipe(v.mapError(() => new t({
3306
3438
  provider: "inspect",
3307
3439
  message: "Invalid share input: provide refId, principalType, principalId, read/write permission and a positive finite expiry if set",
3308
3440
  transient: !1,
3309
3441
  status: 400
3310
3442
  }))), r = n.expiresInDays === void 0 ? null : new Date(Date.now() + n.expiresInDays * 864e5);
3311
- if (r !== null && !Number.isFinite(r.getTime())) return R(400, "Expiry exceeds the supported date range");
3312
- let i = yield* M.grant({
3443
+ if (r !== null && !Number.isFinite(r.getTime())) return z(400, "Expiry exceeds the supported date range");
3444
+ let i = yield* N.grant({
3313
3445
  refId: n.refId,
3314
3446
  principalType: n.principalType,
3315
3447
  principalId: n.principalId,
3316
3448
  ...n.permission ? { permission: n.permission } : {},
3317
3449
  expiresAt: r
3318
3450
  });
3319
- return L({ grant: ur(i) });
3320
- }).pipe(y.catchAll((e) => y.succeed(R(e.status ?? 500, e.message ?? "share failed"))))
3451
+ return R({ grant: mr(i) });
3452
+ }).pipe(v.catch((e) => v.succeed(z(e.status ?? 500, e.message ?? "share failed"))))
3321
3453
  },
3322
3454
  {
3323
3455
  method: "POST",
3324
3456
  path: "/delete",
3325
3457
  description: "Delete an object reference and its grants; release unreferenced bytes",
3326
- handler: (e) => y.gen(function* () {
3327
- let n = yield* C.decodeUnknown(C.parseJson(C.Struct({ refId: C.String.pipe(C.filter((e) => e.trim().length > 0)) })))(e.body).pipe(y.mapError(() => new t({
3458
+ handler: (e) => v.gen(function* () {
3459
+ let n = yield* S.decodeUnknownEffect(S.fromJsonString(S.Struct({ refId: S.String.pipe(S.check(S.makeFilter((e) => e.trim().length > 0))) })))(e.body).pipe(v.mapError(() => new t({
3328
3460
  provider: "inspect",
3329
3461
  message: "A non-empty refId is required",
3330
3462
  transient: !1,
3331
3463
  status: 400
3332
3464
  })));
3333
- return yield* M.delete(n.refId), L({ ok: !0 });
3334
- }).pipe(y.catchAll((e) => y.succeed(R(e.status ?? 500, e.message))))
3465
+ return yield* N.delete(n.refId), R({ ok: !0 });
3466
+ }).pipe(v.catch((e) => v.succeed(z(e.status ?? 500, e.message))))
3335
3467
  },
3336
3468
  {
3337
3469
  method: "POST",
3338
3470
  path: "/revoke",
3339
3471
  description: "Revoke a grant by id",
3340
- handler: (e) => y.gen(function* () {
3341
- let n = yield* C.decodeUnknown(C.parseJson(C.Struct({ grantId: C.String.pipe(C.filter((e) => e.trim().length > 0)) })))(e.body).pipe(y.mapError(() => new t({
3472
+ handler: (e) => v.gen(function* () {
3473
+ let n = yield* S.decodeUnknownEffect(S.fromJsonString(S.Struct({ grantId: S.String.pipe(S.check(S.makeFilter((e) => e.trim().length > 0))) })))(e.body).pipe(v.mapError(() => new t({
3342
3474
  provider: "inspect",
3343
3475
  message: "A non-empty grantId is required",
3344
3476
  transient: !1,
3345
3477
  status: 400
3346
3478
  })));
3347
- return yield* M.revoke(n.grantId), L({ ok: !0 });
3348
- }).pipe(y.catchAll((e) => y.succeed(R(e.status ?? 500, e.message ?? "revoke failed"))))
3479
+ return yield* N.revoke(n.grantId), R({ ok: !0 });
3480
+ }).pipe(v.catch((e) => v.succeed(z(e.status ?? 500, e.message ?? "revoke failed"))))
3349
3481
  }
3350
- ], ke = [
3482
+ ], je = [
3351
3483
  {
3352
3484
  ...te,
3353
3485
  execute: (e, t) => {
3354
3486
  let n = e;
3355
- return M.mintUrl(n.id, t.request.subject, {
3487
+ return N.mintUrl(n.id, t.request.subject, {
3356
3488
  ...n.password === void 0 ? {} : { password: n.password },
3357
3489
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
3358
- }).pipe(y.map((e) => ({ url: e })));
3490
+ }).pipe(v.map((e) => ({ url: e })));
3359
3491
  }
3360
3492
  },
3361
3493
  {
3362
3494
  ...ee,
3363
3495
  execute: (e, t) => {
3364
3496
  let n = e;
3365
- return M.mintUploadUrl({
3497
+ return N.mintUploadUrl({
3366
3498
  key: n.key,
3367
3499
  contentType: n.contentType,
3368
3500
  tenantId: t.request.subject.tenantId,
3369
3501
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
3370
- }).pipe(y.map((e) => ({ url: e })));
3502
+ }).pipe(v.map((e) => ({ url: e })));
3371
3503
  }
3372
3504
  },
3373
3505
  {
3374
3506
  ...m,
3375
3507
  execute: (e, t) => {
3376
3508
  let n = e;
3377
- return cr(t, D).pipe(y.map((e) => {
3378
- let t = n.expiresInSec ?? 900, r = jt({
3379
- instance: v,
3509
+ return fr(t, O).pipe(v.flatMap((e) => A(n, t.request.subject).pipe(v.map((t) => ({
3510
+ writer: e,
3511
+ policy: t
3512
+ })))), v.map(({ writer: e, policy: t }) => {
3513
+ let r = n.expiresInSec ?? 900, i = Ft({
3514
+ instance: y,
3380
3515
  sub: e.id,
3381
3516
  tenant: e.tenantId,
3382
3517
  ct: n.contentType,
3383
3518
  vis: n.visibility ?? "private",
3519
+ ...t,
3384
3520
  ...n.key === void 0 ? {} : { key: n.key },
3385
3521
  ...n.folder === void 0 ? {} : { folder: n.folder },
3386
3522
  ...n.tags === void 0 ? {} : { tags: n.tags },
3387
3523
  ...n.alt === void 0 ? {} : { alt: n.alt },
3388
3524
  ...n.caption === void 0 ? {} : { caption: n.caption },
3389
- ...E === void 0 ? {} : { max: E }
3390
- }, t);
3525
+ ...D === void 0 ? {} : { max: D }
3526
+ }, r);
3391
3527
  return {
3392
- uploadUrl: `${T ? T.replace(/\/+$/, "") : ""}${b}/upload?ticket=${encodeURIComponent(r)}`,
3393
- expiresInSec: t
3528
+ uploadUrl: `${T ? T.replace(/\/+$/, "") : ""}${b}/upload?ticket=${encodeURIComponent(i)}`,
3529
+ expiresInSec: r
3394
3530
  };
3395
3531
  }));
3396
3532
  }
@@ -3399,28 +3535,32 @@ var Un = () => _e({
3399
3535
  ...p,
3400
3536
  execute: (e, t) => {
3401
3537
  let n = e;
3402
- return cr(t, D).pipe(y.flatMap((e) => M.mintPresignedUpload({
3538
+ return fr(t, O).pipe(v.flatMap((e) => A(n, t.request.subject).pipe(v.map((t) => ({
3539
+ writer: e,
3540
+ policy: t
3541
+ })))), v.flatMap(({ writer: e, policy: t }) => N.mintPresignedUpload({
3403
3542
  contentType: n.contentType,
3404
3543
  tenantId: e.tenantId,
3405
3544
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
3406
- }).pipe(y.map((t) => {
3407
- let r = Nt({
3408
- instance: v,
3409
- key: t.key,
3545
+ }).pipe(v.map((r) => {
3546
+ let i = Lt({
3547
+ instance: y,
3548
+ key: r.key,
3410
3549
  sub: e.id,
3411
3550
  tenant: e.tenantId,
3412
3551
  ct: n.contentType,
3413
3552
  vis: n.visibility ?? "private",
3553
+ ...t,
3414
3554
  ...n.folder === void 0 ? {} : { folder: n.folder },
3415
3555
  ...n.tags === void 0 ? {} : { tags: n.tags },
3416
3556
  ...n.alt === void 0 ? {} : { alt: n.alt },
3417
3557
  ...n.caption === void 0 ? {} : { caption: n.caption },
3418
- ...E === void 0 ? {} : { max: E }
3419
- }, t.expiresInSec);
3558
+ ...D === void 0 ? {} : { max: D }
3559
+ }, r.expiresInSec);
3420
3560
  return {
3421
- uploadUrl: t.uploadUrl,
3422
- finalizeToken: r,
3423
- expiresInSec: t.expiresInSec
3561
+ uploadUrl: r.uploadUrl,
3562
+ finalizeToken: i,
3563
+ expiresInSec: r.expiresInSec
3424
3564
  };
3425
3565
  }))));
3426
3566
  }
@@ -3428,29 +3568,29 @@ var Un = () => _e({
3428
3568
  {
3429
3569
  ...l,
3430
3570
  execute: (e, n) => {
3431
- let r = Pt(e.finalizeToken);
3432
- return !r || r.instance !== v ? y.fail(new t({
3571
+ let r = Rt(e.finalizeToken);
3572
+ return !r || r.instance !== y ? v.fail(new t({
3433
3573
  provider: "storage",
3434
3574
  message: "invalid or expired finalize token",
3435
3575
  transient: !1,
3436
3576
  status: 401
3437
- })) : lr(r.sub, n.request.subject.id) ? y.fail(new t({
3577
+ })) : pr(r.sub, n.request.subject.id) ? v.fail(new t({
3438
3578
  provider: "storage",
3439
3579
  message: "finalize token belongs to another subject",
3440
3580
  transient: !1,
3441
3581
  status: 403
3442
- })) : M.finalizeUpload({
3582
+ })) : N.finalizeUpload({
3443
3583
  key: r.key,
3444
3584
  contentType: r.ct,
3445
3585
  tenantId: r.tenant,
3446
3586
  ownerId: r.sub,
3447
3587
  visibility: r.vis,
3448
- ...me(r.vis),
3588
+ ...r.access === void 0 ? {} : { access: r.access },
3449
3589
  ...r.folder === void 0 ? {} : { folder: r.folder },
3450
3590
  ...r.tags === void 0 ? {} : { tags: r.tags },
3451
3591
  ...r.alt === void 0 ? {} : { alt: r.alt },
3452
3592
  ...r.caption === void 0 ? {} : { caption: r.caption }
3453
- }).pipe(y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3593
+ }).pipe(v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3454
3594
  id: e.id,
3455
3595
  url: t,
3456
3596
  contentType: e.contentType,
@@ -3464,27 +3604,31 @@ var Un = () => _e({
3464
3604
  ...s,
3465
3605
  execute: (e, t) => {
3466
3606
  let n = e;
3467
- return cr(t, D).pipe(y.map((e) => {
3468
- let t = n.expiresInSec ?? fe, r = Te(), i = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : de;
3607
+ return fr(t, O).pipe(v.flatMap((e) => A(n, t.request.subject).pipe(v.map((t) => ({
3608
+ writer: e,
3609
+ policy: t
3610
+ })))), v.map(({ writer: e, policy: t }) => {
3611
+ let r = n.expiresInSec ?? fe, i = Te(), a = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : de;
3469
3612
  return {
3470
- uploadId: r,
3471
- resumableToken: Ft({
3472
- instance: v,
3473
- id: r,
3613
+ uploadId: i,
3614
+ resumableToken: zt({
3615
+ instance: y,
3616
+ id: i,
3474
3617
  sub: e.id,
3475
3618
  tenant: e.tenantId,
3476
3619
  ct: n.contentType,
3477
3620
  vis: n.visibility ?? "private",
3621
+ ...t,
3478
3622
  size: n.size,
3479
3623
  ...n.folder === void 0 ? {} : { folder: n.folder },
3480
3624
  ...n.tags === void 0 ? {} : { tags: n.tags },
3481
3625
  ...n.alt === void 0 ? {} : { alt: n.alt },
3482
3626
  ...n.caption === void 0 ? {} : { caption: n.caption },
3483
- ...E === void 0 ? {} : { max: E }
3484
- }, t),
3627
+ ...D === void 0 ? {} : { max: D }
3628
+ }, r),
3485
3629
  uploadUrl: `${T ? T.replace(/\/+$/, "") : ""}${b}/upload/resumable`,
3486
- chunkSize: i,
3487
- expiresInSec: t
3630
+ chunkSize: a,
3631
+ expiresInSec: r
3488
3632
  };
3489
3633
  }));
3490
3634
  }
@@ -3493,20 +3637,24 @@ var Un = () => _e({
3493
3637
  ...o,
3494
3638
  execute: (e, t) => {
3495
3639
  let n = e, r = n.expiresInSec ?? fe;
3496
- return cr(t, D).pipe(y.flatMap((e) => M.beginMultipartUpload({
3640
+ return fr(t, O).pipe(v.flatMap((e) => A(n, t.request.subject).pipe(v.map((t) => ({
3641
+ writer: e,
3642
+ policy: t
3643
+ })))), v.flatMap(({ writer: e, policy: t }) => N.beginMultipartUpload({
3497
3644
  contentType: n.contentType,
3498
3645
  tenantId: e.tenantId,
3499
3646
  visibility: n.visibility ?? "private",
3500
3647
  expiresInSec: r
3501
- }).pipe(y.map((t) => ({
3502
- multipartToken: Lt({
3503
- instance: v,
3504
- key: t.key,
3505
- uploadId: t.uploadId,
3648
+ }).pipe(v.map((i) => ({
3649
+ multipartToken: Vt({
3650
+ instance: y,
3651
+ key: i.key,
3652
+ uploadId: i.uploadId,
3506
3653
  sub: e.id,
3507
3654
  tenant: e.tenantId,
3508
3655
  ct: n.contentType,
3509
3656
  vis: n.visibility ?? "private",
3657
+ ...t,
3510
3658
  size: n.size,
3511
3659
  ...n.folder === void 0 ? {} : { folder: n.folder },
3512
3660
  ...n.tags === void 0 ? {} : { tags: n.tags },
@@ -3521,39 +3669,39 @@ var Un = () => _e({
3521
3669
  {
3522
3670
  ...g,
3523
3671
  execute: (e) => {
3524
- let n = e, r = Rt(n.multipartToken);
3525
- return !r || r.instance !== v ? y.fail(new t({
3672
+ let n = e, r = Ht(n.multipartToken);
3673
+ return !r || r.instance !== y ? v.fail(new t({
3526
3674
  provider: "storage",
3527
3675
  message: "invalid or expired multipart token",
3528
3676
  transient: !1,
3529
3677
  status: 401
3530
- })) : !Number.isInteger(n.partNumber) || n.partNumber < 1 ? y.fail(new t({
3678
+ })) : !Number.isInteger(n.partNumber) || n.partNumber < 1 ? v.fail(new t({
3531
3679
  provider: "storage",
3532
3680
  message: "partNumber must be a positive integer",
3533
3681
  transient: !1,
3534
3682
  status: 400
3535
- })) : M.signMultipartPart({
3683
+ })) : N.signMultipartPart({
3536
3684
  key: r.key,
3537
3685
  uploadId: r.uploadId,
3538
3686
  partNumber: n.partNumber
3539
- }).pipe(y.map((e) => ({ url: e })));
3687
+ }).pipe(v.map((e) => ({ url: e })));
3540
3688
  }
3541
3689
  },
3542
3690
  {
3543
3691
  ...c,
3544
3692
  execute: (e, n) => {
3545
- let r = e, i = Rt(r.multipartToken);
3546
- return !i || i.instance !== v ? y.fail(new t({
3693
+ let r = e, i = Ht(r.multipartToken);
3694
+ return !i || i.instance !== y ? v.fail(new t({
3547
3695
  provider: "storage",
3548
3696
  message: "invalid or expired multipart token",
3549
3697
  transient: !1,
3550
3698
  status: 401
3551
- })) : lr(i.sub, n.request.subject.id) ? y.fail(new t({
3699
+ })) : pr(i.sub, n.request.subject.id) ? v.fail(new t({
3552
3700
  provider: "storage",
3553
3701
  message: "multipart token belongs to another subject",
3554
3702
  transient: !1,
3555
3703
  status: 403
3556
- })) : M.completeMultipart({
3704
+ })) : N.completeMultipart({
3557
3705
  key: i.key,
3558
3706
  uploadId: i.uploadId,
3559
3707
  parts: r.parts,
@@ -3561,12 +3709,12 @@ var Un = () => _e({
3561
3709
  tenantId: i.tenant,
3562
3710
  ownerId: i.sub,
3563
3711
  visibility: i.vis,
3564
- ...me(i.vis),
3712
+ ...i.access === void 0 ? {} : { access: i.access },
3565
3713
  ...i.folder === void 0 ? {} : { folder: i.folder },
3566
3714
  ...i.tags === void 0 ? {} : { tags: i.tags },
3567
3715
  ...i.alt === void 0 ? {} : { alt: i.alt },
3568
3716
  ...i.caption === void 0 ? {} : { caption: i.caption }
3569
- }).pipe(y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3717
+ }).pipe(v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3570
3718
  id: e.id,
3571
3719
  url: t,
3572
3720
  size: e.size
@@ -3576,31 +3724,35 @@ var Un = () => _e({
3576
3724
  {
3577
3725
  ...a,
3578
3726
  execute: (e) => {
3579
- let n = Rt(e.multipartToken);
3580
- return !n || n.instance !== v ? y.fail(new t({
3727
+ let n = Ht(e.multipartToken);
3728
+ return !n || n.instance !== y ? v.fail(new t({
3581
3729
  provider: "storage",
3582
3730
  message: "invalid or expired multipart token",
3583
3731
  transient: !1,
3584
3732
  status: 401
3585
- })) : M.abortMultipart({
3733
+ })) : N.abortMultipart({
3586
3734
  key: n.key,
3587
3735
  uploadId: n.uploadId
3588
- }).pipe(y.as({ ok: !0 }));
3736
+ }).pipe(v.as({ ok: !0 }));
3589
3737
  }
3590
3738
  },
3591
3739
  {
3592
- ...ie,
3740
+ ...re,
3593
3741
  execute: (e, t) => {
3594
3742
  let n = e, r = new Uint8Array(Buffer.from(n.bytesBase64, "base64"));
3595
- return cr(t, D).pipe(y.flatMap((e) => M.put({
3743
+ return fr(t, O).pipe(v.flatMap((e) => A(n, t.request.subject).pipe(v.map((t) => ({
3744
+ writer: e,
3745
+ policy: t
3746
+ })))), v.flatMap(({ writer: e, policy: t }) => N.put({
3596
3747
  bytes: r,
3748
+ ...t,
3597
3749
  contentType: n.contentType,
3598
3750
  tenantId: e.tenantId,
3599
3751
  ownerId: e.id,
3600
3752
  ...n.visibility ? { visibility: n.visibility } : {},
3601
3753
  ...n.key ? { key: n.key } : {},
3602
3754
  ...n.password ? { password: n.password } : {}
3603
- })), y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3755
+ })), v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3604
3756
  id: e.id,
3605
3757
  url: t
3606
3758
  })))));
@@ -3610,7 +3762,7 @@ var Un = () => _e({
3610
3762
  ...u,
3611
3763
  execute: (e, t) => {
3612
3764
  let n = e;
3613
- return cr(t, D).pipe(y.flatMap((e) => M.ingestUrl(n.url, {
3765
+ return fr(t, O).pipe(v.flatMap((e) => N.ingestUrl(n.url, {
3614
3766
  tenantId: e.tenantId,
3615
3767
  ownerId: e.id,
3616
3768
  ...n.visibility ? { visibility: n.visibility } : {},
@@ -3619,45 +3771,45 @@ var Un = () => _e({
3619
3771
  ...n.alt === void 0 ? {} : { alt: n.alt },
3620
3772
  ...n.caption === void 0 ? {} : { caption: n.caption },
3621
3773
  ...n.key === void 0 ? {} : { key: n.key }
3622
- })), y.flatMap((e) => M.getUrl(e.id).pipe(y.map((t) => ({
3774
+ })), v.flatMap((e) => N.getUrl(e.id).pipe(v.map((t) => ({
3623
3775
  id: e.id,
3624
3776
  url: t
3625
3777
  })))));
3626
3778
  }
3627
3779
  },
3628
3780
  {
3629
- ...ne,
3781
+ ...h,
3630
3782
  execute: (e, t) => {
3631
3783
  let n = e, r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null;
3632
- return or(M, n.refId, t).pipe(y.flatMap(() => M.grant({
3784
+ return ur(N, n.refId, t).pipe(v.flatMap(() => N.grant({
3633
3785
  refId: n.refId,
3634
3786
  principalType: n.principalType,
3635
3787
  principalId: n.principalId,
3636
3788
  ...n.permission ? { permission: n.permission } : {},
3637
3789
  expiresAt: r,
3638
3790
  createdBy: t.request.subject.id
3639
- })), y.map((e) => ({ grantId: e.id })));
3791
+ })), v.map((e) => ({ grantId: e.id })));
3640
3792
  }
3641
3793
  },
3642
3794
  {
3643
- ...h,
3795
+ ...ne,
3644
3796
  execute: (e, t) => {
3645
3797
  let n = e;
3646
- return M.getGrant(n.grantId).pipe(y.flatMap((e) => e === null ? y.fail(ar()) : or(M, e.refId, t)), y.flatMap(() => M.revoke(n.grantId)), y.map(() => ({ ok: !0 })));
3798
+ return N.getGrant(n.grantId).pipe(v.flatMap((e) => e === null ? v.fail(lr()) : ur(N, e.refId, t)), v.flatMap(() => N.revoke(n.grantId)), v.map(() => ({ ok: !0 })));
3647
3799
  }
3648
3800
  },
3649
3801
  {
3650
3802
  ...d,
3651
3803
  execute: (e, t) => {
3652
3804
  let n = e;
3653
- return or(M, n.refId, t).pipe(y.flatMap(() => M.listGrants(n.refId)), y.map((e) => ({ grants: e.map(ur) })));
3805
+ return ur(N, n.refId, t).pipe(v.flatMap(() => N.listGrants(n.refId)), v.map((e) => ({ grants: e.map(mr) })));
3654
3806
  }
3655
3807
  },
3656
3808
  {
3657
3809
  ...f,
3658
3810
  execute: (e, t) => {
3659
3811
  let n = e;
3660
- return M.listRefs({
3812
+ return N.listRefs({
3661
3813
  tenantId: t.request.subject.tenantId,
3662
3814
  ...n.folder === void 0 ? {} : { folder: n.folder },
3663
3815
  ...n.tags === void 0 ? {} : { tags: n.tags },
@@ -3665,37 +3817,37 @@ var Un = () => _e({
3665
3817
  ...n.includeDerived === void 0 ? {} : { includeDerived: n.includeDerived },
3666
3818
  ...n.limit === void 0 ? {} : { limit: n.limit },
3667
3819
  ...n.offset === void 0 ? {} : { offset: n.offset }
3668
- }).pipe(y.map((e) => ({
3669
- refs: e.refs.map(ir),
3820
+ }).pipe(v.map((e) => ({
3821
+ refs: e.refs.map(cr),
3670
3822
  nextOffset: e.nextOffset
3671
3823
  })));
3672
3824
  }
3673
3825
  }
3674
3826
  ];
3675
- return ae({
3676
- name: oe({
3677
- base: dr,
3827
+ return oe({
3828
+ name: w({
3829
+ base: hr,
3678
3830
  alias: i.alias,
3679
3831
  instance: i.name
3680
3832
  }),
3681
- baseName: dr,
3833
+ baseName: hr,
3682
3834
  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.",
3683
3835
  permissions: [
3684
3836
  "network:outbound:*",
3685
3837
  "inspect:read",
3686
3838
  "inspect:write"
3687
3839
  ],
3688
- declaredEnv: H.declared,
3689
- egress: tr(i),
3840
+ declaredEnv: U.declared,
3841
+ egress: ar(i),
3690
3842
  services: ve,
3691
- inspectEndpoints: Oe,
3843
+ inspectEndpoints: Ae,
3692
3844
  httpRoutes: [
3693
- we,
3694
- Ee,
3695
- I
3845
+ L,
3846
+ De,
3847
+ Oe
3696
3848
  ],
3697
- routes: ke,
3698
- rpcClientDescriptors: re,
3849
+ routes: je,
3850
+ rpcClientDescriptors: _,
3699
3851
  errorSchemas: [
3700
3852
  {
3701
3853
  schema: t,
@@ -3728,7 +3880,7 @@ var Un = () => _e({
3728
3880
  ],
3729
3881
  capabilities: { mediaPersist: {
3730
3882
  put: async ({ bytes: e, mediaType: t, tenantId: n, operationId: r, ownerId: i, visibility: a, tags: o }) => {
3731
- let s = await y.runPromise(M.put({
3883
+ let s = await v.runPromise(N.put({
3732
3884
  bytes: e,
3733
3885
  contentType: t,
3734
3886
  tenantId: n,
@@ -3736,40 +3888,40 @@ var Un = () => _e({
3736
3888
  ...i === void 0 ? {} : { ownerId: i },
3737
3889
  ...a === void 0 ? {} : { visibility: a },
3738
3890
  ...o === void 0 ? {} : { tags: o },
3739
- ...j.current === void 0 ? {} : { operationId: r }
3891
+ ...me.current === void 0 ? {} : { operationId: r }
3740
3892
  }));
3741
3893
  return {
3742
- url: await y.runPromise(M.getUrl(s.id, { tenantId: n })),
3894
+ url: await v.runPromise(N.getUrl(s.id, { tenantId: n })),
3743
3895
  refId: s.id
3744
3896
  };
3745
3897
  },
3746
3898
  ingestUrl: async ({ url: e, tenantId: t, operationId: n, ownerId: r, visibility: i, tags: a }) => {
3747
- let o = await y.runPromise(M.ingestUrl(e, {
3899
+ let o = await v.runPromise(N.ingestUrl(e, {
3748
3900
  tenantId: t,
3749
3901
  ...r === void 0 ? {} : { ownerId: r },
3750
3902
  ...i === void 0 ? {} : { visibility: i },
3751
3903
  ...a === void 0 ? {} : { tags: a },
3752
- ...j.current === void 0 ? {} : { operationId: n }
3904
+ ...me.current === void 0 ? {} : { operationId: n }
3753
3905
  }));
3754
3906
  return {
3755
- url: await y.runPromise(M.getUrl(o.id, { tenantId: t })),
3907
+ url: await v.runPromise(N.getUrl(o.id, { tenantId: t })),
3756
3908
  refId: o.id
3757
3909
  };
3758
3910
  }
3759
3911
  } },
3760
3912
  bindDataStore: (e) => {
3761
- pe && (k.current = an(e)), O && (A.current = cn(e)), pe && O && (j.current = Fn(e)), x.bindDataStore?.(e);
3913
+ k && (j.current = ln(e)), pe && (M.current = fn(e)), k && pe && (me.current = zn(e)), x.bindDataStore?.(e);
3762
3914
  },
3763
- onActivate: (e) => y.sync(() => {
3764
- let t = !!T || !!H.read("STORAGE_CDN_URL", i.cdnBaseUrl);
3915
+ onActivate: (e) => v.sync(() => {
3916
+ let t = !!T || !!U.read("STORAGE_CDN_URL", i.cdnBaseUrl);
3765
3917
  e.logger.info(`storage: provider=${x.name} presign=${x.presigns ? "yes" : "no"} publicUrl=${t ? "yes" : "no"} transforms=yes`, {
3766
3918
  provider: x.name,
3767
- bucket: S,
3768
- refStore: pe ? "memory" : "custom"
3919
+ bucket: ue,
3920
+ refStore: k ? "memory" : "custom"
3769
3921
  }), x.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 && !x.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.");
3770
3922
  }),
3771
- onDeactivate: () => y.void
3923
+ onDeactivate: () => v.void
3772
3924
  });
3773
3925
  };
3774
3926
  //#endregion
3775
- export { V as STORAGE_BLOBS_TABLE, B as STORAGE_GRANTS_TABLE, z as STORAGE_REFS_TABLE, Ue as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, qe as _voltroStorageBlobsTable, Ge as _voltroStorageGrantsTable, We as _voltroStorageRefsTable, Ke as _voltroStorageUsageTable, Qn as appStorageProvider, Hn as assetRef, it as azureProvider, dn as buildStorageService, Le as bytesToStream, Ht as checkLimits, zn as clamavScanner, Qe as clearStorageBuffer, Re as collectStream, Ie as concatBytes, $n as configuredStorageProvider, zt as contentTypeAllowed, cn as dataStoreGrantStore, an as dataStoreRefStore, rt as databaseProvider, Gn as decodeDataUri, Jn as durabilityNotice, In as encodeInstream, Vn as ffmpegTranscoder, et as filesystemProvider, ze as fromNodeReadable, Ve as getObjectStream, gt as hashPassword, Fn as makeStorageObjectMetadata, on as memoryGrantStore, $e as memoryProvider, tn as memoryRefStore, Ln as parseClamavResponse, st as parseTransformParams, qn as pathDurability, Kn as putAvatar, He as putObjectStream, Ze as readStorageBuffer, $t as refMatchesListQuery, er as resolveStorageProvider, q as resolveStorageSecret, tt as s3Provider, Zn as setActiveStorageProvider, Nt as signFinalizeTicket, kt as signGrant, Lt as signMultipartTicket, Ft as signResumableTicket, jt as signUploadTicket, Vt as sniffMatches, tr as storageEgressOf, fr as storageInstanceName, gn as storageObjectLifecycleTables, pr as storagePlugin, Mn as storagePutIntentsTable, fn as storageServiceLayer, Be as toNodeReadable, ht as transformCached, dt as transformFallbackReason, ft as transformImage, Pt as verifyFinalizeTicket, At as verifyGrant, Rt as verifyMultipartTicket, _t as verifyPassword, It as verifyResumableTicket, Mt as verifyUploadTicket, Un as withStorage };
3927
+ export { H as STORAGE_BLOBS_TABLE, V as STORAGE_GRANTS_TABLE, B as STORAGE_REFS_TABLE, Ue as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, qe as _voltroStorageBlobsTable, Ge as _voltroStorageGrantsTable, We as _voltroStorageRefsTable, Ke as _voltroStorageUsageTable, nr as appStorageProvider, Kn as assetRef, at as azureProvider, hn as buildStorageService, Le as bytesToStream, Kt as checkLimits, Un as clamavScanner, $e as clearStorageBuffer, Re as collectStream, Ie as concatBytes, rr as configuredStorageProvider, Ut as contentTypeAllowed, fn as dataStoreGrantStore, ln as dataStoreRefStore, it as databaseProvider, Yn as decodeDataUri, Qn as durabilityNotice, ht as editImage, Bn as encodeInstream, Gn as ffmpegTranscoder, tt as filesystemProvider, ze as fromNodeReadable, Ve as getObjectStream, yt as hashPassword, zn as makeStorageObjectMetadata, un as memoryGrantStore, et as memoryProvider, on as memoryRefStore, Vn as parseClamavResponse, lt as parseTransformParams, Zn as pathDurability, Xn as putAvatar, He as putObjectStream, Qe as readStorageBuffer, rn as refMatchesListQuery, ir as resolveStorageProvider, q as resolveStorageSecret, nt as s3Provider, tr as setActiveStorageProvider, Lt as signFinalizeTicket, Mt as signGrant, Vt as signMultipartTicket, zt as signResumableTicket, Ft as signUploadTicket, Gt as sniffMatches, ar as storageEgressOf, gr as storageInstanceName, bn as storageObjectLifecycleTables, _r as storagePlugin, In as storagePutIntentsTable, gn as storageServiceLayer, Be as toNodeReadable, vt as transformCached, pt as transformFallbackReason, mt as transformImage, Rt as verifyFinalizeTicket, Nt as verifyGrant, Ht as verifyMultipartTicket, bt as verifyPassword, Bt as verifyResumableTicket, It as verifyUploadTicket, qn as withStorage };