@rpcbase/server 0.524.0 → 0.526.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.
Files changed (46) hide show
  1. package/dist/email-Dzauaq11.js +12449 -0
  2. package/dist/email-Dzauaq11.js.map +1 -0
  3. package/dist/handler-BLwgdQv-.js +544 -0
  4. package/dist/handler-BLwgdQv-.js.map +1 -0
  5. package/dist/handler-Cq-OJ0Rf.js +182 -0
  6. package/dist/handler-Cq-OJ0Rf.js.map +1 -0
  7. package/dist/handler-Cq6MsoD4.js +124 -0
  8. package/dist/handler-Cq6MsoD4.js.map +1 -0
  9. package/dist/handler-Cx_ZP_NB.js +749 -0
  10. package/dist/handler-Cx_ZP_NB.js.map +1 -0
  11. package/dist/index.js +4783 -4935
  12. package/dist/index.js.map +1 -1
  13. package/dist/notifications.js +134 -199
  14. package/dist/notifications.js.map +1 -1
  15. package/dist/queryExecutor-DYVlCvns.js +295 -0
  16. package/dist/queryExecutor-DYVlCvns.js.map +1 -0
  17. package/dist/render_resend-CQb8_8G7.js +7 -0
  18. package/dist/render_resend-CQb8_8G7.js.map +1 -0
  19. package/dist/rts/index.js +581 -725
  20. package/dist/rts/index.js.map +1 -1
  21. package/dist/schemas-BR3K5Luo.js +3824 -0
  22. package/dist/schemas-BR3K5Luo.js.map +1 -0
  23. package/dist/shared-BfMSZm2P.js +87 -0
  24. package/dist/shared-BfMSZm2P.js.map +1 -0
  25. package/dist/ssrMiddleware.d.ts +1 -1
  26. package/dist/uploads.js +71 -84
  27. package/dist/uploads.js.map +1 -1
  28. package/package.json +9 -9
  29. package/dist/email-DK8uUU4X.js +0 -8045
  30. package/dist/email-DK8uUU4X.js.map +0 -1
  31. package/dist/handler-0rPClEv4.js +0 -663
  32. package/dist/handler-0rPClEv4.js.map +0 -1
  33. package/dist/handler-3uwH4f67.js +0 -924
  34. package/dist/handler-3uwH4f67.js.map +0 -1
  35. package/dist/handler-BsauvgjA.js +0 -153
  36. package/dist/handler-BsauvgjA.js.map +0 -1
  37. package/dist/handler-DnSJAQ_B.js +0 -203
  38. package/dist/handler-DnSJAQ_B.js.map +0 -1
  39. package/dist/queryExecutor-Bg1GGL3j.js +0 -407
  40. package/dist/queryExecutor-Bg1GGL3j.js.map +0 -1
  41. package/dist/render_resend_false-MiC__Smr.js +0 -6
  42. package/dist/render_resend_false-MiC__Smr.js.map +0 -1
  43. package/dist/schemas-Cjdjgehl.js +0 -4225
  44. package/dist/schemas-Cjdjgehl.js.map +0 -1
  45. package/dist/shared-BqZiSOmf.js +0 -111
  46. package/dist/shared-BqZiSOmf.js.map +0 -1
