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