@voltro/plugin-storage 0.46.0 → 0.48.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,85 +1,86 @@
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 h, mintUrlDescriptor as g, revokeDescriptor as _, shareDescriptor as ee, signMultipartPartDescriptor as te, storageRpcClientImports as v, uploadDescriptor as ne } from "./rpc.js";
3
- import { Chunk as y, Effect as b, Exit as x, Layer as S, Schedule as C, Stream as w } from "effect";
4
- import { definePlugin as re, pluginInstanceName as T } from "@voltro/protocol";
5
- import { readCookie as ie, resolveSessionSecret as ae, verifySession as oe } from "@voltro/protocol/session";
6
- import { and as E, bytes as se, eq as D, generateId as O, id as k, integer as A, json as j, mixin as ce, reference as le, table as M, text as N, timestamp as P } from "@voltro/database";
7
- import { pluginEnv as ue } from "@voltro/env";
8
- import { createHmac as F, randomBytes as I, randomUUID as de, scryptSync as fe, timingSafeEqual as L } from "node:crypto";
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 h, mintUrlDescriptor as g, revokeDescriptor as _, shareDescriptor as ee, signMultipartPartDescriptor as te, storageRpcClientImports as v, uploadDescriptor as y } from "./rpc.js";
3
+ import { Chunk as b, Effect as x, Exit as S, Layer as C, Schedule as w, Stream as T } from "effect";
4
+ import { definePlugin as ne, pluginInstanceName as E } from "@voltro/protocol";
5
+ import { readCookie as re, resolveSessionSecret as ie, verifySession as ae } from "@voltro/protocol/session";
6
+ import { and as D, bytes as oe, eq as O, generateId as k, id as A, integer as j, json as M, mixin as se, reference as ce, table as N, text as P, timestamp as F } from "@voltro/database";
7
+ import { pluginEnv as le } from "@voltro/env";
8
+ import { createHmac as I, randomBytes as ue, randomUUID as de, scryptSync as fe, timingSafeEqual as L } from "node:crypto";
9
9
  import { spawn as pe } from "node:child_process";
10
10
  import { mkdtemp as me, readFile as he, rm as R, writeFile as z } from "node:fs/promises";
11
11
  import { tmpdir as ge } from "node:os";
12
12
  import { join as B } from "node:path";
13
+ import { statSync as _e } from "node:fs";
13
14
  //#region src/streamBridge.ts
14
- var _e = 1 << 20, ve = (e, n, r = !1) => new t({
15
+ var ve = 1 << 20, ye = (e, n, r = !1) => new t({
15
16
  provider: e,
16
17
  message: n,
17
18
  transient: r
18
- }), ye = (e) => {
19
+ }), be = (e) => {
19
20
  let t = 0;
20
21
  for (let n of e) t += n.byteLength;
21
22
  let n = new Uint8Array(t), r = 0;
22
23
  for (let t of e) n.set(t, r), r += t.byteLength;
23
24
  return n;
24
- }, be = (e, t = _e) => {
25
+ }, xe = (e, t = ve) => {
25
26
  let n = [];
26
27
  for (let r = 0; r < e.byteLength; r += t) n.push(e.subarray(r, Math.min(r + t, e.byteLength)));
27
- return w.fromIterable(n);
28
- }, xe = (e) => e.pipe(w.runCollect, b.map((e) => ye(y.toReadonlyArray(e)))), Se = (e, t) => w.suspend(() => w.fromAsyncIterable(t(), (t) => ve(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(w.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), Ce = async (e) => {
28
+ return T.fromIterable(n);
29
+ }, Se = (e) => e.pipe(T.runCollect, x.map((e) => be(b.toReadonlyArray(e)))), Ce = (e, t) => T.suspend(() => T.fromAsyncIterable(t(), (t) => ye(e, `read stream failed: ${String(t?.message ?? t)}`, !0))).pipe(T.map((e) => e instanceof Uint8Array ? e : new Uint8Array(e))), we = async (e) => {
29
30
  let { Readable: t } = await import("node:stream");
30
- return t.fromWeb(w.toReadableStream(e));
31
- }, we = (e, t) => e.getStream ? e.getStream(t) : e.get(t).pipe(b.map((e) => ({
32
- stream: be(e.bytes),
31
+ return t.fromWeb(T.toReadableStream(e));
32
+ }, Te = (e, t) => e.getStream ? e.getStream(t) : e.get(t).pipe(x.map((e) => ({
33
+ stream: xe(e.bytes),
33
34
  contentType: e.contentType,
34
35
  size: e.bytes.byteLength
35
- }))), Te = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) : xe(n).pipe(b.flatMap((n) => e.put(t, n, {
36
+ }))), Ee = (e, t, n, r) => e.putStream ? e.putStream(t, n, r) : Se(n).pipe(x.flatMap((n) => e.put(t, n, {
36
37
  contentType: r.contentType,
37
38
  ...r.public === void 0 ? {} : { public: r.public }
38
- }))), V = "_voltro_storage_refs", H = "_voltro_storage_grants", U = "_voltro_storage_blobs", Ee = "_voltro_storage_usage", De = M(V, {
39
- id: k({ prefix: "file" }),
40
- tenantId: N().nullable(),
41
- ownerId: N().nullable(),
42
- bucket: N(),
43
- key: N(),
44
- contentType: N(),
45
- size: A(),
46
- checksum: N(),
47
- visibility: N(),
48
- accessPolicy: j().nullable(),
49
- passwordHash: N().nullable(),
50
- width: A().nullable(),
51
- height: A().nullable(),
52
- duration: A().nullable(),
53
- placeholder: N().nullable(),
54
- folder: N().nullable(),
55
- tags: j().nullable(),
56
- alt: N().nullable(),
57
- caption: N().nullable(),
58
- derivedFrom: N().nullable(),
59
- kind: N().nullable(),
60
- createdAt: P()
61
- }).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]), Oe = M(H, {
62
- id: k({ prefix: "sgrant" }),
63
- refId: N(),
64
- principalType: N(),
65
- principalId: N(),
66
- permission: N(),
67
- createdAt: P(),
68
- expiresAt: P().nullable(),
69
- createdBy: N().nullable()
70
- }).index(["refId"]).index(["principalId"]), ke = M(Ee, {
71
- id: k({ prefix: "susage" }),
72
- tenantId: N().maxLength(191),
73
- bytes: A().default(0),
74
- count: A().default(0),
75
- updatedAt: P()
76
- }).unique("byStorageUsageTenant", ["tenantId"]), Ae = M(U, {
77
- id: k({ prefix: "blob" }),
78
- key: N(),
79
- data: se(),
80
- contentType: N(),
81
- size: A()
82
- }).index(["key"]), W = ue([
39
+ }))), V = "_voltro_storage_refs", H = "_voltro_storage_grants", U = "_voltro_storage_blobs", W = "_voltro_storage_usage", De = N(V, {
40
+ id: A({ prefix: "file" }),
41
+ tenantId: P().nullable(),
42
+ ownerId: P().nullable(),
43
+ bucket: P(),
44
+ key: P(),
45
+ contentType: P(),
46
+ size: j(),
47
+ checksum: P(),
48
+ visibility: P(),
49
+ accessPolicy: M().nullable(),
50
+ passwordHash: P().nullable(),
51
+ width: j().nullable(),
52
+ height: j().nullable(),
53
+ duration: j().nullable(),
54
+ placeholder: P().nullable(),
55
+ folder: P().nullable(),
56
+ tags: M().nullable(),
57
+ alt: P().nullable(),
58
+ caption: P().nullable(),
59
+ derivedFrom: P().nullable(),
60
+ kind: P().nullable(),
61
+ createdAt: F()
62
+ }).index(["key"]).index(["tenantId"]).index(["ownerId"]).index(["folder"]).index(["derivedFrom"]), Oe = N(H, {
63
+ id: A({ prefix: "sgrant" }),
64
+ refId: P(),
65
+ principalType: P(),
66
+ principalId: P(),
67
+ permission: P(),
68
+ createdAt: F(),
69
+ expiresAt: F().nullable(),
70
+ createdBy: P().nullable()
71
+ }).index(["refId"]).index(["principalId"]), ke = N(W, {
72
+ id: A({ prefix: "susage" }),
73
+ tenantId: P().maxLength(191),
74
+ bytes: j().default(0),
75
+ count: j().default(0),
76
+ updatedAt: F()
77
+ }).unique("byStorageUsageTenant", ["tenantId"]), Ae = N(U, {
78
+ id: A({ prefix: "blob" }),
79
+ key: P(),
80
+ data: oe(),
81
+ contentType: P(),
82
+ size: j()
83
+ }).index(["key"]), G = le([
83
84
  {
84
85
  name: "STORAGE_PROVIDER",
85
86
  required: !1,
@@ -230,35 +231,35 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
230
231
  secret: !1,
231
232
  description: "clamd port for the optional clamav virus scanner. Default 3310."
232
233
  }
233
- ]), G = (e, n, r, i) => new t({
234
+ ]), K = (e, n, r, i) => new t({
234
235
  provider: e,
235
236
  message: n,
236
237
  transient: r,
237
238
  ...i === void 0 ? {} : { status: i }
238
- }), K = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, je = /* @__PURE__ */ new Map(), Me = (e, t) => je.get(e)?.get(t)?.bytes, Ne = (e) => {
239
+ }), q = (e) => e === void 0 || e === 408 || e === 429 || e >= 500, je = /* @__PURE__ */ new Map(), Me = (e, t) => je.get(e)?.get(t)?.bytes, Ne = (e) => {
239
240
  je.get(e)?.clear();
240
241
  }, Pe = (e = "default") => {
241
242
  let t = je.get(e) ?? /* @__PURE__ */ new Map();
242
243
  return je.set(e, t), {
243
244
  name: "memory",
244
245
  presigns: !1,
245
- put: (e, n, r) => b.sync(() => (t.set(e, {
246
+ put: (e, n, r) => x.sync(() => (t.set(e, {
246
247
  bytes: n,
247
248
  contentType: r.contentType
248
249
  }), { size: n.byteLength })),
249
- get: (e) => b.suspend(() => {
250
+ get: (e) => x.suspend(() => {
250
251
  let n = t.get(e);
251
- return n ? b.succeed({
252
+ return n ? x.succeed({
252
253
  bytes: n.bytes,
253
254
  contentType: n.contentType
254
- }) : b.fail(G("memory", `no object at key '${e}'`, !1, 404));
255
+ }) : x.fail(K("memory", `no object at key '${e}'`, !1, 404));
255
256
  }),
256
- delete: (e) => b.sync(() => {
257
+ delete: (e) => x.sync(() => {
257
258
  t.delete(e);
258
259
  }),
259
260
  publicUrl: () => null,
260
- getUrl: () => b.succeed(""),
261
- head: (e) => b.sync(() => {
261
+ getUrl: () => x.succeed(""),
262
+ head: (e) => x.sync(() => {
262
263
  let n = t.get(e);
263
264
  return n ? { size: n.bytes.byteLength } : null;
264
265
  })
@@ -268,11 +269,12 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
268
269
  let { join: n, resolve: r, sep: i } = await import("node:path"), a = r(t), o = r(a, e);
269
270
  if (o !== a && !o.startsWith(a + i)) throw Error(`key '${e}' escapes the storage root`);
270
271
  return n(o);
271
- }, r = (e, t, n = !1) => b.tryPromise({
272
+ }, r = (e, t, n = !1) => x.tryPromise({
272
273
  try: e,
273
- catch: (e) => e?.code === "ENOENT" ? G("filesystem", `no object at key '${t}'`, !1, 404) : G("filesystem", String(e?.message ?? e), n)
274
+ catch: (e) => e?.code === "ENOENT" ? K("filesystem", `no object at key '${t}'`, !1, 404) : K("filesystem", String(e?.message ?? e), n)
274
275
  });
275
276
  return {
277
+ root: t,
276
278
  name: "filesystem",
277
279
  presigns: !1,
278
280
  put: (e, t, i) => r(async () => {
@@ -297,8 +299,8 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
297
299
  await (await import("node:fs/promises")).rm(await n(e), { force: !0 });
298
300
  }, e),
299
301
  publicUrl: () => null,
300
- getUrl: () => b.succeed(""),
301
- head: (e) => b.tryPromise({
302
+ getUrl: () => x.succeed(""),
303
+ head: (e) => x.tryPromise({
302
304
  try: async () => {
303
305
  let t = await import("node:fs/promises");
304
306
  try {
@@ -308,12 +310,12 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
308
310
  throw e;
309
311
  }
310
312
  },
311
- catch: (e) => G("filesystem", String(e?.message ?? e), !1)
313
+ catch: (e) => K("filesystem", String(e?.message ?? e), !1)
312
314
  }),
313
315
  getStream: (e) => r(async () => {
314
316
  let t = await import("node:fs/promises"), { createReadStream: r } = await import("node:fs"), i = await n(e), a = await t.stat(i);
315
317
  return {
316
- stream: Se("filesystem", () => r(i)),
318
+ stream: Ce("filesystem", () => r(i)),
317
319
  contentType: "application/octet-stream",
318
320
  size: a.size
319
321
  };
@@ -323,7 +325,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
323
325
  await r.mkdir(i(c), { recursive: !0 });
324
326
  let l = `${c}.tmp-${a()}`;
325
327
  try {
326
- await s(await Ce(t), o(l));
328
+ await s(await we(t), o(l));
327
329
  let e = await r.stat(l);
328
330
  return await r.rename(l, c), { size: e.size };
329
331
  } catch (e) {
@@ -338,7 +340,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
338
340
  end: i
339
341
  });
340
342
  s.on("data", (e) => o.push(e)), s.on("end", () => e()), s.on("error", n);
341
- }), ye(o);
343
+ }), be(o);
342
344
  }, e)
343
345
  };
344
346
  }, Ie = (e) => {
@@ -362,11 +364,11 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
362
364
  cmds: t,
363
365
  presign: n.getSignedUrl
364
366
  };
365
- })(), r), a = (e) => b.tryPromise({
367
+ })(), r), a = (e) => x.tryPromise({
366
368
  try: e,
367
369
  catch: (e) => {
368
370
  let n = e?.$metadata?.httpStatusCode;
369
- return G(t, String(e?.message ?? e), K(n), n);
371
+ return K(t, String(e?.message ?? e), q(n), n);
370
372
  }
371
373
  }), o = async (e) => {
372
374
  let t = e;
@@ -462,7 +464,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
462
464
  UploadId: n
463
465
  }));
464
466
  }),
465
- head: (n) => b.tryPromise({
467
+ head: (n) => x.tryPromise({
466
468
  try: async () => {
467
469
  let { client: t, cmds: r } = await i();
468
470
  try {
@@ -481,7 +483,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
481
483
  },
482
484
  catch: (e) => {
483
485
  let n = e?.$metadata?.httpStatusCode;
484
- return G(t, String(e?.message ?? e), K(n), n);
486
+ return K(t, String(e?.message ?? e), q(n), n);
485
487
  }
486
488
  }),
487
489
  getStream: (n) => a(async () => {
@@ -490,7 +492,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
490
492
  Key: n
491
493
  })), s = o.Body;
492
494
  return {
493
- stream: Se(t, () => s),
495
+ stream: Ce(t, () => s),
494
496
  contentType: o.ContentType ?? "application/octet-stream",
495
497
  ...o.ContentLength === void 0 ? {} : { size: o.ContentLength }
496
498
  };
@@ -502,7 +504,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
502
504
  } catch (e) {
503
505
  throw Error("s3/minio `putStream` requires the '@aws-sdk/lib-storage' optional dependency (multipart upload). Install it to enable streamed uploads.", { cause: e });
504
506
  }
505
- let l = await Ce(r);
507
+ let l = await we(r);
506
508
  return await new c.Upload({
507
509
  client: a,
508
510
  params: {
@@ -530,9 +532,9 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
530
532
  let e = null, t = () => {
531
533
  if (!e) throw Error("the 'database' storage provider isn't bound to a DataStore yet");
532
534
  return e;
533
- }, n = (e) => b.tryPromise({
535
+ }, n = (e) => x.tryPromise({
534
536
  try: e,
535
- catch: (e) => G("database", String(e?.message ?? e), !0)
537
+ catch: (e) => K("database", String(e?.message ?? e), !0)
536
538
  }), r = async (e) => (await t().query({
537
539
  table: U,
538
540
  predicate: {
@@ -558,7 +560,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
558
560
  contentType: a.contentType,
559
561
  size: i.byteLength
560
562
  }) : await t().insert(U, {
561
- id: O({
563
+ id: k({
562
564
  kind: "typeid",
563
565
  prefix: "blob"
564
566
  }, U),
@@ -568,16 +570,16 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
568
570
  size: i.byteLength
569
571
  }), { size: i.byteLength };
570
572
  }),
571
- get: (e) => b.suspend(() => n(() => r(e)).pipe(b.flatMap((t) => t ? b.succeed({
573
+ get: (e) => x.suspend(() => n(() => r(e)).pipe(x.flatMap((t) => t ? x.succeed({
572
574
  bytes: Le(t.data),
573
575
  contentType: String(t.contentType)
574
- }) : b.fail(G("database", `no object at key '${e}'`, !1, 404))))),
576
+ }) : x.fail(K("database", `no object at key '${e}'`, !1, 404))))),
575
577
  delete: (e) => n(async () => {
576
578
  let n = await r(e);
577
579
  n && await t().delete(U, String(n.id));
578
580
  }),
579
581
  publicUrl: () => null,
580
- getUrl: () => b.succeed(""),
582
+ getUrl: () => x.succeed(""),
581
583
  head: (e) => n(async () => {
582
584
  let t = await r(e);
583
585
  return t ? { size: Number(t.size) } : null;
@@ -591,17 +593,17 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
591
593
  } catch (e) {
592
594
  throw Error("the 'azure' storage provider requires the '@azure/storage-blob' optional dependency. Install it to enable it.", { cause: e });
593
595
  }
594
- let n = W.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = W.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = W.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
596
+ let n = G.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = G.read("AZURE_STORAGE_KEY", e.accountKey), i = n && r ? new t.StorageSharedKeyCredential(n, r) : null, a = G.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString);
595
597
  return {
596
598
  container: (a ? t.BlobServiceClient.fromConnectionString(a) : new t.BlobServiceClient(e.endpoint ?? `https://${n}.blob.core.windows.net`, i ?? void 0)).getContainerClient(e.container),
597
599
  sdk: t,
598
600
  cred: i
599
601
  };
600
- })(), t), r = (e) => b.tryPromise({
602
+ })(), t), r = (e) => x.tryPromise({
601
603
  try: e,
602
604
  catch: (e) => {
603
605
  let t = e?.statusCode;
604
- return G("azure", String(e?.message ?? e), K(t), t);
606
+ return K("azure", String(e?.message ?? e), q(t), t);
605
607
  }
606
608
  }), i = async (e) => {
607
609
  if (!e) return /* @__PURE__ */ new Uint8Array();
@@ -643,7 +645,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
643
645
  publicUrl: (t) => e.cdnBaseUrl ? `${e.cdnBaseUrl.replace(/\/$/, "")}/${t}` : null,
644
646
  getUrl: (e, t) => r(() => a(e, "r", t)),
645
647
  getUploadUrl: (e, t, n) => r(() => a(e, "cw", t)),
646
- head: (e) => b.tryPromise({
648
+ head: (e) => x.tryPromise({
647
649
  try: async () => {
648
650
  let { container: t } = await n();
649
651
  try {
@@ -659,19 +661,19 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
659
661
  },
660
662
  catch: (e) => {
661
663
  let t = e?.statusCode;
662
- return G("azure", String(e?.message ?? e), K(t), t);
664
+ return K("azure", String(e?.message ?? e), q(t), t);
663
665
  }
664
666
  }),
665
667
  getStream: (e) => r(async () => {
666
668
  let { container: t } = await n(), r = await t.getBlockBlobClient(e).download();
667
669
  return {
668
- stream: Se("azure", () => r.readableStreamBody),
670
+ stream: Ce("azure", () => r.readableStreamBody),
669
671
  contentType: r.contentType ?? "application/octet-stream",
670
672
  ...r.contentLength === void 0 ? {} : { size: r.contentLength }
671
673
  };
672
674
  }),
673
675
  putStream: (e, t, i) => r(async () => {
674
- let { container: r } = await n(), a = await Ce(t);
676
+ let { container: r } = await n(), a = await we(t);
675
677
  return await r.getBlockBlobClient(e).uploadStream(a, 4194304, 5, { blobHTTPHeaders: { blobContentType: i.contentType } }), { size: i.totalSize ?? (await r.getBlockBlobClient(e).getProperties()).contentLength ?? 0 };
676
678
  }),
677
679
  getRange: (e, t, a) => r(async () => {
@@ -700,15 +702,15 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
700
702
  ...a === void 0 ? {} : { q: a },
701
703
  ...s ? { fit: s } : {}
702
704
  };
703
- }, He = (e) => e.startsWith("image/") && !e.includes("svg"), q, Ue = async () => {
704
- if (q !== void 0) return q;
705
+ }, He = (e) => e.startsWith("image/") && !e.includes("svg"), J, Ue = async () => {
706
+ if (J !== void 0) return J;
705
707
  try {
706
708
  let e = await import("sharp");
707
- q = e.default ?? e;
709
+ J = e.default ?? e;
708
710
  } catch {
709
- q = null;
711
+ J = null;
710
712
  }
711
- return q;
713
+ return J;
712
714
  }, We = async (e, t, n) => {
713
715
  if (!He(t)) return null;
714
716
  let r = await Ue();
@@ -734,17 +736,17 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
734
736
  } catch {
735
737
  return null;
736
738
  }
737
- }, Ge = 200, J = /* @__PURE__ */ new Map(), Ke = async (e, t, n, r) => {
738
- let i = `${e}::${JSON.stringify(r)}`, a = J.get(i);
739
+ }, Ge = 200, Y = /* @__PURE__ */ new Map(), Ke = async (e, t, n, r) => {
740
+ let i = `${e}::${JSON.stringify(r)}`, a = Y.get(i);
739
741
  if (a) return a;
740
742
  let o = await We(t, n, r);
741
- if (o && (J.set(i, o), J.size > Ge)) {
742
- let e = J.keys().next().value;
743
- e !== void 0 && J.delete(e);
743
+ if (o && (Y.set(i, o), Y.size > Ge)) {
744
+ let e = Y.keys().next().value;
745
+ e !== void 0 && Y.delete(e);
744
746
  }
745
747
  return o;
746
748
  }, qe = (e) => {
747
- let t = I(16).toString("hex");
749
+ let t = ue(16).toString("hex");
748
750
  return `${t}:${fe(e, t, 32).toString("hex")}`;
749
751
  }, Je = (e, t) => {
750
752
  if (!e || !t) return !1;
@@ -752,14 +754,14 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
752
754
  if (!n || !r) return !1;
753
755
  let i = Buffer.from(r, "hex"), a = fe(e, n, i.length);
754
756
  return a.length === i.length && L(a, i);
755
- }, Ye = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], Xe = (e) => Ye(e.metadata?.roles), Ze = (e) => Ye(e.scopes), Qe = (e, t) => e.some((e) => t.includes(e)), $e = (e) => Ye(e.metadata?.groups), et = (e) => typeof e == "boolean" ? b.succeed(e) : b.isEffect(e) ? e : b.promise(() => e), tt = (e, t, n = {}) => b.gen(function* () {
757
+ }, Ye = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], Xe = (e) => Ye(e.metadata?.roles), Ze = (e) => Ye(e.scopes), Qe = (e, t) => e.some((e) => t.includes(e)), $e = (e) => Ye(e.metadata?.groups), et = (e) => typeof e == "boolean" ? x.succeed(e) : x.isEffect(e) ? e : x.promise(() => e), tt = (e, t, n = {}) => x.gen(function* () {
756
758
  if (t.id && e.ownerId && t.id === e.ownerId) return !0;
757
759
  let r = e.accessPolicy ?? [];
758
760
  if (r.length === 0) return !1;
759
- let i = n.resolveGroups ? yield* b.promise(async () => await n.resolveGroups(t)) : $e(t);
761
+ let i = n.resolveGroups ? yield* x.promise(async () => await n.resolveGroups(t)) : $e(t);
760
762
  for (let a of r) if (yield* nt(a, e, t, i, n)) return !0;
761
763
  return !1;
762
- }), nt = (e, t, n, r, i) => b.gen(function* () {
764
+ }), nt = (e, t, n, r, i) => x.gen(function* () {
763
765
  let a = !1, o = (e) => (a = !0, e);
764
766
  if (e.owner !== void 0 && e.owner && !o(!!n.id && !!t.ownerId && n.id === t.ownerId) || e.tenant !== void 0 && e.tenant && !o(!!n.tenantId && n.tenantId === t.tenantId) || e.apiKey !== void 0 && e.apiKey && !o(n.type === "apiKey") || e.roles && e.roles.length > 0 && !o(Qe(Xe(n), e.roles)) || e.groups && e.groups.length > 0 && !o(Qe(r, e.groups)) || e.scopes && e.scopes.length > 0 && !o(Qe(Ze(n), e.scopes)) || e.password !== void 0 && e.password && !o(Je(i.password, t.passwordHash))) return !1;
765
767
  if (e.guard) {
@@ -784,100 +786,100 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
784
786
  }, it = (e, t, n, r, i) => {
785
787
  let a = rt(t, n);
786
788
  return e.some((e) => e.expiresAt && e.expiresAt.getTime() < i || r === "write" && e.permission !== "write" ? !1 : a.some((t) => t.type === e.principalType && t.id === e.principalId));
787
- }, at = (e, t) => t.resolveGroups ? b.promise(async () => await t.resolveGroups(e)) : b.succeed($e(e)), Y = () => W.read("VOLTRO_STORAGE_SECRET") ?? ae(), X = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Z = (e) => {
789
+ }, at = (e, t) => t.resolveGroups ? x.promise(async () => await t.resolveGroups(e)) : x.succeed($e(e)), X = () => G.read("VOLTRO_STORAGE_SECRET") ?? ie(), Z = (e) => (typeof e == "string" ? Buffer.from(e, "utf8") : e).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""), Q = (e) => {
788
790
  let t = e.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - e.length % 4) % 4);
789
791
  return Buffer.from(t, "base64");
790
- }, ot = (e, t, n = Y()) => {
792
+ }, ot = (e, t, n = X()) => {
791
793
  if (!n) throw Error("signGrant: secret must be a non-empty string");
792
794
  let r = {
793
795
  refId: e,
794
796
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
795
- }, i = X(JSON.stringify(r));
796
- return `${i}.${X(F("sha256", n).update(i).digest())}`;
797
- }, st = (e, t = Y()) => {
797
+ }, i = Z(JSON.stringify(r));
798
+ return `${i}.${Z(I("sha256", n).update(i).digest())}`;
799
+ }, st = (e, t = X()) => {
798
800
  if (!e || !t) return null;
799
801
  let n = e.indexOf(".");
800
802
  if (n <= 0 || n === e.length - 1) return null;
801
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(r).digest(), o = Z(i);
803
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(r).digest(), o = Q(i);
802
804
  if (o.length !== a.length || !L(o, a)) return null;
803
805
  try {
804
- let e = JSON.parse(Z(r).toString("utf8"));
806
+ let e = JSON.parse(Q(r).toString("utf8"));
805
807
  return typeof e.refId != "string" || typeof e.exp != "number" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
806
808
  } catch {
807
809
  return null;
808
810
  }
809
- }, ct = (e, t, n = Y()) => {
811
+ }, ct = (e, t, n = X()) => {
810
812
  if (!n) throw Error("signUploadTicket: secret must be a non-empty string");
811
813
  let r = {
812
814
  ...e,
813
815
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
814
- }, i = X(JSON.stringify(r));
815
- return `${i}.${X(F("sha256", n).update(`u:${i}`).digest())}`;
816
- }, lt = (e, t = Y()) => {
816
+ }, i = Z(JSON.stringify(r));
817
+ return `${i}.${Z(I("sha256", n).update(`u:${i}`).digest())}`;
818
+ }, lt = (e, t = X()) => {
817
819
  if (!e || !t) return null;
818
820
  let n = e.indexOf(".");
819
821
  if (n <= 0 || n === e.length - 1) return null;
820
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`u:${r}`).digest(), o = Z(i);
822
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`u:${r}`).digest(), o = Q(i);
821
823
  if (o.length !== a.length || !L(o, a)) return null;
822
824
  try {
823
- let e = JSON.parse(Z(r).toString("utf8"));
825
+ let e = JSON.parse(Q(r).toString("utf8"));
824
826
  return typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
825
827
  } catch {
826
828
  return null;
827
829
  }
828
- }, ut = (e, t, n = Y()) => {
830
+ }, ut = (e, t, n = X()) => {
829
831
  if (!n) throw Error("signFinalizeTicket: secret must be a non-empty string");
830
832
  let r = {
831
833
  ...e,
832
834
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
833
- }, i = X(JSON.stringify(r));
834
- return `${i}.${X(F("sha256", n).update(`f:${i}`).digest())}`;
835
- }, dt = (e, t = Y()) => {
835
+ }, i = Z(JSON.stringify(r));
836
+ return `${i}.${Z(I("sha256", n).update(`f:${i}`).digest())}`;
837
+ }, dt = (e, t = X()) => {
836
838
  if (!e || !t) return null;
837
839
  let n = e.indexOf(".");
838
840
  if (n <= 0 || n === e.length - 1) return null;
839
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`f:${r}`).digest(), o = Z(i);
841
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`f:${r}`).digest(), o = Q(i);
840
842
  if (o.length !== a.length || !L(o, a)) return null;
