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