@rpcbase/server 0.637.0 → 0.639.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.
@@ -85,7 +85,7 @@ var changesHandler = async (payload, ctx) => {
85
85
  const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean();
86
86
  earliestSeq = earliest?.seq ? Number(earliest.seq) : void 0;
87
87
  }
88
- const needsFullResync = typeof earliestSeq === "number" && sinceSeq < earliestSeq - 1;
88
+ const needsFullResync = sinceSeq > latestSeq || sinceSeq < latestSeq && earliestSeq === void 0 || typeof earliestSeq === "number" && sinceSeq < earliestSeq - 1;
89
89
  const selector = {
90
90
  seq: { $gt: sinceSeq },
91
91
  modelName: { $in: allowedModelNames }
@@ -116,4 +116,4 @@ var handler_default = (api) => {
116
116
  //#endregion
117
117
  export { handler_default as default };
118
118
 
119
- //# sourceMappingURL=handler-BL-Je36s.js.map
119
+ //# sourceMappingURL=handler-DlRmqucR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-BL-Je36s.js","names":[],"sources":["../src/rts/api/changes/index.ts","../src/rts/api/changes/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/rts/changes\"\n\nexport const requestSchema = z.object({\n sinceSeq: z.number().int().min(0).default(0),\n limit: z.number().int().min(1).max(5000).default(2000),\n modelNames: z.array(z.string().min(1)).optional(),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n ok: z.boolean(),\n needsFullResync: z.boolean().optional(),\n earliestSeq: z.number().int().min(0).optional(),\n latestSeq: z.number().int().min(0),\n changes: z.array(z.object({\n seq: z.number().int().min(1),\n modelName: z.string().min(1),\n op: z.enum([\"delete\", \"reset_model\"]),\n docId: z.string().optional(),\n })),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models, ZRBRtsChangeOp, type IRBRtsChange, type IRBRtsCounter, type LoadModelCtx } from \"@rpcbase/db\"\nimport { buildAbilityFromSession, type AclSubjectType } from \"@rpcbase/db/acl\"\nimport type { Model } from \"mongoose\"\n\nimport * as Changes from \"./index\"\n\n\ntype SessionUser = {\n id?: string\n currentTenantId?: string\n signedInTenants?: string[]\n}\n\ntype RtsCounterDoc = IRBRtsCounter\ntype RtsChangeDoc = IRBRtsChange\n\nconst getTenantId = (ctx: Ctx<SessionUser>): string | null => {\n const sessionTenantId = ctx.req.session?.user?.currentTenantId\n if (typeof sessionTenantId === \"string\" && sessionTenantId.trim()) return sessionTenantId.trim()\n\n return null\n}\n\nconst ensureAuthorized = (ctx: Ctx<SessionUser>, tenantId: string): string | null => {\n const userId = ctx.req.session?.user?.id\n if (!userId) return null\n\n const currentTenantId = ctx.req.session?.user?.currentTenantId\n const normalizedCurrentTenantId = typeof currentTenantId === \"string\" ? currentTenantId.trim() : \"\"\n\n if (!normalizedCurrentTenantId || normalizedCurrentTenantId !== tenantId) return null\n return userId\n}\n\nconst getModelCtx = (_ctx: Ctx<SessionUser>, tenantId: string): LoadModelCtx => ({\n req: {\n session: {\n user: {\n currentTenantId: tenantId,\n },\n },\n },\n})\n\nconst isRtsChangeRecord = (value: unknown): value is RtsChangeDoc => {\n if (!value || typeof value !== \"object\") return false\n const obj = value as Partial<RtsChangeDoc>\n const isOp = ZRBRtsChangeOp.safeParse(obj.op).success\n return typeof obj.seq === \"number\" && typeof obj.modelName === \"string\" && isOp\n}\n\nconst changesHandler: ApiHandler<Changes.RequestPayload, Changes.ResponsePayload, SessionUser> = async(\n payload,\n ctx,\n): Promise<Changes.ResponsePayload> => {\n const parsed = Changes.requestSchema.safeParse(payload ?? {})\n if (!parsed.success) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const tenantId = getTenantId(ctx)\n if (!tenantId) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const userId = ensureAuthorized(ctx, tenantId)\n if (!userId) {\n ctx.res.status(401)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const ability = buildAbilityFromSession({ tenantId, session: ctx.req.session })\n\n const modelCtx = getModelCtx(ctx, tenantId)\n\n const [RtsChange, RtsCounter] = await Promise.all([\n models.get(\"RBRtsChange\", modelCtx) as Promise<Model<RtsChangeDoc>>,\n models.get(\"RBRtsCounter\", modelCtx) as Promise<Model<RtsCounterDoc>>,\n ])\n\n const counter = await RtsCounter.findOne({ _id: \"rts\" }, { seq: 1 }).lean()\n const latestSeq = Number(counter?.seq ?? 0) || 0\n\n const { sinceSeq, limit, modelNames } = parsed.data\n\n const requestedModelNames = Array.isArray(modelNames) && modelNames.length\n ? modelNames.map((m) => String(m)).filter(Boolean)\n : null\n\n const allowedModelNames = requestedModelNames\n ? requestedModelNames.filter((m) => ability.can(\"read\", m as AclSubjectType))\n : Array.from(\n new Set(\n (await RtsChange.distinct(\"modelName\"))\n .map((m) => String(m))\n .filter(Boolean)\n .filter((m) => ability.can(\"read\", m as AclSubjectType)),\n ),\n )\n\n let earliestSeq: number | undefined\n if (allowedModelNames.length) {\n const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean()\n earliestSeq = earliest?.seq ? Number(earliest.seq) : undefined\n }\n\n const needsFullResync = typeof earliestSeq === \"number\" && sinceSeq < earliestSeq - 1\n\n const selector: Record<string, unknown> = { seq: { $gt: sinceSeq }, modelName: { $in: allowedModelNames } }\n\n const changes = await RtsChange\n .find(selector, { _id: 0, seq: 1, modelName: 1, op: 1, docId: 1 })\n .sort({ seq: 1 })\n .limit(limit)\n .lean()\n\n return {\n ok: true,\n needsFullResync: needsFullResync || undefined,\n earliestSeq,\n latestSeq,\n changes: Array.isArray(changes)\n ? changes\n .filter(isRtsChangeRecord)\n .filter((c) => ability.can(\"read\", c.modelName as AclSubjectType))\n .map((c) => ({\n seq: Number(c.seq),\n modelName: String(c.modelName),\n op: c.op,\n docId: c.docId ? String(c.docId) : undefined,\n }))\n : [],\n }\n}\n\nexport default (api: Api<SessionUser>) => {\n api.post(Changes.ROUTE, changesHandler)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"handler-DlRmqucR.js","names":[],"sources":["../src/rts/api/changes/index.ts","../src/rts/api/changes/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/rts/changes\"\n\nexport const requestSchema = z.object({\n sinceSeq: z.number().int().min(0).default(0),\n limit: z.number().int().min(1).max(5000).default(2000),\n modelNames: z.array(z.string().min(1)).optional(),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n ok: z.boolean(),\n needsFullResync: z.boolean().optional(),\n earliestSeq: z.number().int().min(0).optional(),\n latestSeq: z.number().int().min(0),\n changes: z.array(z.object({\n seq: z.number().int().min(1),\n modelName: z.string().min(1),\n op: z.enum([\"delete\", \"reset_model\"]),\n docId: z.string().optional(),\n })),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models, ZRBRtsChangeOp, type IRBRtsChange, type IRBRtsCounter, type LoadModelCtx } from \"@rpcbase/db\"\nimport { buildAbilityFromSession, type AclSubjectType } from \"@rpcbase/db/acl\"\nimport type { Model } from \"mongoose\"\n\nimport * as Changes from \"./index\"\n\n\ntype SessionUser = {\n id?: string\n currentTenantId?: string\n signedInTenants?: string[]\n}\n\ntype RtsCounterDoc = IRBRtsCounter\ntype RtsChangeDoc = IRBRtsChange\n\nconst getTenantId = (ctx: Ctx<SessionUser>): string | null => {\n const sessionTenantId = ctx.req.session?.user?.currentTenantId\n if (typeof sessionTenantId === \"string\" && sessionTenantId.trim()) return sessionTenantId.trim()\n\n return null\n}\n\nconst ensureAuthorized = (ctx: Ctx<SessionUser>, tenantId: string): string | null => {\n const userId = ctx.req.session?.user?.id\n if (!userId) return null\n\n const currentTenantId = ctx.req.session?.user?.currentTenantId\n const normalizedCurrentTenantId = typeof currentTenantId === \"string\" ? currentTenantId.trim() : \"\"\n\n if (!normalizedCurrentTenantId || normalizedCurrentTenantId !== tenantId) return null\n return userId\n}\n\nconst getModelCtx = (_ctx: Ctx<SessionUser>, tenantId: string): LoadModelCtx => ({\n req: {\n session: {\n user: {\n currentTenantId: tenantId,\n },\n },\n },\n})\n\nconst isRtsChangeRecord = (value: unknown): value is RtsChangeDoc => {\n if (!value || typeof value !== \"object\") return false\n const obj = value as Partial<RtsChangeDoc>\n const isOp = ZRBRtsChangeOp.safeParse(obj.op).success\n return typeof obj.seq === \"number\" && typeof obj.modelName === \"string\" && isOp\n}\n\nconst changesHandler: ApiHandler<Changes.RequestPayload, Changes.ResponsePayload, SessionUser> = async(\n payload,\n ctx,\n): Promise<Changes.ResponsePayload> => {\n const parsed = Changes.requestSchema.safeParse(payload ?? {})\n if (!parsed.success) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const tenantId = getTenantId(ctx)\n if (!tenantId) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const userId = ensureAuthorized(ctx, tenantId)\n if (!userId) {\n ctx.res.status(401)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const ability = buildAbilityFromSession({ tenantId, session: ctx.req.session })\n\n const modelCtx = getModelCtx(ctx, tenantId)\n\n const [RtsChange, RtsCounter] = await Promise.all([\n models.get(\"RBRtsChange\", modelCtx) as Promise<Model<RtsChangeDoc>>,\n models.get(\"RBRtsCounter\", modelCtx) as Promise<Model<RtsCounterDoc>>,\n ])\n\n const counter = await RtsCounter.findOne({ _id: \"rts\" }, { seq: 1 }).lean()\n const latestSeq = Number(counter?.seq ?? 0) || 0\n\n const { sinceSeq, limit, modelNames } = parsed.data\n\n const requestedModelNames = Array.isArray(modelNames) && modelNames.length\n ? modelNames.map((m) => String(m)).filter(Boolean)\n : null\n\n const allowedModelNames = requestedModelNames\n ? requestedModelNames.filter((m) => ability.can(\"read\", m as AclSubjectType))\n : Array.from(\n new Set(\n (await RtsChange.distinct(\"modelName\"))\n .map((m) => String(m))\n .filter(Boolean)\n .filter((m) => ability.can(\"read\", m as AclSubjectType)),\n ),\n )\n\n let earliestSeq: number | undefined\n if (allowedModelNames.length) {\n const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean()\n earliestSeq = earliest?.seq ? Number(earliest.seq) : undefined\n }\n\n const needsFullResync = sinceSeq > latestSeq\n || (sinceSeq < latestSeq && earliestSeq === undefined)\n || (typeof earliestSeq === \"number\" && sinceSeq < earliestSeq - 1)\n\n const selector: Record<string, unknown> = { seq: { $gt: sinceSeq }, modelName: { $in: allowedModelNames } }\n\n const changes = await RtsChange\n .find(selector, { _id: 0, seq: 1, modelName: 1, op: 1, docId: 1 })\n .sort({ seq: 1 })\n .limit(limit)\n .lean()\n\n return {\n ok: true,\n needsFullResync: needsFullResync || undefined,\n earliestSeq,\n latestSeq,\n changes: Array.isArray(changes)\n ? changes\n .filter(isRtsChangeRecord)\n .filter((c) => ability.can(\"read\", c.modelName as AclSubjectType))\n .map((c) => ({\n seq: Number(c.seq),\n modelName: String(c.modelName),\n op: c.op,\n docId: c.docId ? String(c.docId) : undefined,\n }))\n : [],\n }\n}\n\nexport default (api: Api<SessionUser>) => {\n api.post(Changes.ROUTE, changesHandler)\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import { Transform, Writable } from "node:stream";
29
29
  import { StrictMode, createElement } from "react";
30
30
  import { renderToPipeableStream, renderToStaticMarkup } from "react-dom/server";
31
31
  import { StaticRouterProvider, createPath, createStaticRouter, matchRoutes, parsePath } from "@rpcbase/router";
32
- import { jsx } from "react/jsx-runtime";
32
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
33
33
  //#region ../../node_modules/request-ip/lib/is.js
34
34
  var require_is = /* @__PURE__ */ __commonJSMin(((exports, module) => {
35
35
  var regexes = {
@@ -7361,10 +7361,10 @@ async function renderSSR(req, res, dataRoutes) {
7361
7361
  router,
7362
7362
  context: routerContext
7363
7363
  });
7364
- return /* @__PURE__ */ jsx(StrictMode, { children: runtime ? /* @__PURE__ */ jsx(RtsSsrRuntimeProvider, {
7364
+ return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(Fragment, { children: [runtime ? /* @__PURE__ */ jsx(RtsSsrRuntimeProvider, {
7365
7365
  value: runtime,
7366
7366
  children: app
7367
- }) : app });
7367
+ }) : app, null] }) });
7368
7368
  };
7369
7369
  const tenantId = resolveRtsRequestTenantId(req);
7370
7370
  let rtsHydrationData = null;