841
843
  try {
842
- let e = JSON.parse(Z(r).toString("utf8"));
844
+ let e = JSON.parse(Q(r).toString("utf8"));
843
845
  return typeof e.key != "string" || e.key.length === 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
844
846
  } catch {
845
847
  return null;
846
848
  }
847
- }, ft = (e, t, n = Y()) => {
849
+ }, ft = (e, t, n = X()) => {
848
850
  if (!n) throw Error("signResumableTicket: secret must be a non-empty string");
849
851
  let r = {
850
852
  ...e,
851
853
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
852
- }, i = X(JSON.stringify(r));
853
- return `${i}.${X(F("sha256", n).update(`r:${i}`).digest())}`;
854
- }, pt = (e, t = Y()) => {
854
+ }, i = Z(JSON.stringify(r));
855
+ return `${i}.${Z(I("sha256", n).update(`r:${i}`).digest())}`;
856
+ }, pt = (e, t = X()) => {
855
857
  if (!e || !t) return null;
856
858
  let n = e.indexOf(".");
857
859
  if (n <= 0 || n === e.length - 1) return null;
858
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`r:${r}`).digest(), o = Z(i);
860
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`r:${r}`).digest(), o = Q(i);
859
861
  if (o.length !== a.length || !L(o, a)) return null;
860
862
  try {
861
- let e = JSON.parse(Z(r).toString("utf8"));
863
+ let e = JSON.parse(Q(r).toString("utf8"));
862
864
  return typeof e.id != "string" || e.id.length === 0 || typeof e.size != "number" || e.size < 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
863
865
  } catch {
864
866
  return null;
865
867
  }