@@ -0,0 +1,87 @@
1
+ import { buildAbilityFromSession, getAccessibleByQuery } from "@rpcbase/db/acl";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/uploads/api/file-uploads/shared.ts
4
+ var DEFAULT_CHUNK_SIZE_BYTES = 5 * 1024 * 1024;
5
+ var MAX_CHUNK_SIZE_BYTES = 15 * 1024 * 1024;
6
+ var DEFAULT_MAX_CLIENT_BYTES_PER_SECOND = 10 * 1024 * 1024;
7
+ var DEFAULT_SESSION_TTL_S = 3600 * 24;
8
+ var ensuredIndexDbNames = /* @__PURE__ */ new Set();
9
+ var parseOptionalPositiveInt = (rawValue) => {
10
+ if (typeof rawValue !== "string") return null;
11
+ const normalized = rawValue.trim();
12
+ if (!normalized) return null;
13
+ const parsed = Number(normalized);
14
+ if (!Number.isFinite(parsed) || parsed <= 0) return null;
15
+ return Math.floor(parsed);
16
+ };
17
+ var getChunkSizeBytes = () => {
18
+ const resolved = parseOptionalPositiveInt(process.env.RB_UPLOAD_CHUNK_SIZE_BYTES) ?? DEFAULT_CHUNK_SIZE_BYTES;
19
+ return Math.min(MAX_CHUNK_SIZE_BYTES, resolved);
20
+ };
21
+ var getMaxClientUploadBytesPerSecond = () => {
22
+ return parseOptionalPositiveInt(process.env.RB_UPLOAD_MAX_CLIENT_BYTES_PER_SECOND) ?? DEFAULT_MAX_CLIENT_BYTES_PER_SECOND;
23
+ };
24
+ var getSessionTtlMs = () => {
25
+ return (parseOptionalPositiveInt(process.env.RB_UPLOAD_SESSION_TTL_S) ?? DEFAULT_SESSION_TTL_S) * 1e3;
26
+ };
27
+ var getRawBodyLimitBytes = (chunkSizeBytes) => chunkSizeBytes + 1024 * 1024;
28
+ var getBucketName = () => (process.env.RB_FILESYSTEM_BUCKET_NAME ?? "").trim() || "fs";
29
+ var getUserId = (ctx) => {
30
+ const raw = ctx.req.session?.user?.id;
31
+ if (typeof raw !== "string") return null;
32
+ const normalized = raw.trim();
33
+ return normalized ? normalized : null;
34
+ };
35
+ var getTenantId = (ctx) => {
36
+ const rawSession = ctx.req.session?.user?.currentTenantId;
37
+ const sessionTenantId = typeof rawSession === "string" ? rawSession.trim() : "";
38
+ const userId = getUserId(ctx);
39
+ const rawQuery = ctx.req.query?.["rb-tenant-id"];
40
+ const queryTenantId = Array.isArray(rawQuery) ? rawQuery[0] : rawQuery;
41
+ const queryValue = typeof queryTenantId === "string" && queryTenantId.trim() ? queryTenantId.trim() : null;
42
+ if (!userId && queryValue) return queryValue;
43
+ if (userId) return sessionTenantId || null;
44
+ if (sessionTenantId) return sessionTenantId;
45
+ return queryValue;
46
+ };
47
+ var computeSha256Hex = (data) => createHash("sha256").update(data).digest("hex");
48
+ var normalizeSha256Hex = (value) => value.trim().toLowerCase();
49
+ var getModelCtx = (_ctx, tenantId, ability) => ({
50
+ req: { session: { user: { currentTenantId: tenantId } } },
51
+ ability
52
+ });
53
+ var toBufferPayload = (payload) => {
54
+ if (Buffer.isBuffer(payload)) return payload;
55
+ if (payload instanceof Uint8Array) return Buffer.from(payload);
56
+ return null;
57
+ };
58
+ var ensureUploadIndexes = async (UploadSession, UploadChunk) => {
59
+ const dbName = String(UploadSession?.db?.name ?? "");
60
+ if (dbName && ensuredIndexDbNames.has(dbName)) return;
61
+ await Promise.all([UploadSession.createIndexes(), UploadChunk.createIndexes()]);
62
+ if (dbName) ensuredIndexDbNames.add(dbName);
63
+ };
64
+ var normalizeUploadKey = (raw) => {
65
+ if (typeof raw !== "string") return null;
66
+ const normalized = raw.trim();
67
+ return normalized ? normalized : null;
68
+ };
69
+ var getUploadKeyHash = (ctx) => {
70
+ const uploadKey = normalizeUploadKey(ctx.req.get("X-Upload-Key"));
71
+ if (!uploadKey) return null;
72
+ return computeSha256Hex(Buffer.from(uploadKey));
73
+ };
74
+ var buildUploadsAbility = (ctx, tenantId) => {
75
+ const uploadKeyHash = getUploadKeyHash(ctx);
76
+ const claims = uploadKeyHash ? { uploadKeyHash } : void 0;
77
+ return buildAbilityFromSession({
78
+ tenantId,
79
+ session: ctx.req.session,
80
+ claims
81
+ });
82
+ };
83
+ var getUploadSessionAccessQuery = (ability, action) => getAccessibleByQuery(ability, action, "RBUploadSession");
84
+ //#endregion
85
+ export { getChunkSizeBytes as a, getRawBodyLimitBytes as c, getUploadKeyHash as d, getUploadSessionAccessQuery as f, toBufferPayload as h, getBucketName as i, getSessionTtlMs as l, normalizeSha256Hex as m, computeSha256Hex as n, getMaxClientUploadBytesPerSecond as o, getUserId as p, ensureUploadIndexes as r, getModelCtx as s, buildUploadsAbility as t, getTenantId as u };
86
+
87
+ //# sourceMappingURL=shared-BfMSZm2P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-BfMSZm2P.js","names":["createHash","timingSafeEqual","Ctx","IRBUploadChunk","IRBUploadSession","LoadModelCtx","buildAbilityFromSession","getAccessibleByQuery","AppAbility","Model","SessionUser","id","currentTenantId","UploadSessionDoc","UploadChunkDoc","Omit","data","Buffer","DEFAULT_CHUNK_SIZE_BYTES","MAX_CHUNK_SIZE_BYTES","DEFAULT_MAX_CLIENT_BYTES_PER_SECOND","DEFAULT_SESSION_TTL_S","ensuredIndexDbNames","Set","parseOptionalPositiveInt","rawValue","normalized","trim","parsed","Number","isFinite","Math","floor","getChunkSizeBytes","configured","process","env","RB_UPLOAD_CHUNK_SIZE_BYTES","resolved","min","getMaxClientUploadBytesPerSecond","RB_UPLOAD_MAX_CLIENT_BYTES_PER_SECOND","getSessionTtlMs","ttlSeconds","RB_UPLOAD_SESSION_TTL_S","getRawBodyLimitBytes","chunkSizeBytes","getBucketName","RB_FILESYSTEM_BUCKET_NAME","getUserId","ctx","raw","req","session","user","getTenantId","rawSession","sessionTenantId","userId","rawQuery","query","queryTenantId","Array","isArray","queryValue","computeSha256Hex","update","digest","normalizeSha256Hex","value","toLowerCase","getModelCtx","_ctx","tenantId","ability","toBufferPayload","payload","isBuffer","Uint8Array","from","ensureUploadIndexes","UploadSession","UploadChunk","Promise","dbName","String","db","name","has","all","createIndexes","add","normalizeUploadKey","getUploadKeyHash","uploadKey","get","buildUploadsAbility","uploadKeyHash","claims","undefined","getUploadSessionAccessQuery","action","Record","timingSafeEqualHex","left","right","length","getOwnershipSelector","Pick","ownerKeyHash"],"sources":["../src/uploads/api/file-uploads/shared.ts"],"sourcesContent":["import { createHash, timingSafeEqual } from \"node:crypto\"\n\nimport { Ctx } from \"@rpcbase/api\"\nimport {\n type IRBUploadChunk,\n type IRBUploadSession,\n type LoadModelCtx,\n} from \"@rpcbase/db\"\nimport { buildAbilityFromSession, getAccessibleByQuery, type AppAbility } from \"@rpcbase/db/acl\"\nimport type { Model } from \"mongoose\"\n\n\nexport type SessionUser = {\n id?: string\n currentTenantId?: string\n}\n\nexport type UploadSessionDoc = IRBUploadSession\nexport type UploadChunkDoc = Omit<IRBUploadChunk, \"data\"> & { data: Buffer }\n\nconst DEFAULT_CHUNK_SIZE_BYTES = 5 * 1024 * 1024\nconst MAX_CHUNK_SIZE_BYTES = 15 * 1024 * 1024\n\nconst DEFAULT_MAX_CLIENT_BYTES_PER_SECOND = 10 * 1024 * 1024\n\nconst DEFAULT_SESSION_TTL_S = 60 * 60 * 24\n\nconst ensuredIndexDbNames = new Set<string>()\n\nconst parseOptionalPositiveInt = (rawValue: unknown): number | null => {\n if (typeof rawValue !== \"string\") return null\n const normalized = rawValue.trim()\n if (!normalized) return null\n const parsed = Number(normalized)\n if (!Number.isFinite(parsed) || parsed <= 0) return null\n return Math.floor(parsed)\n}\n\nexport const getChunkSizeBytes = (): number => {\n const configured = parseOptionalPositiveInt(process.env.RB_UPLOAD_CHUNK_SIZE_BYTES)\n const resolved = configured ?? DEFAULT_CHUNK_SIZE_BYTES\n return Math.min(MAX_CHUNK_SIZE_BYTES, resolved)\n}\n\nexport const getMaxClientUploadBytesPerSecond = (): number | null => {\n const configured = parseOptionalPositiveInt(process.env.RB_UPLOAD_MAX_CLIENT_BYTES_PER_SECOND)\n return configured ?? DEFAULT_MAX_CLIENT_BYTES_PER_SECOND\n}\n\nexport const getSessionTtlMs = (): number => {\n const ttlSeconds = parseOptionalPositiveInt(process.env.RB_UPLOAD_SESSION_TTL_S) ?? DEFAULT_SESSION_TTL_S\n return ttlSeconds * 1000\n}\n\nexport const getRawBodyLimitBytes = (chunkSizeBytes: number): number => chunkSizeBytes + 1024 * 1024\n\nexport const getBucketName = (): string => (process.env.RB_FILESYSTEM_BUCKET_NAME ?? \"\").trim() || \"fs\"\n\nexport const getUserId = (ctx: Ctx<SessionUser>): string | null => {\n const raw = ctx.req.session?.user?.id\n if (typeof raw !== \"string\") return null\n const normalized = raw.trim()\n return normalized ? normalized : null\n}\n\nexport const getTenantId = (ctx: Ctx<SessionUser>): string | null => {\n const rawSession = ctx.req.session?.user?.currentTenantId\n const sessionTenantId = typeof rawSession === \"string\" ? rawSession.trim() : \"\"\n\n const userId = getUserId(ctx)\n const rawQuery = ctx.req.query?.[\"rb-tenant-id\"]\n const queryTenantId = Array.isArray(rawQuery) ? rawQuery[0] : rawQuery\n const queryValue = typeof queryTenantId === \"string\" && queryTenantId.trim() ? queryTenantId.trim() : null\n\n if (!userId && queryValue) return queryValue\n\n if (userId) return sessionTenantId || null\n\n if (sessionTenantId) return sessionTenantId\n\n return queryValue\n}\n\nexport const computeSha256Hex = (data: Buffer): string => createHash(\"sha256\").update(data).digest(\"hex\")\n\nexport const normalizeSha256Hex = (value: string): string => value.trim().toLowerCase()\n\nexport const getModelCtx = (_ctx: Ctx<SessionUser>, tenantId: string, ability?: AppAbility): LoadModelCtx => ({\n req: {\n session: {\n user: {\n currentTenantId: tenantId,\n },\n },\n },\n ability,\n})\n\nexport const toBufferPayload = (payload: unknown): Buffer | null => {\n if (Buffer.isBuffer(payload)) return payload\n if (payload instanceof Uint8Array) return Buffer.from(payload)\n return null\n}\n\nexport const ensureUploadIndexes = async (\n UploadSession: Model<UploadSessionDoc>,\n UploadChunk: Model<UploadChunkDoc>,\n): Promise<void> => {\n const dbName = String((UploadSession as unknown as { db?: { name?: unknown } })?.db?.name ?? \"\")\n if (dbName && ensuredIndexDbNames.has(dbName)) return\n\n await Promise.all([\n UploadSession.createIndexes(),\n UploadChunk.createIndexes(),\n ])\n\n if (dbName) ensuredIndexDbNames.add(dbName)\n}\n\nconst normalizeUploadKey = (raw: unknown): string | null => {\n if (typeof raw !== \"string\") return null\n const normalized = raw.trim()\n return normalized ? normalized : null\n}\n\nexport const getUploadKeyHash = (ctx: Ctx<SessionUser>): string | null => {\n const uploadKey = normalizeUploadKey(ctx.req.get(\"X-Upload-Key\"))\n if (!uploadKey) return null\n return computeSha256Hex(Buffer.from(uploadKey))\n}\n\nexport const buildUploadsAbility = (ctx: Ctx<SessionUser>, tenantId: string): AppAbility => {\n const uploadKeyHash = getUploadKeyHash(ctx)\n const claims = uploadKeyHash ? { uploadKeyHash } : undefined\n return buildAbilityFromSession({ tenantId, session: ctx.req.session, claims })\n}\n\nexport const getUploadSessionAccessQuery = (\n ability: AppAbility,\n action: \"read\" | \"update\" | \"delete\",\n): Record<string, unknown> => getAccessibleByQuery(ability, action, \"RBUploadSession\")\n\nconst timingSafeEqualHex = (left: string, right: string): boolean => {\n if (left.length !== right.length) return false\n try {\n return timingSafeEqual(Buffer.from(left, \"hex\"), Buffer.from(right, \"hex\"))\n } catch {\n return false\n }\n}\n\nexport const getOwnershipSelector = (\n ctx: Ctx<SessionUser>,\n session: Pick<UploadSessionDoc, \"userId\" | \"ownerKeyHash\">,\n): { userId?: string; ownerKeyHash?: string } | null => {\n if (session.userId) {\n const userId = getUserId(ctx)\n if (!userId || userId !== session.userId) return null\n return { userId: session.userId }\n }\n\n if (session.ownerKeyHash) {\n const uploadKeyHash = getUploadKeyHash(ctx)\n if (!uploadKeyHash) return null\n if (!timingSafeEqualHex(session.ownerKeyHash, uploadKeyHash)) return null\n return { ownerKeyHash: session.ownerKeyHash }\n }\n\n return null\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { SsrErrorStatePayload } from '@rpcbase/client';
2
2
  import { StaticHandler } from '@rpcbase/router';
