@josephomills/esign 0.4.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placement: r.placement as Placement,\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placement,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/flow.ts","../../src/server/uid.ts","../../src/adapters/prisma/adapter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { EsignError } from \"./errors\";\n\n/**\n * Lifecycle of a single signing request. PENDING/VIEWED are the only active\n * states; SIGNED/DECLINED/EXPIRED/REVOKED are terminal. The submit handler is\n * idempotent, so a no-op transition to the same state is always allowed.\n */\nexport type EsignStatus =\n | \"PENDING\"\n | \"VIEWED\"\n | \"SIGNED\"\n | \"DECLINED\"\n | \"EXPIRED\"\n | \"REVOKED\";\n\nexport const ESIGN_STATUSES: readonly EsignStatus[] = [\n \"PENDING\",\n \"VIEWED\",\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\n/** Active (still-actionable) states — eligible for view/sign/decline. */\nexport const ACTIVE_STATUSES: readonly EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\n/** Terminal states — no further transitions. */\nexport const TERMINAL_STATUSES: readonly EsignStatus[] = [\n \"SIGNED\",\n \"DECLINED\",\n \"EXPIRED\",\n \"REVOKED\",\n];\n\nconst TRANSITIONS: Record<EsignStatus, readonly EsignStatus[]> = {\n PENDING: [\"VIEWED\", \"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n VIEWED: [\"SIGNED\", \"DECLINED\", \"EXPIRED\", \"REVOKED\"],\n SIGNED: [],\n DECLINED: [],\n EXPIRED: [],\n REVOKED: [],\n};\n\nexport function isActive(status: EsignStatus): boolean {\n return ACTIVE_STATUSES.includes(status);\n}\n\nexport function isTerminal(status: EsignStatus): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n/** Whether `from → to` is a legal move (a same-state no-op counts as legal). */\nexport function canTransition(from: EsignStatus, to: EsignStatus): boolean {\n if (from === to) return true;\n return TRANSITIONS[from].includes(to);\n}\n\n/** Throw `EsignError('CONFLICT')` on an illegal transition. */\nexport function assertTransition(from: EsignStatus, to: EsignStatus): void {\n if (!canTransition(from, to)) {\n throw new EsignError(\n \"CONFLICT\",\n `Illegal signing-request transition: ${from} → ${to}.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\n// 62-char URL-safe alphabet. 16 chars ≈ 95 bits of entropy — ample for row ids.\nconst ALPHABET =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\n/**\n * A 16-char unique id, matching the host `@db.VarChar(16)` convention. The\n * package generates ids in code (the Prisma fragment carries no `@default`), so\n * every esign-owned row gets a uid the same way across dhm-estates / flc-missions\n * / flc-hr. Rejection sampling keeps the distribution uniform (no modulo bias).\n */\nexport function uid(size = 16): string {\n let out = \"\";\n while (out.length < size) {\n for (const byte of randomBytes(size)) {\n if (byte < 248) {\n // 248 = floor(256 / 62) * 62 — discard the biased tail.\n out += ALPHABET[byte % 62];\n if (out.length === size) break;\n }\n }\n }\n return out;\n}\n","import type { EsignStatus } from \"../../server/flow\";\nimport type { NewRequestRow, PersistencePort, RequestSummary } from \"../../server/ports\";\nimport { ESIGN_STATUSES } from \"../../server/flow\";\nimport { uid } from \"../../server/uid\";\nimport type {\n CampaignStatsRow,\n DocumentStatsRow,\n EsignChannel,\n GroupBreakdown,\n OutstandingRequest,\n Placement,\n ScopeStatsRow,\n SignatureField,\n SigningAuditEventDTO,\n SigningCampaignDTO,\n SigningDocumentDTO,\n SigningDocumentVersionDTO,\n SigningRequestDTO,\n StatsRange,\n StatusCountMap,\n SubjectSelection,\n SubjectSigningStatus,\n} from \"../../server/types\";\n\n// Structural Prisma client — accepts any client exposing the five esign\n// delegates. Keeps `@prisma/client` out of the package's dependency graph\n// (mirrors @firstlovecenter/milestone-grid). The host passes its own `prisma`.\ninterface Delegate {\n create(args: { data: unknown }): Promise<unknown>;\n createMany(args: { data: unknown[] }): Promise<unknown>;\n findUnique(args: { where: unknown; select?: unknown }): Promise<unknown>;\n findFirst(args: {\n where?: unknown;\n orderBy?: unknown;\n select?: unknown;\n }): Promise<unknown>;\n findMany(args: {\n where?: unknown;\n orderBy?: unknown;\n take?: number;\n select?: unknown;\n }): Promise<unknown[]>;\n update(args: { where: unknown; data: unknown }): Promise<unknown>;\n count(args: { where?: unknown }): Promise<number>;\n groupBy(args: { by: string[]; where?: unknown; _count?: unknown }): Promise<unknown[]>;\n}\n\nexport interface PrismaLike {\n signingDocument: Delegate;\n signingDocumentVersion: Delegate;\n signingCampaign: Delegate;\n signingRequest: Delegate;\n signingAuditEvent: Delegate;\n}\n\nconst iso = (d: Date): string => d.toISOString();\nconst isoN = (d: Date | null): string | null => (d ? d.toISOString() : null);\n\ninterface DocRow {\n id: string;\n scopeId: string | null;\n documentType: string | null;\n title: string;\n audience: unknown;\n currentVersionId: string | null;\n createdById: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\nconst mapDoc = (r: DocRow): SigningDocumentDTO => ({\n id: r.id,\n scopeId: r.scopeId,\n documentType: r.documentType,\n title: r.title,\n audience: (r.audience as SubjectSelection | null) ?? null,\n currentVersionId: r.currentVersionId,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n updatedAt: iso(r.updatedAt),\n});\n\ninterface VerRow {\n id: string;\n documentId: string;\n version: number;\n sourceObjectKey: string;\n sourceSha256: string;\n placement: unknown;\n changeNote: string | null;\n createdById: string | null;\n createdAt: Date;\n}\n/** The `placement` Json column holds a SignatureField[]; tolerate a legacy single object. */\nfunction toFields(raw: unknown): SignatureField[] {\n if (Array.isArray(raw)) return raw as SignatureField[];\n if (raw && typeof raw === \"object\") {\n return [{ ...(raw as Placement), id: \"field-1\", label: \"Signature\" }];\n }\n return [];\n}\n\nconst mapVer = (r: VerRow): SigningDocumentVersionDTO => ({\n id: r.id,\n documentId: r.documentId,\n version: r.version,\n sourceObjectKey: r.sourceObjectKey,\n sourceSha256: r.sourceSha256,\n placements: toFields(r.placement),\n changeNote: r.changeNote,\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface CampRow {\n id: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n note: string | null;\n emailReceipt: boolean;\n targeting: unknown;\n expiresAt: Date;\n createdById: string | null;\n createdAt: Date;\n}\nconst mapCamp = (r: CampRow): SigningCampaignDTO => ({\n id: r.id,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n note: r.note,\n emailReceipt: r.emailReceipt,\n targeting: r.targeting as SubjectSelection,\n expiresAt: iso(r.expiresAt),\n createdById: r.createdById,\n createdAt: iso(r.createdAt),\n});\n\ninterface ReqRow {\n id: string;\n campaignId: string;\n documentId: string;\n documentVersionId: string;\n scopeId: string | null;\n subjectType: string;\n subjectId: string;\n subjectGroup: string | null;\n recipientName: string;\n recipientEmail: string | null;\n recipientWhatsapp: string | null;\n channels: unknown;\n status: EsignStatus;\n viewedAt: Date | null;\n signedAt: Date | null;\n declinedAt: Date | null;\n expiresAt: Date;\n revokedAt: Date | null;\n sealedObjectKey: string | null;\n sealedSha256: string | null;\n createdAt: Date;\n}\nconst mapReq = (r: ReqRow): SigningRequestDTO => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status,\n viewedAt: isoN(r.viewedAt),\n signedAt: isoN(r.signedAt),\n declinedAt: isoN(r.declinedAt),\n expiresAt: iso(r.expiresAt),\n revokedAt: isoN(r.revokedAt),\n sealedObjectKey: r.sealedObjectKey,\n sealedSha256: r.sealedSha256,\n createdAt: iso(r.createdAt),\n});\n\nconst emptyCounts = (): StatusCountMap =>\n Object.fromEntries(ESIGN_STATUSES.map((s) => [s, 0])) as StatusCountMap;\n\ninterface GroupRow {\n status: EsignStatus;\n _count: { _all: number };\n}\nconst totalOf = (c: StatusCountMap): number =>\n ESIGN_STATUSES.reduce((sum, s) => sum + c[s], 0);\nconst completion = (c: StatusCountMap): number => {\n const total = totalOf(c);\n return total === 0 ? 0 : c.SIGNED / total;\n};\n\n/** Fold groupBy([key,status]) rows into per-key status-count breakdowns. */\nfunction foldBreakdown<K extends string>(\n rows: ({ status: EsignStatus; _count: { _all: number } } & Record<K, string | null>)[],\n key: K,\n): { value: string | null; counts: StatusCountMap; total: number }[] {\n const map = new Map<string | null, StatusCountMap>();\n for (const row of rows) {\n const k = row[key];\n let counts = map.get(k);\n if (!counts) {\n counts = emptyCounts();\n map.set(k, counts);\n }\n counts[row.status] += row._count._all;\n }\n return [...map.entries()].map(([value, counts]) => ({\n value,\n counts,\n total: totalOf(counts),\n }));\n}\n\nconst ACTIVE: EsignStatus[] = [\"PENDING\", \"VIEWED\"];\n\nexport function createPrismaPersistence(prisma: PrismaLike): PersistencePort {\n async function statusCounts(where: unknown): Promise<StatusCountMap> {\n const rows = (await prisma.signingRequest.groupBy({\n by: [\"status\"],\n where,\n _count: { _all: true },\n })) as GroupRow[];\n const counts = emptyCounts();\n for (const r of rows) counts[r.status] = r._count._all;\n return counts;\n }\n\n async function outstandingFor(\n where: Record<string, unknown>,\n now: Date,\n limit: number,\n ): Promise<OutstandingRequest[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { ...where, status: { in: ACTIVE }, expiresAt: { gt: now } },\n orderBy: { createdAt: \"asc\" },\n take: limit,\n })) as ReqRow[];\n return rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n recipientName: r.recipientName,\n channels: (r.channels as EsignChannel[]) ?? [],\n status: r.status as \"PENDING\" | \"VIEWED\",\n viewedAt: isoN(r.viewedAt),\n createdAt: iso(r.createdAt),\n expiresAt: iso(r.expiresAt),\n }));\n }\n\n return {\n // Documents\n async createDocument(input) {\n const row = (await prisma.signingDocument.create({\n data: {\n id: uid(),\n scopeId: input.scopeId,\n documentType: input.documentType,\n title: input.title,\n audience: input.audience ?? undefined,\n createdById: input.createdById,\n },\n })) as DocRow;\n return mapDoc(row);\n },\n async getDocument(id) {\n const row = (await prisma.signingDocument.findFirst({\n where: { id, deletedAt: null },\n })) as DocRow | null;\n return row ? mapDoc(row) : null;\n },\n async updateDocument(id, patch) {\n const data: Record<string, unknown> = {};\n if (patch.title !== undefined) data.title = patch.title;\n if (patch.currentVersionId !== undefined) data.currentVersionId = patch.currentVersionId;\n if (patch.audience !== undefined && patch.audience !== null) data.audience = patch.audience;\n const row = (await prisma.signingDocument.update({ where: { id }, data })) as DocRow;\n return mapDoc(row);\n },\n async listDocuments(opts) {\n const rows = (await prisma.signingDocument.findMany({\n where: { deletedAt: null, scopeId: opts.scopeId ?? undefined, documentType: opts.documentType ?? undefined },\n orderBy: { createdAt: \"desc\" },\n })) as DocRow[];\n return rows.map(mapDoc);\n },\n\n // Versions\n async createVersion(input) {\n const row = (await prisma.signingDocumentVersion.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n version: input.version,\n sourceObjectKey: input.sourceObjectKey,\n sourceSha256: input.sourceSha256,\n placement: input.placements,\n changeNote: input.changeNote,\n createdById: input.createdById,\n },\n })) as VerRow;\n return mapVer(row);\n },\n async getVersion(id) {\n const row = (await prisma.signingDocumentVersion.findUnique({ where: { id } })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n async listVersions(documentId) {\n const rows = (await prisma.signingDocumentVersion.findMany({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow[];\n return rows.map(mapVer);\n },\n async latestVersion(documentId) {\n const row = (await prisma.signingDocumentVersion.findFirst({\n where: { documentId },\n orderBy: { version: \"desc\" },\n })) as VerRow | null;\n return row ? mapVer(row) : null;\n },\n\n // Campaigns\n async createCampaign(input) {\n const row = (await prisma.signingCampaign.create({\n data: {\n id: uid(),\n documentId: input.documentId,\n documentVersionId: input.documentVersionId,\n scopeId: input.scopeId,\n note: input.note,\n emailReceipt: input.emailReceipt,\n targeting: input.targeting,\n expiresAt: input.expiresAt,\n createdById: input.createdById,\n },\n })) as CampRow;\n return mapCamp(row);\n },\n async getCampaign(id) {\n const row = (await prisma.signingCampaign.findFirst({ where: { id, deletedAt: null } })) as CampRow | null;\n return row ? mapCamp(row) : null;\n },\n async listCampaigns(documentId) {\n const rows = (await prisma.signingCampaign.findMany({\n where: { documentId, deletedAt: null },\n orderBy: { createdAt: \"desc\" },\n })) as CampRow[];\n return rows.map(mapCamp);\n },\n\n // Requests\n async createRequests(rows: NewRequestRow[]) {\n if (rows.length === 0) return;\n await prisma.signingRequest.createMany({\n data: rows.map((r) => ({\n id: r.id,\n campaignId: r.campaignId,\n documentId: r.documentId,\n documentVersionId: r.documentVersionId,\n scopeId: r.scopeId,\n subjectType: r.subjectType,\n subjectId: r.subjectId,\n subjectGroup: r.subjectGroup,\n recipientName: r.recipientName,\n recipientEmail: r.recipientEmail,\n recipientWhatsapp: r.recipientWhatsapp,\n channels: r.channels,\n tokenHash: r.tokenHash,\n expiresAt: r.expiresAt,\n })),\n });\n },\n async getRequest(id) {\n const row = (await prisma.signingRequest.findUnique({ where: { id } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async findRequestByTokenHash(tokenHash) {\n const row = (await prisma.signingRequest.findUnique({ where: { tokenHash } })) as ReqRow | null;\n return row ? mapReq(row) : null;\n },\n async updateRequest(id, patch) {\n const row = (await prisma.signingRequest.update({ where: { id }, data: patch })) as ReqRow;\n return mapReq(row);\n },\n async listRequests(opts) {\n const rows = (await prisma.signingRequest.findMany({\n where: {\n campaignId: opts.campaignId,\n documentId: opts.documentId,\n subjectType: opts.subjectType,\n subjectId: opts.subjectId,\n },\n orderBy: { createdAt: \"desc\" },\n })) as ReqRow[];\n return rows.map(mapReq);\n },\n async requestSummaryBySubject(documentId): Promise<RequestSummary[]> {\n const rows = (await prisma.signingRequest.findMany({\n where: { documentId },\n orderBy: { createdAt: \"desc\" },\n select: {\n subjectId: true,\n status: true,\n signedAt: true,\n version: { select: { version: true } },\n },\n })) as {\n subjectId: string;\n status: EsignStatus;\n signedAt: Date | null;\n version: { version: number };\n }[];\n const seen = new Map<string, RequestSummary>();\n for (const r of rows) {\n if (seen.has(r.subjectId)) continue; // first = latest (desc order)\n seen.set(r.subjectId, {\n subjectId: r.subjectId,\n status: r.status,\n version: r.version.version,\n signedAt: isoN(r.signedAt),\n });\n }\n return [...seen.values()];\n },\n\n // Audit chain\n async appendAuditEvent(row) {\n const created = (await prisma.signingAuditEvent.create({\n data: {\n id: uid(),\n requestId: row.requestId,\n seq: row.seq,\n type: row.type,\n payload: row.payload,\n prevHash: row.prevHash,\n hash: row.hash,\n },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n };\n return {\n id: created.id,\n requestId: created.requestId,\n seq: created.seq,\n type: created.type,\n payload: created.payload,\n prevHash: created.prevHash,\n hash: created.hash,\n occurredAt: iso(created.occurredAt),\n } satisfies SigningAuditEventDTO;\n },\n async listAuditEvents(requestId) {\n const rows = (await prisma.signingAuditEvent.findMany({\n where: { requestId },\n orderBy: { seq: \"asc\" },\n })) as {\n id: string;\n requestId: string;\n seq: number;\n type: string;\n payload: unknown;\n prevHash: string | null;\n hash: string;\n occurredAt: Date;\n }[];\n return rows.map((r) => ({\n id: r.id,\n requestId: r.requestId,\n seq: r.seq,\n type: r.type,\n payload: r.payload,\n prevHash: r.prevHash,\n hash: r.hash,\n occurredAt: iso(r.occurredAt),\n }));\n },\n async lastAuditHash(requestId) {\n const row = (await prisma.signingAuditEvent.findFirst({\n where: { requestId },\n orderBy: { seq: \"desc\" },\n select: { seq: true, hash: true },\n })) as { seq: number; hash: string } | null;\n return row ?? null;\n },\n\n // Green-check + stats\n async subjectSigningStatus(args): Promise<SubjectSigningStatus> {\n const where: Record<string, unknown> = {\n subjectType: args.subjectType,\n subjectId: args.subjectId,\n };\n if (args.documentId) where.documentId = args.documentId;\n else if (args.documentType) where.document = { documentType: args.documentType };\n\n const latest = (await prisma.signingRequest.findFirst({\n where,\n orderBy: { createdAt: \"desc\" },\n select: {\n id: true,\n status: true,\n signedAt: true,\n sealedObjectKey: true,\n documentId: true,\n version: { select: { version: true } },\n },\n })) as {\n id: string;\n status: EsignStatus;\n signedAt: Date | null;\n sealedObjectKey: string | null;\n documentId: string;\n version: { version: number };\n } | null;\n\n if (!latest) {\n return { state: \"NONE\", signedAt: null, signedVersion: null, requestId: null, sealedObjectKey: null };\n }\n\n const base = {\n signedAt: isoN(latest.signedAt),\n signedVersion: latest.version.version,\n requestId: latest.id,\n sealedObjectKey: latest.sealedObjectKey,\n };\n\n if (latest.status !== \"SIGNED\") {\n const state =\n latest.status === \"PENDING\" || latest.status === \"VIEWED\" || latest.status === \"DECLINED\"\n ? latest.status\n : \"NONE\";\n return { state, ...base, signedAt: null };\n }\n\n if (args.versionPolicy === \"any\") return { state: \"SIGNED\", ...base };\n\n // \"current\": needs re-sign if signed an older version than the doc's current.\n const doc = (await prisma.signingDocument.findFirst({\n where: { id: latest.documentId },\n select: { currentVersionId: true },\n })) as { currentVersionId: string | null } | null;\n let currentNumber = latest.version.version;\n if (doc?.currentVersionId) {\n const cur = (await prisma.signingDocumentVersion.findUnique({\n where: { id: doc.currentVersionId },\n select: { version: true },\n })) as { version: number } | null;\n if (cur) currentNumber = cur.version;\n }\n return {\n state: latest.version.version >= currentNumber ? \"SIGNED\" : \"NEEDS_RESIGN\",\n ...base,\n };\n },\n\n async campaignStats(campaignId): Promise<CampaignStatsRow> {\n const counts = await statusCounts({ campaignId });\n const total = totalOf(counts);\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { campaignId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const signed = (await prisma.signingRequest.findMany({\n where: { campaignId, status: \"SIGNED\" },\n select: { createdAt: true, signedAt: true },\n })) as { createdAt: Date; signedAt: Date | null }[];\n const durations = signed\n .filter((r) => r.signedAt)\n .map((r) => r.signedAt!.getTime() - r.createdAt.getTime());\n const avgTimeToSignMs =\n durations.length === 0 ? null : Math.round(durations.reduce((a, b) => a + b, 0) / durations.length);\n const outstanding = await outstandingFor({ campaignId }, new Date(0), 100).catch(() => []);\n\n return {\n campaignId,\n counts,\n total,\n viewedNotSigned: counts.VIEWED,\n completionRate: completion(counts),\n avgTimeToSignMs,\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n outstanding,\n };\n },\n\n async documentStats(documentId): Promise<DocumentStatsRow> {\n const counts = await statusCounts({ documentId });\n const groupRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectGroup\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectGroup: string | null })[];\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: { documentId },\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n return {\n documentId,\n counts,\n total: totalOf(counts),\n completionRate: completion(counts),\n byGroup: foldBreakdown(groupRows, \"subjectGroup\").map(\n (b): GroupBreakdown => ({ group: b.value, counts: b.counts, total: b.total }),\n ),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n };\n },\n\n async scopeStats(scopeId, range?: StatsRange): Promise<ScopeStatsRow> {\n const createdAt =\n range?.from || range?.to\n ? { gte: range?.from ?? undefined, lte: range?.to ?? undefined }\n : undefined;\n const reqWhere = { scopeId: scopeId ?? undefined, createdAt };\n const counts = await statusCounts(reqWhere);\n const campaignsSent = await prisma.signingCampaign.count({\n where: { scopeId: scopeId ?? undefined, deletedAt: null, createdAt },\n });\n const typeRows = (await prisma.signingRequest.groupBy({\n by: [\"subjectType\", \"status\"],\n where: reqWhere,\n _count: { _all: true },\n })) as (GroupRow & { subjectType: string })[];\n const oldestOutstanding = await outstandingFor(\n { scopeId: scopeId ?? undefined },\n new Date(0),\n 20,\n );\n return {\n campaignsSent,\n requestsSent: totalOf(counts),\n counts,\n completionRate: completion(counts),\n bySubjectType: foldBreakdown(typeRows, \"subjectType\").map((b) => ({\n subjectType: b.value ?? \"\",\n counts: b.counts,\n total: b.total,\n })),\n oldestOutstanding,\n };\n },\n\n async outstandingRequests(filter) {\n return outstandingFor(\n {\n scopeId: filter.scopeId ?? undefined,\n documentId: filter.documentId,\n campaignId: filter.campaignId,\n },\n filter.now,\n filter.limit ?? 100,\n );\n },\n };\n}\n"]}
@@ -128,6 +128,11 @@ var placementSchema = zod.z.object({
128
128
  w: zod.z.number().min(0.01).max(1),
129
129
  h: zod.z.number().min(0.01).max(1)
130
130
  }).strict();