866
- }, mt = (e, t, n = Y()) => {
868
+ }, mt = (e, t, n = X()) => {
867
869
  if (!n) throw Error("signMultipartTicket: secret must be a non-empty string");
868
870
  let r = {
869
871
  ...e,
870
872
  exp: Math.floor(Date.now() / 1e3) + Math.floor(t)
871
- }, i = X(JSON.stringify(r));
872
- return `${i}.${X(F("sha256", n).update(`m:${i}`).digest())}`;
873
- }, ht = (e, t = Y()) => {
873
+ }, i = Z(JSON.stringify(r));
874
+ return `${i}.${Z(I("sha256", n).update(`m:${i}`).digest())}`;
875
+ }, ht = (e, t = X()) => {
874
876
  if (!e || !t) return null;
875
877
  let n = e.indexOf(".");
876
878
  if (n <= 0 || n === e.length - 1) return null;
877
- let r = e.slice(0, n), i = e.slice(n + 1), a = F("sha256", t).update(`m:${r}`).digest(), o = Z(i);
879
+ let r = e.slice(0, n), i = e.slice(n + 1), a = I("sha256", t).update(`m:${r}`).digest(), o = Q(i);
878
880
  if (o.length !== a.length || !L(o, a)) return null;
879
881
  try {
880
- let e = JSON.parse(Z(r).toString("utf8"));
882
+ let e = JSON.parse(Q(r).toString("utf8"));
881
883
  return typeof e.key != "string" || e.key.length === 0 || typeof e.uploadId != "string" || e.uploadId.length === 0 || typeof e.ct != "string" || typeof e.exp != "number" || e.vis !== "public" && e.vis !== "private" || e.exp < Math.floor(Date.now() / 1e3) ? null : e;
882
884
  } catch {
883
885
  return null;
@@ -1010,17 +1012,17 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1010
1012
  if (!t.tags.every((e) => n.includes(e))) return !1;
1011
1013
  }
1012
1014
  return !0;
1013
- }, Q = (e) => e ?? "global", wt = () => {
1015
+ }, wt = (e) => e ?? "global", Tt = () => {
1014
1016
  let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map();
1015
1017
  return {
1016
- insert: (t) => b.sync(() => {
1018
+ insert: (t) => x.sync(() => {
1017
1019
  e.set(t.id, t);
1018
1020
  }),
1019
- getById: (t) => b.sync(() => e.get(t) ?? null),
1020
- delete: (t) => b.sync(() => e.delete(t)),
1021
- listRecent: (t) => b.sync(() => [...e.values()].sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(0, t)),
1022
- countByKey: (t, n) => b.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n).length),
1023
- usageByTenant: (t) => b.sync(() => {
1021
+ getById: (t) => x.sync(() => e.get(t) ?? null),
1022
+ delete: (t) => x.sync(() => e.delete(t)),
1023
+ listRecent: (t) => x.sync(() => [...e.values()].sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(0, t)),
1024
+ countByKey: (t, n) => x.sync(() => [...e.values()].filter((e) => e.bucket === t && e.key === n).length),
1025
+ usageByTenant: (t) => x.sync(() => {
1024
1026
  let n = 0, r = 0;
1025
1027
  for (let i of e.values()) (i.tenantId ?? null) === (t ?? null) && (n += i.size, r++);
1026
1028
  return {
@@ -1028,8 +1030,8 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1028
1030
  count: r
1029
1031
  };
1030
1032
  }),
1031
- consumeUsage: (e, n, r) => b.sync(() => {
1032
- let i = Q(e), a = t.get(i) ?? {
1033
+ consumeUsage: (e, n, r) => x.sync(() => {
1034
+ let i = wt(e), a = t.get(i) ?? {
1033
1035
  bytes: 0,
1034
1036
  count: 0
1035
1037
  }, o = (r?.maxBytes === void 0 || a.bytes + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || a.count + n.count <= r.maxCount);
@@ -1042,17 +1044,17 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1042
1044
  count: a.count
1043
1045
  };
1044
1046
  }),
1045
- releaseUsage: (e, n) => b.sync(() => {
1046
- let r = Q(e), i = t.get(r);
1047
+ releaseUsage: (e, n) => x.sync(() => {
1048
+ let r = wt(e), i = t.get(r);
1047
1049
  i && t.set(r, {
1048
1050
  bytes: Math.max(0, i.bytes - n.bytes),
1049
1051
  count: Math.max(0, i.count - n.count)
1050
1052
  });
1051
1053
  }),
1052
- listByDerivedFrom: (t) => b.sync(() => [...e.values()].filter((e) => (e.derivedFrom ?? null) === t)),
1053
- listRefs: (t) => b.sync(() => [...e.values()].filter((e) => Ct(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(t.offset, t.offset + t.limit))
1054
+ listByDerivedFrom: (t) => x.sync(() => [...e.values()].filter((e) => (e.derivedFrom ?? null) === t)),
1055
+ listRefs: (t) => x.sync(() => [...e.values()].filter((e) => Ct(e, t)).sort((e, t) => t.createdAt.getTime() - e.createdAt.getTime()).slice(t.offset, t.offset + t.limit))
1054
1056
  };
1055
- }, Tt = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, Et = (e) => ({
1057
+ }, Et = (e) => Array.isArray(e) && e.every((e) => typeof e == "string") ? e : null, Dt = (e) => ({
1056
1058
  id: String(e.id),
1057
1059
  tenantId: e.tenantId ?? null,
1058
1060
  ownerId: e.ownerId ?? null,
@@ -1070,19 +1072,19 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1070
1072
  duration: e.duration ?? null,
1071
1073
  placeholder: e.placeholder ?? null,
1072
1074
  folder: e.folder ?? null,
1073
- tags: Tt(e.tags),
1075
+ tags: Et(e.tags),
1074
1076
  alt: e.alt ?? null,
1075
1077
  caption: e.caption ?? null,
1076
1078
  derivedFrom: e.derivedFrom ?? null,
1077
1079
  kind: e.kind ?? null
1078
- }), $ = (e) => b.tryPromise({
1080
+ }), $ = (e) => x.tryPromise({
1079
1081
  try: e,
1080
1082
  catch: (e) => new t({
1081
1083
  provider: "refstore",
1082
1084
  message: String(e?.message ?? e),
1083
1085
  transient: !0
1084
1086
  })
1085
- }), Dt = async (e, t) => (await e.query({
1087
+ }), Ot = async (e, t) => (await e.query({
1086
1088
  table: "_voltro_storage_usage",
1087
1089
  predicate: {
1088
1090
  column: "tenantId",
@@ -1093,7 +1095,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1093
1095
  take: 1,
1094
1096
  skip: void 0,
1095
1097
  projection: void 0
1096
- }))[0] ?? null, Ot = (e) => ({
1098
+ }))[0] ?? null, kt = (e) => ({
1097
1099
  insert: (t) => $(() => e.insert(V, { ...t })),
1098
1100
  getById: (t) => $(async () => {
1099
1101
  let n = await e.query({
@@ -1108,7 +1110,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1108
1110
  skip: void 0,
1109
1111
  projection: void 0
1110
1112
  });
1111
- return n[0] ? Et(n[0]) : null;
1113
+ return n[0] ? Dt(n[0]) : null;
1112
1114
  }),
1113
1115
  delete: (t) => $(() => e.delete(V, t)),
1114
1116
  listRecent: (t) => $(async () => (await e.query({
@@ -1121,7 +1123,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1121
1123
  take: t,
1122
1124
  skip: void 0,
1123
1125
  projection: void 0
1124
- })).map(Et)),
1126
+ })).map(Dt)),
1125
1127
  countByKey: (t, n) => $(async () => (await e.query({
1126
1128
  table: V,
1127
1129
  predicate: { and: [{
@@ -1158,10 +1160,10 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1158
1160
  };
1159
1161
  }),
1160
1162
  consumeUsage: (t, n, r) => $(async () => {
1161
- let i = Q(t);
1163
+ let i = wt(t);
1162
1164
  for (let t = 0; t < 32; t++) {
1163
1165
  t > 0 && await new Promise((e) => setTimeout(e, t));
1164
- let a = await Dt(e, i), o = a ? Number(a.bytes ?? 0) : 0, s = a ? Number(a.count ?? 0) : 0;
1166
+ let a = await Ot(e, i), o = a ? Number(a.bytes ?? 0) : 0, s = a ? Number(a.count ?? 0) : 0;
1165
1167
  if (!((r?.maxBytes === void 0 || o + n.bytes <= r.maxBytes) && (r?.maxCount === void 0 || s + n.count <= r.maxCount))) return {
1166
1168
  allowed: !1,
1167
1169
  bytes: o,
@@ -1172,16 +1174,16 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1172
1174
  bytes: o + n.bytes,
1173
1175
  count: s + n.count,
1174
1176
  updatedAt: /* @__PURE__ */ new Date()
1175
- }, { where: E(D("id", String(a.id)), D("bytes", o), D("count", s)) }) === 1) return {
1177
+ }, { where: D(O("id", String(a.id)), O("bytes", o), O("count", s)) }) === 1) return {
1176
1178
  allowed: !0,
1177
1179
  bytes: o,
1178
1180
  count: s
1179
1181
  };
1180
1182
  } else {
1181
- let t = O({
1183
+ let t = k({
1182
1184
  kind: "typeid",
1183
1185
  prefix: "susage"
1184
- }, Ee), r = await e.insertIgnore(Ee, {
1186
+ }, W), r = await e.insertIgnore(W, {
1185
1187
  id: t,
1186
1188
  tenantId: i,
1187
1189
  bytes: n.bytes,
@@ -1198,17 +1200,17 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1198
1200
  throw Error(`storage usage consume: contention on tenant '${i}' exceeded 32 attempts`);
1199
1201
  }),
1200
1202
  releaseUsage: (t, n) => $(async () => {
1201
- let r = Q(t);
1203
+ let r = wt(t);
1202
1204
  for (let t = 0; t < 32; t++) {
1203
1205
  t > 0 && await new Promise((e) => setTimeout(e, t));
1204
- let i = await Dt(e, r);
1206
+ let i = await Ot(e, r);
1205
1207
  if (!i) return;
1206
1208
  let a = Number(i.bytes ?? 0), o = Number(i.count ?? 0);
1207
1209
  if (await e.updateMany("_voltro_storage_usage", {
1208
1210
  bytes: Math.max(0, a - n.bytes),
1209
1211
  count: Math.max(0, o - n.count),
1210
1212
  updatedAt: /* @__PURE__ */ new Date()
1211
- }, { where: E(D("id", String(i.id)), D("bytes", a), D("count", o)) }) === 1) return;
1213
+ }, { where: D(O("id", String(i.id)), O("bytes", a), O("count", o)) }) === 1) return;
1212
1214
  }
1213
1215
  throw Error(`storage usage release: contention on tenant '${r}' exceeded 32 attempts`);
1214
1216
  }),
@@ -1226,7 +1228,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1226
1228
  take: void 0,
1227
1229
  skip: void 0,
1228
1230
  projection: void 0
1229
- })).map(Et)),
1231
+ })).map(Dt)),
1230
1232
  listRefs: (t) => $(async () => {
1231
1233
  let n = [];
1232
1234
  t.tenantId !== void 0 && n.push({
@@ -1249,24 +1251,24 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1249
1251
  take: void 0,
1250
1252
  skip: void 0,
1251
1253
  projection: void 0
1252
- })).map(Et).filter((e) => Ct(e, t)).slice(t.offset, t.offset + t.limit);
1254
+ })).map(Dt).filter((e) => Ct(e, t)).slice(t.offset, t.offset + t.limit);
1253
1255
  })