3
- import { createServer } from 'vite';
3
+ import { createServer } from '../../node_modules/vite/dist/node/index.d.ts';
4
4
  import { ComponentType } from 'react';
5
5
  import { NextFunction, Request, Response } from 'express';
6
6
  import { PostHog } from 'posthog-node';
package/dist/uploads.js CHANGED
@@ -1,90 +1,77 @@
1
- const routes = Object.entries({
2
- .../* @__PURE__ */ Object.assign({ "./api/file-uploads/handler.ts": () => import("./handler-3uwH4f67.js"), "./api/files/handler.ts": () => import("./handler-DnSJAQ_B.js") })
3
- }).reduce((acc, [path, mod]) => {
4
- acc[path.replace("./api/", "@rpcbase/server/uploads/api/")] = mod;
5
- return acc;
1
+ //#region src/uploads/routes.ts
2
+ var routes = Object.entries({ .../* @__PURE__ */ Object.assign({
3
+ "./api/file-uploads/handler.ts": () => import("./handler-Cx_ZP_NB.js"),
4
+ "./api/files/handler.ts": () => import("./handler-Cq-OJ0Rf.js")
5
+ }) }).reduce((acc, [path, mod]) => {
6
+ acc[path.replace("./api/", "@rpcbase/server/uploads/api/")] = mod;
7
+ return acc;
6
8
  }, {});
7
- const processorsById = /* @__PURE__ */ Object.create(null);
8
- const normalizeProcessorId = (value) => typeof value === "string" ? value.trim() : "";
9
- const normalizeProcessorVersion = (value) => {
10
- if (typeof value !== "number") return void 0;
11
- if (!Number.isInteger(value) || value < 1) return void 0;
12
- return value;
9
+ //#endregion
10
+ //#region src/uploads/api/file-uploads/postProcessors.ts
11
+ var processorsById = Object.create(null);
12
+ var normalizeProcessorId = (value) => typeof value === "string" ? value.trim() : "";
13
+ var normalizeProcessorVersion = (value) => {
14
+ if (typeof value !== "number") return void 0;
15
+ if (!Number.isInteger(value) || value < 1) return void 0;
16
+ return value;
13
17
  };
14
- const registerUploadPostProcessor = (processor) => {
15
- const normalizedId = normalizeProcessorId(processor.id);
16
- if (!normalizedId) {
17
- throw new Error("Upload post processor id is required.");
18
- }
19
- const normalizedVersion = normalizeProcessorVersion(processor.version);
20
- processorsById[normalizedId] = {
21
- ...processor,
22
- id: normalizedId,
23
- ...normalizedVersion ? {
24
- version: normalizedVersion
25
- } : {}
26
- };
18
+ var registerUploadPostProcessor = (processor) => {
19
+ const normalizedId = normalizeProcessorId(processor.id);
20
+ if (!normalizedId) throw new Error("Upload post processor id is required.");
21
+ const normalizedVersion = normalizeProcessorVersion(processor.version);
22
+ processorsById[normalizedId] = {
23
+ ...processor,
24
+ id: normalizedId,
25
+ ...normalizedVersion ? { version: normalizedVersion } : {}
26
+ };
27
27
  };
28
- const registerUploadProcessor = registerUploadPostProcessor;
29
- const unregisterUploadPostProcessor = (id) => {
30
- const normalizedId = normalizeProcessorId(id);
31
- if (!normalizedId) return;
32
- delete processorsById[normalizedId];
28
+ var registerUploadProcessor = registerUploadPostProcessor;
29
+ var unregisterUploadPostProcessor = (id) => {
30
+ const normalizedId = normalizeProcessorId(id);
31
+ if (!normalizedId) return;
32
+ delete processorsById[normalizedId];
33
33
  };
34
- const unregisterUploadProcessor = unregisterUploadPostProcessor;
35
- const clearUploadPostProcessors = () => {
36
- for (const id of Object.keys(processorsById)) {
37
- delete processorsById[id];
38
- }
34
+ var unregisterUploadProcessor = unregisterUploadPostProcessor;
35
+ var clearUploadPostProcessors = () => {
36
+ for (const id of Object.keys(processorsById)) delete processorsById[id];
39
37
  };
40
- const clearUploadProcessors = clearUploadPostProcessors;
41
- const getUploadPostProcessors = () => Object.values(processorsById);
42
- const getUploadProcessors = getUploadPostProcessors;
43
- const runUploadPostProcessors = async (ctx) => {
44
- const processors = getUploadPostProcessors();
45
- if (!processors.length) return;
46
- for (const processor of processors) {
47
- if (processor.match) {
48
- try {
49
- if (!processor.match(ctx)) continue;
50
- } catch (error) {
51
- console.error("Upload post processor failed", {
52
- processorId: processor.id,
53
- processorVersion: processor.version,
54
- tenantId: ctx.tenantId,
55
- uploadId: ctx.uploadId,
56
- fileId: ctx.fileId,
57
- stage: "match",
58
- error
59
- });
60
- continue;
61
- }
62
- }
63
- try {
64
- await processor.process(ctx);
65
- } catch (error) {
66
- console.error("Upload post processor failed", {
67
- processorId: processor.id,
68
- processorVersion: processor.version,
69
- tenantId: ctx.tenantId,
70
- uploadId: ctx.uploadId,
71
- fileId: ctx.fileId,
72
- stage: "process",
73
- error
74
- });
75
- }
76
- }
38
+ var clearUploadProcessors = clearUploadPostProcessors;
39
+ var getUploadPostProcessors = () => Object.values(processorsById);
40
+ var getUploadProcessors = getUploadPostProcessors;
41
+ var runUploadPostProcessors = async (ctx) => {
42
+ const processors = getUploadPostProcessors();
43
+ if (!processors.length) return;
44
+ for (const processor of processors) {
45
+ if (processor.match) try {
46
+ if (!processor.match(ctx)) continue;
47
+ } catch (error) {
48
+ console.error("Upload post processor failed", {
49
+ processorId: processor.id,
50
+ processorVersion: processor.version,
51
+ tenantId: ctx.tenantId,
52
+ uploadId: ctx.uploadId,
53
+ fileId: ctx.fileId,
54
+ stage: "match",
55
+ error
56
+ });
57
+ continue;
58
+ }
59
+ try {
60
+ await processor.process(ctx);
61
+ } catch (error) {
62
+ console.error("Upload post processor failed", {
63
+ processorId: processor.id,
64
+ processorVersion: processor.version,
65
+ tenantId: ctx.tenantId,
66
+ uploadId: ctx.uploadId,
67
+ fileId: ctx.fileId,
68
+ stage: "process",
69
+ error
70
+ });
71
+ }
72
+ }
77
73
  };
78
- export {
79
- clearUploadPostProcessors,
80
- clearUploadProcessors,
81
- getUploadPostProcessors,
82
- getUploadProcessors,
83
- registerUploadPostProcessor,
84
- registerUploadProcessor,
85
- routes,
86
- runUploadPostProcessors,
87
- unregisterUploadPostProcessor,
88
- unregisterUploadProcessor
89
- };
90
- //# sourceMappingURL=uploads.js.map
74
+ //#endregion
75
+ export { clearUploadPostProcessors, clearUploadProcessors, getUploadPostProcessors, getUploadProcessors, registerUploadPostProcessor, registerUploadProcessor, routes, runUploadPostProcessors, unregisterUploadPostProcessor, unregisterUploadProcessor };
76
+
77
+ //# sourceMappingURL=uploads.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploads.js","sources":["../src/uploads/routes.ts","../src/uploads/api/file-uploads/postProcessors.ts"],"sourcesContent":["export const routes = Object.entries({\n ...import.meta.glob(\"./api/**/handler.ts\"),\n}).reduce<Record<string, unknown>>((acc, [path, mod]) => {\n acc[path.replace(\"./api/\", \"@rpcbase/server/uploads/api/\")] = mod\n return acc\n}, {})\n\n","export type UploadPostProcessorContext = {\n tenantId: string\n uploadId: string\n fileId: string\n filename: string\n mimeType: string\n clientMimeType: string\n totalSize: number\n isPublic?: boolean\n userId?: string\n ownerKeyHash?: string\n inlineProcessors: string[]\n metadata: Record<string, unknown>\n}\n\nexport type UploadPostProcessor = {\n id: string\n version?: number\n match?: (ctx: UploadPostProcessorContext) => boolean\n process: (ctx: UploadPostProcessorContext) => Promise<unknown> | unknown\n}\n\nconst processorsById: Record<string, UploadPostProcessor> = Object.create(null)\n\nconst normalizeProcessorId = (value: unknown): string => (typeof value === \"string\" ? value.trim() : \"\")\n\nconst normalizeProcessorVersion = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isInteger(value) || value < 1) return undefined\n return value\n}\n\nexport const registerUploadPostProcessor = (processor: UploadPostProcessor): void => {\n const normalizedId = normalizeProcessorId(processor.id)\n if (!normalizedId) {\n throw new Error(\"Upload post processor id is required.\")\n }\n\n const normalizedVersion = normalizeProcessorVersion(processor.version)\n\n processorsById[normalizedId] = {\n ...processor,\n id: normalizedId,\n ...(normalizedVersion ? { version: normalizedVersion } : {}),\n }\n}\n\nexport const registerUploadProcessor = registerUploadPostProcessor\n\nexport const unregisterUploadPostProcessor = (id: string): void => {\n const normalizedId = normalizeProcessorId(id)\n if (!normalizedId) return\n delete processorsById[normalizedId]\n}\n\nexport const unregisterUploadProcessor = unregisterUploadPostProcessor\n\nexport const clearUploadPostProcessors = (): void => {\n for (const id of Object.keys(processorsById)) {\n delete processorsById[id]\n }\n}\n\nexport const clearUploadProcessors = clearUploadPostProcessors\n\nexport const getUploadPostProcessors = (): UploadPostProcessor[] => Object.values(processorsById)\n\nexport const getUploadProcessors = getUploadPostProcessors\n\nexport const runUploadPostProcessors = async (ctx: UploadPostProcessorContext): Promise<void> => {\n const processors = getUploadPostProcessors()\n if (!processors.length) return\n\n for (const processor of processors) {\n if (processor.match) {\n try {\n if (!processor.match(ctx)) continue\n } catch (error) {\n console.error(\"Upload post processor failed\", {\n processorId: processor.id,\n processorVersion: processor.version,\n tenantId: ctx.tenantId,\n uploadId: ctx.uploadId,\n fileId: ctx.fileId,\n stage: \"match\",\n error,\n })\n continue\n }\n }\n\n try {\n await processor.process(ctx)\n } catch (error) {\n console.error(\"Upload post processor failed\", {\n processorId: processor.id,\n processorVersion: processor.version,\n tenantId: ctx.tenantId,\n uploadId: ctx.uploadId,\n fileId: ctx.fileId,\n stage: \"process\",\n error,\n })\n }\n }\n}\n"],"names":["routes","Object","entries","import","reduce","acc","path","mod","replace","processorsById","create","normalizeProcessorId","value","trim","normalizeProcessorVersion","undefined","Number","isInteger","registerUploadPostProcessor","processor","normalizedId","id","Error","normalizedVersion","version","registerUploadProcessor","unregisterUploadPostProcessor","unregisterUploadProcessor","clearUploadPostProcessors","keys","clearUploadProcessors","getUploadPostProcessors","values","getUploadProcessors","runUploadPostProcessors","ctx","processors","length","match","error","console","processorId","processorVersion","tenantId","uploadId","fileId","stage","process"],"mappings":"AAAO,MAAMA,SAASC,OAAOC,QAAQ;AAAA,EACnC,GAAGC,uBAAAA,OAAAA,EAAAA,iCAAAA,MAAAA,OAAAA,uBAAAA,GAAAA,0BAAAA,MAAAA,OAAAA,uBAAAA,EAAAA,CAAAA;AACL,CAAC,EAAEC,OAAgC,CAACC,KAAK,CAACC,MAAMC,GAAG,MAAM;AACvDF,MAAIC,KAAKE,QAAQ,UAAU,8BAA8B,CAAC,IAAID;AAC9D,SAAOF;AACT,GAAG,CAAA,CAAE;ACiBL,MAAMI,iBAAsDR,uBAAOS,OAAO,IAAI;AAE9E,MAAMC,uBAAuBA,CAACC,UAA4B,OAAOA,UAAU,WAAWA,MAAMC,SAAS;AAErG,MAAMC,4BAA4BA,CAACF,UAAuC;AACxE,MAAI,OAAOA,UAAU,SAAU,QAAOG;AACtC,MAAI,CAACC,OAAOC,UAAUL,KAAK,KAAKA,QAAQ,EAAG,QAAOG;AAClD,SAAOH;AACT;AAEO,MAAMM,8BAA8BA,CAACC,cAAyC;AACnF,QAAMC,eAAeT,qBAAqBQ,UAAUE,EAAE;AACtD,MAAI,CAACD,cAAc;AACjB,UAAM,IAAIE,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAMC,oBAAoBT,0BAA0BK,UAAUK,OAAO;AAErEf,iBAAeW,YAAY,IAAI;AAAA,IAC7B,GAAGD;AAAAA,IACHE,IAAID;AAAAA,IACJ,GAAIG,oBAAoB;AAAA,MAAEC,SAASD;AAAAA,IAAAA,IAAsB,CAAA;AAAA,EAAC;AAE9D;AAEO,MAAME,0BAA0BP;AAEhC,MAAMQ,gCAAgCA,CAACL,OAAqB;AACjE,QAAMD,eAAeT,qBAAqBU,EAAE;AAC5C,MAAI,CAACD,aAAc;AACnB,SAAOX,eAAeW,YAAY;AACpC;AAEO,MAAMO,4BAA4BD;AAElC,MAAME,4BAA4BA,MAAY;AACnD,aAAWP,MAAMpB,OAAO4B,KAAKpB,cAAc,GAAG;AAC5C,WAAOA,eAAeY,EAAE;AAAA,EAC1B;AACF;AAEO,MAAMS,wBAAwBF;AAE9B,MAAMG,0BAA0BA,MAA6B9B,OAAO+B,OAAOvB,cAAc;AAEzF,MAAMwB,sBAAsBF;AAE5B,MAAMG,0BAA0B,OAAOC,QAAmD;AAC/F,QAAMC,aAAaL,wBAAAA;AACnB,MAAI,CAACK,WAAWC,OAAQ;AAExB,aAAWlB,aAAaiB,YAAY;AAClC,QAAIjB,UAAUmB,OAAO;AACnB,UAAI;AACF,YAAI,CAACnB,UAAUmB,MAAMH,GAAG,EAAG;AAAA,MAC7B,SAASI,OAAO;AACdC,gBAAQD,MAAM,gCAAgC;AAAA,UAC5CE,aAAatB,UAAUE;AAAAA,UACvBqB,kBAAkBvB,UAAUK;AAAAA,UAC5BmB,UAAUR,IAAIQ;AAAAA,UACdC,UAAUT,IAAIS;AAAAA,UACdC,QAAQV,IAAIU;AAAAA,UACZC,OAAO;AAAA,UACPP;AAAAA,QAAAA,CACD;AACD;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAMpB,UAAU4B,QAAQZ,GAAG;AAAA,IAC7B,SAASI,OAAO;AACdC,cAAQD,MAAM,gCAAgC;AAAA,QAC5CE,aAAatB,UAAUE;AAAAA,QACvBqB,kBAAkBvB,UAAUK;AAAAA,QAC5BmB,UAAUR,IAAIQ;AAAAA,QACdC,UAAUT,IAAIS;AAAAA,QACdC,QAAQV,IAAIU;AAAAA,QACZC,OAAO;AAAA,QACPP;AAAAA,MAAAA,CACD;AAAA,IACH;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"uploads.js","names":["routes","Object","entries","import","meta","glob","reduce","Record","acc","path","mod","replace","UploadPostProcessorContext","tenantId","uploadId","fileId","filename","mimeType","clientMimeType","totalSize","isPublic","userId","ownerKeyHash","inlineProcessors","metadata","Record","UploadPostProcessor","id","version","match","ctx","process","Promise","processorsById","Object","create","normalizeProcessorId","value","trim","normalizeProcessorVersion","undefined","Number","isInteger","registerUploadPostProcessor","processor","normalizedId","Error","normalizedVersion","registerUploadProcessor","unregisterUploadPostProcessor","unregisterUploadProcessor","clearUploadPostProcessors","keys","clearUploadProcessors","getUploadPostProcessors","values","getUploadProcessors","runUploadPostProcessors","processors","length","error","console","processorId","processorVersion","stage"],"sources":["../src/uploads/routes.ts","../src/uploads/api/file-uploads/postProcessors.ts"],"sourcesContent":["export const routes = Object.entries({\n ...import.meta.glob(\"./api/**/handler.ts\"),\n}).reduce<Record<string, unknown>>((acc, [path, mod]) => {\n acc[path.replace(\"./api/\", \"@rpcbase/server/uploads/api/\")] = mod\n return acc\n}, {})\n\n","export type UploadPostProcessorContext = {\n tenantId: string\n uploadId: string\n fileId: string\n filename: string\n mimeType: string\n clientMimeType: string\n totalSize: number\n isPublic?: boolean\n userId?: string\n ownerKeyHash?: string\n inlineProcessors: string[]\n metadata: Record<string, unknown>\n}\n\nexport type UploadPostProcessor = {\n id: string\n version?: number\n match?: (ctx: UploadPostProcessorContext) => boolean\n process: (ctx: UploadPostProcessorContext) => Promise<unknown> | unknown\n}\n\nconst processorsById: Record<string, UploadPostProcessor> = Object.create(null)\n\nconst normalizeProcessorId = (value: unknown): string => (typeof value === \"string\" ? value.trim() : \"\")\n\nconst normalizeProcessorVersion = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isInteger(value) || value < 1) return undefined\n return value\n}\n\nexport const registerUploadPostProcessor = (processor: UploadPostProcessor): void => {\n const normalizedId = normalizeProcessorId(processor.id)\n if (!normalizedId) {\n throw new Error(\"Upload post processor id is required.\")\n }\n\n const normalizedVersion = normalizeProcessorVersion(processor.version)\n\n processorsById[normalizedId] = {\n ...processor,\n id: normalizedId,\n ...(normalizedVersion ? { version: normalizedVersion } : {}),\n }\n}\n\nexport const registerUploadProcessor = registerUploadPostProcessor\n\nexport const unregisterUploadPostProcessor = (id: string): void => {\n const normalizedId = normalizeProcessorId(id)\n if (!normalizedId) return\n delete processorsById[normalizedId]\n}\n\nexport const unregisterUploadProcessor = unregisterUploadPostProcessor\n\nexport const clearUploadPostProcessors = (): void => {\n for (const id of Object.keys(processorsById)) {\n delete processorsById[id]\n }\n}\n\nexport const clearUploadProcessors = clearUploadPostProcessors\n\nexport const getUploadPostProcessors = (): UploadPostProcessor[] => Object.values(processorsById)\n\nexport const getUploadProcessors = getUploadPostProcessors\n\nexport const runUploadPostProcessors = async (ctx: UploadPostProcessorContext): Promise<void> => {\n const processors = getUploadPostProcessors()\n if (!processors.length) return\n\n for (const processor of processors) {\n if (processor.match) {\n try {\n if (!processor.match(ctx)) continue\n } catch (error) {\n console.error(\"Upload post processor failed\", {\n processorId: processor.id,\n processorVersion: processor.version,\n tenantId: ctx.tenantId,\n uploadId: ctx.uploadId,\n fileId: ctx.fileId,\n stage: \"match\",\n error,\n })\n continue\n }\n }\n\n try {\n await processor.process(ctx)\n } catch (error) {\n console.error(\"Upload post processor failed\", {\n processorId: processor.id,\n processorVersion: processor.version,\n tenantId: ctx.tenantId,\n uploadId: ctx.uploadId,\n fileId: ctx.fileId,\n stage: \"process\",\n error,\n })\n }\n }\n}\n"],"mappings":";AAAA,IAAaA,SAASC,OAAOC,QAAQ,EACnC,GAAGC,uBAAAA,OAAAA;CAAAA,uCAAAA,OAAAA;CAAAA,gCAAAA,OAAAA;CAAAA,CAAsC,EAC1C,CAAC,CAACG,QAAiCE,KAAK,CAACC,MAAMC,SAAS;AACvDF,KAAIC,KAAKE,QAAQ,UAAU,+BAA+B,IAAID;AAC9D,QAAOF;GACN,EAAE,CAAC;;;ACiBN,IAAMyB,iBAAsDC,OAAOC,OAAO,KAAK;AAE/E,IAAMC,wBAAwBC,UAA4B,OAAOA,UAAU,WAAWA,MAAMC,MAAM,GAAG;AAErG,IAAMC,6BAA6BF,UAAuC;AACxE,KAAI,OAAOA,UAAU,SAAU,QAAOG,KAAAA;AACtC,KAAI,CAACC,OAAOC,UAAUL,MAAM,IAAIA,QAAQ,EAAG,QAAOG,KAAAA;AAClD,QAAOH;;AAGT,IAAaM,+BAA+BC,cAAyC;CACnF,MAAMC,eAAeT,qBAAqBQ,UAAUjB,GAAG;AACvD,KAAI,CAACkB,aACH,OAAM,IAAIC,MAAM,wCAAwC;CAG1D,MAAMC,oBAAoBR,0BAA0BK,UAAUhB,QAAQ;AAEtEK,gBAAeY,gBAAgB;EAC7B,GAAGD;EACHjB,IAAIkB;EACJ,GAAIE,oBAAoB,EAAEnB,SAASmB,mBAAmB,GAAG,EAAE;EAC5D;;AAGH,IAAaC,0BAA0BL;AAEvC,IAAaM,iCAAiCtB,OAAqB;CACjE,MAAMkB,eAAeT,qBAAqBT,GAAG;AAC7C,KAAI,CAACkB,aAAc;AACnB,QAAOZ,eAAeY;;AAGxB,IAAaK,4BAA4BD;AAEzC,IAAaE,kCAAwC;AACnD,MAAK,MAAMxB,MAAMO,OAAOkB,KAAKnB,eAAe,CAC1C,QAAOA,eAAeN;;AAI1B,IAAa0B,wBAAwBF;AAErC,IAAaG,gCAAuDpB,OAAOqB,OAAOtB,eAAe;AAEjG,IAAauB,sBAAsBF;AAEnC,IAAaG,0BAA0B,OAAO3B,QAAmD;CAC/F,MAAM4B,aAAaJ,yBAAyB;AAC5C,KAAI,CAACI,WAAWC,OAAQ;AAExB,MAAK,MAAMf,aAAac,YAAY;AAClC,MAAId,UAAUf,MACZ,KAAI;AACF,OAAI,CAACe,UAAUf,MAAMC,IAAI,CAAE;WACpB8B,OAAO;AACdC,WAAQD,MAAM,gCAAgC;IAC5CE,aAAalB,UAAUjB;IACvBoC,kBAAkBnB,UAAUhB;IAC5Bf,UAAUiB,IAAIjB;IACdC,UAAUgB,IAAIhB;IACdC,QAAQe,IAAIf;IACZiD,OAAO;IACPJ;IACD,CAAC;AACF;;AAIJ,MAAI;AACF,SAAMhB,UAAUb,QAAQD,IAAI;WACrB8B,OAAO;AACdC,WAAQD,MAAM,gCAAgC;IAC5CE,aAAalB,UAAUjB;IACvBoC,kBAAkBnB,UAAUhB;IAC5Bf,UAAUiB,IAAIjB;IACdC,UAAUgB,IAAIhB;IACdC,QAAQe,IAAIf;IACZiD,OAAO;IACPJ;IACD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/server",
3
- "version": "0.524.0",
3
+ "version": "0.526.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -88,18 +88,18 @@
88
88
  "dependencies": {
89
89
  "connect-mongo": "6.0.0",
90
90
  "connect-redis": "9.0.0",
91
- "dompurify": "3.3.1",
92
- "express-session": "1.18.2",
91
+ "dompurify": "3.3.3",
92
+ "express-session": "1.19.0",
93
93
  "http-proxy-3": "1.23.2",
94
- "jsdom": "27.4.0",
95
- "mongodb": "7.0.0",
96
- "redis": "5.10.0",
97
- "ws": "8.19.0"
94
+ "jsdom": "29.0.1",
95
+ "mongodb": "7.1.0",
96
+ "redis": "5.11.0",
97
+ "ws": "8.20.0"
98
98
  },
99
99
  "devDependencies": {
100
- "@types/jsdom": "27.0.0",
100
+ "@types/jsdom": "28.0.1",
101
101
  "@types/ws": "8.18.1",
102
102
  "request-ip": "3.3.0",
103
- "resend": "6.6.0"
103
+ "resend": "6.9.4"
104
104
  }
105
105
  }