131
+ var signatureFieldSchema = placementSchema.extend({
132
+ id: zod.z.string().min(1).max(64),
133
+ label: zod.z.string().trim().max(80)
134
+ });
135
+ var placementsSchema = zod.z.array(signatureFieldSchema).min(1).max(20);
131
136
  function addressFor(recipient, channel) {
132
137
  switch (channel) {
133
138
  case "EMAIL":
@@ -440,7 +445,7 @@ async function addVersion(deps, input) {
440
445
  version: (latest?.version ?? 0) + 1,
441
446
  sourceObjectKey,
442
447
  sourceSha256: sha256Hex(bytes),
443
- placement: input.placement,
448
+ placements: input.placements,
444
449
  changeNote: input.changeNote ?? null,
445
450
  createdById: input.createdById ?? null
446
451
  });
@@ -609,35 +614,36 @@ async function sealPdf(input) {
609
614
  pdf.setProducer("@josephomills/esign");
610
615
  pdf.setCreator("@josephomills/esign");
611
616
  const pages = pdf.getPages();
612
- const pageIndex = Math.min(
613
- Math.max(input.placement.page - 1, 0),
614
- pages.length - 1
615
- );
616
- const page = pages[pageIndex];
617
- const pageW = page.getWidth();
618
- const pageH = page.getHeight();
619
- const boxX = input.placement.x * pageW;
620
- const boxW = input.placement.w * pageW;
621
- const boxH = input.placement.h * pageH;
622
- const boxBottomY = pageH * (1 - input.placement.y - input.placement.h);
623
617
  const png = await pdf.embedPng(input.signaturePng);
624
- const scale = Math.min(boxW / png.width, boxH / png.height);
625
- const drawW = png.width * scale;
626
- const drawH = png.height * scale;
627
- page.drawImage(png, {
628
- x: boxX + (boxW - drawW) / 2,
629
- y: boxBottomY + (boxH - drawH) / 2,
630
- width: drawW,
631
- height: drawH
632
- });
633
618
  const font = await pdf.embedFont(pdfLib.StandardFonts.Helvetica);
634
619
  const caption = `Signed by ${input.signerName} \xB7 ${input.signedAt}${input.signerIp ? ` \xB7 IP ${input.signerIp}` : ""}`;
635
- page.drawText(caption, {
636
- x: boxX,
637
- y: Math.max(boxBottomY - 11, 4),
638
- size: 7,
639
- font,
640
- color: pdfLib.rgb(0.35, 0.35, 0.4)
620
+ input.placements.forEach((placement, i) => {
621
+ const pageIndex = Math.min(Math.max(placement.page - 1, 0), pages.length - 1);
622
+ const page = pages[pageIndex];
623
+ const pageW = page.getWidth();
624
+ const pageH = page.getHeight();
625
+ const boxX = placement.x * pageW;
626
+ const boxW = placement.w * pageW;
627
+ const boxH = placement.h * pageH;
628
+ const boxBottomY = pageH * (1 - placement.y - placement.h);
629
+ const scale = Math.min(boxW / png.width, boxH / png.height);
630
+ const drawW = png.width * scale;
631
+ const drawH = png.height * scale;
632
+ page.drawImage(png, {
633
+ x: boxX + (boxW - drawW) / 2,
634
+ y: boxBottomY + (boxH - drawH) / 2,
635
+ width: drawW,
636
+ height: drawH
637
+ });
638
+ if (i === 0) {
639
+ page.drawText(caption, {
640
+ x: boxX,
641
+ y: Math.max(boxBottomY - 11, 4),
642
+ size: 7,
643
+ font,
644
+ color: pdfLib.rgb(0.35, 0.35, 0.4)
645
+ });
646
+ }
641
647
  });
642
648
  const stampedBytes = await pdf.save({ useObjectStreams: false });
643
649
  const documentSha256 = sha256Hex(stampedBytes);
@@ -701,7 +707,7 @@ async function getSigningView(deps, token) {
701
707
  return {
702
708
  request,
703
709
  sourceObjectKey: version.sourceObjectKey,
704
- placement: version.placement,
710
+ placements: version.placements,
705
711
  documentTitle: document?.title ?? "Document"
706
712
  };
707
713
  }
@@ -759,7 +765,7 @@ async function submitSignature(deps, input) {
759
765
  const seal = await sealPdf({
760
766
  sourcePdf: src.bytes,
761
767
  signaturePng: input.signaturePng,
762
- placement: version.placement,
768
+ placements: version.placements,
763
769
  signerName: input.signerName,
764
770
  signedAt: nowIso,
765
771
  signerIp: input.ip,
@@ -1000,12 +1006,14 @@ exports.newSigningToken = newSigningToken;
1000
1006
  exports.ok = ok;
1001
1007
  exports.parseBody = parseBody;
1002
1008
  exports.placementSchema = placementSchema;
1009
+ exports.placementsSchema = placementsSchema;
1003
1010
  exports.recordEvent = recordEvent;
1004
1011
  exports.recordView = recordView;
1005
1012
  exports.registerSubjectTypes = registerSubjectTypes;
1006
1013
  exports.renderAuditCertificatePage = renderAuditCertificatePage;
1007
1014
  exports.sealPdf = sealPdf;
1008
1015
  exports.sha256Hex = sha256Hex;
1016
+ exports.signatureFieldSchema = signatureFieldSchema;
1009
1017
  exports.subjectSelectionSchema = subjectSelectionSchema;
1010
1018
  exports.submitSignature = submitSignature;
1011
1019
  exports.submitSignatureSchema = submitSignatureSchema;