1254
- }), kt = () => {
1256
+ }), At = () => {
1255
1257
  let e = /* @__PURE__ */ new Map();
1256
1258
  return {
1257
- insert: (t) => b.sync(() => {
1259
+ insert: (t) => x.sync(() => {
1258
1260
  e.set(t.id, t);
1259
1261
  }),
1260
- delete: (t) => b.sync(() => {
1262
+ delete: (t) => x.sync(() => {
1261
1263
  e.delete(t);
1262
1264
  }),
1263
- getById: (t) => b.sync(() => e.get(t) ?? null),
1264
- listByRef: (t) => b.sync(() => [...e.values()].filter((e) => e.refId === t)),
1265
- deleteByRef: (t) => b.sync(() => {
1265
+ getById: (t) => x.sync(() => e.get(t) ?? null),
1266
+ listByRef: (t) => x.sync(() => [...e.values()].filter((e) => e.refId === t)),
1267
+ deleteByRef: (t) => x.sync(() => {
1266
1268
  for (let [n, r] of e) r.refId === t && e.delete(n);
1267
1269
  })
1268
1270
  };
1269
- }, At = (e) => ({
1271
+ }, jt = (e) => ({
1270
1272
  id: String(e.id),
1271
1273
  refId: String(e.refId),
1272
1274
  principalType: e.principalType,
@@ -1275,7 +1277,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1275
1277
  createdAt: e.createdAt instanceof Date ? e.createdAt : new Date(String(e.createdAt)),
1276
1278
  expiresAt: e.expiresAt ? e.expiresAt instanceof Date ? e.expiresAt : new Date(String(e.expiresAt)) : null,
1277
1279
  createdBy: e.createdBy ?? null
1278
- }), jt = (e) => ({
1280
+ }), Mt = (e) => ({
1279
1281
  insert: (t) => $(() => e.insert(H, { ...t })),
1280
1282
  delete: (t) => $(() => e.delete(H, t)),
1281
1283
  getById: (t) => $(async () => {
@@ -1291,7 +1293,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1291
1293
  skip: void 0,
1292
1294
  projection: void 0
1293
1295
  }))[0];
1294
- return n ? At(n) : null;
1296
+ return n ? jt(n) : null;
1295
1297
  }),
1296
1298
  listByRef: (t) => $(async () => (await e.query({
1297
1299
  table: H,
@@ -1307,7 +1309,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1307
1309
  take: void 0,
1308
1310
  skip: void 0,
1309
1311
  projection: void 0
1310
- })).map(At)),
1312
+ })).map(jt)),
1311
1313
  deleteByRef: (t) => $(async () => {
1312
1314
  let n = await e.query({
1313
1315
  table: H,
@@ -1323,14 +1325,14 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1323
1325
  });
1324
1326
  for (let t of n) await e.delete(H, String(t.id));
1325
1327
  })
1326
- }), Mt = () => O({
1328
+ }), Nt = () => k({
1327
1329
  kind: "typeid",
1328
1330
  prefix: "file"
1329
- }, V), Nt = () => O({
1331
+ }, V), Pt = () => k({
1330
1332
  kind: "typeid",
1331
1333
  prefix: "grant"
1332
- }, H), Pt = (i) => {
1333
- let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) => St(i.publicBaseUrl, e), p = C.recurs(Math.max(0, u - 1)).pipe(C.intersect(C.exponential("100 millis")), C.whileInput((e) => e.transient)), m = (e, t, n) => [
1334
+ }, H), Ft = (i) => {
1335
+ let { provider: a, refStore: o, grantStore: s, bucket: c } = i, l = i.access ?? {}, u = i.attempts ?? 3, d = i.urlExpiresInSec ?? 3600, f = (e) => St(i.publicBaseUrl, e), p = w.recurs(Math.max(0, u - 1)).pipe(w.intersect(w.exponential("100 millis")), w.whileInput((e) => e.transient)), m = (e, t, n) => [
1334
1336
  i.tenantPrefix,
1335
1337
  e ?? "global",
1336
1338
  n ?? t
@@ -1340,19 +1342,19 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1340
1342
  "_incoming",
1341
1343
  t,
1342
1344
  String(n).padStart(6, "0")
1343
- ].filter(Boolean).join("/"), g = (e, n) => n !== void 0 && e.tenantId !== n ? b.fail(new t({
1345
+ ].filter(Boolean).join("/"), g = (e, n) => n !== void 0 && e.tenantId !== n ? x.fail(new t({
1344
1346
  provider: a.name,
1345
1347
  message: "cross-tenant access denied",
1346
1348
  transient: !1,
1347
1349
  status: 403
1348
- })) : b.succeed(e), _ = (e, n) => o.getById(e).pipe(b.flatMap((r) => r ? g(r, n) : b.fail(new t({
1350
+ })) : x.succeed(e), _ = (e, n) => o.getById(e).pipe(x.flatMap((r) => r ? g(r, n) : x.fail(new t({
1349
1351
  provider: a.name,
1350
1352
  message: `no ref '${e}'`,
1351
1353
  transient: !1,
1352
1354
  status: 404
1353
- })))), ee = (e) => b.suspend(() => {
1355
+ })))), ee = (e) => x.suspend(() => {
1354
1356
  let n = i.scan(e);
1355
- return b.isEffect(n) ? n : b.tryPromise({
1357
+ return x.isEffect(n) ? n : x.tryPromise({
1356
1358
  try: () => Promise.resolve(n),
1357
1359
  catch: (e) => new t({
1358
1360
  provider: "scan",
@@ -1360,56 +1362,56 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1360
1362
  transient: !0
1361
1363
  })
1362
1364
  });
1363
- }), te = (e) => b.suspend(() => {
1365
+ }), te = (e) => x.suspend(() => {
1364
1366
  let t = e.contentType;
1365
- if (!i.videoProbe || !(t.startsWith("video/") || t.startsWith("audio/"))) return b.succeed(null);
1367
+ if (!i.videoProbe || !(t.startsWith("video/") || t.startsWith("audio/"))) return x.succeed(null);
1366
1368
  let n;
1367
1369
  try {
1368
1370
  n = i.videoProbe(e);
1369
1371
  } catch {
1370
- return b.succeed(null);
1372
+ return x.succeed(null);
1371
1373
  }
1372
- return b.isEffect(n) ? n.pipe(b.catchAll(() => b.succeed(null))) : b.tryPromise({
1374
+ return x.isEffect(n) ? n.pipe(x.catchAll(() => x.succeed(null))) : x.tryPromise({
1373
1375
  try: () => Promise.resolve(n),
1374
1376
  catch: () => null
1375
- }).pipe(b.catchAll(() => b.succeed(null)));
1376
- }), v = (e) => b.gen(function* () {
1377
+ }).pipe(x.catchAll(() => x.succeed(null)));
1378
+ }), v = (e) => x.gen(function* () {
1377
1379
  let t = yt(e.bytes, e.contentType, i.limits);
1378
- if (t) return yield* b.fail(new n(t));
1380
+ if (t) return yield* x.fail(new n(t));
1379
1381
  if (i.scan) {
1380
1382
  let t = yield* ee({
1381
1383
  bytes: e.bytes,
1382
1384
  contentType: e.contentType,
1383
1385
  ...e.key ? { key: e.key } : {}
1384
1386
  });
1385
- if (!t.clean) return yield* b.fail(new r({ threat: t.threat ?? "unknown" }));
1387
+ if (!t.clean) return yield* x.fail(new r({ threat: t.threat ?? "unknown" }));
1386
1388
  }
1387
- let s = yield* b.promise(() => bt(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* te({
1389
+ let s = yield* x.promise(() => bt(e.bytes, e.contentType, { normalize: i.normalizeImages ?? !1 })), l = s.bytes, u = yield* te({
1388
1390
  bytes: l,
1389
1391
  contentType: e.contentType
1390
- }), d = s.width ?? u?.width, f = s.height ?? u?.height, h = s.placeholder ?? u?.poster, g = e.duration ?? u?.duration, _ = yield* b.promise(() => xt(l)), v = e.tenantId ?? null, ne = e.visibility ?? "private", S = m(v, _, e.key), C = {
1392
+ }), d = s.width ?? u?.width, f = s.height ?? u?.height, h = s.placeholder ?? u?.poster, g = e.duration ?? u?.duration, _ = yield* x.promise(() => xt(l)), v = e.tenantId ?? null, y = e.visibility ?? "private", C = m(v, _, e.key), w = {
1391
1393
  bytes: l.byteLength,
1392
1394
  count: 1
1393
- }, w = yield* o.consumeUsage(v, C, i.quota);
1394
- if (!w.allowed) {
1395
- let e = i.quota ?? {}, t = e.maxCount !== void 0 && w.count + 1 > e.maxCount ? `tenant object count ${w.count} + 1 exceeds max ${e.maxCount}` : `tenant usage ${w.bytes} + ${l.byteLength} bytes exceeds max ${e.maxBytes}`;
1396
- return yield* b.fail(new n({
1395
+ }, T = yield* o.consumeUsage(v, w, i.quota);
1396
+ if (!T.allowed) {
1397
+ let e = i.quota ?? {}, t = e.maxCount !== void 0 && T.count + 1 > e.maxCount ? `tenant object count ${T.count} + 1 exceeds max ${e.maxCount}` : `tenant usage ${T.bytes} + ${l.byteLength} bytes exceeds max ${e.maxBytes}`;
1398
+ return yield* x.fail(new n({
1397
1399
  reason: "quota-exceeded",
1398
1400
  detail: t
1399
1401
  }));
1400
1402
  }
1401
- let re = e.password ? yield* b.sync(() => qe(e.password)) : null, T = {
1402
- id: Mt(),
1403
+ let ne = e.password ? yield* x.sync(() => qe(e.password)) : null, E = {
1404
+ id: Nt(),
1403
1405
  tenantId: v,
1404
1406
  ownerId: e.ownerId ?? null,
1405
1407
  bucket: c,
1406
- key: S,
1408
+ key: C,
1407
1409
  contentType: e.contentType,
1408
1410
  size: l.byteLength,
1409
1411
  checksum: _,
1410
- visibility: ne,
1412
+ visibility: y,
1411
1413
  accessPolicy: e.access ?? null,
1412
- passwordHash: re,
1414
+ passwordHash: ne,
1413
1415
  createdAt: /* @__PURE__ */ new Date(),
1414
1416
  ...d === void 0 ? {} : { width: d },
1415
1417
  ...f === void 0 ? {} : { height: f },
@@ -1422,25 +1424,25 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1422
1424
  ...e.derivedFrom === void 0 ? {} : { derivedFrom: e.derivedFrom },
1423
1425
  ...e.kind === void 0 ? {} : { kind: e.kind }
1424
1426
  };
1425
- return yield* ((e) => e.pipe(b.onExit((e) => x.isSuccess(e) ? b.void : o.delete(T.id).pipe(b.zipRight(o.releaseUsage(v, C)), b.ignore))))(o.insert(T).pipe(b.zipRight(a.put(S, l, {
1427
+ return yield* ((e) => e.pipe(x.onExit((e) => S.isSuccess(e) ? x.void : o.delete(E.id).pipe(x.zipRight(o.releaseUsage(v, w)), x.ignore))))(o.insert(E).pipe(x.zipRight(a.put(C, l, {
1426
1428
  contentType: e.contentType,
1427
- public: ne === "public"
1428
- }).pipe(b.retry(p))))), i.transcode !== void 0 && i.autoTranscode !== !1 && T.derivedFrom == null && (e.contentType.startsWith("video/") || e.contentType.startsWith("audio/")) && (yield* b.forkDaemon(y(T).pipe(b.ignore))), T;
1429
- }), ne = (e) => b.suspend(() => {
1430
- if (!i.transcode) return b.succeed([]);
1429
+ public: y === "public"
1430
+ }).pipe(x.retry(p))))), i.transcode !== void 0 && i.autoTranscode !== !1 && E.derivedFrom == null && (e.contentType.startsWith("video/") || e.contentType.startsWith("audio/")) && (yield* x.forkDaemon(b(E).pipe(x.ignore))), E;
1431
+ }), y = (e) => x.suspend(() => {
1432
+ if (!i.transcode) return x.succeed([]);
1431
1433
  let t;
1432
1434
  try {
1433
1435
  t = i.transcode(e);
1434
1436
  } catch {
1435
- return b.succeed([]);
1437
+ return x.succeed([]);
1436
1438
  }
1437
- return b.isEffect(t) ? t.pipe(b.catchAll(() => b.succeed([]))) : b.tryPromise({
1439
+ return x.isEffect(t) ? t.pipe(x.catchAll(() => x.succeed([]))) : x.tryPromise({
1438
1440
  try: () => Promise.resolve(t),
1439
1441
  catch: () => []
1440
- }).pipe(b.catchAll(() => b.succeed([])));
1441
- }), y = (e) => b.gen(function* () {
1442
+ }).pipe(x.catchAll(() => x.succeed([])));
1443
+ }), b = (e) => x.gen(function* () {
1442
1444
  if (!i.transcode || e.derivedFrom != null) return [];
1443
- let t = yield* a.get(e.key).pipe(b.retry(p)), n = yield* ne({
1445
+ let t = yield* a.get(e.key).pipe(x.retry(p)), n = yield* y({
1444
1446
  bytes: t.bytes,
1445
1447
  contentType: e.contentType,
1446
1448
  ref: e
@@ -1459,14 +1461,14 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1459
1461
  r.push(n);
1460
1462
  }
1461
1463
  return r;
1462
- }), S = (e, t, n) => b.gen(function* () {
1464
+ }), C = (e, t, n) => x.gen(function* () {
1463
1465
  if (e.visibility === "public" || (yield* tt(e, t, {
1464
1466
  ...l,
1465
1467
  ...n?.password === void 0 ? {} : { password: n.password }
1466
1468
  }))) return !0;
1467
1469
  let r = yield* at(t, l);
1468
1470
  return it(yield* s.listByRef(e.id), t, r, n?.permission ?? "read", Date.now());
1469
- }), w = (e) => {
1471
+ }), T = (e) => {
1470
1472
  if (e.visibility === "public") {
1471
1473
  let t = a.publicUrl?.(e.key);
1472
1474
  if (t != null) return t;
@@ -1475,55 +1477,55 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1475
1477
  };
1476
1478
  return {
1477
1479
  put: v,
1478
- get: (e, t) => _(e, t?.tenantId).pipe(b.flatMap((e) => a.get(e.key).pipe(b.retry(p), b.map((t) => ({
1480
+ get: (e, t) => _(e, t?.tenantId).pipe(x.flatMap((e) => a.get(e.key).pipe(x.retry(p), x.map((t) => ({
1479
1481
  bytes: t.bytes,
1480
1482
  ref: e
1481
1483
  }))))),
1482
- getRange: (e, n, r) => _(e, r?.tenantId).pipe(b.flatMap((e) => {
1484
+ getRange: (e, n, r) => _(e, r?.tenantId).pipe(x.flatMap((e) => {
1483
1485
  let r = e.size, i = Math.max(0, Math.trunc(n.start));
1484
- if (r > 0 && i >= r) return b.fail(new t({
1486
+ if (r > 0 && i >= r) return x.fail(new t({
1485
1487
  provider: a.name,
1486
1488
  message: `range start ${i} past end ${r}`,
1487
1489
  transient: !1,
1488
1490
  status: 416
1489
1491
  }));
1490
1492
  let o = Math.min(Math.trunc(n.endInclusive), Math.max(0, r - 1));
1491
- return o < i ? b.fail(new t({
1493
+ return o < i ? x.fail(new t({
1492
1494
  provider: a.name,
1493
1495
  message: `empty range ${i}-${o}`,
1494
1496
  transient: !1,
1495
1497
  status: 416
1496
- })) : (a.getRange ? a.getRange(e.key, i, o).pipe(b.retry(p)) : a.get(e.key).pipe(b.retry(p), b.map((e) => e.bytes.subarray(i, o + 1)))).pipe(b.map((t) => ({
1498
+ })) : (a.getRange ? a.getRange(e.key, i, o).pipe(x.retry(p)) : a.get(e.key).pipe(x.retry(p), x.map((e) => e.bytes.subarray(i, o + 1)))).pipe(x.map((t) => ({
1497
1499
  bytes: t,
1498
1500
  ref: e,
1499
1501
  totalSize: r
1500
1502
  })));
1501
1503
  })),
1502
- getUrl: (e, t) => _(e, t?.tenantId).pipe(b.flatMap((e) => e.visibility === "public" ? b.succeed(w(e)) : a.presigns ? a.getUrl(e.key, t?.expiresInSec ?? d) : b.succeed(f(e.id)))),
1503
- head: (e, t) => o.getById(e).pipe(b.flatMap((e) => e ? g(e, t?.tenantId).pipe(b.map((e) => e)) : b.succeed(null))),
1504
- delete: (e, t) => _(e, t?.tenantId).pipe(b.flatMap((t) => s.deleteByRef(e).pipe(b.flatMap(() => o.delete(e)), b.flatMap((e) => e ? o.countByKey(t.bucket, t.key).pipe(b.flatMap((e) => e === 0 ? a.delete(t.key).pipe(b.retry(p)) : b.void), b.flatMap(() => o.releaseUsage(t.tenantId, {
1504
+ getUrl: (e, t) => _(e, t?.tenantId).pipe(x.flatMap((e) => e.visibility === "public" ? x.succeed(T(e)) : a.presigns ? a.getUrl(e.key, t?.expiresInSec ?? d) : x.succeed(f(e.id)))),
1505
+ head: (e, t) => o.getById(e).pipe(x.flatMap((e) => e ? g(e, t?.tenantId).pipe(x.map((e) => e)) : x.succeed(null))),
1506
+ delete: (e, t) => _(e, t?.tenantId).pipe(x.flatMap((t) => s.deleteByRef(e).pipe(x.flatMap(() => o.delete(e)), x.flatMap((e) => e ? o.countByKey(t.bucket, t.key).pipe(x.flatMap((e) => e === 0 ? a.delete(t.key).pipe(x.retry(p)) : x.void), x.flatMap(() => o.releaseUsage(t.tenantId, {
1505
1507
  bytes: t.size,
1506
1508
  count: 1
1507
- }))) : b.void), b.asVoid))),
1508
- mintUrl: (n, r, i) => b.gen(function* () {
1509
- let s = yield* o.getById(n).pipe(b.flatMap((e) => e ? b.succeed(e) : b.fail(new t({
1509
+ }))) : x.void), x.asVoid))),
1510
+ mintUrl: (n, r, i) => x.gen(function* () {
1511
+ let s = yield* o.getById(n).pipe(x.flatMap((e) => e ? x.succeed(e) : x.fail(new t({
1510
1512
  provider: a.name,
1511
1513
  message: `no ref '${n}'`,
1512
1514
  transient: !1,
1513
1515
  status: 404
1514
1516
  }))));
1515
- if (s.visibility === "public") return w(s);
1516
- if (!(yield* S(s, r, i?.password === void 0 ? {} : { password: i.password }))) return yield* b.fail(new e({
1517
+ if (s.visibility === "public") return T(s);
1518
+ if (!(yield* C(s, r, i?.password === void 0 ? {} : { password: i.password }))) return yield* x.fail(new e({
1517
1519
  refId: n,
1518
1520
  reason: "access denied"
1519
1521
  }));
1520
1522
  let c = i?.expiresInSec ?? d;
1521
1523
  if (a.presigns) return yield* a.getUrl(s.key, c);
1522
- let l = yield* b.sync(() => ot(s.id, c));
1524
+ let l = yield* x.sync(() => ot(s.id, c));
1523
1525
  return `${f(s.id)}?t=${l}`;
1524
1526
  }),
1525
- mintUploadUrl: (e) => b.gen(function* () {
1526
- if (!a.getUploadUrl) return yield* b.fail(new t({
1527
+ mintUploadUrl: (e) => x.gen(function* () {
1528
+ if (!a.getUploadUrl) return yield* x.fail(new t({
1527
1529
  provider: a.name,
1528
1530
  message: `provider '${a.name}' does not support presigned uploads`,
1529
1531
  transient: !1,
@@ -1532,10 +1534,10 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1532
1534
  let n = m(e.tenantId ?? null, "", e.key);
1533
1535
  return yield* a.getUploadUrl(n, e.expiresInSec ?? d, e.contentType);
1534
1536
  }),
1535
- checkAccess: S,
1536
- grant: (e) => b.gen(function* () {
1537
+ checkAccess: C,
1538
+ grant: (e) => x.gen(function* () {
1537
1539
  let t = {
1538
- id: Nt(),
1540
+ id: Pt(),
1539
1541
  refId: e.refId,
1540
1542
  principalType: e.principalType,
1541
1543
  principalId: e.principalId,
@@ -1546,7 +1548,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1546
1548
  };
1547
1549
  return yield* s.insert(t), t;
1548
1550
  }),
1549
- listRefs: (e) => b.suspend(() => {
1551
+ listRefs: (e) => x.suspend(() => {
1550
1552
  let t = Math.min(500, Math.max(1, Math.trunc(e?.limit ?? 50))), n = Math.max(0, Math.trunc(e?.offset ?? 0)), r = {
1551
1553
  tenantId: e && "tenantId" in e ? e.tenantId : void 0,
1552
1554
  folder: e?.folder,
@@ -1556,7 +1558,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1556
1558
  limit: t + 1,
1557
1559
  offset: n
1558
1560
  };
1559
- return o.listRefs(r).pipe(b.map((e) => {
1561
+ return o.listRefs(r).pipe(x.map((e) => {
1560
1562
  let r = e.length > t;
1561
1563
  return {
1562
1564
  refs: r ? e.slice(0, t) : e,
@@ -1568,19 +1570,19 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1568
1570
  getGrant: (e) => s.getById(e),
1569
1571
  listGrants: (e) => s.listByRef(e),
1570
1572
  usage: (e) => o.usageByTenant(e),
1571
- sweepOrphans: (e) => b.gen(function* () {
1573
+ sweepOrphans: (e) => x.gen(function* () {
1572
1574
  let t = e?.limit ?? 1e3, n = e?.dryRun ?? !1, r = yield* o.listRecent(t), i = [];
1573
- for (let e of r) (yield* a.head(e.key).pipe(b.catchAll(() => b.succeed(null)))) === null && (n || (yield* o.delete(e.id).pipe(b.catchAll(() => b.succeed(!1)))) && (yield* o.releaseUsage(e.tenantId, {
1575
+ for (let e of r) (yield* a.head(e.key).pipe(x.catchAll(() => x.succeed(null)))) === null && (n || (yield* o.delete(e.id).pipe(x.catchAll(() => x.succeed(!1)))) && (yield* o.releaseUsage(e.tenantId, {
1574
1576
  bytes: e.size,
1575
1577
  count: 1
1576
- }).pipe(b.ignore)), i.push(e.id));
1578
+ }).pipe(x.ignore)), i.push(e.id));
1577
1579
  return {
1578
1580
  scanned: r.length,
1579
1581
  removed: i
1580
1582
  };
1581
1583
  }),
1582
- ingestUrl: (e, n) => b.gen(function* () {
1583
- let r = yield* b.tryPromise({
1584
+ ingestUrl: (e, n) => x.gen(function* () {
1585
+ let r = yield* x.tryPromise({
1584
1586
  try: () => fetch(e),
1585
1587
  catch: (e) => new t({
1586
1588
  provider: "ingest",
@@ -1588,13 +1590,13 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1588
1590
  transient: !0
1589
1591
  })
1590
1592
  });
1591
- if (!r.ok) return yield* b.fail(new t({
1593
+ if (!r.ok) return yield* x.fail(new t({
1592
1594
  provider: "ingest",
1593
1595
  message: `fetch ${e} → ${r.status}`,
1594
1596
  transient: r.status >= 500,
1595
1597
  status: r.status
1596
1598
  }));
1597
- let i = yield* b.tryPromise({
1599
+ let i = yield* x.tryPromise({
1598
1600
  try: () => r.arrayBuffer(),
1599
1601
  catch: (e) => new t({
1600
1602
  provider: "ingest",
@@ -1615,14 +1617,14 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1615
1617
  ...n?.caption === void 0 ? {} : { caption: n.caption }
1616
1618
  });
1617
1619
  }),
1618
- mintPresignedUpload: (e) => b.gen(function* () {
1619
- if (!a.getUploadUrl) return yield* b.fail(new t({
1620
+ mintPresignedUpload: (e) => x.gen(function* () {
1621
+ if (!a.getUploadUrl) return yield* x.fail(new t({
1620
1622
  provider: a.name,
1621
1623
  message: `provider '${a.name}' does not support presigned uploads`,
1622
1624
  transient: !1,
1623
1625
  status: 400
1624
1626
  }));
1625
- let n = e.expiresInSec ?? d, r = `_incoming/${O({
1627
+ let n = e.expiresInSec ?? d, r = `_incoming/${k({
1626
1628
  kind: "typeid",
1627
1629
  prefix: "up"
1628
1630
  }, V)}`, i = m(e.tenantId ?? null, "", r);
@@ -1632,7 +1634,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1632
1634
  expiresInSec: n
1633
1635
  };
1634
1636
  }),
1635
- finalizeUpload: (e) => a.get(e.key).pipe(b.retry(p), b.flatMap((t) => v({
1637
+ finalizeUpload: (e) => a.get(e.key).pipe(x.retry(p), x.flatMap((t) => v({
1636
1638
  bytes: t.bytes,
1637
1639
  contentType: e.contentType,
1638
1640
  ...e.tenantId === void 0 ? {} : { tenantId: e.tenantId },
@@ -1642,12 +1644,12 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1642
1644
  ...e.tags === void 0 ? {} : { tags: e.tags },
1643
1645
  ...e.alt === void 0 ? {} : { alt: e.alt },
1644
1646
  ...e.caption === void 0 ? {} : { caption: e.caption }
1645
- })), b.ensuring(a.delete(e.key).pipe(b.retry(p), b.ignore))),
1646
- putResumableChunk: (e) => a.put(h(e.tenantId ?? null, e.uploadId, e.index), e.bytes, { contentType: "application/octet-stream" }).pipe(b.retry(p), b.asVoid),
1647
- resumableStatus: (e) => b.gen(function* () {
1647
+ })), x.ensuring(a.delete(e.key).pipe(x.retry(p), x.ignore))),
1648
+ putResumableChunk: (e) => a.put(h(e.tenantId ?? null, e.uploadId, e.index), e.bytes, { contentType: "application/octet-stream" }).pipe(x.retry(p), x.asVoid),
1649
+ resumableStatus: (e) => x.gen(function* () {
1648
1650
  let t = 0, n = 0;
1649
1651
  for (; t < 1e6;) {
1650
- let r = yield* a.head(h(e.tenantId ?? null, e.uploadId, t)).pipe(b.retry(p), b.catchAll(() => b.succeed(null)));
1652
+ let r = yield* a.head(h(e.tenantId ?? null, e.uploadId, t)).pipe(x.retry(p), x.catchAll(() => x.succeed(null)));
1651
1653
  if (r === null) break;
1652
1654
  n += r.size, t += 1;
1653
1655
  }
@@ -1656,15 +1658,15 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1656
1658
  nextIndex: t
1657
1659
  };
1658
1660
  }),
1659
- finalizeResumable: (e) => b.gen(function* () {
1661
+ finalizeResumable: (e) => x.gen(function* () {
1660
1662
  let t = [];
1661
1663
  for (let n = 0; n < e.count; n++) {
1662
- let r = yield* a.get(h(e.tenantId ?? null, e.uploadId, n)).pipe(b.retry(p));
1664
+ let r = yield* a.get(h(e.tenantId ?? null, e.uploadId, n)).pipe(x.retry(p));
1663
1665
  t.push(r.bytes);
1664
1666
  }
1665
1667
  let n = t.reduce((e, t) => e + t.byteLength, 0), r = new Uint8Array(n), i = 0;
1666
1668
  for (let e of t) r.set(e, i), i += e.byteLength;
1667
- let o = b.forEach(Array.from({ length: e.count }, (e, t) => t), (t) => a.delete(h(e.tenantId ?? null, e.uploadId, t)).pipe(b.retry(p), b.ignore), { discard: !0 });
1669
+ let o = x.forEach(Array.from({ length: e.count }, (e, t) => t), (t) => a.delete(h(e.tenantId ?? null, e.uploadId, t)).pipe(x.retry(p), x.ignore), { discard: !0 });
1668
1670
  return yield* v({
1669
1671
  bytes: r,
1670
1672
  contentType: e.contentType,
@@ -1675,18 +1677,18 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1675
1677
  ...e.tags === void 0 ? {} : { tags: e.tags },
1676
1678
  ...e.alt === void 0 ? {} : { alt: e.alt },
1677
1679
  ...e.caption === void 0 ? {} : { caption: e.caption }
1678
- }).pipe(b.ensuring(o));
1680
+ }).pipe(x.ensuring(o));
1679
1681
  }),
1680
- transcode: (e, t) => _(e, t?.tenantId).pipe(b.flatMap((e) => y(e))),
1681
- renditions: (e, t) => _(e, t?.tenantId).pipe(b.flatMap(() => o.listByDerivedFrom(e))),
1682
- beginMultipartUpload: (e) => b.gen(function* () {
1683
- if (!a.createMultipartUpload || !a.presignUploadPart || !a.completeMultipartUpload) return yield* b.fail(new t({
1682
+ transcode: (e, t) => _(e, t?.tenantId).pipe(x.flatMap((e) => b(e))),
1683
+ renditions: (e, t) => _(e, t?.tenantId).pipe(x.flatMap(() => o.listByDerivedFrom(e))),
1684
+ beginMultipartUpload: (e) => x.gen(function* () {
1685
+ if (!a.createMultipartUpload || !a.presignUploadPart || !a.completeMultipartUpload) return yield* x.fail(new t({
1684
1686
  provider: a.name,
1685
1687
  message: `provider '${a.name}' does not support multipart uploads`,
1686
1688
  transient: !1,
1687
1689
  status: 400
1688
1690
  }));
1689
- let n = m(e.tenantId ?? null, "", `multipart/${O({
1691
+ let n = m(e.tenantId ?? null, "", `multipart/${k({
1690
1692
  kind: "typeid",
1691
1693
  prefix: "mp"
1692
1694
  }, V)}`);
@@ -1695,29 +1697,29 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1695
1697
  key: n
1696
1698
  };
1697
1699
  }),
1698
- signMultipartPart: (e) => b.suspend(() => a.presignUploadPart ? a.presignUploadPart(e.key, e.uploadId, e.partNumber, e.expiresInSec ?? d) : b.fail(new t({
1700
+ signMultipartPart: (e) => x.suspend(() => a.presignUploadPart ? a.presignUploadPart(e.key, e.uploadId, e.partNumber, e.expiresInSec ?? d) : x.fail(new t({
1699
1701
  provider: a.name,
1700
1702
  message: "provider does not support multipart uploads",
1701
1703
  transient: !1,
1702
1704
  status: 400
1703
1705
  }))),
1704
- completeMultipart: (e) => b.gen(function* () {
1705
- if (!a.completeMultipartUpload) return yield* b.fail(new t({
1706
+ completeMultipart: (e) => x.gen(function* () {
1707
+ if (!a.completeMultipartUpload) return yield* x.fail(new t({
1706
1708
  provider: a.name,
1707
1709
  message: "provider does not support multipart uploads",
1708
1710
  transient: !1,
1709
1711
  status: 400
1710
1712
  }));
1711
- let r = yield* a.completeMultipartUpload(e.key, e.uploadId, e.parts), s = yield* a.head(e.key).pipe(b.retry(p)), l = s?.size ?? 0, u = (r.etag ?? s?.etag ?? "").replace(/"/g, ""), d = e.tenantId ?? null, f = {
1713
+ let r = yield* a.completeMultipartUpload(e.key, e.uploadId, e.parts), s = yield* a.head(e.key).pipe(x.retry(p)), l = s?.size ?? 0, u = (r.etag ?? s?.etag ?? "").replace(/"/g, ""), d = e.tenantId ?? null, f = {
1712
1714
  bytes: l,
1713
1715
  count: 1
1714
1716
  };
1715
- if (!(yield* o.consumeUsage(d, f, i.quota)).allowed) return yield* a.delete(e.key).pipe(b.retry(p), b.ignore), yield* b.fail(new n({
1717
+ if (!(yield* o.consumeUsage(d, f, i.quota)).allowed) return yield* a.delete(e.key).pipe(x.retry(p), x.ignore), yield* x.fail(new n({
1716
1718
  reason: "quota-exceeded",
1717
1719
  detail: `multipart upload of ${l} bytes exceeds tenant quota`
1718
1720
  }));
1719
1721
  let m = {
1720
- id: Mt(),
1722
+ id: Nt(),
1721
1723
  tenantId: e.tenantId ?? null,
1722
1724
  ownerId: e.ownerId ?? null,
1723
1725
  bucket: c,
@@ -1734,11 +1736,11 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1734
1736
  ...e.alt === void 0 ? {} : { alt: e.alt },
1735
1737
  ...e.caption === void 0 ? {} : { caption: e.caption }
1736
1738
  };
1737
- return yield* o.insert(m).pipe(b.onExit((e) => x.isSuccess(e) ? b.void : o.releaseUsage(d, f).pipe(b.ignore))), m;
1739
+ return yield* o.insert(m).pipe(x.onExit((e) => S.isSuccess(e) ? x.void : o.releaseUsage(d, f).pipe(x.ignore))), m;
1738
1740
  }),
1739
- abortMultipart: (e) => b.suspend(() => a.abortMultipartUpload ? a.abortMultipartUpload(e.key, e.uploadId).pipe(b.retry(p)) : b.void)
1741
+ abortMultipart: (e) => x.suspend(() => a.abortMultipartUpload ? a.abortMultipartUpload(e.key, e.uploadId).pipe(x.retry(p)) : x.void)
1740
1742
  };
1741
- }, Ft = (e) => S.succeed(i, Pt(e)), It = (e, t = 65536) => {
1743
+ }, It = (e) => C.succeed(i, Ft(e)), Lt = (e, t = 65536) => {
1742
1744
  let n = [Buffer.from("zINSTREAM\0", "utf8")];
1743
1745
  for (let r = 0; r < e.length; r += t) {
1744
1746
  let i = e.subarray(r, Math.min(r + t, e.length)), a = Buffer.alloc(4);
@@ -1746,7 +1748,7 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1746
1748
  }
1747
1749
  let r = Buffer.alloc(4);
1748
1750
  return r.writeUInt32BE(0, 0), n.push(r), Buffer.concat(n);
1749
- }, Lt = (e) => {
1751
+ }, Rt = (e) => {
1750
1752
  let t = e.replace(/\0+$/, "").trim();
1751
1753
  if (/\bOK$/.test(t)) return { clean: !0 };
1752
1754
  let n = /:\s*(.+?)\s+FOUND$/.exec(t);
@@ -1755,8 +1757,8 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1755
1757
  threat: n[1] ?? "unknown"
1756
1758
  };
1757
1759
  throw Error(`clamav: unexpected response: ${t}`);
1758
- }, Rt = async (e, t) => {
1759
- let n = await import("node:net"), r = W.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = W.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
1760
+ }, zt = async (e, t) => {
1761
+ let n = await import("node:net"), r = G.read("CLAMAV_HOST", t.host) ?? "127.0.0.1", i = G.read("CLAMAV_PORT"), a = t.port ?? (i ? Number(i) : 3310), o = t.timeoutMs ?? 3e4;
1760
1762
  return new Promise((i, s) => {
1761
1763
  let c = n.createConnection({
1762
1764
  host: r,
@@ -1767,19 +1769,19 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1767
1769
  c.on("error", (e) => {
1768
1770
  clearTimeout(u), s(e);
1769
1771
  }), c.on("connect", () => {
1770
- c.end(It(e, t.chunkSize));
1772
+ c.end(Lt(e, t.chunkSize));
1771
1773
  }), c.on("data", (e) => {
1772
1774
  l += e.toString("utf8");
1773
1775
  }), c.on("close", () => {
1774
1776
  clearTimeout(u);
1775
1777
  try {
1776
- i(Lt(l));
1778
+ i(Rt(l));
1777
1779
  } catch (e) {
1778
1780
  s(e);
1779
1781
  }
1780
1782
  });
1781
1783
  });
1782
- }, zt = (e = {}) => (t) => Rt(t.bytes, e), Bt = (e, t, n) => new Promise((r, i) => {
1784
+ }, Bt = (e = {}) => (t) => zt(t.bytes, e), Vt = (e, t, n) => new Promise((r, i) => {
1783
1785
  let a = pe(e, [...t], { stdio: [
1784
1786
  "ignore",
1785
1787
  "ignore",
@@ -1794,14 +1796,14 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1794
1796
  }), a.on("close", (e) => {
1795
1797
  clearTimeout(s), e === 0 ? r() : i(/* @__PURE__ */ Error(`ffmpeg exited ${String(e)}: ${o.slice(-400)}`));
1796
1798
  });
1797
- }), Vt = (e) => async ({ bytes: t }) => {
1799
+ }), Ht = (e) => async ({ bytes: t }) => {
1798
1800
  let n = e.ffmpegPath ?? "ffmpeg", r = e.timeoutMs ?? 3e5, i = await me(B(ge(), "voltro-tc-")), a = B(i, "in"), o = [];
1799
1801
  try {
1800
1802
  await z(a, t);
1801
1803
  for (let t of e.renditions) {
1802
1804
  let e = B(i, `out.${t.ext}`);
1803
1805
  try {
1804
- await Bt(n, [
1806
+ await Vt(n, [
1805
1807
  "-y",
1806
1808
  "-i",
1807
1809
  a,
@@ -1827,21 +1829,21 @@ var _e = 1 << 20, ve = (e, n, r = !1) => new t({
1827
1829
  };
1828
1830
  //#endregion
1829
1831
  //#region src/assetRef.ts
1830
- function Ht(e = {}) {
1831
- let t = e.nullable ?? !0, n = e.fk === !1 ? N() : le(() => De, { onDelete: e.onDelete ?? "setNull" });
1832
+ function Ut(e = {}) {
1833
+ let t = e.nullable ?? !0, n = e.fk === !1 ? P() : ce(() => De, { onDelete: e.onDelete ?? "setNull" });
1832
1834
  return t ? n.nullable() : n;
1833
1835
  }
1834
- var Ut = () => ce({
1836
+ var Wt = () => se({
1835
1837
  id: "@voltro/plugin-storage/withStorage",
1836
- fields: { asset: Ht() }
1837
- }), Wt = {
1838
+ fields: { asset: Ut() }
1839
+ }), Gt = {
1838
1840
  "image/png": "png",
1839
1841
  "image/jpeg": "jpg",
1840
1842
  "image/jpg": "jpg",
1841
1843
  "image/gif": "gif",
1842
1844
  "image/webp": "webp",
1843
1845
  "image/svg+xml": "svg"
1844
- }, Gt = (e) => {
1846
+ }, Kt = (e) => {
1845
1847
  let t = /^data:([^;,]+)(;base64)?,(.*)$/s.exec(e);
1846
1848
  if (!t) throw Error("not a data URI");
1847
1849
  let n = t[1] || "application/octet-stream", r = !!t[2], i = t[3] ?? "";
@@ -1849,16 +1851,16 @@ var Ut = () => ce({
1849
1851
  bytes: r ? new Uint8Array(Buffer.from(i, "base64")) : new Uint8Array(Buffer.from(decodeURIComponent(i), "utf8")),
1850
1852
  contentType: n
1851
1853
  };
1852
- }, Kt = (e, n) => b.gen(function* () {
1853
- let r = yield* b.try({
1854
- try: () => Gt(n.dataUri),
1854
+ }, qt = (e, n) => x.gen(function* () {
1855
+ let r = yield* x.try({
1856
+ try: () => Kt(n.dataUri),
1855
1857
  catch: (e) => new t({
1856
1858
  provider: "avatar",
1857
1859
  message: String(e?.message ?? e),
1858
1860
  transient: !1,
1859
1861
  status: 400
1860
1862
  })
1861
- }), i = Wt[r.contentType] ?? "bin";
1863
+ }), i = Gt[r.contentType] ?? "bin";
1862
1864
  return yield* e.put({
1863
1865
  bytes: r.bytes,
1864
1866
  contentType: r.contentType,
@@ -1867,15 +1869,26 @@ var Ut = () => ce({
1867
1869
  visibility: "public",
1868
1870
  key: `avatars/${n.userId}/avatar.${i}`
1869
1871
  });
1870
- }), qt = W.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", Jt, Yt = (e) => {
1871
- Jt = e;
1872
- }, Xt = () => Jt ?? Zt({}), Zt = (e) => {
1872
+ }), Jt = (e) => {
1873
+ try {
1874
+ let t = _e(e), n = _e("/");
1875
+ return typeof t.dev != "number" || typeof n.dev != "number" ? "unknown" : t.dev === n.dev ? "same-device-as-root" : "separate-mount";
1876
+ } catch {
1877
+ return "unknown";
1878
+ }
1879
+ }, Yt = (e) => {
1880
+ if (Jt(e) === "same-device-as-root") return `the capture is going to ${e}, which is on the SAME filesystem as \`/\`.\n A mounted volume would be a separate one. If this process is a container, that means the capture
1881
+ dies with it — which is the exact failure it exists for. On a development machine this is normal
1882
+ and can be ignored.`;
1883
+ }, Xt = G.read("VOLTRO_SESSION_COOKIE") ?? "voltro:session", Zt, Qt = (e) => {
1884
+ Zt = e;
1885
+ }, $t = () => Zt ?? en({}), en = (e) => {
1873
1886
  if (e.provider && typeof e.provider == "object") return e.provider;
1874
- let t = (e.provider ?? W.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = W.read("S3_BUCKET", e.bucket) ?? W.read("STORAGE_BUCKET") ?? "voltro";
1887
+ let t = (e.provider ?? G.read("STORAGE_PROVIDER") ?? "memory").toLowerCase(), n = G.read("S3_BUCKET", e.bucket) ?? G.read("STORAGE_BUCKET") ?? "voltro";
1875
1888
  switch (t) {
1876
1889
  case "s3":
1877
1890
  case "minio": {
1878
- let r = W.read("S3_REGION", e.region) ?? W.read("AWS_REGION"), i = W.read("S3_ENDPOINT", e.endpoint) ?? W.read("MINIO_ENDPOINT"), a = W.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? W.read("AWS_ACCESS_KEY_ID"), o = W.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? W.read("AWS_SECRET_ACCESS_KEY"), s = W.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1891
+ let r = G.read("S3_REGION", e.region) ?? G.read("AWS_REGION"), i = G.read("S3_ENDPOINT", e.endpoint) ?? G.read("MINIO_ENDPOINT"), a = G.read("S3_ACCESS_KEY_ID", e.accessKeyId) ?? G.read("AWS_ACCESS_KEY_ID"), o = G.read("S3_SECRET_ACCESS_KEY", e.secretAccessKey) ?? G.read("AWS_SECRET_ACCESS_KEY"), s = G.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1879
1892
  return Ie({
1880
1893
  bucket: n,
1881
1894
  name: t,
@@ -1885,13 +1898,13 @@ var Ut = () => ce({
1885
1898
  ...o ? { secretAccessKey: o } : {},
1886
1899
  ...s ? { cdnBaseUrl: s } : {},
1887
1900
  ...e.publicAcl === void 0 ? {} : { publicAcl: e.publicAcl },
1888
- ...t === "minio" || W.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
1901
+ ...t === "minio" || G.read("S3_FORCE_PATH_STYLE") === "1" ? { forcePathStyle: !0 } : {}
1889
1902
  });
1890
1903
  }
1891
1904
  case "azure": {
1892
- let t = W.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = W.read("AZURE_STORAGE_KEY", e.accountKey), i = W.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = W.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = W.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1905
+ let t = G.read("AZURE_STORAGE_ACCOUNT", e.accountName), r = G.read("AZURE_STORAGE_KEY", e.accountKey), i = G.read("AZURE_STORAGE_CONNECTION_STRING", e.connectionString), a = G.read("AZURE_STORAGE_ENDPOINT", e.endpoint), o = G.read("STORAGE_CDN_URL", e.cdnBaseUrl);
1893
1906
  return ze({
1894
- container: W.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
1907
+ container: G.read("AZURE_STORAGE_CONTAINER", e.bucket) ?? n,
1895
1908
  ...t ? { accountName: t } : {},
1896
1909
  ...r ? { accountKey: r } : {},
1897
1910
  ...i ? { connectionString: i } : {},
@@ -1900,14 +1913,14 @@ var Ut = () => ce({
1900
1913
  });
1901
1914
  }
1902
1915
  case "database": return Re();
1903
- case "filesystem": return Fe({ root: W.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
1916
+ case "filesystem": return Fe({ root: G.read("STORAGE_ROOT", e.root) ?? ".voltro-storage" });
1904
1917
  default: return Pe(e.name ?? "default");
1905
1918
  }
1906
- }, Qt = (e) => {
1919
+ }, tn = (e) => {
1907
1920
  if (e !== void 0) return e;
1908
- let t = W.read("STORAGE_ALLOWED_ORIGINS");
1921
+ let t = G.read("STORAGE_ALLOWED_ORIGINS");
1909
1922
  return t ? t.trim() === "*" ? "*" : t.split(",").map((e) => e.trim()).filter(Boolean) : [];
1910
- }, $t = (e, t) => {
1923
+ }, nn = (e, t) => {
1911
1924
  if (!e || t !== "*" && !t.includes(e)) return {};
1912
1925
  let n = {
1913
1926
  "access-control-allow-origin": t === "*" ? "*" : e,
@@ -1917,7 +1930,7 @@ var Ut = () => ce({
1917
1930
  vary: "Origin"
1918
1931
  };
1919
1932
  return t !== "*" && (n["access-control-allow-credentials"] = "true"), n;
1920
- }, en = (e) => ({
1933
+ }, rn = (e) => ({
1921
1934
  id: e.id,
1922
1935
  tenantId: e.tenantId,
1923
1936
  ownerId: e.ownerId,
@@ -1940,18 +1953,18 @@ var Ut = () => ce({
1940
1953
  caption: e.caption ?? null,
1941
1954
  derivedFrom: e.derivedFrom ?? null,
1942
1955
  kind: e.kind ?? null
1943
- }), tn = () => new t({
1956
+ }), an = () => new t({
1944
1957
  provider: "storage",
1945
1958
  message: "not permitted to administer sharing for this object",
1946
1959
  transient: !1,
1947
1960
  status: 403
1948
- }), nn = (e, t, n) => {
1961
+ }), on = (e, t, n) => {
1949
1962
  let r = n.request.subject;
1950
- return (r.scopes ?? []).includes("admin:full") ? b.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(b.catchAll(() => b.fail(tn())), b.flatMap((e) => {
1963
+ return (r.scopes ?? []).includes("admin:full") ? x.void : e.head(t, { tenantId: r.tenantId ?? null }).pipe(x.catchAll(() => x.fail(an())), x.flatMap((e) => {
1951
1964
  let t = e?.ownerId;
1952
- return t != null && t === r.id ? b.void : b.fail(tn());
1965
+ return t != null && t === r.id ? x.void : x.fail(an());
1953
1966
  }));
1954
- }, rn = (e) => ({
1967
+ }, sn = (e) => ({
1955
1968
  id: e.id,
1956
1969
  refId: e.refId,
1957
1970
  principalType: e.principalType,
@@ -1960,31 +1973,31 @@ var Ut = () => ce({
1960
1973
  createdAt: e.createdAt.toISOString(),
1961
1974
  expiresAt: e.expiresAt ? e.expiresAt.toISOString() : null,
1962
1975
  createdBy: e.createdBy
1963
- }), an = "@voltro/plugin-storage", on = (i = {}) => {
1964
- let y = Zt(i);
1965
- Yt(y);
1966
- let x = W.read("S3_BUCKET", i.bucket) ?? W.read("STORAGE_BUCKET") ?? "voltro", S = W.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), C = Qt(i.allowedOrigins), w = i.limits?.maxBytes, E = 5242880, se = 21600, D = i.refStore === void 0 || i.refStore === "memory", O = i.grantStore === void 0 || i.grantStore === "memory", k = { current: D ? wt() : i.refStore }, A = { current: O ? kt() : i.grantStore }, j = {
1967
- insert: (e) => k.current.insert(e),
1968
- getById: (e) => k.current.getById(e),
1969
- delete: (e) => k.current.delete(e),
1970
- listRecent: (e) => k.current.listRecent(e),
1971
- countByKey: (e, t) => k.current.countByKey(e, t),
1972
- usageByTenant: (e) => k.current.usageByTenant(e),
1973
- consumeUsage: (e, t, n) => k.current.consumeUsage(e, t, n),
1974
- releaseUsage: (e, t) => k.current.releaseUsage(e, t),
1975
- listByDerivedFrom: (e) => k.current.listByDerivedFrom(e),
1976
- listRefs: (e) => k.current.listRefs(e)
1977
- }, ce = {
1976
+ }), cn = "@voltro/plugin-storage", ln = (i = {}) => {
1977
+ let b = en(i);
1978
+ Qt(b);
1979
+ let S = G.read("S3_BUCKET", i.bucket) ?? G.read("STORAGE_BUCKET") ?? "voltro", C = G.read("VOLTRO_PUBLIC_URL", i.publicBaseUrl), w = tn(i.allowedOrigins), T = i.limits?.maxBytes, D = 5242880, oe = 21600, O = i.refStore === void 0 || i.refStore === "memory", k = i.grantStore === void 0 || i.grantStore === "memory", A = { current: O ? Tt() : i.refStore }, j = { current: k ? At() : i.grantStore }, M = {
1978
1980
  insert: (e) => A.current.insert(e),
1979
- delete: (e) => A.current.delete(e),
1980
1981
  getById: (e) => A.current.getById(e),
1981
- listByRef: (e) => A.current.listByRef(e),
1982
- deleteByRef: (e) => A.current.deleteByRef(e)
1983
- }, le = {
1984
- provider: y,
1985
- refStore: j,
1986
- grantStore: ce,
1987
- bucket: x,
1982
+ delete: (e) => A.current.delete(e),
1983
+ listRecent: (e) => A.current.listRecent(e),
1984
+ countByKey: (e, t) => A.current.countByKey(e, t),
1985
+ usageByTenant: (e) => A.current.usageByTenant(e),
1986
+ consumeUsage: (e, t, n) => A.current.consumeUsage(e, t, n),
1987
+ releaseUsage: (e, t) => A.current.releaseUsage(e, t),
1988
+ listByDerivedFrom: (e) => A.current.listByDerivedFrom(e),
1989
+ listRefs: (e) => A.current.listRefs(e)
1990
+ }, se = {
1991
+ insert: (e) => j.current.insert(e),
1992
+ delete: (e) => j.current.delete(e),
1993
+ getById: (e) => j.current.getById(e),
1994
+ listByRef: (e) => j.current.listByRef(e),
1995
+ deleteByRef: (e) => j.current.deleteByRef(e)
1996
+ }, ce = {
1997
+ provider: b,
1998
+ refStore: M,
1999
+ grantStore: se,
2000
+ bucket: S,
1988
2001
  ...i.tenantPrefix === void 0 ? {} : { tenantPrefix: i.tenantPrefix },
1989
2002
  ...i.attempts === void 0 ? {} : { attempts: i.attempts },
1990
2003
  ...i.urlExpiresInSec === void 0 ? {} : { urlExpiresInSec: i.urlExpiresInSec },
@@ -1994,10 +2007,10 @@ var Ut = () => ce({
1994
2007
  ...i.videoProbe === void 0 ? {} : { videoProbe: i.videoProbe },
1995
2008
  ...i.transcode === void 0 ? {} : { transcode: i.transcode },
1996
2009
  ...i.autoTranscode === void 0 ? {} : { autoTranscode: i.autoTranscode },
1997
- ...S ? { publicBaseUrl: S } : {},
2010
+ ...C ? { publicBaseUrl: C } : {},
1998
2011
  ...i.normalizeImages === void 0 ? {} : { normalizeImages: i.normalizeImages },
1999
2012
  ...i.quota === void 0 ? {} : { quota: i.quota }
2000
- }, M = Ft(le), N = Pt(le), P = (e) => b.runPromise(e.pipe(b.catchAll(() => b.succeed(null)))), ue = (e, t) => {
2013
+ }, N = It(ce), P = Ft(ce), F = (e) => x.runPromise(e.pipe(x.catchAll(() => x.succeed(null)))), le = (e, t) => {
2001
2014
  if (!e) return "invalid";
2002
2015
  let n = /^bytes=(\d*)-(\d*)$/.exec(e.trim());
2003
2016
  if (!n) return "invalid";
@@ -2018,12 +2031,12 @@ var Ut = () => ce({
2018
2031
  start: a,
2019
2032
  endInclusive: o
2020
2033
  };
2021
- }, F = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, I = (e) => ({
2034
+ }, I = /^(?:image\/(?!svg)|video\/|audio\/|application\/pdf(?:;|$)|text\/plain(?:;|$))/i, ue = (e) => ({
2022
2035
  "x-content-type-options": "nosniff",
2023
- "content-disposition": F.test(e) ? "inline" : "attachment"
2036
+ "content-disposition": I.test(e) ? "inline" : "attachment"
2024
2037
  }), fe = async (e, t, n, r) => {
2025
2038
  if (n) {
2026
- let r = await P(N.get(e.id));
2039
+ let r = await F(P.get(e.id));
2027
2040
  if (!r) return {
2028
2041
  status: 404,
2029
2042
  body: "not found",
@@ -2035,13 +2048,13 @@ var Ut = () => ce({
2035
2048
  body: a,
2036
2049
  contentType: o,
2037
2050
  headers: {
2038
- ...I(o),
2051
+ ...ue(o),
2039
2052
  "cache-control": t,
2040
2053
  "accept-ranges": "none"
2041
2054
  }
2042
2055
  };
2043
2056
  }
2044
- let i = r === void 0 ? "invalid" : ue(r, e.size);
2057
+ let i = r === void 0 ? "invalid" : le(r, e.size);
2045
2058
  if (i === "unsatisfiable") return {
2046
2059
  status: 416,
2047
2060
  body: "range not satisfiable",
@@ -2052,13 +2065,13 @@ var Ut = () => ce({
2052
2065
  }
2053
2066
  };
2054
2067
  if (i !== "invalid") {
2055
- let n = await P(N.getRange(e.id, i));
2068
+ let n = await F(P.getRange(e.id, i));
2056
2069
  return n ? {
2057
2070
  status: 206,
2058
2071
  body: n.bytes,
2059
2072
  contentType: e.contentType,
2060
2073
  headers: {
2061
- ...I(e.contentType),
2074
+ ...ue(e.contentType),
2062
2075
  "cache-control": t,
2063
2076
  "accept-ranges": "bytes",
2064
2077
  "content-range": `bytes ${i.start}-${i.endInclusive}/${n.totalSize}`
@@ -2069,13 +2082,13 @@ var Ut = () => ce({
2069
2082
  contentType: "text/plain"
2070
2083
  };
2071
2084
  }
2072
- let a = await P(N.get(e.id));
2085
+ let a = await F(P.get(e.id));
2073
2086
  return a ? {
2074
2087
  status: 200,
2075
2088
  body: a.bytes,
2076
2089
  contentType: e.contentType,
2077
2090
  headers: {
2078
- ...I(e.contentType),
2091
+ ...ue(e.contentType),
2079
2092
  "cache-control": t,
2080
2093
  "accept-ranges": "bytes"
2081
2094
  }
@@ -2091,7 +2104,7 @@ var Ut = () => ce({
2091
2104
  body: "not found",
2092
2105
  contentType: "text/plain"
2093
2106
  };
2094
- let n = await P(N.head(t));
2107
+ let n = await F(P.head(t));
2095
2108
  if (!n) return {
2096
2109
  status: 404,
2097
2110
  body: "not found",
@@ -2099,7 +2112,7 @@ var Ut = () => ce({
2099
2112
  };
2100
2113
  let r = Ve(e.query), i = e.headers.range;
2101
2114
  if (n.visibility === "public") {
2102
- let e = y.publicUrl?.(n.key) ?? null;
2115
+ let e = b.publicUrl?.(n.key) ?? null;
2103
2116
  return e && !r ? {
2104
2117
  status: 302,
2105
2118
  headers: {
@@ -2114,16 +2127,16 @@ var Ut = () => ce({
2114
2127
  a = !!e && e.refId === t;
2115
2128
  }
2116
2129
  if (!a) {
2117
- let t = ie(e.headers.cookie, qt), r = t ? oe(t, ae()) : null;
2118
- r && (a = await P(N.checkAccess(n, r)) === !0);
2130
+ let t = re(e.headers.cookie, Xt), r = t ? ae(t, ie()) : null;
2131
+ r && (a = await F(P.checkAccess(n, r)) === !0);
2119
2132
  }
2120
2133
  if (!a) return {
2121
2134
  status: 403,
2122
2135
  body: "forbidden",
2123
2136
  contentType: "text/plain"
2124
2137
  };
2125
- if (y.presigns && !r) {
2126
- let e = await P(y.getUrl(n.key, 300));
2138
+ if (b.presigns && !r) {
2139
+ let e = await F(b.getUrl(n.key, 300));
2127
2140
  if (e && /^https?:/.test(e)) return {
2128
2141
  status: 302,
2129
2142
  headers: {
@@ -2137,7 +2150,7 @@ var Ut = () => ce({
2137
2150
  method: "GET",
2138
2151
  path: "/_voltro/storage",
2139
2152
  handle: async (e) => {
2140
- let t = await L(e), n = $t(e.headers.origin, C);
2153
+ let t = await L(e), n = nn(e.headers.origin, w);
2141
2154
  return Object.keys(n).length === 0 ? t : {
2142
2155
  ...t,
2143
2156
  headers: {
@@ -2151,7 +2164,7 @@ var Ut = () => ce({
2151
2164
  path: "/_voltro/storage/upload",
2152
2165
  originGuard: "exempt",
2153
2166
  handle: async (e) => {
2154
- let t = $t(e.headers.origin, C);
2167
+ let t = nn(e.headers.origin, w);
2155
2168
  if (e.method === "OPTIONS") return {
2156
2169
  status: 204,
2157
2170
  headers: t
@@ -2181,7 +2194,7 @@ var Ut = () => ce({
2181
2194
  contentType: "text/plain",
2182
2195
  headers: t
2183
2196
  };
2184
- let i = await b.runPromise(N.put({
2197
+ let i = await x.runPromise(P.put({
2185
2198
  bytes: e.rawBody,
2186
2199
  contentType: r.ct,
2187
2200
  tenantId: r.tenant,
@@ -2192,21 +2205,21 @@ var Ut = () => ce({
2192
2205
  ...r.tags === void 0 ? {} : { tags: r.tags },
2193
2206
  ...r.alt === void 0 ? {} : { alt: r.alt },
2194
2207
  ...r.caption === void 0 ? {} : { caption: r.caption }
2195
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2208
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2196
2209
  kind: "ok",
2197
2210
  ref: e,
2198
2211
  url: t
2199
- })))), b.catchTags({
2200
- StorageRejected: (e) => b.succeed({
2212
+ })))), x.catchTags({
2213
+ StorageRejected: (e) => x.succeed({
2201
2214
  kind: "rejected",
2202
2215
  status: e.reason === "too-large" ? 413 : 415,
2203
2216
  detail: e.detail
2204
2217
  }),
2205
- StorageScanRejected: (e) => b.succeed({
2218
+ StorageScanRejected: (e) => x.succeed({
2206
2219
  kind: "scan",
2207
2220
  threat: e.threat
2208
2221
  }),
2209
- StorageError: (e) => b.succeed({
2222
+ StorageError: (e) => x.succeed({
2210
2223
  kind: "error",
2211
2224
  message: e.message
2212
2225
  })
@@ -2243,7 +2256,7 @@ var Ut = () => ce({
2243
2256
  path: "/_voltro/storage/upload/resumable",
2244
2257
  originGuard: "exempt",
2245
2258
  handle: async (e) => {
2246
- let t = $t(e.headers.origin, C);
2259
+ let t = nn(e.headers.origin, w);
2247
2260
  if (e.method === "OPTIONS") return {
2248
2261
  status: 204,
2249
2262
  headers: t
@@ -2256,10 +2269,10 @@ var Ut = () => ce({
2256
2269
  headers: t
2257
2270
  };
2258
2271
  if (e.method === "GET" || e.method === "HEAD") {
2259
- let e = await b.runPromise(N.resumableStatus({
2272
+ let e = await x.runPromise(P.resumableStatus({
2260
2273
  uploadId: r.id,
2261
2274
  tenantId: r.tenant
2262
- }).pipe(b.match({
2275
+ }).pipe(x.match({
2263
2276
  onFailure: (e) => ({ error: e.message }),
2264
2277
  onSuccess: (e) => e
2265
2278
  })));
@@ -2297,12 +2310,12 @@ var Ut = () => ce({
2297
2310
  contentType: "text/plain",
2298
2311
  headers: t
2299
2312
  };
2300
- let a = n.get("final") === "1", o = await b.runPromise(N.putResumableChunk({
2313
+ let a = n.get("final") === "1", o = await x.runPromise(P.putResumableChunk({
2301
2314
  uploadId: r.id,
2302
2315
  tenantId: r.tenant,
2303
2316
  index: i,
2304
2317
  bytes: e.rawBody
2305
- }).pipe(b.flatMap(() => a ? N.finalizeResumable({
2318
+ }).pipe(x.flatMap(() => a ? P.finalizeResumable({
2306
2319
  uploadId: r.id,
2307
2320
  count: i + 1,
2308
2321
  contentType: r.ct,
@@ -2313,21 +2326,21 @@ var Ut = () => ce({
2313
2326
  ...r.tags === void 0 ? {} : { tags: r.tags },
2314
2327
  ...r.alt === void 0 ? {} : { alt: r.alt },
2315
2328
  ...r.caption === void 0 ? {} : { caption: r.caption }
2316
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2329
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2317
2330
  kind: "done",
2318
2331
  ref: e,
2319
2332
  url: t
2320
- }))))) : b.succeed({ kind: "chunk" })), b.catchTags({
2321
- StorageRejected: (e) => b.succeed({
2333
+ }))))) : x.succeed({ kind: "chunk" })), x.catchTags({
2334
+ StorageRejected: (e) => x.succeed({
2322
2335
  kind: "rejected",
2323
2336
  status: e.reason === "too-large" ? 413 : 415,
2324
2337
  detail: e.detail
2325
2338
  }),
2326
- StorageScanRejected: (e) => b.succeed({
2339
+ StorageScanRejected: (e) => x.succeed({
2327
2340
  kind: "scan",
2328
2341
  threat: e.threat
2329
2342
  }),
2330
- StorageError: (e) => b.succeed({
2343
+ StorageError: (e) => x.succeed({
2331
2344
  kind: "error",
2332
2345
  message: e.message
2333
2346
  })
@@ -2383,13 +2396,13 @@ var Ut = () => ce({
2383
2396
  method: "GET",
2384
2397
  path: "/refs",
2385
2398
  description: "Recent storage refs (newest first)",
2386
- handler: () => j.listRecent(100).pipe(b.map((e) => R({ refs: e.map(en) })), b.catchAll((e) => b.succeed(z(500, e.message))))
2399
+ handler: () => M.listRecent(100).pipe(x.map((e) => R({ refs: e.map(rn) })), x.catchAll((e) => x.succeed(z(500, e.message))))
2387
2400
  },
2388
2401
  {
2389
2402
  method: "GET",
2390
2403
  path: "/stats",
2391
2404
  description: "Object count + total bytes per tenant + visibility split",
2392
- handler: () => j.listRecent(1e4).pipe(b.map((e) => {
2405
+ handler: () => M.listRecent(1e4).pipe(x.map((e) => {
2393
2406
  let t = {}, n = 0, r = 0;
2394
2407
  for (let i of e) {
2395
2408
  let e = i.tenantId ?? "(global)", a = t[e] ?? {
@@ -2399,15 +2412,15 @@ var Ut = () => ce({
2399
2412
  a.count++, a.bytes += i.size, t[e] = a, i.visibility === "public" ? n++ : r++;
2400
2413
  }
2401
2414
  return R({
2402
- provider: y.name,
2403
- bucket: x,
2415
+ provider: b.name,
2416
+ bucket: S,
2404
2417
  byTenant: t,
2405
2418
  visibility: {
2406
2419
  public: n,
2407
2420
  private: r
2408
2421
  }
2409
2422
  });
2410
- }), b.catchAll((e) => b.succeed(z(500, e.message))))
2423
+ }), x.catchAll((e) => x.succeed(z(500, e.message))))
2411
2424
  },
2412
2425
  {
2413
2426
  method: "GET",
@@ -2415,15 +2428,15 @@ var Ut = () => ce({
2415
2428
  description: "Grants for a ref (?refId=…)",
2416
2429
  handler: (e) => {
2417
2430
  let t = ge(e.url, "refId");
2418
- return t ? ce.listByRef(t).pipe(b.map((e) => R({ grants: e.map(rn) })), b.catchAll((e) => b.succeed(z(500, e.message)))) : b.succeed(z(400, "refId query param required"));
2431
+ return t ? se.listByRef(t).pipe(x.map((e) => R({ grants: e.map(sn) })), x.catchAll((e) => x.succeed(z(500, e.message)))) : x.succeed(z(400, "refId query param required"));
2419
2432
  }
2420
2433
  },
2421
2434
  {
2422
2435
  method: "POST",
2423
2436
  path: "/share",
2424
2437
  description: "Grant a principal access to a ref",
2425
- handler: (e) => b.gen(function* () {
2426
- let n = yield* b.try({
2438
+ handler: (e) => x.gen(function* () {
2439
+ let n = yield* x.try({
2427
2440
  try: () => JSON.parse(e.body || "{}"),
2428
2441
  catch: () => new t({
2429
2442
  provider: "inspect",
@@ -2433,22 +2446,22 @@ var Ut = () => ce({
2433
2446
  })
2434
2447
  });
2435
2448
  if (!n.refId || !n.principalType || !n.principalId) return z(400, "refId, principalType, principalId required");
2436
- let r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null, i = yield* N.grant({
2449
+ let r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null, i = yield* P.grant({
2437
2450
  refId: n.refId,
2438
2451
  principalType: n.principalType,
2439
2452
  principalId: n.principalId,
2440
2453
  ...n.permission ? { permission: n.permission } : {},
2441
2454
  expiresAt: r
2442
2455
  });
2443
- return R({ grant: rn(i) });
2444
- }).pipe(b.catchAll((e) => b.succeed(z(e.status ?? 500, e.message ?? "share failed"))))
2456
+ return R({ grant: sn(i) });
2457
+ }).pipe(x.catchAll((e) => x.succeed(z(e.status ?? 500, e.message ?? "share failed"))))
2445
2458
  },
2446
2459
  {
2447
2460
  method: "POST",
2448
2461
  path: "/revoke",
2449
2462
  description: "Revoke a grant by id",
2450
- handler: (e) => b.gen(function* () {
2451
- let n = yield* b.try({
2463
+ handler: (e) => x.gen(function* () {
2464
+ let n = yield* x.try({
2452
2465
  try: () => JSON.parse(e.body || "{}"),
2453
2466
  catch: () => new t({
2454
2467
  provider: "inspect",
@@ -2457,37 +2470,37 @@ var Ut = () => ce({
2457
2470
  status: 400
2458
2471
  })
2459
2472
  });
2460
- return n.grantId ? (yield* N.revoke(n.grantId), R({ ok: !0 })) : z(400, "grantId required");
2461
- }).pipe(b.catchAll((e) => b.succeed(z(e.status ?? 500, e.message ?? "revoke failed"))))
2473
+ return n.grantId ? (yield* P.revoke(n.grantId), R({ ok: !0 })) : z(400, "grantId required");
2474
+ }).pipe(x.catchAll((e) => x.succeed(z(e.status ?? 500, e.message ?? "revoke failed"))))
2462
2475
  }
2463
2476
  ], _e = [
2464
2477
  {
2465
2478
  ...g,
2466
2479
  execute: (e, t) => {
2467
2480
  let n = e;
2468
- return N.mintUrl(n.id, t.request.subject, {
2481
+ return P.mintUrl(n.id, t.request.subject, {
2469
2482
  ...n.password === void 0 ? {} : { password: n.password },
2470
2483
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
2471
- }).pipe(b.map((e) => ({ url: e })));
2484
+ }).pipe(x.map((e) => ({ url: e })));
2472
2485
  }
2473
2486
  },
2474
2487
  {
2475
2488
  ...h,
2476
2489
  execute: (e, t) => {
2477
2490
  let n = e;
2478
- return N.mintUploadUrl({
2491
+ return P.mintUploadUrl({
2479
2492
  key: n.key,
2480
2493
  contentType: n.contentType,
2481
2494
  tenantId: t.request.subject.tenantId,
2482
2495
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
2483
- }).pipe(b.map((e) => ({ url: e })));
2496
+ }).pipe(x.map((e) => ({ url: e })));
2484
2497
  }
2485
2498
  },
2486
2499
  {
2487
2500
  ...m,
2488
2501
  execute: (e, t) => {
2489
2502
  let n = e;
2490
- return b.sync(() => {
2503
+ return x.sync(() => {
2491
2504
  let e = n.expiresInSec ?? 900, r = ct({
2492
2505
  sub: t.request.subject.id,
2493
2506
  tenant: t.request.subject.tenantId,
@@ -2498,10 +2511,10 @@ var Ut = () => ce({
2498
2511
  ...n.tags === void 0 ? {} : { tags: n.tags },
2499
2512
  ...n.alt === void 0 ? {} : { alt: n.alt },
2500
2513
  ...n.caption === void 0 ? {} : { caption: n.caption },
2501
- ...w === void 0 ? {} : { max: w }
2514
+ ...T === void 0 ? {} : { max: T }
2502
2515
  }, e);
2503
2516
  return {
2504
- uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload?ticket=${encodeURIComponent(r)}`,
2517
+ uploadUrl: `${C ? C.replace(/\/+$/, "") : ""}/_voltro/storage/upload?ticket=${encodeURIComponent(r)}`,
2505
2518
  expiresInSec: e
2506
2519
  };
2507
2520
  });
@@ -2511,11 +2524,11 @@ var Ut = () => ce({
2511
2524
  ...p,
2512
2525
  execute: (e, t) => {
2513
2526
  let n = e;
2514
- return N.mintPresignedUpload({
2527
+ return P.mintPresignedUpload({
2515
2528
  contentType: n.contentType,
2516
2529
  tenantId: t.request.subject.tenantId,
2517
2530
  ...n.expiresInSec === void 0 ? {} : { expiresInSec: n.expiresInSec }
2518
- }).pipe(b.map((e) => {
2531
+ }).pipe(x.map((e) => {
2519
2532
  let r = ut({
2520
2533
  key: e.key,
2521
2534
  sub: t.request.subject.id,
@@ -2526,7 +2539,7 @@ var Ut = () => ce({
2526
2539
  ...n.tags === void 0 ? {} : { tags: n.tags },
2527
2540
  ...n.alt === void 0 ? {} : { alt: n.alt },
2528
2541
  ...n.caption === void 0 ? {} : { caption: n.caption },
2529
- ...w === void 0 ? {} : { max: w }
2542
+ ...T === void 0 ? {} : { max: T }
2530
2543
  }, e.expiresInSec);
2531
2544
  return {
2532
2545
  uploadUrl: e.uploadUrl,
@@ -2540,12 +2553,12 @@ var Ut = () => ce({
2540
2553
  ...l,
2541
2554
  execute: (e, n) => {
2542
2555
  let r = dt(e.finalizeToken);
2543
- return r ? r.sub !== null && r.sub !== n.request.subject.id ? b.fail(new t({
2556
+ return r ? r.sub !== null && r.sub !== n.request.subject.id ? x.fail(new t({
2544
2557
  provider: "storage",
2545
2558
  message: "finalize token belongs to another subject",
2546
2559
  transient: !1,
2547
2560
  status: 403
2548
- })) : N.finalizeUpload({
2561
+ })) : P.finalizeUpload({
2549
2562
  key: r.key,
2550
2563
  contentType: r.ct,
2551
2564
  tenantId: r.tenant,
@@ -2555,14 +2568,14 @@ var Ut = () => ce({
2555
2568
  ...r.tags === void 0 ? {} : { tags: r.tags },
2556
2569
  ...r.alt === void 0 ? {} : { alt: r.alt },
2557
2570
  ...r.caption === void 0 ? {} : { caption: r.caption }
2558
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2571
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2559
2572
  id: e.id,
2560
2573
  url: t,
2561
2574
  contentType: e.contentType,
2562
2575
  size: e.size,
2563
2576
  ...e.width == null ? {} : { width: e.width },
2564
2577
  ...e.height == null ? {} : { height: e.height }
2565
- }))))) : b.fail(new t({
2578
+ }))))) : x.fail(new t({
2566
2579
  provider: "storage",
2567
2580
  message: "invalid or expired finalize token",
2568
2581
  transient: !1,
@@ -2574,8 +2587,8 @@ var Ut = () => ce({
2574
2587
  ...s,
2575
2588
  execute: (e, t) => {
2576
2589
  let n = e;
2577
- return b.sync(() => {
2578
- let e = n.expiresInSec ?? se, r = de(), i = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : E;
2590
+ return x.sync(() => {
2591
+ let e = n.expiresInSec ?? oe, r = de(), i = n.chunkSize && n.chunkSize > 0 ? n.chunkSize : D;
2579
2592
  return {
2580
2593
  uploadId: r,
2581
2594
  resumableToken: ft({
@@ -2589,9 +2602,9 @@ var Ut = () => ce({
2589
2602
  ...n.tags === void 0 ? {} : { tags: n.tags },
2590
2603
  ...n.alt === void 0 ? {} : { alt: n.alt },
2591
2604
  ...n.caption === void 0 ? {} : { caption: n.caption },
2592
- ...w === void 0 ? {} : { max: w }
2605
+ ...T === void 0 ? {} : { max: T }
2593
2606
  }, e),
2594
- uploadUrl: `${S ? S.replace(/\/+$/, "") : ""}/_voltro/storage/upload/resumable`,
2607
+ uploadUrl: `${C ? C.replace(/\/+$/, "") : ""}/_voltro/storage/upload/resumable`,
2595
2608
  chunkSize: i,
2596
2609
  expiresInSec: e
2597
2610
  };
@@ -2601,13 +2614,13 @@ var Ut = () => ce({
2601
2614
  {
2602
2615
  ...o,
2603
2616
  execute: (e, t) => {
2604
- let n = e, r = n.expiresInSec ?? se;
2605
- return N.beginMultipartUpload({
2617
+ let n = e, r = n.expiresInSec ?? oe;
2618
+ return P.beginMultipartUpload({
2606
2619
  contentType: n.contentType,
2607
2620
  tenantId: t.request.subject.tenantId,
2608
2621
  visibility: n.visibility ?? "private",
2609
2622
  expiresInSec: r
2610
- }).pipe(b.map((e) => ({
2623
+ }).pipe(x.map((e) => ({
2611
2624
  multipartToken: mt({
2612
2625
  key: e.key,
2613
2626
  uploadId: e.uploadId,
@@ -2621,7 +2634,7 @@ var Ut = () => ce({
2621
2634
  ...n.alt === void 0 ? {} : { alt: n.alt },
2622
2635
  ...n.caption === void 0 ? {} : { caption: n.caption }
2623
2636
  }, r),
2624
- partSize: n.partSize && n.partSize >= E ? n.partSize : E,
2637
+ partSize: n.partSize && n.partSize >= D ? n.partSize : D,
2625
2638
  expiresInSec: r
2626
2639
  })));
2627
2640
  }
@@ -2630,16 +2643,16 @@ var Ut = () => ce({
2630
2643
  ...te,
2631
2644
  execute: (e) => {
2632
2645
  let n = e, r = ht(n.multipartToken);
2633
- return r ? !Number.isInteger(n.partNumber) || n.partNumber < 1 ? b.fail(new t({
2646
+ return r ? !Number.isInteger(n.partNumber) || n.partNumber < 1 ? x.fail(new t({
2634
2647
  provider: "storage",
2635
2648
  message: "partNumber must be a positive integer",
2636
2649
  transient: !1,
2637
2650
  status: 400
2638
- })) : N.signMultipartPart({
2651
+ })) : P.signMultipartPart({
2639
2652
  key: r.key,
2640
2653
  uploadId: r.uploadId,
2641
2654
  partNumber: n.partNumber
2642
- }).pipe(b.map((e) => ({ url: e }))) : b.fail(new t({
2655
+ }).pipe(x.map((e) => ({ url: e }))) : x.fail(new t({
2643
2656
  provider: "storage",
2644
2657
  message: "invalid or expired multipart token",
2645
2658
  transient: !1,
@@ -2651,12 +2664,12 @@ var Ut = () => ce({
2651
2664
  ...c,
2652
2665
  execute: (e, n) => {
2653
2666
  let r = e, i = ht(r.multipartToken);
2654
- return i ? i.sub !== null && i.sub !== n.request.subject.id ? b.fail(new t({
2667
+ return i ? i.sub !== null && i.sub !== n.request.subject.id ? x.fail(new t({
2655
2668
  provider: "storage",
2656
2669
  message: "multipart token belongs to another subject",
2657
2670
  transient: !1,
2658
2671
  status: 403
2659
- })) : N.completeMultipart({
2672
+ })) : P.completeMultipart({
2660
2673
  key: i.key,
2661
2674
  uploadId: i.uploadId,
2662
2675
  parts: r.parts,
@@ -2668,11 +2681,11 @@ var Ut = () => ce({
2668
2681
  ...i.tags === void 0 ? {} : { tags: i.tags },
2669
2682
  ...i.alt === void 0 ? {} : { alt: i.alt },
2670
2683
  ...i.caption === void 0 ? {} : { caption: i.caption }
2671
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2684
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2672
2685
  id: e.id,
2673
2686
  url: t,
2674
2687
  size: e.size
2675
- }))))) : b.fail(new t({
2688
+ }))))) : x.fail(new t({
2676
2689
  provider: "storage",
2677
2690
  message: "invalid or expired multipart token",
2678
2691
  transient: !1,
@@ -2684,10 +2697,10 @@ var Ut = () => ce({
2684
2697
  ...a,
2685
2698
  execute: (e) => {
2686
2699
  let n = ht(e.multipartToken);
2687
- return n ? N.abortMultipart({
2700
+ return n ? P.abortMultipart({
2688
2701
  key: n.key,
2689
2702
  uploadId: n.uploadId
2690
- }).pipe(b.as({ ok: !0 })) : b.fail(new t({
2703
+ }).pipe(x.as({ ok: !0 })) : x.fail(new t({
2691
2704
  provider: "storage",
2692
2705
  message: "invalid or expired multipart token",
2693
2706
  transient: !1,
@@ -2696,10 +2709,10 @@ var Ut = () => ce({
2696
2709
  }
2697
2710
  },
2698
2711
  {
2699
- ...ne,
2712
+ ...y,
2700
2713
  execute: (e, t) => {
2701
2714
  let n = e, r = new Uint8Array(Buffer.from(n.bytesBase64, "base64"));
2702
- return N.put({
2715
+ return P.put({
2703
2716
  bytes: r,
2704
2717
  contentType: n.contentType,
2705
2718
  tenantId: t.request.subject.tenantId,
@@ -2707,7 +2720,7 @@ var Ut = () => ce({
2707
2720
  ...n.visibility ? { visibility: n.visibility } : {},
2708
2721
  ...n.key ? { key: n.key } : {},
2709
2722
  ...n.password ? { password: n.password } : {}
2710
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2723
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2711
2724
  id: e.id,
2712
2725
  url: t
2713
2726
  })))));
@@ -2717,7 +2730,7 @@ var Ut = () => ce({
2717
2730
  ...u,
2718
2731
  execute: (e, t) => {
2719
2732
  let n = e;
2720
- return N.ingestUrl(n.url, {
2733
+ return P.ingestUrl(n.url, {
2721
2734
  tenantId: t.request.subject.tenantId,
2722
2735
  ownerId: t.request.subject.id,
2723
2736
  ...n.visibility ? { visibility: n.visibility } : {},
@@ -2726,7 +2739,7 @@ var Ut = () => ce({
2726
2739
  ...n.alt === void 0 ? {} : { alt: n.alt },
2727
2740
  ...n.caption === void 0 ? {} : { caption: n.caption },
2728
2741
  ...n.key === void 0 ? {} : { key: n.key }
2729
- }).pipe(b.flatMap((e) => N.getUrl(e.id).pipe(b.map((t) => ({
2742
+ }).pipe(x.flatMap((e) => P.getUrl(e.id).pipe(x.map((t) => ({
2730
2743
  id: e.id,
2731
2744
  url: t
2732
2745
  })))));
@@ -2736,35 +2749,35 @@ var Ut = () => ce({
2736
2749
  ...ee,
2737
2750
  execute: (e, t) => {
2738
2751
  let n = e, r = n.expiresInDays ? new Date(Date.now() + n.expiresInDays * 864e5) : null;
2739
- return nn(N, n.refId, t).pipe(b.flatMap(() => N.grant({
2752
+ return on(P, n.refId, t).pipe(x.flatMap(() => P.grant({
2740
2753
  refId: n.refId,
2741
2754
  principalType: n.principalType,
2742
2755
  principalId: n.principalId,
2743
2756
  ...n.permission ? { permission: n.permission } : {},
2744
2757
  expiresAt: r,
2745
2758
  createdBy: t.request.subject.id
2746
- })), b.map((e) => ({ grantId: e.id })));
2759
+ })), x.map((e) => ({ grantId: e.id })));
2747
2760
  }
2748
2761
  },
2749
2762
  {
2750
2763
  ..._,
2751
2764
  execute: (e, t) => {
2752
2765
  let n = e;
2753
- return N.getGrant(n.grantId).pipe(b.flatMap((e) => e === null ? b.fail(tn()) : nn(N, e.refId, t)), b.flatMap(() => N.revoke(n.grantId)), b.map(() => ({ ok: !0 })));
2766
+ return P.getGrant(n.grantId).pipe(x.flatMap((e) => e === null ? x.fail(an()) : on(P, e.refId, t)), x.flatMap(() => P.revoke(n.grantId)), x.map(() => ({ ok: !0 })));
2754
2767
  }
2755
2768
  },
2756
2769
  {
2757
2770
  ...d,
2758
2771
  execute: (e, t) => {
2759
2772
  let n = e;
2760
- return nn(N, n.refId, t).pipe(b.flatMap(() => N.listGrants(n.refId)), b.map((e) => ({ grants: e.map(rn) })));
2773
+ return on(P, n.refId, t).pipe(x.flatMap(() => P.listGrants(n.refId)), x.map((e) => ({ grants: e.map(sn) })));
2761
2774
  }
2762
2775
  },
2763
2776
  {
2764
2777
  ...f,
2765
2778
  execute: (e, t) => {
2766
2779
  let n = e;
2767
- return N.listRefs({
2780
+ return P.listRefs({
2768
2781
  tenantId: t.request.subject.tenantId,
2769
2782
  ...n.folder === void 0 ? {} : { folder: n.folder },
2770
2783
  ...n.tags === void 0 ? {} : { tags: n.tags },
@@ -2772,28 +2785,28 @@ var Ut = () => ce({
2772
2785
  ...n.includeDerived === void 0 ? {} : { includeDerived: n.includeDerived },
2773
2786
  ...n.limit === void 0 ? {} : { limit: n.limit },
2774
2787
  ...n.offset === void 0 ? {} : { offset: n.offset }
2775
- }).pipe(b.map((e) => ({
2776
- refs: e.refs.map(en),
2788
+ }).pipe(x.map((e) => ({
2789
+ refs: e.refs.map(rn),
2777
2790
  nextOffset: e.nextOffset
2778
2791
  })));
2779
2792
  }
2780
2793
  }
2781
2794
  ];
2782
- return re({
2783
- name: T({
2784
- base: an,
2795
+ return ne({
2796
+ name: E({
2797
+ base: cn,
2785
2798
  alias: i.alias,
2786
2799
  instance: i.name
2787
2800
  }),
2788
- baseName: an,
2801
+ baseName: cn,
2789
2802
  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.",
2790
2803
  permissions: [
2791
2804
  "network:outbound:*",
2792
2805
  "inspect:read",
2793
2806
  "inspect:write"
2794
2807
  ],
2795
- declaredEnv: W.declared,
2796
- services: M,
2808
+ declaredEnv: G.declared,
2809
+ services: N,
2797
2810
  inspectEndpoints: B,
2798
2811
  httpRoutes: [
2799
2812
  pe,
@@ -2833,18 +2846,18 @@ var Ut = () => ce({
2833
2846
  }
2834
2847
  ],
2835
2848
  bindDataStore: (e) => {
2836
- D && (k.current = Ot(e)), O && (A.current = jt(e)), y.bindDataStore?.(e);
2849
+ O && (A.current = kt(e)), k && (j.current = Mt(e)), b.bindDataStore?.(e);
2837
2850
  },
2838
- onActivate: (e) => b.sync(() => {
2839
- let t = !!S || !!W.read("STORAGE_CDN_URL", i.cdnBaseUrl);
2840
- e.logger.info(`storage: provider=${y.name} presign=${y.presigns ? "yes" : "no"} publicUrl=${t ? "yes" : "no"} transforms=yes`, {
2841
- provider: y.name,
2842
- bucket: x,
2843
- refStore: D ? "memory" : "custom"
2844
- }), y.name === "memory" && process.env.NODE_ENV !== "test" && e.logger.warn("storage: provider=memory — uploads are IN-MEMORY and LOST on restart. Set STORAGE_PROVIDER (filesystem / s3 / r2 / azure / gcs) for anything but throwaway dev. (Empty/placeholder storage env silently falls back to memory.)"), !t && !y.presigns && e.logger.warn("storage: no VOLTRO_PUBLIC_URL / STORAGE_CDN_URL and this provider can't presign — serve URLs are RELATIVE and will not resolve cross-origin (browser <img> / server-to-server AI fetches). Set VOLTRO_PUBLIC_URL to this api's absolute base URL.");
2851
+ onActivate: (e) => x.sync(() => {
2852
+ let t = !!C || !!G.read("STORAGE_CDN_URL", i.cdnBaseUrl);
2853
+ e.logger.info(`storage: provider=${b.name} presign=${b.presigns ? "yes" : "no"} publicUrl=${t ? "yes" : "no"} transforms=yes`, {
2854
+ provider: b.name,
2855
+ bucket: S,
2856
+ refStore: O ? "memory" : "custom"
2857
+ }), b.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 && !b.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.");
2845
2858
  }),
2846
- onDeactivate: () => b.void
2859
+ onDeactivate: () => x.void
2847
2860
  });
2848
2861
  };
2849
2862
  //#endregion
2850
- export { U as STORAGE_BLOBS_TABLE, H as STORAGE_GRANTS_TABLE, V as STORAGE_REFS_TABLE, Ee as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, Ae as _voltroStorageBlobsTable, Oe as _voltroStorageGrantsTable, De as _voltroStorageRefsTable, ke as _voltroStorageUsageTable, Xt as appStorageProvider, Ht as assetRef, ze as azureProvider, Pt as buildStorageService, be as bytesToStream, yt as checkLimits, zt as clamavScanner, Ne as clearStorageBuffer, xe as collectStream, ye as concatBytes, gt as contentTypeAllowed, jt as dataStoreGrantStore, Ot as dataStoreRefStore, Re as databaseProvider, Gt as decodeDataUri, It as encodeInstream, Vt as ffmpegTranscoder, Fe as filesystemProvider, Se as fromNodeReadable, we as getObjectStream, qe as hashPassword, kt as memoryGrantStore, Pe as memoryProvider, wt as memoryRefStore, Lt as parseClamavResponse, Ve as parseTransformParams, Kt as putAvatar, Te as putObjectStream, Me as readStorageBuffer, Ct as refMatchesListQuery, Zt as resolveStorageProvider, Y as resolveStorageSecret, Ie as s3Provider, Yt as setActiveStorageProvider, ut as signFinalizeTicket, ot as signGrant, mt as signMultipartTicket, ft as signResumableTicket, ct as signUploadTicket, vt as sniffMatches, on as storagePlugin, Ft as storageServiceLayer, Ce as toNodeReadable, Ke as transformCached, We as transformImage, dt as verifyFinalizeTicket, st as verifyGrant, ht as verifyMultipartTicket, Je as verifyPassword, pt as verifyResumableTicket, lt as verifyUploadTicket, Ut as withStorage };
2863
+ export { U as STORAGE_BLOBS_TABLE, H as STORAGE_GRANTS_TABLE, V as STORAGE_REFS_TABLE, W as STORAGE_USAGE_TABLE, e as StorageAccessDenied, t as StorageError, n as StorageRejected, r as StorageScanRejected, i as StorageService, Ae as _voltroStorageBlobsTable, Oe as _voltroStorageGrantsTable, De as _voltroStorageRefsTable, ke as _voltroStorageUsageTable, $t as appStorageProvider, Ut as assetRef, ze as azureProvider, Ft as buildStorageService, xe as bytesToStream, yt as checkLimits, Bt as clamavScanner, Ne as clearStorageBuffer, Se as collectStream, be as concatBytes, gt as contentTypeAllowed, Mt as dataStoreGrantStore, kt as dataStoreRefStore, Re as databaseProvider, Kt as decodeDataUri, Yt as durabilityNotice, Lt as encodeInstream, Ht as ffmpegTranscoder, Fe as filesystemProvider, Ce as fromNodeReadable, Te as getObjectStream, qe as hashPassword, At as memoryGrantStore, Pe as memoryProvider, Tt as memoryRefStore, Rt as parseClamavResponse, Ve as parseTransformParams, Jt as pathDurability, qt as putAvatar, Ee as putObjectStream, Me as readStorageBuffer, Ct as refMatchesListQuery, en as resolveStorageProvider, X as resolveStorageSecret, Ie as s3Provider, Qt as setActiveStorageProvider, ut as signFinalizeTicket, ot as signGrant, mt as signMultipartTicket, ft as signResumableTicket, ct as signUploadTicket, vt as sniffMatches, ln as storagePlugin, It as storageServiceLayer, we as toNodeReadable, Ke as transformCached, We as transformImage, dt as verifyFinalizeTicket, st as verifyGrant, ht as verifyMultipartTicket, Je as verifyPassword, pt as verifyResumableTicket, lt as verifyUploadTicket, Wt as withStorage };