@tearleads/client-sdk 0.1.20 → 0.1.22

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 (28) hide show
  1. package/data/persistence/organizations/organizationReadModelProjection.js +2 -2
  2. package/data/persistence/organizations/organizationReadModelProjection.js.map +1 -1
  3. package/data/persistence/principalPolicyReferencePersistence.js +2 -2
  4. package/data/persistence/principalPolicyReferencePersistence.js.map +1 -1
  5. package/internal/crypto/keying/accessEvent.js +11 -9
  6. package/internal/crypto/keying/accessEvent.js.map +1 -1
  7. package/internal/crypto/keying/principalPolicyChainEntry.js +3 -0
  8. package/internal/crypto/keying/principalPolicyChainEntry.js.map +1 -1
  9. package/internal/crypto/keying/principalPolicyTransition.d.ts +2 -1
  10. package/internal/crypto/keying/principalPolicyTransition.js +5 -0
  11. package/internal/crypto/keying/principalPolicyTransition.js.map +1 -1
  12. package/internal/crypto/principalState.js +2 -2
  13. package/internal/crypto/principalState.js.map +1 -1
  14. package/internal/validators/operation/organizations.d.ts +2 -2
  15. package/internal/validators/request/principal.js +2 -2
  16. package/internal/validators/request/principal.js.map +1 -1
  17. package/internal/validators/response/organization.d.ts +1 -1
  18. package/internal/validators/response/organization.js +1 -1
  19. package/internal/validators/response/organization.js.map +1 -1
  20. package/internal/validators/response/organizationReadModel.d.ts +5 -5
  21. package/internal/validators/response/principalReference.d.ts +1 -1
  22. package/internal/validators/response/principalReference.js +1 -1
  23. package/internal/validators/response/principalReference.js.map +1 -1
  24. package/internal/validators/response/principalSnapshot.js +4 -4
  25. package/internal/validators/response/principalSnapshot.js.map +1 -1
  26. package/package.json +1 -1
  27. package/workflows/containers/mutationResponse.js +1 -1
  28. package/workflows/containers/mutationResponse.js.map +1 -1
@@ -46,7 +46,7 @@ function toGroupCurrentState(row, policyHead) {
46
46
  row.stateHash.length === 0 ||
47
47
  !Number.isInteger(row.stateVersion) ||
48
48
  row.stateVersion <= 0 ||
49
- !Number.isInteger(row.keyEpoch) ||
49
+ !Number.isSafeInteger(row.keyEpoch) ||
50
50
  row.keyEpoch <= 0 ||
51
51
  !Number.isInteger(row.memberCount) ||
52
52
  row.memberCount < 0 ||
@@ -71,7 +71,7 @@ function toPolicyHead(row) {
71
71
  row.stateHash.length === 0 ||
72
72
  !Number.isInteger(row.stateVersion) ||
73
73
  row.stateVersion <= 0 ||
74
- !Number.isInteger(row.keyEpoch) ||
74
+ !Number.isSafeInteger(row.keyEpoch) ||
75
75
  row.keyEpoch <= 0 ||
76
76
  row.keyFingerprint.length === 0 ||
77
77
  !Number.isInteger(row.memberCount) ||
@@ -1 +1 @@
1
- {"version":3,"file":"organizationReadModelProjection.js","sourceRoot":"","sources":["organizationReadModelProjection.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ListOrganizationGroupsResponse,\n OrganizationContainerGrantsResponse,\n OrganizationDirectoryResponse,\n OrganizationDirectoryUserResponse,\n OrganizationGroupCurrentStateResponse,\n OrganizationRosterStatus,\n} from \"@tearleads/validators/response\";\nimport { and, asc, eq } from \"drizzle-orm\";\nimport {\n organizationReadModelDirectoryUsers,\n organizationReadModelGroupMembers,\n organizationReadModelGroups,\n organizationReadModelPolicyHeads,\n organizationReadModelRequesters,\n organizationReadModelState,\n} from \"../../sqlite/organizationReadModelSchema\";\nimport type { ClientSQLiteTransactionScope } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { loadOrganizationReadModelGrantsInTransaction } from \"./organizationReadModelGrantPersistence\";\nimport {\n ORGANIZATION_READ_MODEL_PROTOCOL_VERSION,\n OrganizationReadModelIntegrityError,\n} from \"./organizationReadModelProtocol\";\n\nexport type OrganizationDirectoryProjection = Omit<\n OrganizationDirectoryResponse,\n \"currentUser\"\n>;\n\nexport interface OrganizationReadModelProjection {\n readonly cursor: string;\n readonly directory: OrganizationDirectoryProjection;\n readonly grants: OrganizationContainerGrantsResponse;\n readonly groups: Omit<ListOrganizationGroupsResponse, \"groups\"> & {\n groups: Array<\n ListOrganizationGroupsResponse[\"groups\"][number] & { name: string }\n >;\n };\n readonly membershipEdges: OrganizationReadModelMembershipEdge[];\n readonly organizationId: string;\n readonly policyHeads: readonly OrganizationReadModelPolicyHead[];\n readonly protocolVersion: typeof ORGANIZATION_READ_MODEL_PROTOCOL_VERSION;\n readonly requester: OrganizationDirectoryResponse[\"currentUser\"] | null;\n readonly updatedAt: string;\n}\n\nexport interface OrganizationReadModelPolicyHead {\n readonly keyEpoch: number;\n readonly keyFingerprint: string;\n readonly memberCount: number;\n readonly organizationId: string;\n readonly principalId: string;\n readonly principalType: \"group\" | \"organization\";\n readonly stateHash: string;\n readonly version: number;\n}\n\nexport interface OrganizationReadModelMembershipEdge {\n readonly groupId: string;\n readonly userId: string;\n}\n\ninterface SelectedDirectoryUser {\n readonly createdAt: string;\n readonly disabledAt: string | null;\n readonly disabledByUserId: string | null;\n readonly encapsulationKeyFingerprint: string;\n readonly encapsulationPublicKey: string;\n readonly isPersonalOrganizationOwner: boolean;\n readonly joinedAt: string;\n readonly profileDocumentId: string | null;\n readonly signingKeyFingerprint: string;\n readonly signingPublicKey: string;\n readonly status: string;\n readonly updatedAt: string;\n readonly userId: string;\n}\n\ninterface SelectedGroup {\n readonly createdAt: string;\n readonly groupId: string;\n readonly isBuiltin: boolean;\n readonly keyEpoch: number | null;\n readonly memberCount: number | null;\n readonly name: string;\n readonly stateHash: string | null;\n readonly stateVersion: number | null;\n}\n\ninterface SelectedPolicyHead {\n readonly keyEpoch: number;\n readonly keyFingerprint: string;\n readonly memberCount: number;\n readonly organizationId: string;\n readonly principalId: string;\n readonly principalType: string;\n readonly stateHash: string;\n readonly stateVersion: number;\n}\n\nfunction isOrganizationRosterStatus(\n value: string,\n): value is OrganizationRosterStatus {\n return value === \"active\" || value === \"disabled\";\n}\n\nfunction toDirectoryUser(\n row: SelectedDirectoryUser,\n currentUserId: string,\n): OrganizationDirectoryUserResponse {\n if (!isOrganizationRosterStatus(row.status)) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization directory status is invalid\",\n );\n }\n\n return {\n userId: row.userId,\n signingKeyFingerprint: row.signingKeyFingerprint,\n signingPublicKey: row.signingPublicKey,\n encapsulationPublicKey: row.encapsulationPublicKey,\n encapsulationKeyFingerprint: row.encapsulationKeyFingerprint,\n createdAt: row.createdAt,\n isPersonalOrganizationOwner: row.isPersonalOrganizationOwner,\n isSelf: row.userId === currentUserId,\n status: row.status,\n profileDocumentId: row.profileDocumentId,\n joinedAt: row.joinedAt,\n updatedAt: row.updatedAt,\n disabledAt: row.disabledAt,\n disabledByUserId: row.disabledByUserId,\n };\n}\n\nfunction toGroupCurrentState(\n row: SelectedGroup,\n policyHead: OrganizationReadModelPolicyHead | undefined,\n): OrganizationGroupCurrentStateResponse | null {\n const values = [\n row.stateHash,\n row.stateVersion,\n row.keyEpoch,\n row.memberCount,\n ];\n if (values.every((value) => value === null)) {\n if (policyHead) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group policy head is orphaned\",\n );\n }\n return null;\n }\n if (\n row.stateHash === null ||\n row.stateVersion === null ||\n row.keyEpoch === null ||\n row.memberCount === null ||\n row.stateHash.length === 0 ||\n !Number.isInteger(row.stateVersion) ||\n row.stateVersion <= 0 ||\n !Number.isInteger(row.keyEpoch) ||\n row.keyEpoch <= 0 ||\n !Number.isInteger(row.memberCount) ||\n row.memberCount < 0 ||\n !policyHead ||\n policyHead.stateHash !== row.stateHash ||\n policyHead.version !== row.stateVersion ||\n policyHead.keyEpoch !== row.keyEpoch ||\n policyHead.memberCount !== row.memberCount\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group state is invalid\",\n );\n }\n\n return {\n stateHash: row.stateHash,\n version: row.stateVersion,\n keyEpoch: row.keyEpoch,\n keyFingerprint: policyHead.keyFingerprint,\n memberCount: row.memberCount,\n };\n}\n\nfunction toPolicyHead(\n row: SelectedPolicyHead,\n): OrganizationReadModelPolicyHead {\n if (\n (row.principalType !== \"group\" && row.principalType !== \"organization\") ||\n row.principalId.length === 0 ||\n row.stateHash.length === 0 ||\n !Number.isInteger(row.stateVersion) ||\n row.stateVersion <= 0 ||\n !Number.isInteger(row.keyEpoch) ||\n row.keyEpoch <= 0 ||\n row.keyFingerprint.length === 0 ||\n !Number.isInteger(row.memberCount) ||\n row.memberCount < 0\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization policy head is invalid\",\n );\n }\n\n return {\n organizationId: row.organizationId,\n principalType: row.principalType,\n principalId: row.principalId,\n stateHash: row.stateHash,\n version: row.stateVersion,\n keyEpoch: row.keyEpoch,\n keyFingerprint: row.keyFingerprint,\n memberCount: row.memberCount,\n };\n}\n\nasync function loadDirectoryRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedDirectoryUser[]> {\n return tx\n .select({\n createdAt: organizationReadModelDirectoryUsers.createdAt,\n disabledAt: organizationReadModelDirectoryUsers.disabledAt,\n disabledByUserId: organizationReadModelDirectoryUsers.disabledByUserId,\n encapsulationKeyFingerprint:\n organizationReadModelDirectoryUsers.encapsulationKeyFingerprint,\n encapsulationPublicKey:\n organizationReadModelDirectoryUsers.encapsulationPublicKey,\n joinedAt: organizationReadModelDirectoryUsers.joinedAt,\n isPersonalOrganizationOwner:\n organizationReadModelDirectoryUsers.isPersonalOrganizationOwner,\n profileDocumentId: organizationReadModelDirectoryUsers.profileDocumentId,\n signingKeyFingerprint:\n organizationReadModelDirectoryUsers.signingKeyFingerprint,\n signingPublicKey: organizationReadModelDirectoryUsers.signingPublicKey,\n status: organizationReadModelDirectoryUsers.status,\n updatedAt: organizationReadModelDirectoryUsers.updatedAt,\n userId: organizationReadModelDirectoryUsers.userId,\n })\n .from(organizationReadModelDirectoryUsers)\n .where(\n eq(organizationReadModelDirectoryUsers.organizationId, organizationId),\n )\n .orderBy(\n asc(organizationReadModelDirectoryUsers.sortOrder),\n asc(organizationReadModelDirectoryUsers.userId),\n );\n}\n\nasync function loadGroupRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedGroup[]> {\n return tx\n .select({\n createdAt: organizationReadModelGroups.createdAt,\n groupId: organizationReadModelGroups.groupId,\n isBuiltin: organizationReadModelGroups.isBuiltin,\n keyEpoch: organizationReadModelGroups.keyEpoch,\n memberCount: organizationReadModelGroups.memberCount,\n name: organizationReadModelGroups.name,\n stateHash: organizationReadModelGroups.stateHash,\n stateVersion: organizationReadModelGroups.stateVersion,\n })\n .from(organizationReadModelGroups)\n .where(eq(organizationReadModelGroups.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelGroups.sortOrder),\n asc(organizationReadModelGroups.groupId),\n );\n}\n\nasync function loadPolicyHeadRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedPolicyHead[]> {\n return tx\n .select({\n keyEpoch: organizationReadModelPolicyHeads.keyEpoch,\n keyFingerprint: organizationReadModelPolicyHeads.keyFingerprint,\n memberCount: organizationReadModelPolicyHeads.memberCount,\n organizationId: organizationReadModelPolicyHeads.organizationId,\n principalId: organizationReadModelPolicyHeads.principalId,\n principalType: organizationReadModelPolicyHeads.principalType,\n stateHash: organizationReadModelPolicyHeads.stateHash,\n stateVersion: organizationReadModelPolicyHeads.stateVersion,\n })\n .from(organizationReadModelPolicyHeads)\n .where(eq(organizationReadModelPolicyHeads.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelPolicyHeads.principalType),\n asc(organizationReadModelPolicyHeads.principalId),\n );\n}\n\nasync function loadMembershipEdges(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<OrganizationReadModelMembershipEdge[]> {\n return tx\n .select({\n groupId: organizationReadModelGroupMembers.groupId,\n userId: organizationReadModelGroupMembers.userId,\n })\n .from(organizationReadModelGroupMembers)\n .where(eq(organizationReadModelGroupMembers.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelGroupMembers.groupId),\n asc(organizationReadModelGroupMembers.sortOrder),\n asc(organizationReadModelGroupMembers.userId),\n );\n}\n\nfunction validatePolicyHeads(input: {\n readonly groupRows: readonly SelectedGroup[];\n readonly organizationId: string;\n readonly policyHeadRows: readonly SelectedPolicyHead[];\n}): {\n readonly groupPolicyHeads: ReadonlyMap<\n string,\n OrganizationReadModelPolicyHead\n >;\n readonly policyHeads: readonly OrganizationReadModelPolicyHead[];\n} {\n const policyHeads = input.policyHeadRows.map(toPolicyHead);\n const organizationPolicyHeads = policyHeads.filter(\n (head) => head.principalType === \"organization\",\n );\n if (\n organizationPolicyHeads.length !== 1 ||\n organizationPolicyHeads[0]?.principalId !== input.organizationId\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization policy head is missing or ambiguous\",\n );\n }\n const groupPolicyHeads = new Map(\n policyHeads\n .filter((head) => head.principalType === \"group\")\n .map((head) => [head.principalId, head]),\n );\n const visibleGroupIds = new Set(input.groupRows.map((row) => row.groupId));\n if (\n [...groupPolicyHeads.keys()].some(\n (principalId) => !visibleGroupIds.has(principalId),\n )\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group policy head is not visible\",\n );\n }\n return { groupPolicyHeads, policyHeads };\n}\n\nexport async function loadOrganizationReadModelProjectionInTransaction(input: {\n readonly currentUserId: string;\n readonly organizationId: string;\n readonly tx: ClientSQLiteTransactionScope;\n}): Promise<OrganizationReadModelProjection | null> {\n const [state] = await input.tx\n .select({\n cursor: organizationReadModelState.cursor,\n memberGroupId: organizationReadModelState.memberGroupId,\n profileDocumentId: organizationReadModelState.profileDocumentId,\n updatedAt: organizationReadModelState.updatedAt,\n })\n .from(organizationReadModelState)\n .where(eq(organizationReadModelState.organizationId, input.organizationId))\n .limit(1);\n if (!state) {\n return null;\n }\n const [requester] = await input.tx\n .select({ isOrgAdmin: organizationReadModelRequesters.isOrgAdmin })\n .from(organizationReadModelRequesters)\n .where(\n and(\n eq(\n organizationReadModelRequesters.organizationId,\n input.organizationId,\n ),\n eq(organizationReadModelRequesters.userId, input.currentUserId),\n ),\n )\n .limit(1);\n const directoryRows = await loadDirectoryRows(input.tx, input.organizationId);\n const groupRows = await loadGroupRows(input.tx, input.organizationId);\n const grants = await loadOrganizationReadModelGrantsInTransaction(input);\n const membershipEdges = await loadMembershipEdges(\n input.tx,\n input.organizationId,\n );\n const policyHeadRows = await loadPolicyHeadRows(\n input.tx,\n input.organizationId,\n );\n const { groupPolicyHeads, policyHeads } = validatePolicyHeads({\n groupRows,\n organizationId: input.organizationId,\n policyHeadRows,\n });\n\n return {\n cursor: state.cursor,\n directory: {\n organizationId: input.organizationId,\n profileDocumentId: state.profileDocumentId,\n users: directoryRows.map((row) =>\n toDirectoryUser(row, input.currentUserId),\n ),\n },\n grants,\n groups: {\n organizationId: input.organizationId,\n memberGroupId: state.memberGroupId,\n groups: groupRows.map((row) => ({\n groupId: row.groupId,\n organizationId: input.organizationId,\n name: row.name,\n createdAt: row.createdAt,\n isBuiltin: row.isBuiltin,\n currentState: toGroupCurrentState(\n row,\n groupPolicyHeads.get(row.groupId),\n ),\n })),\n },\n membershipEdges,\n organizationId: input.organizationId,\n policyHeads,\n protocolVersion: ORGANIZATION_READ_MODEL_PROTOCOL_VERSION,\n requester: requester ? { isOrgAdmin: requester.isOrgAdmin } : null,\n updatedAt: state.updatedAt,\n };\n}\n"]}
1
+ {"version":3,"file":"organizationReadModelProjection.js","sourceRoot":"","sources":["organizationReadModelProjection.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ListOrganizationGroupsResponse,\n OrganizationContainerGrantsResponse,\n OrganizationDirectoryResponse,\n OrganizationDirectoryUserResponse,\n OrganizationGroupCurrentStateResponse,\n OrganizationRosterStatus,\n} from \"@tearleads/validators/response\";\nimport { and, asc, eq } from \"drizzle-orm\";\nimport {\n organizationReadModelDirectoryUsers,\n organizationReadModelGroupMembers,\n organizationReadModelGroups,\n organizationReadModelPolicyHeads,\n organizationReadModelRequesters,\n organizationReadModelState,\n} from \"../../sqlite/organizationReadModelSchema\";\nimport type { ClientSQLiteTransactionScope } from \"../../sqlite/sqlitePersistenceRuntime\";\nimport { loadOrganizationReadModelGrantsInTransaction } from \"./organizationReadModelGrantPersistence\";\nimport {\n ORGANIZATION_READ_MODEL_PROTOCOL_VERSION,\n OrganizationReadModelIntegrityError,\n} from \"./organizationReadModelProtocol\";\n\nexport type OrganizationDirectoryProjection = Omit<\n OrganizationDirectoryResponse,\n \"currentUser\"\n>;\n\nexport interface OrganizationReadModelProjection {\n readonly cursor: string;\n readonly directory: OrganizationDirectoryProjection;\n readonly grants: OrganizationContainerGrantsResponse;\n readonly groups: Omit<ListOrganizationGroupsResponse, \"groups\"> & {\n groups: Array<\n ListOrganizationGroupsResponse[\"groups\"][number] & { name: string }\n >;\n };\n readonly membershipEdges: OrganizationReadModelMembershipEdge[];\n readonly organizationId: string;\n readonly policyHeads: readonly OrganizationReadModelPolicyHead[];\n readonly protocolVersion: typeof ORGANIZATION_READ_MODEL_PROTOCOL_VERSION;\n readonly requester: OrganizationDirectoryResponse[\"currentUser\"] | null;\n readonly updatedAt: string;\n}\n\nexport interface OrganizationReadModelPolicyHead {\n readonly keyEpoch: number;\n readonly keyFingerprint: string;\n readonly memberCount: number;\n readonly organizationId: string;\n readonly principalId: string;\n readonly principalType: \"group\" | \"organization\";\n readonly stateHash: string;\n readonly version: number;\n}\n\nexport interface OrganizationReadModelMembershipEdge {\n readonly groupId: string;\n readonly userId: string;\n}\n\ninterface SelectedDirectoryUser {\n readonly createdAt: string;\n readonly disabledAt: string | null;\n readonly disabledByUserId: string | null;\n readonly encapsulationKeyFingerprint: string;\n readonly encapsulationPublicKey: string;\n readonly isPersonalOrganizationOwner: boolean;\n readonly joinedAt: string;\n readonly profileDocumentId: string | null;\n readonly signingKeyFingerprint: string;\n readonly signingPublicKey: string;\n readonly status: string;\n readonly updatedAt: string;\n readonly userId: string;\n}\n\ninterface SelectedGroup {\n readonly createdAt: string;\n readonly groupId: string;\n readonly isBuiltin: boolean;\n readonly keyEpoch: number | null;\n readonly memberCount: number | null;\n readonly name: string;\n readonly stateHash: string | null;\n readonly stateVersion: number | null;\n}\n\ninterface SelectedPolicyHead {\n readonly keyEpoch: number;\n readonly keyFingerprint: string;\n readonly memberCount: number;\n readonly organizationId: string;\n readonly principalId: string;\n readonly principalType: string;\n readonly stateHash: string;\n readonly stateVersion: number;\n}\n\nfunction isOrganizationRosterStatus(\n value: string,\n): value is OrganizationRosterStatus {\n return value === \"active\" || value === \"disabled\";\n}\n\nfunction toDirectoryUser(\n row: SelectedDirectoryUser,\n currentUserId: string,\n): OrganizationDirectoryUserResponse {\n if (!isOrganizationRosterStatus(row.status)) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization directory status is invalid\",\n );\n }\n\n return {\n userId: row.userId,\n signingKeyFingerprint: row.signingKeyFingerprint,\n signingPublicKey: row.signingPublicKey,\n encapsulationPublicKey: row.encapsulationPublicKey,\n encapsulationKeyFingerprint: row.encapsulationKeyFingerprint,\n createdAt: row.createdAt,\n isPersonalOrganizationOwner: row.isPersonalOrganizationOwner,\n isSelf: row.userId === currentUserId,\n status: row.status,\n profileDocumentId: row.profileDocumentId,\n joinedAt: row.joinedAt,\n updatedAt: row.updatedAt,\n disabledAt: row.disabledAt,\n disabledByUserId: row.disabledByUserId,\n };\n}\n\nfunction toGroupCurrentState(\n row: SelectedGroup,\n policyHead: OrganizationReadModelPolicyHead | undefined,\n): OrganizationGroupCurrentStateResponse | null {\n const values = [\n row.stateHash,\n row.stateVersion,\n row.keyEpoch,\n row.memberCount,\n ];\n if (values.every((value) => value === null)) {\n if (policyHead) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group policy head is orphaned\",\n );\n }\n return null;\n }\n if (\n row.stateHash === null ||\n row.stateVersion === null ||\n row.keyEpoch === null ||\n row.memberCount === null ||\n row.stateHash.length === 0 ||\n !Number.isInteger(row.stateVersion) ||\n row.stateVersion <= 0 ||\n !Number.isSafeInteger(row.keyEpoch) ||\n row.keyEpoch <= 0 ||\n !Number.isInteger(row.memberCount) ||\n row.memberCount < 0 ||\n !policyHead ||\n policyHead.stateHash !== row.stateHash ||\n policyHead.version !== row.stateVersion ||\n policyHead.keyEpoch !== row.keyEpoch ||\n policyHead.memberCount !== row.memberCount\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group state is invalid\",\n );\n }\n\n return {\n stateHash: row.stateHash,\n version: row.stateVersion,\n keyEpoch: row.keyEpoch,\n keyFingerprint: policyHead.keyFingerprint,\n memberCount: row.memberCount,\n };\n}\n\nfunction toPolicyHead(\n row: SelectedPolicyHead,\n): OrganizationReadModelPolicyHead {\n if (\n (row.principalType !== \"group\" && row.principalType !== \"organization\") ||\n row.principalId.length === 0 ||\n row.stateHash.length === 0 ||\n !Number.isInteger(row.stateVersion) ||\n row.stateVersion <= 0 ||\n !Number.isSafeInteger(row.keyEpoch) ||\n row.keyEpoch <= 0 ||\n row.keyFingerprint.length === 0 ||\n !Number.isInteger(row.memberCount) ||\n row.memberCount < 0\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization policy head is invalid\",\n );\n }\n\n return {\n organizationId: row.organizationId,\n principalType: row.principalType,\n principalId: row.principalId,\n stateHash: row.stateHash,\n version: row.stateVersion,\n keyEpoch: row.keyEpoch,\n keyFingerprint: row.keyFingerprint,\n memberCount: row.memberCount,\n };\n}\n\nasync function loadDirectoryRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedDirectoryUser[]> {\n return tx\n .select({\n createdAt: organizationReadModelDirectoryUsers.createdAt,\n disabledAt: organizationReadModelDirectoryUsers.disabledAt,\n disabledByUserId: organizationReadModelDirectoryUsers.disabledByUserId,\n encapsulationKeyFingerprint:\n organizationReadModelDirectoryUsers.encapsulationKeyFingerprint,\n encapsulationPublicKey:\n organizationReadModelDirectoryUsers.encapsulationPublicKey,\n joinedAt: organizationReadModelDirectoryUsers.joinedAt,\n isPersonalOrganizationOwner:\n organizationReadModelDirectoryUsers.isPersonalOrganizationOwner,\n profileDocumentId: organizationReadModelDirectoryUsers.profileDocumentId,\n signingKeyFingerprint:\n organizationReadModelDirectoryUsers.signingKeyFingerprint,\n signingPublicKey: organizationReadModelDirectoryUsers.signingPublicKey,\n status: organizationReadModelDirectoryUsers.status,\n updatedAt: organizationReadModelDirectoryUsers.updatedAt,\n userId: organizationReadModelDirectoryUsers.userId,\n })\n .from(organizationReadModelDirectoryUsers)\n .where(\n eq(organizationReadModelDirectoryUsers.organizationId, organizationId),\n )\n .orderBy(\n asc(organizationReadModelDirectoryUsers.sortOrder),\n asc(organizationReadModelDirectoryUsers.userId),\n );\n}\n\nasync function loadGroupRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedGroup[]> {\n return tx\n .select({\n createdAt: organizationReadModelGroups.createdAt,\n groupId: organizationReadModelGroups.groupId,\n isBuiltin: organizationReadModelGroups.isBuiltin,\n keyEpoch: organizationReadModelGroups.keyEpoch,\n memberCount: organizationReadModelGroups.memberCount,\n name: organizationReadModelGroups.name,\n stateHash: organizationReadModelGroups.stateHash,\n stateVersion: organizationReadModelGroups.stateVersion,\n })\n .from(organizationReadModelGroups)\n .where(eq(organizationReadModelGroups.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelGroups.sortOrder),\n asc(organizationReadModelGroups.groupId),\n );\n}\n\nasync function loadPolicyHeadRows(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<SelectedPolicyHead[]> {\n return tx\n .select({\n keyEpoch: organizationReadModelPolicyHeads.keyEpoch,\n keyFingerprint: organizationReadModelPolicyHeads.keyFingerprint,\n memberCount: organizationReadModelPolicyHeads.memberCount,\n organizationId: organizationReadModelPolicyHeads.organizationId,\n principalId: organizationReadModelPolicyHeads.principalId,\n principalType: organizationReadModelPolicyHeads.principalType,\n stateHash: organizationReadModelPolicyHeads.stateHash,\n stateVersion: organizationReadModelPolicyHeads.stateVersion,\n })\n .from(organizationReadModelPolicyHeads)\n .where(eq(organizationReadModelPolicyHeads.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelPolicyHeads.principalType),\n asc(organizationReadModelPolicyHeads.principalId),\n );\n}\n\nasync function loadMembershipEdges(\n tx: ClientSQLiteTransactionScope,\n organizationId: string,\n): Promise<OrganizationReadModelMembershipEdge[]> {\n return tx\n .select({\n groupId: organizationReadModelGroupMembers.groupId,\n userId: organizationReadModelGroupMembers.userId,\n })\n .from(organizationReadModelGroupMembers)\n .where(eq(organizationReadModelGroupMembers.organizationId, organizationId))\n .orderBy(\n asc(organizationReadModelGroupMembers.groupId),\n asc(organizationReadModelGroupMembers.sortOrder),\n asc(organizationReadModelGroupMembers.userId),\n );\n}\n\nfunction validatePolicyHeads(input: {\n readonly groupRows: readonly SelectedGroup[];\n readonly organizationId: string;\n readonly policyHeadRows: readonly SelectedPolicyHead[];\n}): {\n readonly groupPolicyHeads: ReadonlyMap<\n string,\n OrganizationReadModelPolicyHead\n >;\n readonly policyHeads: readonly OrganizationReadModelPolicyHead[];\n} {\n const policyHeads = input.policyHeadRows.map(toPolicyHead);\n const organizationPolicyHeads = policyHeads.filter(\n (head) => head.principalType === \"organization\",\n );\n if (\n organizationPolicyHeads.length !== 1 ||\n organizationPolicyHeads[0]?.principalId !== input.organizationId\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization policy head is missing or ambiguous\",\n );\n }\n const groupPolicyHeads = new Map(\n policyHeads\n .filter((head) => head.principalType === \"group\")\n .map((head) => [head.principalId, head]),\n );\n const visibleGroupIds = new Set(input.groupRows.map((row) => row.groupId));\n if (\n [...groupPolicyHeads.keys()].some(\n (principalId) => !visibleGroupIds.has(principalId),\n )\n ) {\n throw new OrganizationReadModelIntegrityError(\n \"Stored organization group policy head is not visible\",\n );\n }\n return { groupPolicyHeads, policyHeads };\n}\n\nexport async function loadOrganizationReadModelProjectionInTransaction(input: {\n readonly currentUserId: string;\n readonly organizationId: string;\n readonly tx: ClientSQLiteTransactionScope;\n}): Promise<OrganizationReadModelProjection | null> {\n const [state] = await input.tx\n .select({\n cursor: organizationReadModelState.cursor,\n memberGroupId: organizationReadModelState.memberGroupId,\n profileDocumentId: organizationReadModelState.profileDocumentId,\n updatedAt: organizationReadModelState.updatedAt,\n })\n .from(organizationReadModelState)\n .where(eq(organizationReadModelState.organizationId, input.organizationId))\n .limit(1);\n if (!state) {\n return null;\n }\n const [requester] = await input.tx\n .select({ isOrgAdmin: organizationReadModelRequesters.isOrgAdmin })\n .from(organizationReadModelRequesters)\n .where(\n and(\n eq(\n organizationReadModelRequesters.organizationId,\n input.organizationId,\n ),\n eq(organizationReadModelRequesters.userId, input.currentUserId),\n ),\n )\n .limit(1);\n const directoryRows = await loadDirectoryRows(input.tx, input.organizationId);\n const groupRows = await loadGroupRows(input.tx, input.organizationId);\n const grants = await loadOrganizationReadModelGrantsInTransaction(input);\n const membershipEdges = await loadMembershipEdges(\n input.tx,\n input.organizationId,\n );\n const policyHeadRows = await loadPolicyHeadRows(\n input.tx,\n input.organizationId,\n );\n const { groupPolicyHeads, policyHeads } = validatePolicyHeads({\n groupRows,\n organizationId: input.organizationId,\n policyHeadRows,\n });\n\n return {\n cursor: state.cursor,\n directory: {\n organizationId: input.organizationId,\n profileDocumentId: state.profileDocumentId,\n users: directoryRows.map((row) =>\n toDirectoryUser(row, input.currentUserId),\n ),\n },\n grants,\n groups: {\n organizationId: input.organizationId,\n memberGroupId: state.memberGroupId,\n groups: groupRows.map((row) => ({\n groupId: row.groupId,\n organizationId: input.organizationId,\n name: row.name,\n createdAt: row.createdAt,\n isBuiltin: row.isBuiltin,\n currentState: toGroupCurrentState(\n row,\n groupPolicyHeads.get(row.groupId),\n ),\n })),\n },\n membershipEdges,\n organizationId: input.organizationId,\n policyHeads,\n protocolVersion: ORGANIZATION_READ_MODEL_PROTOCOL_VERSION,\n requester: requester ? { isOrgAdmin: requester.isOrgAdmin } : null,\n updatedAt: state.updatedAt,\n };\n}\n"]}
@@ -21,7 +21,7 @@ function assertUnambiguousBundleChain(bundle) {
21
21
  }
22
22
  if (!Number.isInteger(state.version) ||
23
23
  state.version !== index + 1 ||
24
- !Number.isInteger(state.keyEpoch) ||
24
+ !Number.isSafeInteger(state.keyEpoch) ||
25
25
  state.keyEpoch < 1 ||
26
26
  state.principalId.length === 0 ||
27
27
  state.stateHash.length === 0 ||
@@ -109,7 +109,7 @@ function assertReferenceShape(reference) {
109
109
  }
110
110
  if (!Number.isInteger(reference.version) ||
111
111
  reference.version < 1 ||
112
- !Number.isInteger(reference.keyEpoch) ||
112
+ !Number.isSafeInteger(reference.keyEpoch) ||
113
113
  reference.keyEpoch < 1 ||
114
114
  reference.principalId.length === 0 ||
115
115
  reference.stateHash.length === 0 ||
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyReferencePersistence.js","sourceRoot":"","sources":["principalPolicyReferencePersistence.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyingVerificationError,\n type PrincipalPolicyCheckpoint,\n type ReferencedPrincipalHead,\n} from \"@tearleads/crypto\";\nimport type { PrincipalPolicyBundleResponse } from \"@tearleads/validators/response\";\nimport {\n isPrincipalPolicyBundleResponse,\n isReferencedPrincipalStateResponse,\n} from \"@tearleads/validators/response\";\nimport { and, eq, inArray } from \"drizzle-orm\";\nimport {\n principalPolicyBundleContainsReference,\n principalPolicyBundleStates,\n} from \"../principalPolicyStates\";\nimport {\n principalPolicies,\n principalPolicyBundleHistory,\n principalPolicyBundleReferences,\n} from \"../sqlite/schema\";\nimport { getClientSQLitePersistenceRuntime } from \"../sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../sqlite/sqlSchema\";\nimport { assertSameHeadPrincipalPolicyBundle } from \"./principalPolicyBundleIntegrity\";\nimport {\n ensurePrincipalPolicyTables,\n principalPolicyBundleSelection,\n type SelectedPrincipalPolicyRow,\n} from \"./principalPolicyPersistence\";\nimport { applyPrincipalPolicyReferenceCheckpoint } from \"./principalPolicyReferenceCheckpoint\";\nimport { storedPrincipalPolicyBundleFromJson } from \"./storedPrincipalPolicyBundle\";\n\ninterface IndexedBundleHead {\n readonly bundleStateHash: string;\n readonly bundleVersion: number;\n}\n\nfunction assertUnambiguousBundleChain(\n bundle: PrincipalPolicyBundleResponse,\n): void {\n const states = principalPolicyBundleStates(bundle);\n if (states.length !== bundle.currentState.version) {\n throw new KeyingVerificationError(\n \"missing_dependency\",\n \"stored principal policy bundle chain length does not match its head\",\n );\n }\n const versions = new Map<number, string>();\n for (const [index, state] of states.entries()) {\n if (\n state.principalType !== bundle.currentState.principalType ||\n state.principalId !== bundle.currentState.principalId\n ) {\n throw new KeyingVerificationError(\n \"object_mismatch\",\n \"stored principal policy bundle chain belongs to another principal\",\n );\n }\n if (\n !Number.isInteger(state.version) ||\n state.version !== index + 1 ||\n !Number.isInteger(state.keyEpoch) ||\n state.keyEpoch < 1 ||\n state.principalId.length === 0 ||\n state.stateHash.length === 0 ||\n state.keyFingerprint.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle chain has an invalid version or epoch\",\n );\n }\n if (versions.has(state.version)) {\n const previousHash = versions.get(state.version);\n throw new KeyingVerificationError(\n previousHash === state.stateHash ? \"duplicate_entry\" : \"equivocation\",\n \"stored principal policy bundle chain repeats a version\",\n );\n }\n versions.set(state.version, state.stateHash);\n }\n}\n\nfunction parseBoundBundle(\n row: SelectedPrincipalPolicyRow,\n): PrincipalPolicyBundleResponse {\n let bundle: unknown;\n try {\n bundle = storedPrincipalPolicyBundleFromJson(row);\n } catch {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle contains malformed JSON\",\n );\n }\n if (!isPrincipalPolicyBundleResponse(bundle)) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle is invalid\",\n );\n }\n if (\n bundle.currentState.principalType !== row.principalType ||\n bundle.currentState.principalId !== row.principalId\n ) {\n throw new KeyingVerificationError(\n \"object_mismatch\",\n \"stored principal policy bundle row belongs to another principal\",\n );\n }\n if (bundle.currentState.stateHash !== row.stateHash) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"stored principal policy bundle row has a different head hash\",\n );\n }\n assertUnambiguousBundleChain(bundle);\n return bundle;\n}\n\nfunction assertIndexedBundle(\n bundle: PrincipalPolicyBundleResponse,\n indexed: IndexedBundleHead,\n reference: ReferencedPrincipalHead,\n): void {\n if (\n bundle.currentState.stateHash !== indexed.bundleStateHash ||\n bundle.currentState.version !== indexed.bundleVersion\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"principal policy reference index conflicts with its bundle head\",\n );\n }\n if (!principalPolicyBundleContainsReference(bundle, reference)) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"indexed principal policy bundle does not contain the exact reference\",\n );\n }\n}\n\nfunction addCandidate(\n candidates: Map<\n string,\n { bundle: PrincipalPolicyBundleResponse; row: SelectedPrincipalPolicyRow }\n >,\n bundle: PrincipalPolicyBundleResponse,\n row: SelectedPrincipalPolicyRow,\n): void {\n const existing = candidates.get(bundle.currentState.stateHash);\n if (existing) {\n assertSameHeadPrincipalPolicyBundle(existing.row, row);\n return;\n }\n candidates.set(bundle.currentState.stateHash, { bundle, row });\n}\n\nfunction assertCurrentDoesNotConflict(\n bundle: PrincipalPolicyBundleResponse,\n reference: ReferencedPrincipalHead,\n): void {\n if (bundle.currentState.version < reference.version) {\n return;\n }\n const stateAtReference = principalPolicyBundleStates(bundle).find(\n (state) => state.version === reference.version,\n );\n if (!stateAtReference) {\n throw new KeyingVerificationError(\n \"stale_predecessor\",\n \"current principal policy chain omits the referenced version\",\n );\n }\n if (stateAtReference.stateHash !== reference.stateHash) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"current principal policy chain conflicts with the referenced version\",\n );\n }\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"current principal policy state does not match the exact reference\",\n );\n}\n\nfunction selectNewestCandidate(\n candidates: ReadonlyMap<\n string,\n { readonly bundle: PrincipalPolicyBundleResponse }\n >,\n): PrincipalPolicyBundleResponse | null {\n let selected: PrincipalPolicyBundleResponse | null = null;\n const stateHashByVersion = new Map<number, string>();\n for (const { bundle } of candidates.values()) {\n const existingHash = stateHashByVersion.get(bundle.currentState.version);\n if (\n existingHash !== undefined &&\n existingHash !== bundle.currentState.stateHash\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"stored principal policy bundles conflict at one version\",\n );\n }\n stateHashByVersion.set(\n bundle.currentState.version,\n bundle.currentState.stateHash,\n );\n if (\n !selected ||\n bundle.currentState.version > selected.currentState.version\n ) {\n selected = bundle;\n }\n }\n return selected;\n}\n\nfunction assertReferenceShape(reference: ReferencedPrincipalHead): void {\n if (!isReferencedPrincipalStateResponse(reference)) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference is malformed\",\n );\n }\n if (\n !Number.isInteger(reference.version) ||\n reference.version < 1 ||\n !Number.isInteger(reference.keyEpoch) ||\n reference.keyEpoch < 1 ||\n reference.principalId.length === 0 ||\n reference.stateHash.length === 0 ||\n reference.keyFingerprint.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference is malformed\",\n );\n }\n}\n\nasync function loadCurrentRow(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n): Promise<SelectedPrincipalPolicyRow | undefined> {\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n const [row] = await db\n .select(principalPolicyBundleSelection(principalPolicies))\n .from(principalPolicies)\n .where(\n and(\n eq(principalPolicies.principalType, reference.principalType),\n eq(principalPolicies.principalId, reference.principalId),\n ),\n )\n .limit(1);\n return row;\n}\n\nasync function loadIndexedHeads(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n): Promise<IndexedBundleHead[]> {\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n return db\n .select({\n bundleStateHash: principalPolicyBundleReferences.bundleStateHash,\n bundleVersion: principalPolicyBundleReferences.bundleVersion,\n })\n .from(principalPolicyBundleReferences)\n .where(\n and(\n eq(\n principalPolicyBundleReferences.principalType,\n reference.principalType,\n ),\n eq(principalPolicyBundleReferences.principalId, reference.principalId),\n eq(principalPolicyBundleReferences.version, reference.version),\n eq(principalPolicyBundleReferences.stateHash, reference.stateHash),\n eq(principalPolicyBundleReferences.keyEpoch, reference.keyEpoch),\n eq(\n principalPolicyBundleReferences.keyFingerprint,\n reference.keyFingerprint,\n ),\n ),\n );\n}\n\nfunction indexHeadsByHash(\n heads: readonly IndexedBundleHead[],\n): Map<string, IndexedBundleHead> {\n const stateHashByVersion = new Map<number, string>();\n for (const head of heads) {\n if (\n !Number.isInteger(head.bundleVersion) ||\n head.bundleVersion < 1 ||\n head.bundleStateHash.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference index is malformed\",\n );\n }\n const indexedHash = stateHashByVersion.get(head.bundleVersion);\n if (indexedHash !== undefined && indexedHash !== head.bundleStateHash) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"principal policy reference index has conflicting bundle heads at one version\",\n );\n }\n stateHashByVersion.set(head.bundleVersion, head.bundleStateHash);\n }\n return new Map(heads.map((head) => [head.bundleStateHash, head]));\n}\n\nasync function loadRetainedRows(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n currentRow: SelectedPrincipalPolicyRow | undefined,\n indexedByHash: ReadonlyMap<string, IndexedBundleHead>,\n): Promise<SelectedPrincipalPolicyRow[]> {\n const hashes = new Set([reference.stateHash, ...indexedByHash.keys()]);\n if (currentRow) {\n hashes.delete(currentRow.stateHash);\n }\n if (hashes.size === 0) {\n return [];\n }\n // Remote reset deliberately clears mutable heads while retaining historical\n // key material, so an index target can outlive its bundle row. Such a target\n // is only a selection hint; rows that still exist remain authoritative.\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n return db\n .select(principalPolicyBundleSelection(principalPolicyBundleHistory))\n .from(principalPolicyBundleHistory)\n .where(\n and(\n eq(principalPolicyBundleHistory.principalType, reference.principalType),\n eq(principalPolicyBundleHistory.principalId, reference.principalId),\n inArray(principalPolicyBundleHistory.stateHash, [...hashes]),\n ),\n );\n}\n\nfunction collectCandidates(\n currentRow: SelectedPrincipalPolicyRow | undefined,\n retainedRows: readonly SelectedPrincipalPolicyRow[],\n indexedByHash: ReadonlyMap<string, IndexedBundleHead>,\n reference: ReferencedPrincipalHead,\n) {\n const candidates = new Map<\n string,\n { bundle: PrincipalPolicyBundleResponse; row: SelectedPrincipalPolicyRow }\n >();\n if (currentRow) {\n const bundle = parseBoundBundle(currentRow);\n const indexed = indexedByHash.get(currentRow.stateHash);\n if (indexed) {\n assertIndexedBundle(bundle, indexed, reference);\n }\n if (principalPolicyBundleContainsReference(bundle, reference)) {\n addCandidate(candidates, bundle, currentRow);\n } else {\n assertCurrentDoesNotConflict(bundle, reference);\n }\n }\n for (const row of retainedRows) {\n const bundle = parseBoundBundle(row);\n const indexed = indexedByHash.get(row.stateHash);\n if (indexed) {\n assertIndexedBundle(bundle, indexed, reference);\n } else if (!principalPolicyBundleContainsReference(bundle, reference)) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"stored principal policy bundle head does not match the exact reference\",\n );\n }\n addCandidate(candidates, bundle, row);\n }\n return candidates;\n}\n\nexport async function loadPrincipalPolicyBundleForReference(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n checkpoint: PrincipalPolicyCheckpoint | null,\n): Promise<PrincipalPolicyBundleResponse | null> {\n assertReferenceShape(reference);\n await ensurePrincipalPolicyTables(execSql);\n const [currentRow, indexedHeads] = await Promise.all([\n loadCurrentRow(execSql, reference),\n loadIndexedHeads(execSql, reference),\n ]);\n const indexedByHash = indexHeadsByHash(indexedHeads);\n const retainedRows = await loadRetainedRows(\n execSql,\n reference,\n currentRow,\n indexedByHash,\n );\n const candidates = collectCandidates(\n currentRow,\n retainedRows,\n indexedByHash,\n reference,\n );\n const selected = selectNewestCandidate(candidates);\n return selected\n ? applyPrincipalPolicyReferenceCheckpoint(selected, checkpoint)\n : null;\n}\n"]}
1
+ {"version":3,"file":"principalPolicyReferencePersistence.js","sourceRoot":"","sources":["principalPolicyReferencePersistence.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n KeyingVerificationError,\n type PrincipalPolicyCheckpoint,\n type ReferencedPrincipalHead,\n} from \"@tearleads/crypto\";\nimport type { PrincipalPolicyBundleResponse } from \"@tearleads/validators/response\";\nimport {\n isPrincipalPolicyBundleResponse,\n isReferencedPrincipalStateResponse,\n} from \"@tearleads/validators/response\";\nimport { and, eq, inArray } from \"drizzle-orm\";\nimport {\n principalPolicyBundleContainsReference,\n principalPolicyBundleStates,\n} from \"../principalPolicyStates\";\nimport {\n principalPolicies,\n principalPolicyBundleHistory,\n principalPolicyBundleReferences,\n} from \"../sqlite/schema\";\nimport { getClientSQLitePersistenceRuntime } from \"../sqlite/sqlitePersistenceRuntime\";\nimport type { ExecSql } from \"../sqlite/sqlSchema\";\nimport { assertSameHeadPrincipalPolicyBundle } from \"./principalPolicyBundleIntegrity\";\nimport {\n ensurePrincipalPolicyTables,\n principalPolicyBundleSelection,\n type SelectedPrincipalPolicyRow,\n} from \"./principalPolicyPersistence\";\nimport { applyPrincipalPolicyReferenceCheckpoint } from \"./principalPolicyReferenceCheckpoint\";\nimport { storedPrincipalPolicyBundleFromJson } from \"./storedPrincipalPolicyBundle\";\n\ninterface IndexedBundleHead {\n readonly bundleStateHash: string;\n readonly bundleVersion: number;\n}\n\nfunction assertUnambiguousBundleChain(\n bundle: PrincipalPolicyBundleResponse,\n): void {\n const states = principalPolicyBundleStates(bundle);\n if (states.length !== bundle.currentState.version) {\n throw new KeyingVerificationError(\n \"missing_dependency\",\n \"stored principal policy bundle chain length does not match its head\",\n );\n }\n const versions = new Map<number, string>();\n for (const [index, state] of states.entries()) {\n if (\n state.principalType !== bundle.currentState.principalType ||\n state.principalId !== bundle.currentState.principalId\n ) {\n throw new KeyingVerificationError(\n \"object_mismatch\",\n \"stored principal policy bundle chain belongs to another principal\",\n );\n }\n if (\n !Number.isInteger(state.version) ||\n state.version !== index + 1 ||\n !Number.isSafeInteger(state.keyEpoch) ||\n state.keyEpoch < 1 ||\n state.principalId.length === 0 ||\n state.stateHash.length === 0 ||\n state.keyFingerprint.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle chain has an invalid version or epoch\",\n );\n }\n if (versions.has(state.version)) {\n const previousHash = versions.get(state.version);\n throw new KeyingVerificationError(\n previousHash === state.stateHash ? \"duplicate_entry\" : \"equivocation\",\n \"stored principal policy bundle chain repeats a version\",\n );\n }\n versions.set(state.version, state.stateHash);\n }\n}\n\nfunction parseBoundBundle(\n row: SelectedPrincipalPolicyRow,\n): PrincipalPolicyBundleResponse {\n let bundle: unknown;\n try {\n bundle = storedPrincipalPolicyBundleFromJson(row);\n } catch {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle contains malformed JSON\",\n );\n }\n if (!isPrincipalPolicyBundleResponse(bundle)) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"stored principal policy bundle is invalid\",\n );\n }\n if (\n bundle.currentState.principalType !== row.principalType ||\n bundle.currentState.principalId !== row.principalId\n ) {\n throw new KeyingVerificationError(\n \"object_mismatch\",\n \"stored principal policy bundle row belongs to another principal\",\n );\n }\n if (bundle.currentState.stateHash !== row.stateHash) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"stored principal policy bundle row has a different head hash\",\n );\n }\n assertUnambiguousBundleChain(bundle);\n return bundle;\n}\n\nfunction assertIndexedBundle(\n bundle: PrincipalPolicyBundleResponse,\n indexed: IndexedBundleHead,\n reference: ReferencedPrincipalHead,\n): void {\n if (\n bundle.currentState.stateHash !== indexed.bundleStateHash ||\n bundle.currentState.version !== indexed.bundleVersion\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"principal policy reference index conflicts with its bundle head\",\n );\n }\n if (!principalPolicyBundleContainsReference(bundle, reference)) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"indexed principal policy bundle does not contain the exact reference\",\n );\n }\n}\n\nfunction addCandidate(\n candidates: Map<\n string,\n { bundle: PrincipalPolicyBundleResponse; row: SelectedPrincipalPolicyRow }\n >,\n bundle: PrincipalPolicyBundleResponse,\n row: SelectedPrincipalPolicyRow,\n): void {\n const existing = candidates.get(bundle.currentState.stateHash);\n if (existing) {\n assertSameHeadPrincipalPolicyBundle(existing.row, row);\n return;\n }\n candidates.set(bundle.currentState.stateHash, { bundle, row });\n}\n\nfunction assertCurrentDoesNotConflict(\n bundle: PrincipalPolicyBundleResponse,\n reference: ReferencedPrincipalHead,\n): void {\n if (bundle.currentState.version < reference.version) {\n return;\n }\n const stateAtReference = principalPolicyBundleStates(bundle).find(\n (state) => state.version === reference.version,\n );\n if (!stateAtReference) {\n throw new KeyingVerificationError(\n \"stale_predecessor\",\n \"current principal policy chain omits the referenced version\",\n );\n }\n if (stateAtReference.stateHash !== reference.stateHash) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"current principal policy chain conflicts with the referenced version\",\n );\n }\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"current principal policy state does not match the exact reference\",\n );\n}\n\nfunction selectNewestCandidate(\n candidates: ReadonlyMap<\n string,\n { readonly bundle: PrincipalPolicyBundleResponse }\n >,\n): PrincipalPolicyBundleResponse | null {\n let selected: PrincipalPolicyBundleResponse | null = null;\n const stateHashByVersion = new Map<number, string>();\n for (const { bundle } of candidates.values()) {\n const existingHash = stateHashByVersion.get(bundle.currentState.version);\n if (\n existingHash !== undefined &&\n existingHash !== bundle.currentState.stateHash\n ) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"stored principal policy bundles conflict at one version\",\n );\n }\n stateHashByVersion.set(\n bundle.currentState.version,\n bundle.currentState.stateHash,\n );\n if (\n !selected ||\n bundle.currentState.version > selected.currentState.version\n ) {\n selected = bundle;\n }\n }\n return selected;\n}\n\nfunction assertReferenceShape(reference: ReferencedPrincipalHead): void {\n if (!isReferencedPrincipalStateResponse(reference)) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference is malformed\",\n );\n }\n if (\n !Number.isInteger(reference.version) ||\n reference.version < 1 ||\n !Number.isSafeInteger(reference.keyEpoch) ||\n reference.keyEpoch < 1 ||\n reference.principalId.length === 0 ||\n reference.stateHash.length === 0 ||\n reference.keyFingerprint.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference is malformed\",\n );\n }\n}\n\nasync function loadCurrentRow(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n): Promise<SelectedPrincipalPolicyRow | undefined> {\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n const [row] = await db\n .select(principalPolicyBundleSelection(principalPolicies))\n .from(principalPolicies)\n .where(\n and(\n eq(principalPolicies.principalType, reference.principalType),\n eq(principalPolicies.principalId, reference.principalId),\n ),\n )\n .limit(1);\n return row;\n}\n\nasync function loadIndexedHeads(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n): Promise<IndexedBundleHead[]> {\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n return db\n .select({\n bundleStateHash: principalPolicyBundleReferences.bundleStateHash,\n bundleVersion: principalPolicyBundleReferences.bundleVersion,\n })\n .from(principalPolicyBundleReferences)\n .where(\n and(\n eq(\n principalPolicyBundleReferences.principalType,\n reference.principalType,\n ),\n eq(principalPolicyBundleReferences.principalId, reference.principalId),\n eq(principalPolicyBundleReferences.version, reference.version),\n eq(principalPolicyBundleReferences.stateHash, reference.stateHash),\n eq(principalPolicyBundleReferences.keyEpoch, reference.keyEpoch),\n eq(\n principalPolicyBundleReferences.keyFingerprint,\n reference.keyFingerprint,\n ),\n ),\n );\n}\n\nfunction indexHeadsByHash(\n heads: readonly IndexedBundleHead[],\n): Map<string, IndexedBundleHead> {\n const stateHashByVersion = new Map<number, string>();\n for (const head of heads) {\n if (\n !Number.isInteger(head.bundleVersion) ||\n head.bundleVersion < 1 ||\n head.bundleStateHash.length === 0\n ) {\n throw new KeyingVerificationError(\n \"invalid_shape\",\n \"principal policy reference index is malformed\",\n );\n }\n const indexedHash = stateHashByVersion.get(head.bundleVersion);\n if (indexedHash !== undefined && indexedHash !== head.bundleStateHash) {\n throw new KeyingVerificationError(\n \"equivocation\",\n \"principal policy reference index has conflicting bundle heads at one version\",\n );\n }\n stateHashByVersion.set(head.bundleVersion, head.bundleStateHash);\n }\n return new Map(heads.map((head) => [head.bundleStateHash, head]));\n}\n\nasync function loadRetainedRows(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n currentRow: SelectedPrincipalPolicyRow | undefined,\n indexedByHash: ReadonlyMap<string, IndexedBundleHead>,\n): Promise<SelectedPrincipalPolicyRow[]> {\n const hashes = new Set([reference.stateHash, ...indexedByHash.keys()]);\n if (currentRow) {\n hashes.delete(currentRow.stateHash);\n }\n if (hashes.size === 0) {\n return [];\n }\n // Remote reset deliberately clears mutable heads while retaining historical\n // key material, so an index target can outlive its bundle row. Such a target\n // is only a selection hint; rows that still exist remain authoritative.\n const { db } = getClientSQLitePersistenceRuntime(execSql);\n return db\n .select(principalPolicyBundleSelection(principalPolicyBundleHistory))\n .from(principalPolicyBundleHistory)\n .where(\n and(\n eq(principalPolicyBundleHistory.principalType, reference.principalType),\n eq(principalPolicyBundleHistory.principalId, reference.principalId),\n inArray(principalPolicyBundleHistory.stateHash, [...hashes]),\n ),\n );\n}\n\nfunction collectCandidates(\n currentRow: SelectedPrincipalPolicyRow | undefined,\n retainedRows: readonly SelectedPrincipalPolicyRow[],\n indexedByHash: ReadonlyMap<string, IndexedBundleHead>,\n reference: ReferencedPrincipalHead,\n) {\n const candidates = new Map<\n string,\n { bundle: PrincipalPolicyBundleResponse; row: SelectedPrincipalPolicyRow }\n >();\n if (currentRow) {\n const bundle = parseBoundBundle(currentRow);\n const indexed = indexedByHash.get(currentRow.stateHash);\n if (indexed) {\n assertIndexedBundle(bundle, indexed, reference);\n }\n if (principalPolicyBundleContainsReference(bundle, reference)) {\n addCandidate(candidates, bundle, currentRow);\n } else {\n assertCurrentDoesNotConflict(bundle, reference);\n }\n }\n for (const row of retainedRows) {\n const bundle = parseBoundBundle(row);\n const indexed = indexedByHash.get(row.stateHash);\n if (indexed) {\n assertIndexedBundle(bundle, indexed, reference);\n } else if (!principalPolicyBundleContainsReference(bundle, reference)) {\n throw new KeyingVerificationError(\n \"hash_mismatch\",\n \"stored principal policy bundle head does not match the exact reference\",\n );\n }\n addCandidate(candidates, bundle, row);\n }\n return candidates;\n}\n\nexport async function loadPrincipalPolicyBundleForReference(\n execSql: ExecSql,\n reference: ReferencedPrincipalHead,\n checkpoint: PrincipalPolicyCheckpoint | null,\n): Promise<PrincipalPolicyBundleResponse | null> {\n assertReferenceShape(reference);\n await ensurePrincipalPolicyTables(execSql);\n const [currentRow, indexedHeads] = await Promise.all([\n loadCurrentRow(execSql, reference),\n loadIndexedHeads(execSql, reference),\n ]);\n const indexedByHash = indexHeadsByHash(indexedHeads);\n const retainedRows = await loadRetainedRows(\n execSql,\n reference,\n currentRow,\n indexedByHash,\n );\n const candidates = collectCandidates(\n currentRow,\n retainedRows,\n indexedByHash,\n reference,\n );\n const selected = selectNewestCandidate(candidates);\n return selected\n ? applyPrincipalPolicyReferenceCheckpoint(selected, checkpoint)\n : null;\n}\n"]}
@@ -149,6 +149,7 @@ export async function verifySignedAccessEvent({ body, event, signerPublicKey, })
149
149
  });
150
150
  }
151
151
  export function normalizeReferencedPrincipalHead(value) {
152
+ const label = "referenced principal head";
152
153
  const record = assertExactKeys(value, [
153
154
  "keyEpoch",
154
155
  "keyFingerprint",
@@ -156,17 +157,18 @@ export function normalizeReferencedPrincipalHead(value) {
156
157
  "principalType",
157
158
  "stateHash",
158
159
  "version",
159
- ], "referenced principal head");
160
- const version = readPositiveInteger(record, "version", "referenced principal head");
161
- if (!Number.isSafeInteger(version))
162
- throwVerification("invalid_shape", "referenced principal head version must be a safe integer");
160
+ ], label);
161
+ const version = readPositiveInteger(record, "version", label);
162
+ const keyEpoch = readPositiveInteger(record, "keyEpoch", label);
163
+ if (![version, keyEpoch].every(Number.isSafeInteger))
164
+ throwVerification("invalid_shape", "referenced principal head counters must be safe integers");
163
165
  return {
164
- principalType: normalizeManagedPrincipalKind(record.principalType, "referenced principal head"),
165
- principalId: readString(record, "principalId", "referenced principal head"),
166
+ principalType: normalizeManagedPrincipalKind(record.principalType, label),
167
+ principalId: readString(record, "principalId", label),
166
168
  version,
167
- keyEpoch: readPositiveInteger(record, "keyEpoch", "referenced principal head"),
168
- stateHash: readHashString(record, "stateHash", "referenced principal head"),
169
- keyFingerprint: readHashString(record, "keyFingerprint", "referenced principal head"),
169
+ keyEpoch,
170
+ stateHash: readHashString(record, "stateHash", label),
171
+ keyFingerprint: readHashString(record, "keyFingerprint", label),
170
172
  };
171
173
  }
172
174
  export function referencedPrincipalKey(principal) {
@@ -1 +1 @@
1
- {"version":3,"file":"accessEvent.js","sourceRoot":"","sources":["accessEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport { toFingerprint } from \"../fingerprint\";\nimport { sign } from \"../signing/sign\";\nimport { verifyHistorySignature as verify } from \"../signing/verifiedHistorySignature\";\nimport {\n computeKeyingDomainHash,\n encodeDomainPayload,\n normalizeCanonicalJsonValue,\n} from \"./canonical\";\nimport {\n accessManifestCheckpointFromManifest,\n verifyAccessManifestLocalCheckpoint,\n} from \"./checkpoints\";\nimport {\n assertExactKeys,\n compareCanonicalStrings,\n expectedObjectKindForEventType,\n normalizeAccessEventType,\n normalizeAccessObjectKind,\n normalizeManagedPrincipalKind,\n normalizeUniqueSortedStrings,\n readHashString,\n readNullableHashString,\n readPositiveInteger,\n readSignedAt,\n readString,\n readStringArray,\n readVersion,\n runVerifier,\n throwVerification,\n} from \"./shared\";\nimport type {\n AccessEvent,\n AccessManifest,\n KeyingCanonicalJson,\n KeyingCanonicalPayload,\n KeyingVerificationResult,\n ReferencedPrincipalHead,\n UnsignedAccessEvent,\n VerifiedAccessEvent,\n VerifiedAccessManifest,\n VerifyAccessEventInput,\n VerifyAccessManifestInput,\n} from \"./types\";\nimport { makeVerifiedAccessEvent, makeVerifiedAccessManifest } from \"./types\";\n\nfunction normalizeUnsignedAccessEvent(value: unknown): UnsignedAccessEvent {\n const record = assertExactKeys(\n value,\n [\n \"bodyHash\",\n \"dependencyManifestHashes\",\n \"eventId\",\n \"eventType\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"signedAt\",\n \"signerDeviceId\",\n \"signerKeyFingerprint\",\n \"signerUserId\",\n \"version\",\n ],\n \"access event\",\n );\n const eventType = normalizeAccessEventType(record.eventType, \"access event\");\n const objectKind = normalizeAccessObjectKind(\n record.objectKind,\n \"access event\",\n );\n const expectedObjectKind = expectedObjectKindForEventType(eventType);\n\n if (objectKind !== expectedObjectKind) {\n throwVerification(\n \"object_mismatch\",\n `access event ${eventType} must use objectKind ${expectedObjectKind}`,\n );\n }\n\n return {\n version: readVersion(record, \"access event\"),\n eventId: readString(record, \"eventId\", \"access event\"),\n eventType,\n objectKind,\n objectId: readString(record, \"objectId\", \"access event\"),\n organizationId: readString(record, \"organizationId\", \"access event\"),\n previousManifestHash: readNullableHashString(\n record,\n \"previousManifestHash\",\n \"access event\",\n ),\n dependencyManifestHashes: normalizeUniqueSortedStrings(\n readStringArray(record, \"dependencyManifestHashes\", \"access event\"),\n \"access event dependencyManifestHashes\",\n ),\n bodyHash: readHashString(record, \"bodyHash\", \"access event\"),\n signerUserId: readString(record, \"signerUserId\", \"access event\"),\n signerDeviceId: readString(record, \"signerDeviceId\", \"access event\"),\n signerKeyFingerprint: readHashString(\n record,\n \"signerKeyFingerprint\",\n \"access event\",\n ),\n signedAt: readSignedAt(record, \"signedAt\", \"access event\"),\n };\n}\n\nfunction normalizeAccessEvent(value: unknown): AccessEvent {\n const record = assertExactKeys(\n value,\n [\n \"bodyHash\",\n \"dependencyManifestHashes\",\n \"eventId\",\n \"eventType\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"signature\",\n \"signedAt\",\n \"signerDeviceId\",\n \"signerKeyFingerprint\",\n \"signerUserId\",\n \"version\",\n ],\n \"access event\",\n );\n const unsignedEvent = normalizeUnsignedAccessEvent({\n version: record.version,\n eventId: record.eventId,\n eventType: record.eventType,\n objectKind: record.objectKind,\n objectId: record.objectId,\n organizationId: record.organizationId,\n previousManifestHash: record.previousManifestHash,\n dependencyManifestHashes: record.dependencyManifestHashes,\n bodyHash: record.bodyHash,\n signerUserId: record.signerUserId,\n signerDeviceId: record.signerDeviceId,\n signerKeyFingerprint: record.signerKeyFingerprint,\n signedAt: record.signedAt,\n });\n\n return {\n ...unsignedEvent,\n signature: readString(record, \"signature\", \"access event\"),\n };\n}\n\nfunction unsignedAccessEventPayload(\n event: UnsignedAccessEvent,\n): KeyingCanonicalPayload<UnsignedAccessEvent> {\n return normalizeUnsignedAccessEvent(event);\n}\n\nfunction accessEventSigningBytes(event: UnsignedAccessEvent): Uint8Array {\n return encodeDomainPayload(\n \"tearleads.keying.access-event-signing\",\n unsignedAccessEventPayload(event),\n );\n}\n\nfunction toUnsignedAccessEvent(event: AccessEvent): UnsignedAccessEvent {\n return {\n version: event.version,\n eventId: event.eventId,\n eventType: event.eventType,\n objectKind: event.objectKind,\n objectId: event.objectId,\n organizationId: event.organizationId,\n previousManifestHash: event.previousManifestHash,\n dependencyManifestHashes: event.dependencyManifestHashes,\n bodyHash: event.bodyHash,\n signerUserId: event.signerUserId,\n signerDeviceId: event.signerDeviceId,\n signerKeyFingerprint: event.signerKeyFingerprint,\n signedAt: event.signedAt,\n };\n}\n\nexport async function computeAccessEventBodyHash(\n body: KeyingCanonicalJson,\n): Promise<string> {\n return computeKeyingDomainHash(\"tearleads.keying.access-event-body\", body);\n}\n\nexport async function signAccessEvent(\n event: UnsignedAccessEvent,\n signingPrivateKey: Uint8Array,\n): Promise<AccessEvent> {\n const normalizedEvent = normalizeUnsignedAccessEvent(event);\n const signature = sign(\n accessEventSigningBytes(normalizedEvent),\n signingPrivateKey,\n );\n\n return {\n ...normalizedEvent,\n signature: bytesToBase64(signature),\n };\n}\n\nexport async function computeAccessEventHash(\n event: AccessEvent,\n): Promise<string> {\n const payload: KeyingCanonicalPayload<AccessEvent> =\n normalizeAccessEvent(event);\n\n return computeKeyingDomainHash(\"tearleads.keying.access-event\", payload);\n}\n\nexport async function verifySignedAccessEvent({\n body,\n event,\n signerPublicKey,\n}: VerifyAccessEventInput): Promise<\n KeyingVerificationResult<VerifiedAccessEvent>\n> {\n return runVerifier(async () => {\n const normalizedBody = normalizeCanonicalJsonValue(\n body,\n \"access event body\",\n );\n const normalizedEvent = normalizeAccessEvent(event);\n const computedBodyHash = await computeAccessEventBodyHash(normalizedBody);\n\n if (computedBodyHash !== normalizedEvent.bodyHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access event body hash does not match body\",\n );\n }\n\n const signerKeyFingerprint = await toFingerprint(signerPublicKey);\n if (signerKeyFingerprint !== normalizedEvent.signerKeyFingerprint) {\n throwVerification(\n \"signer_mismatch\",\n \"access event signer fingerprint does not match signer public key\",\n );\n }\n\n let signature: Uint8Array;\n try {\n signature = base64ToBytes(normalizedEvent.signature);\n } catch {\n throwVerification(\"signature_mismatch\", \"access event signature invalid\");\n }\n\n if (\n !verify(\n signature,\n accessEventSigningBytes(toUnsignedAccessEvent(normalizedEvent)),\n signerPublicKey,\n )\n ) {\n throwVerification(\n \"signature_mismatch\",\n \"access event signature verification failed\",\n );\n }\n\n return makeVerifiedAccessEvent({\n event: normalizedEvent,\n body: normalizedBody,\n eventHash: await computeAccessEventHash(normalizedEvent),\n });\n });\n}\n\nexport function normalizeReferencedPrincipalHead(\n value: unknown,\n): ReferencedPrincipalHead {\n const record = assertExactKeys(\n value,\n [\n \"keyEpoch\",\n \"keyFingerprint\",\n \"principalId\",\n \"principalType\",\n \"stateHash\",\n \"version\",\n ],\n \"referenced principal head\",\n );\n\n const version = readPositiveInteger(\n record,\n \"version\",\n \"referenced principal head\",\n );\n if (!Number.isSafeInteger(version))\n throwVerification(\n \"invalid_shape\",\n \"referenced principal head version must be a safe integer\",\n );\n return {\n principalType: normalizeManagedPrincipalKind(\n record.principalType,\n \"referenced principal head\",\n ),\n principalId: readString(record, \"principalId\", \"referenced principal head\"),\n version,\n keyEpoch: readPositiveInteger(\n record,\n \"keyEpoch\",\n \"referenced principal head\",\n ),\n stateHash: readHashString(record, \"stateHash\", \"referenced principal head\"),\n keyFingerprint: readHashString(\n record,\n \"keyFingerprint\",\n \"referenced principal head\",\n ),\n };\n}\n\nexport function referencedPrincipalKey(\n principal: ReferencedPrincipalHead,\n): string {\n return `${principal.principalType}:${principal.principalId}`;\n}\n\nexport function normalizeReferencedPrincipalHeads(\n values: readonly unknown[],\n): ReferencedPrincipalHead[] {\n const normalizedValues = values\n .map(normalizeReferencedPrincipalHead)\n .sort((left, right) =>\n compareCanonicalStrings(\n referencedPrincipalKey(left),\n referencedPrincipalKey(right),\n ),\n );\n\n let previousKey: string | null = null;\n for (const principalHead of normalizedValues) {\n const principalKey = referencedPrincipalKey(principalHead);\n if (previousKey === principalKey) {\n throwVerification(\n \"duplicate_entry\",\n \"access manifest referencedPrincipalHeads contains a duplicate\",\n );\n }\n previousKey = principalKey;\n }\n\n return normalizedValues;\n}\n\nexport function normalizeAccessManifest(value: unknown): AccessManifest {\n const record = assertExactKeys(\n value,\n [\n \"epoch\",\n \"eventHash\",\n \"grantRoot\",\n \"keyTargetHash\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"referencedPrincipalHeads\",\n \"structuralHash\",\n \"version\",\n ],\n \"access manifest\",\n );\n const referencedPrincipalHeads = record.referencedPrincipalHeads;\n\n if (!Array.isArray(referencedPrincipalHeads)) {\n throwVerification(\n \"invalid_shape\",\n \"access manifest.referencedPrincipalHeads must be an array\",\n );\n }\n\n return {\n version: readVersion(record, \"access manifest\"),\n objectKind: normalizeAccessObjectKind(record.objectKind, \"access manifest\"),\n objectId: readString(record, \"objectId\", \"access manifest\"),\n organizationId: readString(record, \"organizationId\", \"access manifest\"),\n epoch: readPositiveInteger(record, \"epoch\", \"access manifest\"),\n previousManifestHash: readNullableHashString(\n record,\n \"previousManifestHash\",\n \"access manifest\",\n ),\n eventHash: readHashString(record, \"eventHash\", \"access manifest\"),\n structuralHash: readHashString(record, \"structuralHash\", \"access manifest\"),\n grantRoot: readHashString(record, \"grantRoot\", \"access manifest\"),\n referencedPrincipalHeads: normalizeReferencedPrincipalHeads(\n referencedPrincipalHeads,\n ),\n keyTargetHash: readHashString(record, \"keyTargetHash\", \"access manifest\"),\n };\n}\n\nexport async function computeAccessManifestHash(\n manifest: AccessManifest,\n): Promise<string> {\n const payload: KeyingCanonicalPayload<AccessManifest> =\n normalizeAccessManifest(manifest);\n\n return computeKeyingDomainHash(\"tearleads.keying.access-manifest\", payload);\n}\n\nexport async function verifyAccessManifest({\n checkpointPredecessors,\n event,\n expectedManifestHash,\n expectedObject,\n expectedPreviousManifestHash,\n localCheckpoint,\n manifest,\n}: VerifyAccessManifestInput): Promise<\n KeyingVerificationResult<VerifiedAccessManifest>\n> {\n return runVerifier(async () => {\n const normalizedManifest = normalizeAccessManifest(manifest);\n const manifestHash = await computeAccessManifestHash(normalizedManifest);\n\n if (manifestHash !== expectedManifestHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access manifest hash does not match expected hash\",\n );\n }\n\n if (event.eventHash !== normalizedManifest.eventHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access manifest event hash does not match verified event\",\n );\n }\n\n if (\n event.event.objectKind !== normalizedManifest.objectKind ||\n event.event.objectId !== normalizedManifest.objectId ||\n event.event.organizationId !== normalizedManifest.organizationId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"access manifest object does not match verified event\",\n );\n }\n\n if (\n event.event.previousManifestHash !==\n normalizedManifest.previousManifestHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"access manifest predecessor does not match verified event\",\n );\n }\n\n if (\n expectedPreviousManifestHash !== undefined &&\n expectedPreviousManifestHash !== normalizedManifest.previousManifestHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"access manifest predecessor does not match expected predecessor\",\n );\n }\n\n if (\n expectedObject &&\n (expectedObject.objectKind !== normalizedManifest.objectKind ||\n expectedObject.objectId !== normalizedManifest.objectId)\n ) {\n throwVerification(\n \"object_mismatch\",\n \"access manifest object does not match expected object\",\n );\n }\n\n const checkpoint = accessManifestCheckpointFromManifest({\n manifest: normalizedManifest,\n manifestHash,\n });\n verifyAccessManifestLocalCheckpoint({\n current: {\n ...checkpoint,\n previousManifestHash: normalizedManifest.previousManifestHash,\n },\n localCheckpoint,\n checkpointPredecessors,\n });\n\n return makeVerifiedAccessManifest({\n manifest: normalizedManifest,\n manifestHash,\n event,\n checkpoint,\n });\n });\n}\n"]}
1
+ {"version":3,"file":"accessEvent.js","sourceRoot":"","sources":["accessEvent.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport { toFingerprint } from \"../fingerprint\";\nimport { sign } from \"../signing/sign\";\nimport { verifyHistorySignature as verify } from \"../signing/verifiedHistorySignature\";\nimport {\n computeKeyingDomainHash,\n encodeDomainPayload,\n normalizeCanonicalJsonValue,\n} from \"./canonical\";\nimport {\n accessManifestCheckpointFromManifest,\n verifyAccessManifestLocalCheckpoint,\n} from \"./checkpoints\";\nimport {\n assertExactKeys,\n compareCanonicalStrings,\n expectedObjectKindForEventType,\n normalizeAccessEventType,\n normalizeAccessObjectKind,\n normalizeManagedPrincipalKind,\n normalizeUniqueSortedStrings,\n readHashString,\n readNullableHashString,\n readPositiveInteger,\n readSignedAt,\n readString,\n readStringArray,\n readVersion,\n runVerifier,\n throwVerification,\n} from \"./shared\";\nimport type {\n AccessEvent,\n AccessManifest,\n KeyingCanonicalJson,\n KeyingCanonicalPayload,\n KeyingVerificationResult,\n ReferencedPrincipalHead,\n UnsignedAccessEvent,\n VerifiedAccessEvent,\n VerifiedAccessManifest,\n VerifyAccessEventInput,\n VerifyAccessManifestInput,\n} from \"./types\";\nimport { makeVerifiedAccessEvent, makeVerifiedAccessManifest } from \"./types\";\n\nfunction normalizeUnsignedAccessEvent(value: unknown): UnsignedAccessEvent {\n const record = assertExactKeys(\n value,\n [\n \"bodyHash\",\n \"dependencyManifestHashes\",\n \"eventId\",\n \"eventType\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"signedAt\",\n \"signerDeviceId\",\n \"signerKeyFingerprint\",\n \"signerUserId\",\n \"version\",\n ],\n \"access event\",\n );\n const eventType = normalizeAccessEventType(record.eventType, \"access event\");\n const objectKind = normalizeAccessObjectKind(\n record.objectKind,\n \"access event\",\n );\n const expectedObjectKind = expectedObjectKindForEventType(eventType);\n\n if (objectKind !== expectedObjectKind) {\n throwVerification(\n \"object_mismatch\",\n `access event ${eventType} must use objectKind ${expectedObjectKind}`,\n );\n }\n\n return {\n version: readVersion(record, \"access event\"),\n eventId: readString(record, \"eventId\", \"access event\"),\n eventType,\n objectKind,\n objectId: readString(record, \"objectId\", \"access event\"),\n organizationId: readString(record, \"organizationId\", \"access event\"),\n previousManifestHash: readNullableHashString(\n record,\n \"previousManifestHash\",\n \"access event\",\n ),\n dependencyManifestHashes: normalizeUniqueSortedStrings(\n readStringArray(record, \"dependencyManifestHashes\", \"access event\"),\n \"access event dependencyManifestHashes\",\n ),\n bodyHash: readHashString(record, \"bodyHash\", \"access event\"),\n signerUserId: readString(record, \"signerUserId\", \"access event\"),\n signerDeviceId: readString(record, \"signerDeviceId\", \"access event\"),\n signerKeyFingerprint: readHashString(\n record,\n \"signerKeyFingerprint\",\n \"access event\",\n ),\n signedAt: readSignedAt(record, \"signedAt\", \"access event\"),\n };\n}\n\nfunction normalizeAccessEvent(value: unknown): AccessEvent {\n const record = assertExactKeys(\n value,\n [\n \"bodyHash\",\n \"dependencyManifestHashes\",\n \"eventId\",\n \"eventType\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"signature\",\n \"signedAt\",\n \"signerDeviceId\",\n \"signerKeyFingerprint\",\n \"signerUserId\",\n \"version\",\n ],\n \"access event\",\n );\n const unsignedEvent = normalizeUnsignedAccessEvent({\n version: record.version,\n eventId: record.eventId,\n eventType: record.eventType,\n objectKind: record.objectKind,\n objectId: record.objectId,\n organizationId: record.organizationId,\n previousManifestHash: record.previousManifestHash,\n dependencyManifestHashes: record.dependencyManifestHashes,\n bodyHash: record.bodyHash,\n signerUserId: record.signerUserId,\n signerDeviceId: record.signerDeviceId,\n signerKeyFingerprint: record.signerKeyFingerprint,\n signedAt: record.signedAt,\n });\n\n return {\n ...unsignedEvent,\n signature: readString(record, \"signature\", \"access event\"),\n };\n}\n\nfunction unsignedAccessEventPayload(\n event: UnsignedAccessEvent,\n): KeyingCanonicalPayload<UnsignedAccessEvent> {\n return normalizeUnsignedAccessEvent(event);\n}\n\nfunction accessEventSigningBytes(event: UnsignedAccessEvent): Uint8Array {\n return encodeDomainPayload(\n \"tearleads.keying.access-event-signing\",\n unsignedAccessEventPayload(event),\n );\n}\n\nfunction toUnsignedAccessEvent(event: AccessEvent): UnsignedAccessEvent {\n return {\n version: event.version,\n eventId: event.eventId,\n eventType: event.eventType,\n objectKind: event.objectKind,\n objectId: event.objectId,\n organizationId: event.organizationId,\n previousManifestHash: event.previousManifestHash,\n dependencyManifestHashes: event.dependencyManifestHashes,\n bodyHash: event.bodyHash,\n signerUserId: event.signerUserId,\n signerDeviceId: event.signerDeviceId,\n signerKeyFingerprint: event.signerKeyFingerprint,\n signedAt: event.signedAt,\n };\n}\n\nexport async function computeAccessEventBodyHash(\n body: KeyingCanonicalJson,\n): Promise<string> {\n return computeKeyingDomainHash(\"tearleads.keying.access-event-body\", body);\n}\n\nexport async function signAccessEvent(\n event: UnsignedAccessEvent,\n signingPrivateKey: Uint8Array,\n): Promise<AccessEvent> {\n const normalizedEvent = normalizeUnsignedAccessEvent(event);\n const signature = sign(\n accessEventSigningBytes(normalizedEvent),\n signingPrivateKey,\n );\n\n return {\n ...normalizedEvent,\n signature: bytesToBase64(signature),\n };\n}\n\nexport async function computeAccessEventHash(\n event: AccessEvent,\n): Promise<string> {\n const payload: KeyingCanonicalPayload<AccessEvent> =\n normalizeAccessEvent(event);\n\n return computeKeyingDomainHash(\"tearleads.keying.access-event\", payload);\n}\n\nexport async function verifySignedAccessEvent({\n body,\n event,\n signerPublicKey,\n}: VerifyAccessEventInput): Promise<\n KeyingVerificationResult<VerifiedAccessEvent>\n> {\n return runVerifier(async () => {\n const normalizedBody = normalizeCanonicalJsonValue(\n body,\n \"access event body\",\n );\n const normalizedEvent = normalizeAccessEvent(event);\n const computedBodyHash = await computeAccessEventBodyHash(normalizedBody);\n\n if (computedBodyHash !== normalizedEvent.bodyHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access event body hash does not match body\",\n );\n }\n\n const signerKeyFingerprint = await toFingerprint(signerPublicKey);\n if (signerKeyFingerprint !== normalizedEvent.signerKeyFingerprint) {\n throwVerification(\n \"signer_mismatch\",\n \"access event signer fingerprint does not match signer public key\",\n );\n }\n\n let signature: Uint8Array;\n try {\n signature = base64ToBytes(normalizedEvent.signature);\n } catch {\n throwVerification(\"signature_mismatch\", \"access event signature invalid\");\n }\n\n if (\n !verify(\n signature,\n accessEventSigningBytes(toUnsignedAccessEvent(normalizedEvent)),\n signerPublicKey,\n )\n ) {\n throwVerification(\n \"signature_mismatch\",\n \"access event signature verification failed\",\n );\n }\n\n return makeVerifiedAccessEvent({\n event: normalizedEvent,\n body: normalizedBody,\n eventHash: await computeAccessEventHash(normalizedEvent),\n });\n });\n}\n\nexport function normalizeReferencedPrincipalHead(\n value: unknown,\n): ReferencedPrincipalHead {\n const label = \"referenced principal head\";\n const record = assertExactKeys(\n value,\n [\n \"keyEpoch\",\n \"keyFingerprint\",\n \"principalId\",\n \"principalType\",\n \"stateHash\",\n \"version\",\n ],\n label,\n );\n\n const version = readPositiveInteger(record, \"version\", label);\n const keyEpoch = readPositiveInteger(record, \"keyEpoch\", label);\n if (![version, keyEpoch].every(Number.isSafeInteger))\n throwVerification(\n \"invalid_shape\",\n \"referenced principal head counters must be safe integers\",\n );\n return {\n principalType: normalizeManagedPrincipalKind(record.principalType, label),\n principalId: readString(record, \"principalId\", label),\n version,\n keyEpoch,\n stateHash: readHashString(record, \"stateHash\", label),\n keyFingerprint: readHashString(record, \"keyFingerprint\", label),\n };\n}\n\nexport function referencedPrincipalKey(\n principal: ReferencedPrincipalHead,\n): string {\n return `${principal.principalType}:${principal.principalId}`;\n}\n\nexport function normalizeReferencedPrincipalHeads(\n values: readonly unknown[],\n): ReferencedPrincipalHead[] {\n const normalizedValues = values\n .map(normalizeReferencedPrincipalHead)\n .sort((left, right) =>\n compareCanonicalStrings(\n referencedPrincipalKey(left),\n referencedPrincipalKey(right),\n ),\n );\n\n let previousKey: string | null = null;\n for (const principalHead of normalizedValues) {\n const principalKey = referencedPrincipalKey(principalHead);\n if (previousKey === principalKey) {\n throwVerification(\n \"duplicate_entry\",\n \"access manifest referencedPrincipalHeads contains a duplicate\",\n );\n }\n previousKey = principalKey;\n }\n\n return normalizedValues;\n}\n\nexport function normalizeAccessManifest(value: unknown): AccessManifest {\n const record = assertExactKeys(\n value,\n [\n \"epoch\",\n \"eventHash\",\n \"grantRoot\",\n \"keyTargetHash\",\n \"objectId\",\n \"objectKind\",\n \"organizationId\",\n \"previousManifestHash\",\n \"referencedPrincipalHeads\",\n \"structuralHash\",\n \"version\",\n ],\n \"access manifest\",\n );\n const referencedPrincipalHeads = record.referencedPrincipalHeads;\n\n if (!Array.isArray(referencedPrincipalHeads)) {\n throwVerification(\n \"invalid_shape\",\n \"access manifest.referencedPrincipalHeads must be an array\",\n );\n }\n\n return {\n version: readVersion(record, \"access manifest\"),\n objectKind: normalizeAccessObjectKind(record.objectKind, \"access manifest\"),\n objectId: readString(record, \"objectId\", \"access manifest\"),\n organizationId: readString(record, \"organizationId\", \"access manifest\"),\n epoch: readPositiveInteger(record, \"epoch\", \"access manifest\"),\n previousManifestHash: readNullableHashString(\n record,\n \"previousManifestHash\",\n \"access manifest\",\n ),\n eventHash: readHashString(record, \"eventHash\", \"access manifest\"),\n structuralHash: readHashString(record, \"structuralHash\", \"access manifest\"),\n grantRoot: readHashString(record, \"grantRoot\", \"access manifest\"),\n referencedPrincipalHeads: normalizeReferencedPrincipalHeads(\n referencedPrincipalHeads,\n ),\n keyTargetHash: readHashString(record, \"keyTargetHash\", \"access manifest\"),\n };\n}\n\nexport async function computeAccessManifestHash(\n manifest: AccessManifest,\n): Promise<string> {\n const payload: KeyingCanonicalPayload<AccessManifest> =\n normalizeAccessManifest(manifest);\n\n return computeKeyingDomainHash(\"tearleads.keying.access-manifest\", payload);\n}\n\nexport async function verifyAccessManifest({\n checkpointPredecessors,\n event,\n expectedManifestHash,\n expectedObject,\n expectedPreviousManifestHash,\n localCheckpoint,\n manifest,\n}: VerifyAccessManifestInput): Promise<\n KeyingVerificationResult<VerifiedAccessManifest>\n> {\n return runVerifier(async () => {\n const normalizedManifest = normalizeAccessManifest(manifest);\n const manifestHash = await computeAccessManifestHash(normalizedManifest);\n\n if (manifestHash !== expectedManifestHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access manifest hash does not match expected hash\",\n );\n }\n\n if (event.eventHash !== normalizedManifest.eventHash) {\n throwVerification(\n \"hash_mismatch\",\n \"access manifest event hash does not match verified event\",\n );\n }\n\n if (\n event.event.objectKind !== normalizedManifest.objectKind ||\n event.event.objectId !== normalizedManifest.objectId ||\n event.event.organizationId !== normalizedManifest.organizationId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"access manifest object does not match verified event\",\n );\n }\n\n if (\n event.event.previousManifestHash !==\n normalizedManifest.previousManifestHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"access manifest predecessor does not match verified event\",\n );\n }\n\n if (\n expectedPreviousManifestHash !== undefined &&\n expectedPreviousManifestHash !== normalizedManifest.previousManifestHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"access manifest predecessor does not match expected predecessor\",\n );\n }\n\n if (\n expectedObject &&\n (expectedObject.objectKind !== normalizedManifest.objectKind ||\n expectedObject.objectId !== normalizedManifest.objectId)\n ) {\n throwVerification(\n \"object_mismatch\",\n \"access manifest object does not match expected object\",\n );\n }\n\n const checkpoint = accessManifestCheckpointFromManifest({\n manifest: normalizedManifest,\n manifestHash,\n });\n verifyAccessManifestLocalCheckpoint({\n current: {\n ...checkpoint,\n previousManifestHash: normalizedManifest.previousManifestHash,\n },\n localCheckpoint,\n checkpointPredecessors,\n });\n\n return makeVerifiedAccessManifest({\n manifest: normalizedManifest,\n manifestHash,\n event,\n checkpoint,\n });\n });\n}\n"]}
@@ -38,6 +38,9 @@ export function verifyPrincipalPolicyChainEntryIdentity(input) {
38
38
  }
39
39
  export function verifyInitialPrincipalPolicyChainEntry(input) {
40
40
  const { normalizedEntry } = input;
41
+ if (normalizedEntry.state.keyEpoch !== 1) {
42
+ throwVerification("key_epoch_reuse", "initial principal policy key epoch must be 1");
43
+ }
41
44
  if (normalizedEntry.state.prevStateHash !== null) {
42
45
  throwVerification("stale_predecessor", "initial principal policy chain entry has a previous state hash");
43
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyChainEntry.js","sourceRoot":"","sources":["principalPolicyChainEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computePrincipalStateHash,\n normalizePrincipalProjectionMembers,\n type PrincipalProjectionMember,\n} from \"../principalState\";\nimport {\n verifyPrincipalPolicyGrantCommitments,\n verifyPrincipalPolicyProjectionCommitments,\n} from \"./principalPolicyCommitments\";\nimport {\n externalAuthorityIncludesAdminSigner,\n type PrincipalPolicyExternalAuthorityVerifier,\n} from \"./principalPolicyExternalAuthority\";\nimport {\n getPrincipalPolicyTransitionMismatch,\n throwPrincipalPolicyTransitionError,\n} from \"./principalPolicyTransition\";\nimport { throwVerification } from \"./shared\";\nimport type {\n NormalizedPrincipalPolicyStateChainEntry,\n PrincipalPolicySignedState,\n PrincipalPolicyStateChainEntry,\n} from \"./types\";\n\nfunction projectionIncludesAdminUser(\n projection: readonly PrincipalProjectionMember[],\n userId: string,\n): boolean {\n return projection.some(\n (member) => member.userId === userId && member.role === \"admin\",\n );\n}\n\nexport async function normalizePrincipalPolicyStateChainEntry(\n entry: PrincipalPolicyStateChainEntry,\n): Promise<NormalizedPrincipalPolicyStateChainEntry> {\n const projection = normalizePrincipalProjectionMembers(entry.projection);\n const computedStateHash = await computePrincipalStateHash(entry.state);\n\n if (computedStateHash !== entry.state.stateHash) {\n throwVerification(\n \"hash_mismatch\",\n \"principal policy state hash does not match signed state\",\n );\n }\n\n await verifyPrincipalPolicyProjectionCommitments({\n projection,\n state: entry.state,\n });\n const grants = await verifyPrincipalPolicyGrantCommitments({\n grants: entry.grants,\n state: entry.state,\n });\n\n return {\n state: entry.state,\n projection,\n grants,\n };\n}\n\nexport function verifyPrincipalPolicyChainEntryIdentity(input: {\n readonly currentState: Pick<\n PrincipalPolicySignedState,\n \"principalId\" | \"principalType\"\n >;\n readonly expectedVersion: number;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.principalType !==\n input.currentState.principalType ||\n input.normalizedEntry.state.principalId !== input.currentState.principalId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"principal policy chain entry principal does not match current state\",\n );\n }\n\n if (input.normalizedEntry.state.version !== input.expectedVersion) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry version is not contiguous\",\n );\n }\n}\n\nexport function verifyInitialPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n const { normalizedEntry } = input;\n\n if (normalizedEntry.state.prevStateHash !== null) {\n throwVerification(\n \"stale_predecessor\",\n \"initial principal policy chain entry has a previous state hash\",\n );\n }\n\n if (\n projectionIncludesAdminUser(\n normalizedEntry.projection,\n normalizedEntry.state.signerUserId,\n )\n ) {\n if (normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n return;\n }\n\n if (\n normalizedEntry.projection.length === 0 &&\n externalAuthorityIncludesAdminSigner({\n entry: normalizedEntry,\n verifier: input.authorityVerifier,\n })\n ) {\n return;\n }\n\n throwVerification(\n \"unauthorized\",\n \"initial principal policy state signer is not an admin\",\n );\n}\n\nexport function verifySuccessorPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n readonly previousEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.prevStateHash !==\n input.previousEntry.state.stateHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry previous hash mismatch\",\n );\n }\n\n const isDirectAdmin = projectionIncludesAdminUser(\n input.previousEntry.projection,\n input.normalizedEntry.state.signerUserId,\n );\n const isExternalAdmin = externalAuthorityIncludesAdminSigner({\n entry: input.normalizedEntry,\n verifier: input.authorityVerifier,\n });\n if (!isDirectAdmin && !isExternalAdmin) {\n throwVerification(\n \"unauthorized\",\n \"principal policy state signer is not an admin in previous projection\",\n );\n }\n if (isDirectAdmin && input.normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n\n const transitionMismatch = getPrincipalPolicyTransitionMismatch({\n current: input.normalizedEntry,\n previous: input.previousEntry,\n });\n\n if (transitionMismatch) {\n throwPrincipalPolicyTransitionError(transitionMismatch);\n }\n}\n"]}
1
+ {"version":3,"file":"principalPolicyChainEntry.js","sourceRoot":"","sources":["principalPolicyChainEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computePrincipalStateHash,\n normalizePrincipalProjectionMembers,\n type PrincipalProjectionMember,\n} from \"../principalState\";\nimport {\n verifyPrincipalPolicyGrantCommitments,\n verifyPrincipalPolicyProjectionCommitments,\n} from \"./principalPolicyCommitments\";\nimport {\n externalAuthorityIncludesAdminSigner,\n type PrincipalPolicyExternalAuthorityVerifier,\n} from \"./principalPolicyExternalAuthority\";\nimport {\n getPrincipalPolicyTransitionMismatch,\n throwPrincipalPolicyTransitionError,\n} from \"./principalPolicyTransition\";\nimport { throwVerification } from \"./shared\";\nimport type {\n NormalizedPrincipalPolicyStateChainEntry,\n PrincipalPolicySignedState,\n PrincipalPolicyStateChainEntry,\n} from \"./types\";\n\nfunction projectionIncludesAdminUser(\n projection: readonly PrincipalProjectionMember[],\n userId: string,\n): boolean {\n return projection.some(\n (member) => member.userId === userId && member.role === \"admin\",\n );\n}\n\nexport async function normalizePrincipalPolicyStateChainEntry(\n entry: PrincipalPolicyStateChainEntry,\n): Promise<NormalizedPrincipalPolicyStateChainEntry> {\n const projection = normalizePrincipalProjectionMembers(entry.projection);\n const computedStateHash = await computePrincipalStateHash(entry.state);\n\n if (computedStateHash !== entry.state.stateHash) {\n throwVerification(\n \"hash_mismatch\",\n \"principal policy state hash does not match signed state\",\n );\n }\n\n await verifyPrincipalPolicyProjectionCommitments({\n projection,\n state: entry.state,\n });\n const grants = await verifyPrincipalPolicyGrantCommitments({\n grants: entry.grants,\n state: entry.state,\n });\n\n return {\n state: entry.state,\n projection,\n grants,\n };\n}\n\nexport function verifyPrincipalPolicyChainEntryIdentity(input: {\n readonly currentState: Pick<\n PrincipalPolicySignedState,\n \"principalId\" | \"principalType\"\n >;\n readonly expectedVersion: number;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.principalType !==\n input.currentState.principalType ||\n input.normalizedEntry.state.principalId !== input.currentState.principalId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"principal policy chain entry principal does not match current state\",\n );\n }\n\n if (input.normalizedEntry.state.version !== input.expectedVersion) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry version is not contiguous\",\n );\n }\n}\n\nexport function verifyInitialPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n const { normalizedEntry } = input;\n\n if (normalizedEntry.state.keyEpoch !== 1) {\n throwVerification(\n \"key_epoch_reuse\",\n \"initial principal policy key epoch must be 1\",\n );\n }\n\n if (normalizedEntry.state.prevStateHash !== null) {\n throwVerification(\n \"stale_predecessor\",\n \"initial principal policy chain entry has a previous state hash\",\n );\n }\n\n if (\n projectionIncludesAdminUser(\n normalizedEntry.projection,\n normalizedEntry.state.signerUserId,\n )\n ) {\n if (normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n return;\n }\n\n if (\n normalizedEntry.projection.length === 0 &&\n externalAuthorityIncludesAdminSigner({\n entry: normalizedEntry,\n verifier: input.authorityVerifier,\n })\n ) {\n return;\n }\n\n throwVerification(\n \"unauthorized\",\n \"initial principal policy state signer is not an admin\",\n );\n}\n\nexport function verifySuccessorPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n readonly previousEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.prevStateHash !==\n input.previousEntry.state.stateHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry previous hash mismatch\",\n );\n }\n\n const isDirectAdmin = projectionIncludesAdminUser(\n input.previousEntry.projection,\n input.normalizedEntry.state.signerUserId,\n );\n const isExternalAdmin = externalAuthorityIncludesAdminSigner({\n entry: input.normalizedEntry,\n verifier: input.authorityVerifier,\n });\n if (!isDirectAdmin && !isExternalAdmin) {\n throwVerification(\n \"unauthorized\",\n \"principal policy state signer is not an admin in previous projection\",\n );\n }\n if (isDirectAdmin && input.normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n\n const transitionMismatch = getPrincipalPolicyTransitionMismatch({\n current: input.normalizedEntry,\n previous: input.previousEntry,\n });\n\n if (transitionMismatch) {\n throwPrincipalPolicyTransitionError(transitionMismatch);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { PrincipalContainerGrant, PrincipalProjectionMember, SignedPrincipalState } from "../principalState.js";
2
2
  import type { PrincipalPolicySignedState } from "./types.js";
3
- export type PrincipalPolicyTransitionMismatchCode = "epoch_advance_without_key_material" | "grant_removal_without_key_rotation" | "key_change_without_epoch" | "key_epoch_decrease" | "previous_hash_mismatch" | "principal_mismatch" | "shrink_without_key_rotation" | "version_not_contiguous";
3
+ export type PrincipalPolicyTransitionMismatchCode = "epoch_advance_without_key_material" | "grant_removal_without_key_rotation" | "key_change_without_epoch" | "key_epoch_decrease" | "key_epoch_jump" | "previous_hash_mismatch" | "principal_mismatch" | "shrink_without_key_rotation" | "version_not_contiguous";
4
4
  export interface PrincipalPolicyTransitionMismatch {
5
5
  readonly code: PrincipalPolicyTransitionMismatchCode;
6
6
  readonly message: string;
@@ -18,4 +18,5 @@ export declare function getPrincipalPolicyTransitionMismatch(input: {
18
18
  };
19
19
  }): PrincipalPolicyTransitionMismatch | null;
20
20
  export declare function getPrincipalPolicyTransitionMismatchReason(input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0]): string | null;
21
+ /** key_epoch_reuse classifies all epoch/key-material continuity violations. */
21
22
  export declare function throwPrincipalPolicyTransitionError(mismatch: PrincipalPolicyTransitionMismatch): never;
@@ -53,6 +53,9 @@ export function getPrincipalPolicyTransitionMismatch(input) {
53
53
  if (current.state.keyEpoch < previous.state.keyEpoch) {
54
54
  return principalPolicyTransitionMismatch("key_epoch_decrease", "Principal policy key epoch cannot decrease");
55
55
  }
56
+ if (current.state.keyEpoch > previous.state.keyEpoch + 1) {
57
+ return principalPolicyTransitionMismatch("key_epoch_jump", "Principal policy key epoch must advance by exactly one");
58
+ }
56
59
  const previousProjection = normalizePrincipalProjectionMembers(previous.projection);
57
60
  const currentProjection = normalizePrincipalProjectionMembers(current.projection);
58
61
  const keyMaterialChanged = principalPolicyKeyMaterialChanged({
@@ -85,12 +88,14 @@ export function getPrincipalPolicyTransitionMismatch(input) {
85
88
  export function getPrincipalPolicyTransitionMismatchReason(input) {
86
89
  return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;
87
90
  }
91
+ /** key_epoch_reuse classifies all epoch/key-material continuity violations. */
88
92
  export function throwPrincipalPolicyTransitionError(mismatch) {
89
93
  switch (mismatch.code) {
90
94
  case "epoch_advance_without_key_material":
91
95
  case "grant_removal_without_key_rotation":
92
96
  case "key_change_without_epoch":
93
97
  case "key_epoch_decrease":
98
+ case "key_epoch_jump":
94
99
  case "shrink_without_key_rotation":
95
100
  return throwVerification("key_epoch_reuse", mismatch.message);
96
101
  case "previous_hash_mismatch":
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyTransition.js","sourceRoot":"","sources":["principalPolicyTransition.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PrincipalContainerGrant,\n PrincipalProjectionMember,\n SignedPrincipalState,\n} from \"../principalState\";\nimport { normalizePrincipalProjectionMembers } from \"../principalState\";\nimport { throwVerification } from \"./shared\";\nimport type { PrincipalPolicySignedState } from \"./types\";\n\nfunction principalProjectionMemberKey(\n member: PrincipalProjectionMember,\n): string {\n return member.userId;\n}\n\nfunction principalProjectionRoleRank(\n role: PrincipalProjectionMember[\"role\"],\n): number {\n return role === \"admin\" ? 2 : 1;\n}\n\nfunction hasPrincipalPolicyProjectionShrink(input: {\n currentProjection: readonly PrincipalProjectionMember[];\n previousProjection: readonly PrincipalProjectionMember[];\n}): boolean {\n const currentProjectionByMember = new Map<string, PrincipalProjectionMember>(\n input.currentProjection.map((member) => [\n principalProjectionMemberKey(member),\n member,\n ]),\n );\n\n return input.previousProjection.some((previousMember) => {\n const currentMember = currentProjectionByMember.get(\n principalProjectionMemberKey(previousMember),\n );\n\n if (!currentMember) {\n return true;\n }\n\n return (\n principalProjectionRoleRank(currentMember.role) <\n principalProjectionRoleRank(previousMember.role)\n );\n });\n}\n\n/**\n * Container KEK wraps sealed to a group's key stay stored after the group\n * loses a grant, so a member added later at the same key epoch could still\n * open them (#2365 finding 20). A grant may change its access level in place,\n * but dropping a container needs a new key, exactly like a projection shrink.\n */\nfunction hasPrincipalPolicyGrantRemoval(input: {\n currentGrants: readonly PrincipalContainerGrant[];\n previousGrants: readonly PrincipalContainerGrant[];\n}): boolean {\n const retained = new Set(\n input.currentGrants.map((grant) => grant.containerId),\n );\n return input.previousGrants.some((grant) => !retained.has(grant.containerId));\n}\n\nfunction principalPolicyKeyMaterialChanged(input: {\n currentState: SignedPrincipalState;\n previousState: SignedPrincipalState;\n}): boolean {\n return (\n input.currentState.encapsulationPublicKey !==\n input.previousState.encapsulationPublicKey ||\n input.currentState.keyFingerprint !== input.previousState.keyFingerprint\n );\n}\n\nexport type PrincipalPolicyTransitionMismatchCode =\n | \"epoch_advance_without_key_material\"\n | \"grant_removal_without_key_rotation\"\n | \"key_change_without_epoch\"\n | \"key_epoch_decrease\"\n | \"previous_hash_mismatch\"\n | \"principal_mismatch\"\n | \"shrink_without_key_rotation\"\n | \"version_not_contiguous\";\n\nexport interface PrincipalPolicyTransitionMismatch {\n readonly code: PrincipalPolicyTransitionMismatchCode;\n readonly message: string;\n}\n\nfunction principalPolicyTransitionMismatch(\n code: PrincipalPolicyTransitionMismatchCode,\n message: string,\n): PrincipalPolicyTransitionMismatch {\n return { code, message };\n}\n\nexport function getPrincipalPolicyTransitionMismatch(input: {\n readonly current: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: SignedPrincipalState;\n };\n readonly previous: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: PrincipalPolicySignedState;\n };\n}): PrincipalPolicyTransitionMismatch | null {\n const { current, previous } = input;\n\n if (\n current.state.principalType !== previous.state.principalType ||\n current.state.principalId !== previous.state.principalId\n ) {\n return principalPolicyTransitionMismatch(\n \"principal_mismatch\",\n \"Principal policy transition principal mismatch\",\n );\n }\n\n if (current.state.version !== previous.state.version + 1) {\n return principalPolicyTransitionMismatch(\n \"version_not_contiguous\",\n \"Principal policy transition version is not contiguous\",\n );\n }\n\n if (current.state.prevStateHash !== previous.state.stateHash) {\n return principalPolicyTransitionMismatch(\n \"previous_hash_mismatch\",\n \"Principal policy transition previous hash mismatch\",\n );\n }\n\n if (current.state.keyEpoch < previous.state.keyEpoch) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_decrease\",\n \"Principal policy key epoch cannot decrease\",\n );\n }\n\n const previousProjection = normalizePrincipalProjectionMembers(\n previous.projection,\n );\n const currentProjection = normalizePrincipalProjectionMembers(\n current.projection,\n );\n const keyMaterialChanged = principalPolicyKeyMaterialChanged({\n currentState: current.state,\n previousState: previous.state,\n });\n\n if (\n current.state.keyEpoch === previous.state.keyEpoch &&\n keyMaterialChanged\n ) {\n return principalPolicyTransitionMismatch(\n \"key_change_without_epoch\",\n \"Principal policy key change requires a new key epoch\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch && !keyMaterialChanged) {\n return principalPolicyTransitionMismatch(\n \"epoch_advance_without_key_material\",\n \"Principal policy key epoch advance requires new key material\",\n );\n }\n\n if (\n hasPrincipalPolicyProjectionShrink({\n currentProjection,\n previousProjection,\n }) &&\n (current.state.keyEpoch <= previous.state.keyEpoch || !keyMaterialChanged)\n ) {\n return principalPolicyTransitionMismatch(\n \"shrink_without_key_rotation\",\n \"Principal policy shrink requires a new key epoch and key material\",\n );\n }\n\n if (\n hasPrincipalPolicyGrantRemoval({\n currentGrants: current.grants,\n previousGrants: previous.grants,\n }) &&\n current.state.keyEpoch <= previous.state.keyEpoch\n ) {\n return principalPolicyTransitionMismatch(\n \"grant_removal_without_key_rotation\",\n \"Principal policy grant removal requires a new key epoch\",\n );\n }\n\n return null;\n}\n\nexport function getPrincipalPolicyTransitionMismatchReason(\n input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0],\n): string | null {\n return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;\n}\n\nexport function throwPrincipalPolicyTransitionError(\n mismatch: PrincipalPolicyTransitionMismatch,\n): never {\n switch (mismatch.code) {\n case \"epoch_advance_without_key_material\":\n case \"grant_removal_without_key_rotation\":\n case \"key_change_without_epoch\":\n case \"key_epoch_decrease\":\n case \"shrink_without_key_rotation\":\n return throwVerification(\"key_epoch_reuse\", mismatch.message);\n case \"previous_hash_mismatch\":\n return throwVerification(\"stale_predecessor\", mismatch.message);\n case \"principal_mismatch\":\n case \"version_not_contiguous\":\n return throwVerification(\"invalid_shape\", mismatch.message);\n }\n}\n"]}
1
+ {"version":3,"file":"principalPolicyTransition.js","sourceRoot":"","sources":["principalPolicyTransition.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PrincipalContainerGrant,\n PrincipalProjectionMember,\n SignedPrincipalState,\n} from \"../principalState\";\nimport { normalizePrincipalProjectionMembers } from \"../principalState\";\nimport { throwVerification } from \"./shared\";\nimport type { PrincipalPolicySignedState } from \"./types\";\n\nfunction principalProjectionMemberKey(\n member: PrincipalProjectionMember,\n): string {\n return member.userId;\n}\n\nfunction principalProjectionRoleRank(\n role: PrincipalProjectionMember[\"role\"],\n): number {\n return role === \"admin\" ? 2 : 1;\n}\n\nfunction hasPrincipalPolicyProjectionShrink(input: {\n currentProjection: readonly PrincipalProjectionMember[];\n previousProjection: readonly PrincipalProjectionMember[];\n}): boolean {\n const currentProjectionByMember = new Map<string, PrincipalProjectionMember>(\n input.currentProjection.map((member) => [\n principalProjectionMemberKey(member),\n member,\n ]),\n );\n\n return input.previousProjection.some((previousMember) => {\n const currentMember = currentProjectionByMember.get(\n principalProjectionMemberKey(previousMember),\n );\n\n if (!currentMember) {\n return true;\n }\n\n return (\n principalProjectionRoleRank(currentMember.role) <\n principalProjectionRoleRank(previousMember.role)\n );\n });\n}\n\n/**\n * Container KEK wraps sealed to a group's key stay stored after the group\n * loses a grant, so a member added later at the same key epoch could still\n * open them (#2365 finding 20). A grant may change its access level in place,\n * but dropping a container needs a new key, exactly like a projection shrink.\n */\nfunction hasPrincipalPolicyGrantRemoval(input: {\n currentGrants: readonly PrincipalContainerGrant[];\n previousGrants: readonly PrincipalContainerGrant[];\n}): boolean {\n const retained = new Set(\n input.currentGrants.map((grant) => grant.containerId),\n );\n return input.previousGrants.some((grant) => !retained.has(grant.containerId));\n}\n\nfunction principalPolicyKeyMaterialChanged(input: {\n currentState: SignedPrincipalState;\n previousState: SignedPrincipalState;\n}): boolean {\n return (\n input.currentState.encapsulationPublicKey !==\n input.previousState.encapsulationPublicKey ||\n input.currentState.keyFingerprint !== input.previousState.keyFingerprint\n );\n}\n\nexport type PrincipalPolicyTransitionMismatchCode =\n | \"epoch_advance_without_key_material\"\n | \"grant_removal_without_key_rotation\"\n | \"key_change_without_epoch\"\n | \"key_epoch_decrease\"\n | \"key_epoch_jump\"\n | \"previous_hash_mismatch\"\n | \"principal_mismatch\"\n | \"shrink_without_key_rotation\"\n | \"version_not_contiguous\";\n\nexport interface PrincipalPolicyTransitionMismatch {\n readonly code: PrincipalPolicyTransitionMismatchCode;\n readonly message: string;\n}\n\nfunction principalPolicyTransitionMismatch(\n code: PrincipalPolicyTransitionMismatchCode,\n message: string,\n): PrincipalPolicyTransitionMismatch {\n return { code, message };\n}\n\nexport function getPrincipalPolicyTransitionMismatch(input: {\n readonly current: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: SignedPrincipalState;\n };\n readonly previous: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: PrincipalPolicySignedState;\n };\n}): PrincipalPolicyTransitionMismatch | null {\n const { current, previous } = input;\n\n if (\n current.state.principalType !== previous.state.principalType ||\n current.state.principalId !== previous.state.principalId\n ) {\n return principalPolicyTransitionMismatch(\n \"principal_mismatch\",\n \"Principal policy transition principal mismatch\",\n );\n }\n\n if (current.state.version !== previous.state.version + 1) {\n return principalPolicyTransitionMismatch(\n \"version_not_contiguous\",\n \"Principal policy transition version is not contiguous\",\n );\n }\n\n if (current.state.prevStateHash !== previous.state.stateHash) {\n return principalPolicyTransitionMismatch(\n \"previous_hash_mismatch\",\n \"Principal policy transition previous hash mismatch\",\n );\n }\n\n if (current.state.keyEpoch < previous.state.keyEpoch) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_decrease\",\n \"Principal policy key epoch cannot decrease\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch + 1) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_jump\",\n \"Principal policy key epoch must advance by exactly one\",\n );\n }\n\n const previousProjection = normalizePrincipalProjectionMembers(\n previous.projection,\n );\n const currentProjection = normalizePrincipalProjectionMembers(\n current.projection,\n );\n const keyMaterialChanged = principalPolicyKeyMaterialChanged({\n currentState: current.state,\n previousState: previous.state,\n });\n\n if (\n current.state.keyEpoch === previous.state.keyEpoch &&\n keyMaterialChanged\n ) {\n return principalPolicyTransitionMismatch(\n \"key_change_without_epoch\",\n \"Principal policy key change requires a new key epoch\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch && !keyMaterialChanged) {\n return principalPolicyTransitionMismatch(\n \"epoch_advance_without_key_material\",\n \"Principal policy key epoch advance requires new key material\",\n );\n }\n\n if (\n hasPrincipalPolicyProjectionShrink({\n currentProjection,\n previousProjection,\n }) &&\n (current.state.keyEpoch <= previous.state.keyEpoch || !keyMaterialChanged)\n ) {\n return principalPolicyTransitionMismatch(\n \"shrink_without_key_rotation\",\n \"Principal policy shrink requires a new key epoch and key material\",\n );\n }\n\n if (\n hasPrincipalPolicyGrantRemoval({\n currentGrants: current.grants,\n previousGrants: previous.grants,\n }) &&\n current.state.keyEpoch <= previous.state.keyEpoch\n ) {\n return principalPolicyTransitionMismatch(\n \"grant_removal_without_key_rotation\",\n \"Principal policy grant removal requires a new key epoch\",\n );\n }\n\n return null;\n}\n\nexport function getPrincipalPolicyTransitionMismatchReason(\n input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0],\n): string | null {\n return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;\n}\n\n/** key_epoch_reuse classifies all epoch/key-material continuity violations. */\nexport function throwPrincipalPolicyTransitionError(\n mismatch: PrincipalPolicyTransitionMismatch,\n): never {\n switch (mismatch.code) {\n case \"epoch_advance_without_key_material\":\n case \"grant_removal_without_key_rotation\":\n case \"key_change_without_epoch\":\n case \"key_epoch_decrease\":\n case \"key_epoch_jump\":\n case \"shrink_without_key_rotation\":\n return throwVerification(\"key_epoch_reuse\", mismatch.message);\n case \"previous_hash_mismatch\":\n return throwVerification(\"stale_predecessor\", mismatch.message);\n case \"principal_mismatch\":\n case \"version_not_contiguous\":\n return throwVerification(\"invalid_shape\", mismatch.message);\n }\n}\n"]}
@@ -10,7 +10,7 @@ import { sign } from "./signing/sign.js";
10
10
  const TEXT_ENCODER = new TextEncoder();
11
11
  const TEXT_DECODER = new TextDecoder();
12
12
  function isValidPositiveInteger(value) {
13
- return Number.isInteger(value) && value > 0;
13
+ return Number.isSafeInteger(value) && value > 0;
14
14
  }
15
15
  function isValidNonNegativeInteger(value) {
16
16
  return Number.isInteger(value) && value >= 0;
@@ -83,7 +83,7 @@ function validatePrincipalStateIdentityFields(state) {
83
83
  throw new Error("Principal state version must be a positive safe integer");
84
84
  }
85
85
  if (!isValidPositiveInteger(state.keyEpoch)) {
86
- throw new Error("Principal state key epoch must be a positive integer");
86
+ throw new Error("Principal state key epoch must be a positive safe integer");
87
87
  }
88
88
  if (state.principalId.length === 0) {
89
89
  throw new Error("Principal state principalId cannot be empty");
@@ -1 +1 @@
1
- {"version":3,"file":"principalState.js","sourceRoot":"","sources":["principalState.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport {\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"@tearleads/validators/util\";\nimport { ML_KEM1024_PUBLIC_KEY_BYTES } from \"./encapsulation/generateKeyPair\";\nimport { toFingerprint } from \"./fingerprint\";\nimport { computePrincipalContainerGrantRoot } from \"./principalContainerGrants\";\nimport { computePrincipalMemberEnvelopesRoot } from \"./principalMemberEnvelopes\";\nimport { throwPrincipalPolicyValidationError } from \"./principalPolicyValidationError\";\nimport {\n comparePrincipalProjectionMembers,\n comparePrincipalStateMembers,\n hasDuplicateNormalizedPrincipalProjectionMembers,\n hasDuplicateNormalizedPrincipalStateMembers,\n} from \"./principalStateMembers\";\nimport type {\n ManagedRecipientPrincipalType,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMembershipMode,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\nimport { sign } from \"./signing/sign\";\n\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport type {\n ManagedRecipientPrincipalType,\n PrincipalContainerGrant,\n PrincipalContainerGrantAccessLevel,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMemberEnvelope,\n PrincipalStateMembershipMode,\n PrincipalStatePayloadCipherSuite,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\n\nfunction isValidPositiveInteger(value: number): boolean {\n return Number.isInteger(value) && value > 0;\n}\n\nfunction isValidNonNegativeInteger(value: number): boolean {\n return Number.isInteger(value) && value >= 0;\n}\n\nfunction encodeNormalizedPrincipalStateMembers(\n normalizedMembers: ReadonlyArray<PrincipalStateMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n })),\n ),\n );\n}\n\nfunction encodeNormalizedPrincipalProjectionMembers(\n normalizedMembers: ReadonlyArray<PrincipalProjectionMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n role: member.role,\n })),\n ),\n );\n}\n\nexport function encodeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify({\n domain: \"tearleads.principal-state\",\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n }),\n );\n}\n\nexport function toUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): UnsignedPrincipalState {\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nfunction isMembershipMode(\n value: string,\n): value is PrincipalStateMembershipMode {\n return value === \"projection\";\n}\n\nfunction validatePrincipalStateIdentityFields(\n state: UnsignedPrincipalState,\n): void {\n // Versions are counters, not a lifetime history budget. Keep every value\n // exact across JSON, JavaScript arithmetic, and the database number mapping.\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new Error(\"Principal state version must be a positive safe integer\");\n }\n\n if (!isValidPositiveInteger(state.keyEpoch)) {\n throw new Error(\"Principal state key epoch must be a positive integer\");\n }\n\n if (state.principalId.length === 0) {\n throw new Error(\"Principal state principalId cannot be empty\");\n }\n\n if (state.encapsulationPublicKey.length === 0) {\n throw new Error(\"Principal state encapsulationPublicKey cannot be empty\");\n }\n\n if (state.keyFingerprint.length === 0) {\n throw new Error(\"Principal state keyFingerprint cannot be empty\");\n }\n\n if (state.signerUserId.length === 0) {\n throw new Error(\"Principal state signerUserId cannot be empty\");\n }\n\n if (state.signerUserKeyFingerprint.length === 0) {\n throw new Error(\"Principal state signerUserKeyFingerprint cannot be empty\");\n }\n\n if (!isCanonicalSignedAt(state.signedAt)) {\n throw new Error(`Principal state signedAt must be ${SIGNED_AT_CONTRACT}`);\n }\n}\n\nfunction resolveMembershipMode(\n membershipMode: string | undefined,\n): PrincipalStateMembershipMode {\n if (!membershipMode || !isMembershipMode(membershipMode)) {\n throw new Error(\"Principal state membershipMode is unsupported\");\n }\n return membershipMode;\n}\n\nfunction requireNonEmptyHeaderString(\n value: string | undefined,\n message: string,\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(message);\n }\n return value;\n}\n\nfunction resolveMemberCount(state: UnsignedPrincipalState): number {\n if (\n typeof state.memberCount !== \"number\" ||\n !isValidNonNegativeInteger(state.memberCount)\n ) {\n throw new Error(\n \"Principal state memberCount must be a non-negative integer\",\n );\n }\n\n return state.memberCount;\n}\n\nfunction normalizeExternalAuthority(\n authority: PrincipalStateExternalAuthority | null,\n): PrincipalStateExternalAuthority | null {\n if (authority === null) {\n return null;\n }\n\n if (\n authority.principalType !== \"group\" ||\n authority.principalId.length === 0 ||\n !Number.isSafeInteger(authority.version) ||\n authority.version < 1 ||\n !isValidPositiveInteger(authority.keyEpoch) ||\n authority.stateHash.length === 0 ||\n authority.keyFingerprint.length === 0\n ) {\n throw new Error(\"Principal state externalAuthority is invalid\");\n }\n\n return {\n principalType: \"group\",\n principalId: authority.principalId,\n version: authority.version,\n keyEpoch: authority.keyEpoch,\n stateHash: authority.stateHash,\n keyFingerprint: authority.keyFingerprint,\n };\n}\n\nasync function validatePrincipalEncapsulationKey(\n state: UnsignedPrincipalState,\n): Promise<void> {\n let publicKey: Uint8Array;\n try {\n publicKey = base64ToBytes(state.encapsulationPublicKey);\n } catch {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (bytesToBase64(publicKey) !== state.encapsulationPublicKey) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (publicKey.length !== ML_KEM1024_PUBLIC_KEY_BYTES) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n `Principal state encapsulationPublicKey must contain exactly ${ML_KEM1024_PUBLIC_KEY_BYTES} bytes`,\n );\n }\n\n const publicKeyFingerprint = await toFingerprint(publicKey);\n if (publicKeyFingerprint !== state.keyFingerprint) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state keyFingerprint does not match encapsulationPublicKey\",\n );\n }\n}\n\nexport async function normalizeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<UnsignedPrincipalState> {\n validatePrincipalStateIdentityFields(state);\n\n const membershipMode = resolveMembershipMode(state.membershipMode);\n const resolvedMembershipRoot = requireNonEmptyHeaderString(\n state.membershipRoot,\n \"Principal state membershipRoot is required\",\n );\n const resolvedProjectionRoot = requireNonEmptyHeaderString(\n state.projectionRoot,\n \"Principal state projectionRoot is required\",\n );\n const resolvedGrantRoot = requireNonEmptyHeaderString(\n state.grantRoot,\n \"Principal state grantRoot is required\",\n );\n const resolvedMemberEnvelopesRoot = requireNonEmptyHeaderString(\n state.memberEnvelopesRoot,\n \"Principal state memberEnvelopesRoot is required\",\n );\n const resolvedPayloadCiphertextHash = requireNonEmptyHeaderString(\n state.payloadCiphertextHash,\n \"Principal state payloadCiphertextHash is required\",\n );\n const memberCount = resolveMemberCount(state);\n if (!isValidNonNegativeInteger(state.grantCount)) {\n throw new Error(\n \"Principal state grantCount must be a non-negative integer\",\n );\n }\n\n await validatePrincipalEncapsulationKey(state);\n\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode,\n membershipRoot: resolvedMembershipRoot,\n memberEnvelopesRoot: resolvedMemberEnvelopesRoot,\n projectionRoot: resolvedProjectionRoot,\n grantRoot: resolvedGrantRoot,\n payloadCiphertextHash: resolvedPayloadCiphertextHash,\n memberCount,\n grantCount: state.grantCount,\n externalAuthority: normalizeExternalAuthority(state.externalAuthority),\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nexport function isManagedRecipientPrincipalType(\n value: string,\n): value is ManagedRecipientPrincipalType {\n return value === \"group\" || value === \"organization\";\n}\n\nexport function isPrincipalProjectionRole(\n value: string,\n): value is PrincipalProjectionRole {\n return value === \"member\" || value === \"admin\";\n}\n\nexport function normalizePrincipalStateMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalStateMember[] {\n return members\n .map((member) => ({ userId: member.userId }))\n .sort(comparePrincipalStateMembers);\n}\n\nexport function derivePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalProjectionMember[] {\n return normalizePrincipalStateMembers(members).map((member) => ({\n userId: member.userId,\n role: \"member\",\n }));\n}\n\nexport function normalizePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): PrincipalProjectionMember[] {\n return members\n .map((member) => ({ userId: member.userId, role: member.role }))\n .sort(comparePrincipalProjectionMembers);\n}\n\nexport async function computePrincipalMembershipRoot(\n members: ReadonlyArray<PrincipalStateMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalStateMembers(members);\n\n if (hasDuplicateNormalizedPrincipalStateMembers(normalizedMembers)) {\n throw new Error(\"Principal state cannot contain duplicate members\");\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalStateMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalProjectionRoot(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalProjectionMembers(members);\n\n if (hasDuplicateNormalizedPrincipalProjectionMembers(normalizedMembers)) {\n throw new Error(\n \"Principal state projection cannot contain duplicate members\",\n );\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalProjectionMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalStatePayloadCiphertextHash(\n ciphertext: string,\n): Promise<string> {\n return toFingerprint(TEXT_ENCODER.encode(ciphertext));\n}\n\nexport async function buildPrincipalStateSigningInput(\n input: PrincipalStateHeaderInput,\n): Promise<PrincipalStateSigningInput> {\n return {\n principalType: input.principalType,\n principalId: input.principalId,\n version: input.version,\n prevStateHash: input.prevStateHash,\n keyEpoch: input.keyEpoch,\n encapsulationPublicKey: input.encapsulationPublicKey,\n keyFingerprint: input.keyFingerprint,\n membershipMode: \"projection\",\n membershipRoot: await computePrincipalMembershipRoot(input.members),\n memberEnvelopesRoot: await computePrincipalMemberEnvelopesRoot(\n input.memberEnvelopes,\n ),\n projectionRoot: await computePrincipalProjectionRoot(input.projection),\n grantRoot: await computePrincipalContainerGrantRoot(input.grants),\n payloadCiphertextHash: await computePrincipalStatePayloadCiphertextHash(\n input.payloadCiphertext,\n ),\n memberCount: input.projection.length,\n grantCount: input.grants.length,\n externalAuthority: input.externalAuthority,\n signedAt: input.signedAt,\n signerUserId: input.signerUserId,\n signerUserKeyFingerprint: input.signerUserKeyFingerprint,\n };\n}\n\nexport async function serializeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return TEXT_DECODER.decode(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function computePrincipalStateHash(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return toFingerprint(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function signPrincipalState(\n state: PrincipalStateSigningInput,\n secretKey: Uint8Array,\n): Promise<SignedPrincipalState> {\n const normalizedState = await normalizeUnsignedPrincipalState(\n toUnsignedPrincipalState(state),\n );\n const signature = sign(\n encodeUnsignedPrincipalState(normalizedState),\n secretKey,\n );\n\n return {\n ...normalizedState,\n signature: bytesToBase64(signature),\n };\n}\n"]}
1
+ {"version":3,"file":"principalState.js","sourceRoot":"","sources":["principalState.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport {\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"@tearleads/validators/util\";\nimport { ML_KEM1024_PUBLIC_KEY_BYTES } from \"./encapsulation/generateKeyPair\";\nimport { toFingerprint } from \"./fingerprint\";\nimport { computePrincipalContainerGrantRoot } from \"./principalContainerGrants\";\nimport { computePrincipalMemberEnvelopesRoot } from \"./principalMemberEnvelopes\";\nimport { throwPrincipalPolicyValidationError } from \"./principalPolicyValidationError\";\nimport {\n comparePrincipalProjectionMembers,\n comparePrincipalStateMembers,\n hasDuplicateNormalizedPrincipalProjectionMembers,\n hasDuplicateNormalizedPrincipalStateMembers,\n} from \"./principalStateMembers\";\nimport type {\n ManagedRecipientPrincipalType,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMembershipMode,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\nimport { sign } from \"./signing/sign\";\n\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport type {\n ManagedRecipientPrincipalType,\n PrincipalContainerGrant,\n PrincipalContainerGrantAccessLevel,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMemberEnvelope,\n PrincipalStateMembershipMode,\n PrincipalStatePayloadCipherSuite,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\n\nfunction isValidPositiveInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isValidNonNegativeInteger(value: number): boolean {\n return Number.isInteger(value) && value >= 0;\n}\n\nfunction encodeNormalizedPrincipalStateMembers(\n normalizedMembers: ReadonlyArray<PrincipalStateMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n })),\n ),\n );\n}\n\nfunction encodeNormalizedPrincipalProjectionMembers(\n normalizedMembers: ReadonlyArray<PrincipalProjectionMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n role: member.role,\n })),\n ),\n );\n}\n\nexport function encodeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify({\n domain: \"tearleads.principal-state\",\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n }),\n );\n}\n\nexport function toUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): UnsignedPrincipalState {\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nfunction isMembershipMode(\n value: string,\n): value is PrincipalStateMembershipMode {\n return value === \"projection\";\n}\n\nfunction validatePrincipalStateIdentityFields(\n state: UnsignedPrincipalState,\n): void {\n // Versions are counters, not a lifetime history budget. Keep every value\n // exact across JSON, JavaScript arithmetic, and the database number mapping.\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new Error(\"Principal state version must be a positive safe integer\");\n }\n\n if (!isValidPositiveInteger(state.keyEpoch)) {\n throw new Error(\n \"Principal state key epoch must be a positive safe integer\",\n );\n }\n\n if (state.principalId.length === 0) {\n throw new Error(\"Principal state principalId cannot be empty\");\n }\n\n if (state.encapsulationPublicKey.length === 0) {\n throw new Error(\"Principal state encapsulationPublicKey cannot be empty\");\n }\n\n if (state.keyFingerprint.length === 0) {\n throw new Error(\"Principal state keyFingerprint cannot be empty\");\n }\n\n if (state.signerUserId.length === 0) {\n throw new Error(\"Principal state signerUserId cannot be empty\");\n }\n\n if (state.signerUserKeyFingerprint.length === 0) {\n throw new Error(\"Principal state signerUserKeyFingerprint cannot be empty\");\n }\n\n if (!isCanonicalSignedAt(state.signedAt)) {\n throw new Error(`Principal state signedAt must be ${SIGNED_AT_CONTRACT}`);\n }\n}\n\nfunction resolveMembershipMode(\n membershipMode: string | undefined,\n): PrincipalStateMembershipMode {\n if (!membershipMode || !isMembershipMode(membershipMode)) {\n throw new Error(\"Principal state membershipMode is unsupported\");\n }\n return membershipMode;\n}\n\nfunction requireNonEmptyHeaderString(\n value: string | undefined,\n message: string,\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(message);\n }\n return value;\n}\n\nfunction resolveMemberCount(state: UnsignedPrincipalState): number {\n if (\n typeof state.memberCount !== \"number\" ||\n !isValidNonNegativeInteger(state.memberCount)\n ) {\n throw new Error(\n \"Principal state memberCount must be a non-negative integer\",\n );\n }\n\n return state.memberCount;\n}\n\nfunction normalizeExternalAuthority(\n authority: PrincipalStateExternalAuthority | null,\n): PrincipalStateExternalAuthority | null {\n if (authority === null) {\n return null;\n }\n\n if (\n authority.principalType !== \"group\" ||\n authority.principalId.length === 0 ||\n !Number.isSafeInteger(authority.version) ||\n authority.version < 1 ||\n !isValidPositiveInteger(authority.keyEpoch) ||\n authority.stateHash.length === 0 ||\n authority.keyFingerprint.length === 0\n ) {\n throw new Error(\"Principal state externalAuthority is invalid\");\n }\n\n return {\n principalType: \"group\",\n principalId: authority.principalId,\n version: authority.version,\n keyEpoch: authority.keyEpoch,\n stateHash: authority.stateHash,\n keyFingerprint: authority.keyFingerprint,\n };\n}\n\nasync function validatePrincipalEncapsulationKey(\n state: UnsignedPrincipalState,\n): Promise<void> {\n let publicKey: Uint8Array;\n try {\n publicKey = base64ToBytes(state.encapsulationPublicKey);\n } catch {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (bytesToBase64(publicKey) !== state.encapsulationPublicKey) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (publicKey.length !== ML_KEM1024_PUBLIC_KEY_BYTES) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n `Principal state encapsulationPublicKey must contain exactly ${ML_KEM1024_PUBLIC_KEY_BYTES} bytes`,\n );\n }\n\n const publicKeyFingerprint = await toFingerprint(publicKey);\n if (publicKeyFingerprint !== state.keyFingerprint) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state keyFingerprint does not match encapsulationPublicKey\",\n );\n }\n}\n\nexport async function normalizeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<UnsignedPrincipalState> {\n validatePrincipalStateIdentityFields(state);\n\n const membershipMode = resolveMembershipMode(state.membershipMode);\n const resolvedMembershipRoot = requireNonEmptyHeaderString(\n state.membershipRoot,\n \"Principal state membershipRoot is required\",\n );\n const resolvedProjectionRoot = requireNonEmptyHeaderString(\n state.projectionRoot,\n \"Principal state projectionRoot is required\",\n );\n const resolvedGrantRoot = requireNonEmptyHeaderString(\n state.grantRoot,\n \"Principal state grantRoot is required\",\n );\n const resolvedMemberEnvelopesRoot = requireNonEmptyHeaderString(\n state.memberEnvelopesRoot,\n \"Principal state memberEnvelopesRoot is required\",\n );\n const resolvedPayloadCiphertextHash = requireNonEmptyHeaderString(\n state.payloadCiphertextHash,\n \"Principal state payloadCiphertextHash is required\",\n );\n const memberCount = resolveMemberCount(state);\n if (!isValidNonNegativeInteger(state.grantCount)) {\n throw new Error(\n \"Principal state grantCount must be a non-negative integer\",\n );\n }\n\n await validatePrincipalEncapsulationKey(state);\n\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode,\n membershipRoot: resolvedMembershipRoot,\n memberEnvelopesRoot: resolvedMemberEnvelopesRoot,\n projectionRoot: resolvedProjectionRoot,\n grantRoot: resolvedGrantRoot,\n payloadCiphertextHash: resolvedPayloadCiphertextHash,\n memberCount,\n grantCount: state.grantCount,\n externalAuthority: normalizeExternalAuthority(state.externalAuthority),\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nexport function isManagedRecipientPrincipalType(\n value: string,\n): value is ManagedRecipientPrincipalType {\n return value === \"group\" || value === \"organization\";\n}\n\nexport function isPrincipalProjectionRole(\n value: string,\n): value is PrincipalProjectionRole {\n return value === \"member\" || value === \"admin\";\n}\n\nexport function normalizePrincipalStateMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalStateMember[] {\n return members\n .map((member) => ({ userId: member.userId }))\n .sort(comparePrincipalStateMembers);\n}\n\nexport function derivePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalProjectionMember[] {\n return normalizePrincipalStateMembers(members).map((member) => ({\n userId: member.userId,\n role: \"member\",\n }));\n}\n\nexport function normalizePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): PrincipalProjectionMember[] {\n return members\n .map((member) => ({ userId: member.userId, role: member.role }))\n .sort(comparePrincipalProjectionMembers);\n}\n\nexport async function computePrincipalMembershipRoot(\n members: ReadonlyArray<PrincipalStateMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalStateMembers(members);\n\n if (hasDuplicateNormalizedPrincipalStateMembers(normalizedMembers)) {\n throw new Error(\"Principal state cannot contain duplicate members\");\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalStateMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalProjectionRoot(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalProjectionMembers(members);\n\n if (hasDuplicateNormalizedPrincipalProjectionMembers(normalizedMembers)) {\n throw new Error(\n \"Principal state projection cannot contain duplicate members\",\n );\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalProjectionMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalStatePayloadCiphertextHash(\n ciphertext: string,\n): Promise<string> {\n return toFingerprint(TEXT_ENCODER.encode(ciphertext));\n}\n\nexport async function buildPrincipalStateSigningInput(\n input: PrincipalStateHeaderInput,\n): Promise<PrincipalStateSigningInput> {\n return {\n principalType: input.principalType,\n principalId: input.principalId,\n version: input.version,\n prevStateHash: input.prevStateHash,\n keyEpoch: input.keyEpoch,\n encapsulationPublicKey: input.encapsulationPublicKey,\n keyFingerprint: input.keyFingerprint,\n membershipMode: \"projection\",\n membershipRoot: await computePrincipalMembershipRoot(input.members),\n memberEnvelopesRoot: await computePrincipalMemberEnvelopesRoot(\n input.memberEnvelopes,\n ),\n projectionRoot: await computePrincipalProjectionRoot(input.projection),\n grantRoot: await computePrincipalContainerGrantRoot(input.grants),\n payloadCiphertextHash: await computePrincipalStatePayloadCiphertextHash(\n input.payloadCiphertext,\n ),\n memberCount: input.projection.length,\n grantCount: input.grants.length,\n externalAuthority: input.externalAuthority,\n signedAt: input.signedAt,\n signerUserId: input.signerUserId,\n signerUserKeyFingerprint: input.signerUserKeyFingerprint,\n };\n}\n\nexport async function serializeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return TEXT_DECODER.decode(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function computePrincipalStateHash(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return toFingerprint(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function signPrincipalState(\n state: PrincipalStateSigningInput,\n secretKey: Uint8Array,\n): Promise<SignedPrincipalState> {\n const normalizedState = await normalizeUnsignedPrincipalState(\n toUnsignedPrincipalState(state),\n );\n const signature = sign(\n encodeUnsignedPrincipalState(normalizedState),\n secretKey,\n );\n\n return {\n ...normalizedState,\n signature: bytesToBase64(signature),\n };\n}\n"]}
@@ -7976,7 +7976,7 @@ export declare const getOrganizationReadModelOperation: Omit<{
7976
7976
  organizationPolicy: z.ZodOptional<z.ZodObject<{
7977
7977
  currentState: z.ZodObject<{
7978
7978
  stateHash: z.ZodString;
7979
- keyEpoch: z.ZodNumber;
7979
+ keyEpoch: z.ZodCustom<number, number>;
7980
7980
  keyFingerprint: z.ZodString;
7981
7981
  memberCount: z.ZodCustom<number, number>;
7982
7982
  version: z.ZodCustom<number, number>;
@@ -8125,7 +8125,7 @@ export declare const getOrganizationReadModelOperation: Omit<{
8125
8125
  organizationPolicy: z.ZodObject<{
8126
8126
  currentState: z.ZodObject<{
8127
8127
  stateHash: z.ZodString;
8128
- keyEpoch: z.ZodNumber;
8128
+ keyEpoch: z.ZodCustom<number, number>;
8129
8129
  keyFingerprint: z.ZodString;
8130
8130
  memberCount: z.ZodCustom<number, number>;
8131
8131
  version: z.ZodCustom<number, number>;
@@ -12,7 +12,7 @@ export const PrincipalContainerGrantRequestSchema = loosePlainObject({
12
12
  containerId: uuidV4StringSchema,
13
13
  });
14
14
  const PrincipalStateExternalAuthorityRequestSchema = loosePlainObject({
15
- keyEpoch: boundedPositiveIntegerSchema(Number.MAX_VALUE),
15
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
16
16
  keyFingerprint: z.string(),
17
17
  principalId: uuidV4StringSchema,
18
18
  principalType: z.literal("group"),
@@ -24,7 +24,7 @@ const PrincipalStateRequestSchema = loosePlainObject({
24
24
  externalAuthority: PrincipalStateExternalAuthorityRequestSchema.nullable(),
25
25
  grantCount: nonNegativeIntegerSchema,
26
26
  grantRoot: z.string(),
27
- keyEpoch: z.number(),
27
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
28
28
  keyFingerprint: z.string(),
29
29
  memberCount: nonNegativeIntegerSchema,
30
30
  memberEnvelopesRoot: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"principal.js","sourceRoot":"","sources":["principal.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { registerJsonSchemaFragment } from \"../jsonSchema\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonNegativeIntegerSchema,\n uuidV4StringSchema,\n} from \"../schema\";\nimport {\n CANONICAL_SIGNED_AT_PATTERN,\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"../util\";\nimport { ContainerMutationRequestSchema } from \"./container\";\n\nconst PrincipalProjectionMemberRequestSchema = loosePlainObject({\n role: z.literal([\"member\", \"admin\"]),\n userId: uuidV4StringSchema,\n});\n\nexport type PrincipalProjectionMemberRequest = z.infer<\n typeof PrincipalProjectionMemberRequestSchema\n>;\n\nexport const PrincipalContainerGrantRequestSchema = loosePlainObject({\n accessLevel: z.literal([\"admin\", \"read\", \"write\"]),\n containerId: uuidV4StringSchema,\n});\n\nexport type PrincipalContainerGrantRequest = z.infer<\n typeof PrincipalContainerGrantRequestSchema\n>;\n\nconst PrincipalStateExternalAuthorityRequestSchema = loosePlainObject({\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_VALUE),\n keyFingerprint: z.string(),\n principalId: uuidV4StringSchema,\n principalType: z.literal(\"group\"),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nconst PrincipalStateRequestSchema = loosePlainObject({\n encapsulationPublicKey: z.string(),\n externalAuthority: PrincipalStateExternalAuthorityRequestSchema.nullable(),\n grantCount: nonNegativeIntegerSchema,\n grantRoot: z.string(),\n keyEpoch: z.number(),\n keyFingerprint: z.string(),\n memberCount: nonNegativeIntegerSchema,\n memberEnvelopesRoot: z.string(),\n membershipMode: z.literal(\"projection\"),\n membershipRoot: z.string(),\n payloadCiphertextHash: z.string(),\n prevStateHash: z.string().nullable(),\n principalId: uuidV4StringSchema,\n principalType: z.literal([\"group\", \"organization\"]),\n projectionRoot: z.string(),\n signature: z.string(),\n signedAt: registerJsonSchemaFragment(\n z.string().refine(isCanonicalSignedAt, {\n message: `signedAt must be ${SIGNED_AT_CONTRACT}`,\n }),\n { pattern: CANONICAL_SIGNED_AT_PATTERN.source, type: \"string\" },\n ),\n signerUserId: uuidV4StringSchema,\n signerUserKeyFingerprint: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateRequest = z.infer<typeof PrincipalStateRequestSchema>;\n\nconst PrincipalStateEncryptedPayloadRequestSchema = loosePlainObject({\n cipherSuite: z.literal(\"aes-256-gcm\"),\n ciphertext: z.string(),\n ciphertextHash: z.string(),\n});\n\nexport type PrincipalStateEncryptedPayloadRequest = z.infer<\n typeof PrincipalStateEncryptedPayloadRequestSchema\n>;\n\nconst PrincipalMemberEnvelopeRequestSchema = loosePlainObject({\n kemCipherText: z.string(),\n memberKeyFingerprint: z.string(),\n userId: uuidV4StringSchema,\n wrappedKey: z.string(),\n});\n\nexport type PrincipalMemberEnvelopeRequest = z.infer<\n typeof PrincipalMemberEnvelopeRequestSchema\n>;\n\nexport const PutPrincipalPolicyRequestSchema = loosePlainObject({\n containerMutations: arraySchema(ContainerMutationRequestSchema).optional(),\n encryptedPayload: PrincipalStateEncryptedPayloadRequestSchema,\n grants: arraySchema(PrincipalContainerGrantRequestSchema),\n memberEnvelopes: arraySchema(PrincipalMemberEnvelopeRequestSchema),\n projection: arraySchema(PrincipalProjectionMemberRequestSchema),\n state: PrincipalStateRequestSchema,\n});\n\nexport type PutPrincipalPolicyRequest = z.infer<\n typeof PutPrincipalPolicyRequestSchema\n>;\n\nexport const OrganizationPrincipalPolicyRequestSchema = loosePlainObject({\n containerMutations: arraySchema(ContainerMutationRequestSchema, 0).optional(),\n encryptedPayload: PrincipalStateEncryptedPayloadRequestSchema,\n grants: arraySchema(PrincipalContainerGrantRequestSchema),\n memberEnvelopes: arraySchema(PrincipalMemberEnvelopeRequestSchema),\n projection: arraySchema(PrincipalProjectionMemberRequestSchema),\n state: PrincipalStateRequestSchema,\n});\n\nexport type OrganizationPrincipalPolicyRequest = z.infer<\n typeof OrganizationPrincipalPolicyRequestSchema\n>;\n\nexport const CommitOrganizationGroupPolicyRequestSchema = loosePlainObject({\n groupPolicy: PutPrincipalPolicyRequestSchema,\n organizationPolicy: OrganizationPrincipalPolicyRequestSchema,\n});\n\nexport type CommitOrganizationGroupPolicyRequest = z.infer<\n typeof CommitOrganizationGroupPolicyRequestSchema\n>;\n\nexport function isPutPrincipalPolicyRequest(\n value: unknown,\n): value is PutPrincipalPolicyRequest {\n return PutPrincipalPolicyRequestSchema.safeParse(value).success;\n}\n\nexport function isOrganizationPrincipalPolicyRequest(\n value: unknown,\n): value is OrganizationPrincipalPolicyRequest {\n return OrganizationPrincipalPolicyRequestSchema.safeParse(value).success;\n}\n\nexport function isCommitOrganizationGroupPolicyRequest(\n value: unknown,\n): value is CommitOrganizationGroupPolicyRequest {\n return CommitOrganizationGroupPolicyRequestSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"principal.js","sourceRoot":"","sources":["principal.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { registerJsonSchemaFragment } from \"../jsonSchema\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonNegativeIntegerSchema,\n uuidV4StringSchema,\n} from \"../schema\";\nimport {\n CANONICAL_SIGNED_AT_PATTERN,\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"../util\";\nimport { ContainerMutationRequestSchema } from \"./container\";\n\nconst PrincipalProjectionMemberRequestSchema = loosePlainObject({\n role: z.literal([\"member\", \"admin\"]),\n userId: uuidV4StringSchema,\n});\n\nexport type PrincipalProjectionMemberRequest = z.infer<\n typeof PrincipalProjectionMemberRequestSchema\n>;\n\nexport const PrincipalContainerGrantRequestSchema = loosePlainObject({\n accessLevel: z.literal([\"admin\", \"read\", \"write\"]),\n containerId: uuidV4StringSchema,\n});\n\nexport type PrincipalContainerGrantRequest = z.infer<\n typeof PrincipalContainerGrantRequestSchema\n>;\n\nconst PrincipalStateExternalAuthorityRequestSchema = loosePlainObject({\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: z.string(),\n principalId: uuidV4StringSchema,\n principalType: z.literal(\"group\"),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nconst PrincipalStateRequestSchema = loosePlainObject({\n encapsulationPublicKey: z.string(),\n externalAuthority: PrincipalStateExternalAuthorityRequestSchema.nullable(),\n grantCount: nonNegativeIntegerSchema,\n grantRoot: z.string(),\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: z.string(),\n memberCount: nonNegativeIntegerSchema,\n memberEnvelopesRoot: z.string(),\n membershipMode: z.literal(\"projection\"),\n membershipRoot: z.string(),\n payloadCiphertextHash: z.string(),\n prevStateHash: z.string().nullable(),\n principalId: uuidV4StringSchema,\n principalType: z.literal([\"group\", \"organization\"]),\n projectionRoot: z.string(),\n signature: z.string(),\n signedAt: registerJsonSchemaFragment(\n z.string().refine(isCanonicalSignedAt, {\n message: `signedAt must be ${SIGNED_AT_CONTRACT}`,\n }),\n { pattern: CANONICAL_SIGNED_AT_PATTERN.source, type: \"string\" },\n ),\n signerUserId: uuidV4StringSchema,\n signerUserKeyFingerprint: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateRequest = z.infer<typeof PrincipalStateRequestSchema>;\n\nconst PrincipalStateEncryptedPayloadRequestSchema = loosePlainObject({\n cipherSuite: z.literal(\"aes-256-gcm\"),\n ciphertext: z.string(),\n ciphertextHash: z.string(),\n});\n\nexport type PrincipalStateEncryptedPayloadRequest = z.infer<\n typeof PrincipalStateEncryptedPayloadRequestSchema\n>;\n\nconst PrincipalMemberEnvelopeRequestSchema = loosePlainObject({\n kemCipherText: z.string(),\n memberKeyFingerprint: z.string(),\n userId: uuidV4StringSchema,\n wrappedKey: z.string(),\n});\n\nexport type PrincipalMemberEnvelopeRequest = z.infer<\n typeof PrincipalMemberEnvelopeRequestSchema\n>;\n\nexport const PutPrincipalPolicyRequestSchema = loosePlainObject({\n containerMutations: arraySchema(ContainerMutationRequestSchema).optional(),\n encryptedPayload: PrincipalStateEncryptedPayloadRequestSchema,\n grants: arraySchema(PrincipalContainerGrantRequestSchema),\n memberEnvelopes: arraySchema(PrincipalMemberEnvelopeRequestSchema),\n projection: arraySchema(PrincipalProjectionMemberRequestSchema),\n state: PrincipalStateRequestSchema,\n});\n\nexport type PutPrincipalPolicyRequest = z.infer<\n typeof PutPrincipalPolicyRequestSchema\n>;\n\nexport const OrganizationPrincipalPolicyRequestSchema = loosePlainObject({\n containerMutations: arraySchema(ContainerMutationRequestSchema, 0).optional(),\n encryptedPayload: PrincipalStateEncryptedPayloadRequestSchema,\n grants: arraySchema(PrincipalContainerGrantRequestSchema),\n memberEnvelopes: arraySchema(PrincipalMemberEnvelopeRequestSchema),\n projection: arraySchema(PrincipalProjectionMemberRequestSchema),\n state: PrincipalStateRequestSchema,\n});\n\nexport type OrganizationPrincipalPolicyRequest = z.infer<\n typeof OrganizationPrincipalPolicyRequestSchema\n>;\n\nexport const CommitOrganizationGroupPolicyRequestSchema = loosePlainObject({\n groupPolicy: PutPrincipalPolicyRequestSchema,\n organizationPolicy: OrganizationPrincipalPolicyRequestSchema,\n});\n\nexport type CommitOrganizationGroupPolicyRequest = z.infer<\n typeof CommitOrganizationGroupPolicyRequestSchema\n>;\n\nexport function isPutPrincipalPolicyRequest(\n value: unknown,\n): value is PutPrincipalPolicyRequest {\n return PutPrincipalPolicyRequestSchema.safeParse(value).success;\n}\n\nexport function isOrganizationPrincipalPolicyRequest(\n value: unknown,\n): value is OrganizationPrincipalPolicyRequest {\n return OrganizationPrincipalPolicyRequestSchema.safeParse(value).success;\n}\n\nexport function isCommitOrganizationGroupPolicyRequest(\n value: unknown,\n): value is CommitOrganizationGroupPolicyRequest {\n return CommitOrganizationGroupPolicyRequestSchema.safeParse(value).success;\n}\n"]}
@@ -193,7 +193,7 @@ export declare const OrganizationProfileResponseSchema: z.ZodType<{
193
193
  }>>;
194
194
  export type OrganizationProfileResponse = z.infer<typeof OrganizationProfileResponseSchema>;
195
195
  export declare const OrganizationGroupCurrentStateResponseShape: {
196
- keyEpoch: z.ZodNumber;
196
+ keyEpoch: z.ZodCustom<number, number>;
197
197
  keyFingerprint: z.ZodString;
198
198
  memberCount: z.ZodCustom<number, number>;
199
199
  stateHash: z.ZodString;
@@ -44,7 +44,7 @@ export const OrganizationProfileResponseSchema = loosePlainObject({
44
44
  profileDocumentId: z.string().nullable(),
45
45
  });
46
46
  export const OrganizationGroupCurrentStateResponseShape = {
47
- keyEpoch: positiveIntegerSchema,
47
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
48
48
  keyFingerprint: nonEmptyStringSchema,
49
49
  memberCount: nonNegativeIntegerSchema,
50
50
  stateHash: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"organization.js","sourceRoot":"","sources":["organization.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonEmptyStringSchema,\n nonNegativeIntegerSchema,\n positiveIntegerSchema,\n} from \"../schema\";\nimport { PrincipalPolicyMutationResponseSchema } from \"./principal\";\n\nconst OrganizationRoleSchema = z.literal([\"member\", \"admin\"]);\nconst OrganizationRosterStatusSchema = z.literal([\"active\", \"disabled\"]);\nconst OrganizationGroupContainerAccessLevelSchema = z.literal([\n \"admin\",\n \"read\",\n \"write\",\n]);\nconst OrganizationContainerGrantSubjectTypeSchema = z.literal([\n \"group\",\n \"user\",\n]);\n\nexport type OrganizationRole = z.infer<typeof OrganizationRoleSchema>;\nexport type OrganizationRosterStatus = z.infer<\n typeof OrganizationRosterStatusSchema\n>;\nexport type OrganizationGroupContainerAccessLevel = z.infer<\n typeof OrganizationGroupContainerAccessLevelSchema\n>;\nexport type OrganizationContainerGrantSubjectType = z.infer<\n typeof OrganizationContainerGrantSubjectTypeSchema\n>;\n\nexport const OrganizationDirectoryUserResponseShape = {\n createdAt: z.string(),\n disabledAt: z.string().nullable(),\n disabledByUserId: z.string().nullable(),\n encapsulationKeyFingerprint: z.string(),\n encapsulationPublicKey: z.string(),\n isPersonalOrganizationOwner: z.boolean(),\n isSelf: z.boolean(),\n joinedAt: z.string(),\n profileDocumentId: z.string().nullable(),\n signingKeyFingerprint: z.string(),\n signingPublicKey: z.string(),\n status: OrganizationRosterStatusSchema,\n updatedAt: z.string(),\n userId: z.string(),\n};\n\nexport const OrganizationDirectoryUserResponseSchema = loosePlainObject(\n OrganizationDirectoryUserResponseShape,\n);\n\nexport type OrganizationDirectoryUserResponse = z.infer<\n typeof OrganizationDirectoryUserResponseSchema\n>;\n\nexport const OrganizationDirectoryCurrentUserResponseShape = {\n isOrgAdmin: z.boolean(),\n};\n\nconst OrganizationDirectoryCurrentUserResponseSchema = loosePlainObject(\n OrganizationDirectoryCurrentUserResponseShape,\n);\n\nexport const OrganizationDirectoryResponseSchema = loosePlainObject({\n currentUser: OrganizationDirectoryCurrentUserResponseSchema,\n organizationId: z.string(),\n profileDocumentId: z.string().nullable(),\n users: arraySchema(OrganizationDirectoryUserResponseSchema),\n});\n\nexport type OrganizationDirectoryResponse = z.infer<\n typeof OrganizationDirectoryResponseSchema\n>;\n\nexport const OrganizationProfileResponseSchema = loosePlainObject({\n organizationId: z.string(),\n profileDocumentId: z.string().nullable(),\n});\n\nexport type OrganizationProfileResponse = z.infer<\n typeof OrganizationProfileResponseSchema\n>;\n\nexport const OrganizationGroupCurrentStateResponseShape = {\n keyEpoch: positiveIntegerSchema,\n keyFingerprint: nonEmptyStringSchema,\n memberCount: nonNegativeIntegerSchema,\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n};\n\nexport const OrganizationGroupCurrentStateResponseSchema = loosePlainObject(\n OrganizationGroupCurrentStateResponseShape,\n);\n\nexport type OrganizationGroupCurrentStateResponse = z.infer<\n typeof OrganizationGroupCurrentStateResponseSchema\n>;\n\nexport const OrganizationGroupSummaryResponseShape = {\n createdAt: z.string(),\n currentState: OrganizationGroupCurrentStateResponseSchema.nullable(),\n groupId: z.string(),\n isBuiltin: z.boolean(),\n organizationId: z.string(),\n};\n\nexport const OrganizationGroupSummaryResponseSchema = loosePlainObject(\n OrganizationGroupSummaryResponseShape,\n);\n\nexport type OrganizationGroupSummaryResponse = z.infer<\n typeof OrganizationGroupSummaryResponseSchema\n>;\n\nexport const CreateOrganizationGroupResponseSchema = loosePlainObject({\n group: OrganizationGroupSummaryResponseSchema,\n organizationPolicy: PrincipalPolicyMutationResponseSchema,\n});\n\nexport type CreateOrganizationGroupResponse = z.infer<\n typeof CreateOrganizationGroupResponseSchema\n>;\n\nexport const DeleteOrganizationGroupResponseSchema = loosePlainObject({\n deleted: z.literal(true),\n groupId: z.string(),\n organizationPolicy: PrincipalPolicyMutationResponseSchema,\n organizationId: z.string(),\n});\n\nexport type DeleteOrganizationGroupResponse = z.infer<\n typeof DeleteOrganizationGroupResponseSchema\n>;\n\nexport const ListOrganizationGroupsResponseSchema = loosePlainObject({\n groups: arraySchema(OrganizationGroupSummaryResponseSchema),\n memberGroupId: z.string(),\n organizationId: z.string(),\n});\n\nexport type ListOrganizationGroupsResponse = z.infer<\n typeof ListOrganizationGroupsResponseSchema\n>;\n\nexport const OrganizationGroupMemberResponseShape = {\n encapsulationKeyFingerprint: z.string().nullable(),\n encapsulationPublicKey: z.string().nullable(),\n role: OrganizationRoleSchema,\n signingKeyFingerprint: z.string().nullable(),\n signingPublicKey: z.string().nullable(),\n userId: z.string(),\n};\n\nexport const OrganizationGroupMemberResponseSchema = loosePlainObject(\n OrganizationGroupMemberResponseShape,\n);\n\nexport type OrganizationGroupMemberResponse = z.infer<\n typeof OrganizationGroupMemberResponseSchema\n>;\n\nexport const OrganizationGroupMembersResponseSchema = loosePlainObject({\n groupId: z.string(),\n members: arraySchema(OrganizationGroupMemberResponseSchema),\n organizationId: z.string(),\n});\n\nexport type OrganizationGroupMembersResponse = z.infer<\n typeof OrganizationGroupMembersResponseSchema\n>;\n\nconst OrganizationGroupContainerResponseShape = {\n accessLevel: OrganizationGroupContainerAccessLevelSchema,\n containerId: z.string(),\n createdAt: z.string(),\n depth: nonNegativeIntegerSchema,\n isBuiltin: z.boolean(),\n metadataAccessEpoch: positiveIntegerSchema,\n metadataAccessStateHash: nonEmptyStringSchema,\n metadataDocumentId: z.string().nullable(),\n parentId: z.string().nullable(),\n updatedAt: z.string(),\n};\n\nexport const OrganizationGroupContainerResponseSchema = loosePlainObject(\n OrganizationGroupContainerResponseShape,\n);\n\nexport type OrganizationGroupContainerResponse = z.infer<\n typeof OrganizationGroupContainerResponseSchema\n>;\n\nexport const OrganizationGroupContainersResponseSchema = loosePlainObject({\n containers: arraySchema(OrganizationGroupContainerResponseSchema),\n groupId: z.string(),\n organizationId: z.string(),\n});\n\nexport type OrganizationGroupContainersResponse = z.infer<\n typeof OrganizationGroupContainersResponseSchema\n>;\n\nexport const OrganizationContainerGrantResponseShape = {\n ...OrganizationGroupContainerResponseShape,\n groupId: z.string().nullable(),\n signingKeyFingerprint: z.string().nullable(),\n subjectId: z.string(),\n subjectType: OrganizationContainerGrantSubjectTypeSchema,\n userId: z.string().nullable(),\n};\n\nexport const OrganizationContainerGrantResponseSchema = loosePlainObject(\n OrganizationContainerGrantResponseShape,\n);\n\nexport type OrganizationContainerGrantResponse = z.infer<\n typeof OrganizationContainerGrantResponseSchema\n>;\n\nexport const OrganizationContainerGrantsResponseSchema = loosePlainObject({\n grants: arraySchema(OrganizationContainerGrantResponseSchema),\n organizationId: z.string(),\n});\n\nexport type OrganizationContainerGrantsResponse = z.infer<\n typeof OrganizationContainerGrantsResponseSchema\n>;\n\nexport const OrganizationUserDetailGrantsResponseSchema = loosePlainObject({\n directGrants: arraySchema(OrganizationContainerGrantResponseSchema),\n groupGrants: arraySchema(OrganizationContainerGrantResponseSchema),\n});\n\nexport type OrganizationUserDetailGrantsResponse = z.infer<\n typeof OrganizationUserDetailGrantsResponseSchema\n>;\n\nexport const OrganizationUserDetailResponseSchema = loosePlainObject({\n grants: OrganizationUserDetailGrantsResponseSchema,\n groups: arraySchema(OrganizationGroupSummaryResponseSchema),\n organizationId: z.string(),\n user: OrganizationDirectoryUserResponseSchema,\n});\n\nexport type OrganizationUserDetailResponse = z.infer<\n typeof OrganizationUserDetailResponseSchema\n>;\n\nexport function isOrganizationGroupContainerAccessLevel(\n value: string,\n): value is OrganizationGroupContainerAccessLevel {\n return OrganizationGroupContainerAccessLevelSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantSubjectType(\n value: string,\n): value is OrganizationContainerGrantSubjectType {\n return OrganizationContainerGrantSubjectTypeSchema.safeParse(value).success;\n}\n\nexport function isOrganizationDirectoryUserResponse(\n value: unknown,\n): value is OrganizationDirectoryUserResponse {\n return OrganizationDirectoryUserResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationDirectoryResponse(\n value: unknown,\n): value is OrganizationDirectoryResponse {\n return OrganizationDirectoryResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationProfileResponse(\n value: unknown,\n): value is OrganizationProfileResponse {\n return OrganizationProfileResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupCurrentStateResponse(\n value: unknown,\n): value is OrganizationGroupCurrentStateResponse {\n return OrganizationGroupCurrentStateResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupSummaryResponse(\n value: unknown,\n): value is OrganizationGroupSummaryResponse {\n return OrganizationGroupSummaryResponseSchema.safeParse(value).success;\n}\n\nexport function isListOrganizationGroupsResponse(\n value: unknown,\n): value is ListOrganizationGroupsResponse {\n return ListOrganizationGroupsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupMemberResponse(\n value: unknown,\n): value is OrganizationGroupMemberResponse {\n return OrganizationGroupMemberResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupMembersResponse(\n value: unknown,\n): value is OrganizationGroupMembersResponse {\n return OrganizationGroupMembersResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupContainerResponse(\n value: unknown,\n): value is OrganizationGroupContainerResponse {\n return OrganizationGroupContainerResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupContainersResponse(\n value: unknown,\n): value is OrganizationGroupContainersResponse {\n return OrganizationGroupContainersResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantResponse(\n value: unknown,\n): value is OrganizationContainerGrantResponse {\n return OrganizationContainerGrantResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantsResponse(\n value: unknown,\n): value is OrganizationContainerGrantsResponse {\n return OrganizationContainerGrantsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationUserDetailGrantsResponse(\n value: unknown,\n): value is OrganizationUserDetailGrantsResponse {\n return OrganizationUserDetailGrantsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationUserDetailResponse(\n value: unknown,\n): value is OrganizationUserDetailResponse {\n return OrganizationUserDetailResponseSchema.safeParse(value).success;\n}\n\nexport function isCreateOrganizationGroupResponse(\n value: unknown,\n): value is CreateOrganizationGroupResponse {\n return CreateOrganizationGroupResponseSchema.safeParse(value).success;\n}\n\nexport function isDeleteOrganizationGroupResponse(\n value: unknown,\n): value is DeleteOrganizationGroupResponse {\n return DeleteOrganizationGroupResponseSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"organization.js","sourceRoot":"","sources":["organization.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonEmptyStringSchema,\n nonNegativeIntegerSchema,\n positiveIntegerSchema,\n} from \"../schema\";\nimport { PrincipalPolicyMutationResponseSchema } from \"./principal\";\n\nconst OrganizationRoleSchema = z.literal([\"member\", \"admin\"]);\nconst OrganizationRosterStatusSchema = z.literal([\"active\", \"disabled\"]);\nconst OrganizationGroupContainerAccessLevelSchema = z.literal([\n \"admin\",\n \"read\",\n \"write\",\n]);\nconst OrganizationContainerGrantSubjectTypeSchema = z.literal([\n \"group\",\n \"user\",\n]);\n\nexport type OrganizationRole = z.infer<typeof OrganizationRoleSchema>;\nexport type OrganizationRosterStatus = z.infer<\n typeof OrganizationRosterStatusSchema\n>;\nexport type OrganizationGroupContainerAccessLevel = z.infer<\n typeof OrganizationGroupContainerAccessLevelSchema\n>;\nexport type OrganizationContainerGrantSubjectType = z.infer<\n typeof OrganizationContainerGrantSubjectTypeSchema\n>;\n\nexport const OrganizationDirectoryUserResponseShape = {\n createdAt: z.string(),\n disabledAt: z.string().nullable(),\n disabledByUserId: z.string().nullable(),\n encapsulationKeyFingerprint: z.string(),\n encapsulationPublicKey: z.string(),\n isPersonalOrganizationOwner: z.boolean(),\n isSelf: z.boolean(),\n joinedAt: z.string(),\n profileDocumentId: z.string().nullable(),\n signingKeyFingerprint: z.string(),\n signingPublicKey: z.string(),\n status: OrganizationRosterStatusSchema,\n updatedAt: z.string(),\n userId: z.string(),\n};\n\nexport const OrganizationDirectoryUserResponseSchema = loosePlainObject(\n OrganizationDirectoryUserResponseShape,\n);\n\nexport type OrganizationDirectoryUserResponse = z.infer<\n typeof OrganizationDirectoryUserResponseSchema\n>;\n\nexport const OrganizationDirectoryCurrentUserResponseShape = {\n isOrgAdmin: z.boolean(),\n};\n\nconst OrganizationDirectoryCurrentUserResponseSchema = loosePlainObject(\n OrganizationDirectoryCurrentUserResponseShape,\n);\n\nexport const OrganizationDirectoryResponseSchema = loosePlainObject({\n currentUser: OrganizationDirectoryCurrentUserResponseSchema,\n organizationId: z.string(),\n profileDocumentId: z.string().nullable(),\n users: arraySchema(OrganizationDirectoryUserResponseSchema),\n});\n\nexport type OrganizationDirectoryResponse = z.infer<\n typeof OrganizationDirectoryResponseSchema\n>;\n\nexport const OrganizationProfileResponseSchema = loosePlainObject({\n organizationId: z.string(),\n profileDocumentId: z.string().nullable(),\n});\n\nexport type OrganizationProfileResponse = z.infer<\n typeof OrganizationProfileResponseSchema\n>;\n\nexport const OrganizationGroupCurrentStateResponseShape = {\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: nonEmptyStringSchema,\n memberCount: nonNegativeIntegerSchema,\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n};\n\nexport const OrganizationGroupCurrentStateResponseSchema = loosePlainObject(\n OrganizationGroupCurrentStateResponseShape,\n);\n\nexport type OrganizationGroupCurrentStateResponse = z.infer<\n typeof OrganizationGroupCurrentStateResponseSchema\n>;\n\nexport const OrganizationGroupSummaryResponseShape = {\n createdAt: z.string(),\n currentState: OrganizationGroupCurrentStateResponseSchema.nullable(),\n groupId: z.string(),\n isBuiltin: z.boolean(),\n organizationId: z.string(),\n};\n\nexport const OrganizationGroupSummaryResponseSchema = loosePlainObject(\n OrganizationGroupSummaryResponseShape,\n);\n\nexport type OrganizationGroupSummaryResponse = z.infer<\n typeof OrganizationGroupSummaryResponseSchema\n>;\n\nexport const CreateOrganizationGroupResponseSchema = loosePlainObject({\n group: OrganizationGroupSummaryResponseSchema,\n organizationPolicy: PrincipalPolicyMutationResponseSchema,\n});\n\nexport type CreateOrganizationGroupResponse = z.infer<\n typeof CreateOrganizationGroupResponseSchema\n>;\n\nexport const DeleteOrganizationGroupResponseSchema = loosePlainObject({\n deleted: z.literal(true),\n groupId: z.string(),\n organizationPolicy: PrincipalPolicyMutationResponseSchema,\n organizationId: z.string(),\n});\n\nexport type DeleteOrganizationGroupResponse = z.infer<\n typeof DeleteOrganizationGroupResponseSchema\n>;\n\nexport const ListOrganizationGroupsResponseSchema = loosePlainObject({\n groups: arraySchema(OrganizationGroupSummaryResponseSchema),\n memberGroupId: z.string(),\n organizationId: z.string(),\n});\n\nexport type ListOrganizationGroupsResponse = z.infer<\n typeof ListOrganizationGroupsResponseSchema\n>;\n\nexport const OrganizationGroupMemberResponseShape = {\n encapsulationKeyFingerprint: z.string().nullable(),\n encapsulationPublicKey: z.string().nullable(),\n role: OrganizationRoleSchema,\n signingKeyFingerprint: z.string().nullable(),\n signingPublicKey: z.string().nullable(),\n userId: z.string(),\n};\n\nexport const OrganizationGroupMemberResponseSchema = loosePlainObject(\n OrganizationGroupMemberResponseShape,\n);\n\nexport type OrganizationGroupMemberResponse = z.infer<\n typeof OrganizationGroupMemberResponseSchema\n>;\n\nexport const OrganizationGroupMembersResponseSchema = loosePlainObject({\n groupId: z.string(),\n members: arraySchema(OrganizationGroupMemberResponseSchema),\n organizationId: z.string(),\n});\n\nexport type OrganizationGroupMembersResponse = z.infer<\n typeof OrganizationGroupMembersResponseSchema\n>;\n\nconst OrganizationGroupContainerResponseShape = {\n accessLevel: OrganizationGroupContainerAccessLevelSchema,\n containerId: z.string(),\n createdAt: z.string(),\n depth: nonNegativeIntegerSchema,\n isBuiltin: z.boolean(),\n metadataAccessEpoch: positiveIntegerSchema,\n metadataAccessStateHash: nonEmptyStringSchema,\n metadataDocumentId: z.string().nullable(),\n parentId: z.string().nullable(),\n updatedAt: z.string(),\n};\n\nexport const OrganizationGroupContainerResponseSchema = loosePlainObject(\n OrganizationGroupContainerResponseShape,\n);\n\nexport type OrganizationGroupContainerResponse = z.infer<\n typeof OrganizationGroupContainerResponseSchema\n>;\n\nexport const OrganizationGroupContainersResponseSchema = loosePlainObject({\n containers: arraySchema(OrganizationGroupContainerResponseSchema),\n groupId: z.string(),\n organizationId: z.string(),\n});\n\nexport type OrganizationGroupContainersResponse = z.infer<\n typeof OrganizationGroupContainersResponseSchema\n>;\n\nexport const OrganizationContainerGrantResponseShape = {\n ...OrganizationGroupContainerResponseShape,\n groupId: z.string().nullable(),\n signingKeyFingerprint: z.string().nullable(),\n subjectId: z.string(),\n subjectType: OrganizationContainerGrantSubjectTypeSchema,\n userId: z.string().nullable(),\n};\n\nexport const OrganizationContainerGrantResponseSchema = loosePlainObject(\n OrganizationContainerGrantResponseShape,\n);\n\nexport type OrganizationContainerGrantResponse = z.infer<\n typeof OrganizationContainerGrantResponseSchema\n>;\n\nexport const OrganizationContainerGrantsResponseSchema = loosePlainObject({\n grants: arraySchema(OrganizationContainerGrantResponseSchema),\n organizationId: z.string(),\n});\n\nexport type OrganizationContainerGrantsResponse = z.infer<\n typeof OrganizationContainerGrantsResponseSchema\n>;\n\nexport const OrganizationUserDetailGrantsResponseSchema = loosePlainObject({\n directGrants: arraySchema(OrganizationContainerGrantResponseSchema),\n groupGrants: arraySchema(OrganizationContainerGrantResponseSchema),\n});\n\nexport type OrganizationUserDetailGrantsResponse = z.infer<\n typeof OrganizationUserDetailGrantsResponseSchema\n>;\n\nexport const OrganizationUserDetailResponseSchema = loosePlainObject({\n grants: OrganizationUserDetailGrantsResponseSchema,\n groups: arraySchema(OrganizationGroupSummaryResponseSchema),\n organizationId: z.string(),\n user: OrganizationDirectoryUserResponseSchema,\n});\n\nexport type OrganizationUserDetailResponse = z.infer<\n typeof OrganizationUserDetailResponseSchema\n>;\n\nexport function isOrganizationGroupContainerAccessLevel(\n value: string,\n): value is OrganizationGroupContainerAccessLevel {\n return OrganizationGroupContainerAccessLevelSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantSubjectType(\n value: string,\n): value is OrganizationContainerGrantSubjectType {\n return OrganizationContainerGrantSubjectTypeSchema.safeParse(value).success;\n}\n\nexport function isOrganizationDirectoryUserResponse(\n value: unknown,\n): value is OrganizationDirectoryUserResponse {\n return OrganizationDirectoryUserResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationDirectoryResponse(\n value: unknown,\n): value is OrganizationDirectoryResponse {\n return OrganizationDirectoryResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationProfileResponse(\n value: unknown,\n): value is OrganizationProfileResponse {\n return OrganizationProfileResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupCurrentStateResponse(\n value: unknown,\n): value is OrganizationGroupCurrentStateResponse {\n return OrganizationGroupCurrentStateResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupSummaryResponse(\n value: unknown,\n): value is OrganizationGroupSummaryResponse {\n return OrganizationGroupSummaryResponseSchema.safeParse(value).success;\n}\n\nexport function isListOrganizationGroupsResponse(\n value: unknown,\n): value is ListOrganizationGroupsResponse {\n return ListOrganizationGroupsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupMemberResponse(\n value: unknown,\n): value is OrganizationGroupMemberResponse {\n return OrganizationGroupMemberResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupMembersResponse(\n value: unknown,\n): value is OrganizationGroupMembersResponse {\n return OrganizationGroupMembersResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupContainerResponse(\n value: unknown,\n): value is OrganizationGroupContainerResponse {\n return OrganizationGroupContainerResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationGroupContainersResponse(\n value: unknown,\n): value is OrganizationGroupContainersResponse {\n return OrganizationGroupContainersResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantResponse(\n value: unknown,\n): value is OrganizationContainerGrantResponse {\n return OrganizationContainerGrantResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationContainerGrantsResponse(\n value: unknown,\n): value is OrganizationContainerGrantsResponse {\n return OrganizationContainerGrantsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationUserDetailGrantsResponse(\n value: unknown,\n): value is OrganizationUserDetailGrantsResponse {\n return OrganizationUserDetailGrantsResponseSchema.safeParse(value).success;\n}\n\nexport function isOrganizationUserDetailResponse(\n value: unknown,\n): value is OrganizationUserDetailResponse {\n return OrganizationUserDetailResponseSchema.safeParse(value).success;\n}\n\nexport function isCreateOrganizationGroupResponse(\n value: unknown,\n): value is CreateOrganizationGroupResponse {\n return CreateOrganizationGroupResponseSchema.safeParse(value).success;\n}\n\nexport function isDeleteOrganizationGroupResponse(\n value: unknown,\n): value is DeleteOrganizationGroupResponse {\n return DeleteOrganizationGroupResponseSchema.safeParse(value).success;\n}\n"]}
@@ -123,7 +123,7 @@ export type OrganizationReadModelGroupMembershipsResponse = z.infer<typeof Organ
123
123
  declare const OrganizationReadModelOrganizationPolicyResponseSchema: z.ZodObject<{
124
124
  currentState: z.ZodObject<{
125
125
  stateHash: z.ZodString;
126
- keyEpoch: z.ZodNumber;
126
+ keyEpoch: z.ZodCustom<number, number>;
127
127
  keyFingerprint: z.ZodString;
128
128
  memberCount: z.ZodCustom<number, number>;
129
129
  version: z.ZodCustom<number, number>;
@@ -264,7 +264,7 @@ declare const OrganizationReadModelSnapshotResponseSchema: z.ZodObject<{
264
264
  organizationPolicy: z.ZodObject<{
265
265
  currentState: z.ZodObject<{
266
266
  stateHash: z.ZodString;
267
- keyEpoch: z.ZodNumber;
267
+ keyEpoch: z.ZodCustom<number, number>;
268
268
  keyFingerprint: z.ZodString;
269
269
  memberCount: z.ZodCustom<number, number>;
270
270
  version: z.ZodCustom<number, number>;
@@ -413,7 +413,7 @@ declare const OrganizationReadModelDeltaResponseSchema: z.ZodObject<{
413
413
  organizationPolicy: z.ZodOptional<z.ZodObject<{
414
414
  currentState: z.ZodObject<{
415
415
  stateHash: z.ZodString;
416
- keyEpoch: z.ZodNumber;
416
+ keyEpoch: z.ZodCustom<number, number>;
417
417
  keyFingerprint: z.ZodString;
418
418
  memberCount: z.ZodCustom<number, number>;
419
419
  version: z.ZodCustom<number, number>;
@@ -563,7 +563,7 @@ export declare const OrganizationReadModelResponseSchema: z.ZodDiscriminatedUnio
563
563
  organizationPolicy: z.ZodOptional<z.ZodObject<{
564
564
  currentState: z.ZodObject<{
565
565
  stateHash: z.ZodString;
566
- keyEpoch: z.ZodNumber;
566
+ keyEpoch: z.ZodCustom<number, number>;
567
567
  keyFingerprint: z.ZodString;
568
568
  memberCount: z.ZodCustom<number, number>;
569
569
  version: z.ZodCustom<number, number>;
@@ -712,7 +712,7 @@ export declare const OrganizationReadModelResponseSchema: z.ZodDiscriminatedUnio
712
712
  organizationPolicy: z.ZodObject<{
713
713
  currentState: z.ZodObject<{
714
714
  stateHash: z.ZodString;
715
- keyEpoch: z.ZodNumber;
715
+ keyEpoch: z.ZodCustom<number, number>;
716
716
  keyFingerprint: z.ZodString;
717
717
  memberCount: z.ZodCustom<number, number>;
718
718
  version: z.ZodCustom<number, number>;
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  export declare const ReferencedPrincipalStateResponseShape: {
3
- keyEpoch: z.ZodNumber;
3
+ keyEpoch: z.ZodCustom<number, number>;
4
4
  keyFingerprint: z.ZodString;
5
5
  principalId: z.ZodString;
6
6
  principalType: z.ZodLiteral<"group" | "organization">;
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { boundedPositiveIntegerSchema, loosePlainObject } from "../schema.js";
3
3
  export const ReferencedPrincipalStateResponseShape = {
4
- keyEpoch: z.number(),
4
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
5
5
  keyFingerprint: z.string(),
6
6
  principalId: z.string(),
7
7
  principalType: z.literal(["group", "organization"]),
@@ -1 +1 @@
1
- {"version":3,"file":"principalReference.js","sourceRoot":"","sources":["principalReference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE3E,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,gBAAgB,CAAC;CAC/D,CAAC;AAEF,MAAM,CAAC,MAAM,sCAAsC,GAAG,gBAAgB,CACpE,qCAAqC,CACtC,CAAC;AAMF,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,OAAO,sCAAsC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACzE,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { boundedPositiveIntegerSchema, loosePlainObject } from \"../schema\";\n\nexport const ReferencedPrincipalStateResponseShape = {\n keyEpoch: z.number(),\n keyFingerprint: z.string(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n};\n\nexport const ReferencedPrincipalStateResponseSchema = loosePlainObject(\n ReferencedPrincipalStateResponseShape,\n);\n\nexport type ReferencedPrincipalStateResponse = z.infer<\n typeof ReferencedPrincipalStateResponseSchema\n>;\n\nexport function isReferencedPrincipalStateResponse(\n value: unknown,\n): value is ReferencedPrincipalStateResponse {\n return ReferencedPrincipalStateResponseSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"principalReference.js","sourceRoot":"","sources":["principalReference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE3E,MAAM,CAAC,MAAM,qCAAqC,GAAG;IACnD,QAAQ,EAAE,4BAA4B,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAC/D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,gBAAgB,CAAC;CAC/D,CAAC;AAEF,MAAM,CAAC,MAAM,sCAAsC,GAAG,gBAAgB,CACpE,qCAAqC,CACtC,CAAC;AAMF,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,OAAO,sCAAsC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACzE,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { boundedPositiveIntegerSchema, loosePlainObject } from \"../schema\";\n\nexport const ReferencedPrincipalStateResponseShape = {\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: z.string(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n};\n\nexport const ReferencedPrincipalStateResponseSchema = loosePlainObject(\n ReferencedPrincipalStateResponseShape,\n);\n\nexport type ReferencedPrincipalStateResponse = z.infer<\n typeof ReferencedPrincipalStateResponseSchema\n>;\n\nexport function isReferencedPrincipalStateResponse(\n value: unknown,\n): value is ReferencedPrincipalStateResponse {\n return ReferencedPrincipalStateResponseSchema.safeParse(value).success;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
- import { arraySchema, boundedPositiveIntegerSchema, loosePlainObject, nonNegativeIntegerSchema, positiveIntegerSchema, } from "../schema.js";
2
+ import { arraySchema, boundedPositiveIntegerSchema, loosePlainObject, nonNegativeIntegerSchema, } from "../schema.js";
3
3
  export const PrincipalStateExternalAuthorityResponseSchema = loosePlainObject({
4
- keyEpoch: positiveIntegerSchema,
4
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
5
5
  keyFingerprint: z.string(),
6
6
  principalId: z.string(),
7
7
  principalType: z.literal("group"),
@@ -14,7 +14,7 @@ export const PrincipalStateResponseSchema = loosePlainObject({
14
14
  externalAuthority: PrincipalStateExternalAuthorityResponseSchema.nullable(),
15
15
  grantCount: nonNegativeIntegerSchema,
16
16
  grantRoot: z.string(),
17
- keyEpoch: z.number(),
17
+ keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
18
18
  keyFingerprint: z.string(),
19
19
  memberCount: nonNegativeIntegerSchema,
20
20
  memberEnvelopesRoot: z.string(),
@@ -57,7 +57,7 @@ export const PrincipalMemberEnvelopeResponseSchema = loosePlainObject({
57
57
  });
58
58
  export const CurrentPrincipalMemberEnvelopesResponseSchema = loosePlainObject({
59
59
  envelopes: arraySchema(PrincipalMemberEnvelopeResponseSchema),
60
- epoch: z.number(),
60
+ epoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
61
61
  principalId: z.string(),
62
62
  principalType: z.literal(["group", "organization"]),
63
63
  stateHash: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"principalSnapshot.js","sourceRoot":"","sources":["principalSnapshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonNegativeIntegerSchema,\n positiveIntegerSchema,\n} from \"../schema\";\n\nexport const PrincipalStateExternalAuthorityResponseSchema = loosePlainObject({\n keyEpoch: positiveIntegerSchema,\n keyFingerprint: z.string(),\n principalId: z.string(),\n principalType: z.literal(\"group\"),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateExternalAuthorityResponse = z.infer<\n typeof PrincipalStateExternalAuthorityResponseSchema\n>;\n\nexport const PrincipalStateResponseSchema = loosePlainObject({\n createdAt: z.string(),\n encapsulationPublicKey: z.string(),\n externalAuthority: PrincipalStateExternalAuthorityResponseSchema.nullable(),\n grantCount: nonNegativeIntegerSchema,\n grantRoot: z.string(),\n keyEpoch: z.number(),\n keyFingerprint: z.string(),\n memberCount: nonNegativeIntegerSchema,\n memberEnvelopesRoot: z.string(),\n membershipMode: z.literal(\"projection\"),\n membershipRoot: z.string(),\n payloadCiphertextHash: z.string(),\n prevStateHash: z.string().nullable(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n projectionRoot: z.string(),\n signature: z.string(),\n signedAt: z.string(),\n signerUserId: z.string(),\n signerUserKeyFingerprint: z.string(),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateResponse = z.infer<\n typeof PrincipalStateResponseSchema\n>;\n\nexport const PrincipalProjectionMemberResponseSchema = loosePlainObject({\n role: z.literal([\"member\", \"admin\"]),\n userId: z.string(),\n});\n\nexport type PrincipalProjectionMemberResponse = z.infer<\n typeof PrincipalProjectionMemberResponseSchema\n>;\n\nexport const PrincipalContainerGrantResponseSchema = loosePlainObject({\n accessLevel: z.literal([\"admin\", \"read\", \"write\"]),\n containerId: z.string(),\n});\n\nexport type PrincipalContainerGrantResponse = z.infer<\n typeof PrincipalContainerGrantResponseSchema\n>;\n\nexport const PrincipalStatePayloadResponseSchema = loosePlainObject({\n cipherSuite: z.literal(\"aes-256-gcm\"),\n ciphertext: z.string(),\n ciphertextHash: z.string(),\n createdAt: z.string(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n});\n\nexport type PrincipalStatePayloadResponse = z.infer<\n typeof PrincipalStatePayloadResponseSchema\n>;\n\nexport const PrincipalMemberEnvelopeResponseSchema = loosePlainObject({\n kemCipherText: z.string(),\n memberKeyFingerprint: z.string(),\n userId: z.string(),\n wrappedKey: z.string(),\n});\n\nexport type PrincipalMemberEnvelopeResponse = z.infer<\n typeof PrincipalMemberEnvelopeResponseSchema\n>;\n\nexport const CurrentPrincipalMemberEnvelopesResponseSchema = loosePlainObject({\n envelopes: arraySchema(PrincipalMemberEnvelopeResponseSchema),\n epoch: z.number(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n});\n\nexport type CurrentPrincipalMemberEnvelopesResponse = z.infer<\n typeof CurrentPrincipalMemberEnvelopesResponseSchema\n>;\n\nexport const PrincipalPolicyStateChainEntryResponseSchema = loosePlainObject({\n grants: arraySchema(PrincipalContainerGrantResponseSchema),\n projection: arraySchema(PrincipalProjectionMemberResponseSchema),\n state: PrincipalStateResponseSchema,\n});\n\nexport type PrincipalPolicyStateChainEntryResponse = z.infer<\n typeof PrincipalPolicyStateChainEntryResponseSchema\n>;\n\nexport const PrincipalPolicySnapshotResponseSchema = loosePlainObject({\n currentGrants: arraySchema(PrincipalContainerGrantResponseSchema),\n currentProjection: arraySchema(PrincipalProjectionMemberResponseSchema),\n currentState: PrincipalStateResponseSchema,\n previousStates: arraySchema(PrincipalPolicyStateChainEntryResponseSchema),\n});\n\nexport type PrincipalPolicySnapshotResponse = z.infer<\n typeof PrincipalPolicySnapshotResponseSchema\n>;\n\nexport function isPrincipalStateResponse(\n value: unknown,\n): value is PrincipalStateResponse {\n return PrincipalStateResponseSchema.safeParse(value).success;\n}\n\nexport function isPrincipalStatePayloadResponse(\n value: unknown,\n): value is PrincipalStatePayloadResponse {\n return PrincipalStatePayloadResponseSchema.safeParse(value).success;\n}\n\nexport function isCurrentPrincipalMemberEnvelopesResponse(\n value: unknown,\n): value is CurrentPrincipalMemberEnvelopesResponse {\n return CurrentPrincipalMemberEnvelopesResponseSchema.safeParse(value).success;\n}\n\nexport function isPrincipalPolicyStateChainEntryResponse(\n value: unknown,\n): value is PrincipalPolicyStateChainEntryResponse {\n return PrincipalPolicyStateChainEntryResponseSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"principalSnapshot.js","sourceRoot":"","sources":["principalSnapshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport {\n arraySchema,\n boundedPositiveIntegerSchema,\n loosePlainObject,\n nonNegativeIntegerSchema,\n} from \"../schema\";\n\nexport const PrincipalStateExternalAuthorityResponseSchema = loosePlainObject({\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: z.string(),\n principalId: z.string(),\n principalType: z.literal(\"group\"),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateExternalAuthorityResponse = z.infer<\n typeof PrincipalStateExternalAuthorityResponseSchema\n>;\n\nexport const PrincipalStateResponseSchema = loosePlainObject({\n createdAt: z.string(),\n encapsulationPublicKey: z.string(),\n externalAuthority: PrincipalStateExternalAuthorityResponseSchema.nullable(),\n grantCount: nonNegativeIntegerSchema,\n grantRoot: z.string(),\n keyEpoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n keyFingerprint: z.string(),\n memberCount: nonNegativeIntegerSchema,\n memberEnvelopesRoot: z.string(),\n membershipMode: z.literal(\"projection\"),\n membershipRoot: z.string(),\n payloadCiphertextHash: z.string(),\n prevStateHash: z.string().nullable(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n projectionRoot: z.string(),\n signature: z.string(),\n signedAt: z.string(),\n signerUserId: z.string(),\n signerUserKeyFingerprint: z.string(),\n stateHash: z.string(),\n version: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n});\n\nexport type PrincipalStateResponse = z.infer<\n typeof PrincipalStateResponseSchema\n>;\n\nexport const PrincipalProjectionMemberResponseSchema = loosePlainObject({\n role: z.literal([\"member\", \"admin\"]),\n userId: z.string(),\n});\n\nexport type PrincipalProjectionMemberResponse = z.infer<\n typeof PrincipalProjectionMemberResponseSchema\n>;\n\nexport const PrincipalContainerGrantResponseSchema = loosePlainObject({\n accessLevel: z.literal([\"admin\", \"read\", \"write\"]),\n containerId: z.string(),\n});\n\nexport type PrincipalContainerGrantResponse = z.infer<\n typeof PrincipalContainerGrantResponseSchema\n>;\n\nexport const PrincipalStatePayloadResponseSchema = loosePlainObject({\n cipherSuite: z.literal(\"aes-256-gcm\"),\n ciphertext: z.string(),\n ciphertextHash: z.string(),\n createdAt: z.string(),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n});\n\nexport type PrincipalStatePayloadResponse = z.infer<\n typeof PrincipalStatePayloadResponseSchema\n>;\n\nexport const PrincipalMemberEnvelopeResponseSchema = loosePlainObject({\n kemCipherText: z.string(),\n memberKeyFingerprint: z.string(),\n userId: z.string(),\n wrappedKey: z.string(),\n});\n\nexport type PrincipalMemberEnvelopeResponse = z.infer<\n typeof PrincipalMemberEnvelopeResponseSchema\n>;\n\nexport const CurrentPrincipalMemberEnvelopesResponseSchema = loosePlainObject({\n envelopes: arraySchema(PrincipalMemberEnvelopeResponseSchema),\n epoch: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n principalId: z.string(),\n principalType: z.literal([\"group\", \"organization\"]),\n stateHash: z.string(),\n});\n\nexport type CurrentPrincipalMemberEnvelopesResponse = z.infer<\n typeof CurrentPrincipalMemberEnvelopesResponseSchema\n>;\n\nexport const PrincipalPolicyStateChainEntryResponseSchema = loosePlainObject({\n grants: arraySchema(PrincipalContainerGrantResponseSchema),\n projection: arraySchema(PrincipalProjectionMemberResponseSchema),\n state: PrincipalStateResponseSchema,\n});\n\nexport type PrincipalPolicyStateChainEntryResponse = z.infer<\n typeof PrincipalPolicyStateChainEntryResponseSchema\n>;\n\nexport const PrincipalPolicySnapshotResponseSchema = loosePlainObject({\n currentGrants: arraySchema(PrincipalContainerGrantResponseSchema),\n currentProjection: arraySchema(PrincipalProjectionMemberResponseSchema),\n currentState: PrincipalStateResponseSchema,\n previousStates: arraySchema(PrincipalPolicyStateChainEntryResponseSchema),\n});\n\nexport type PrincipalPolicySnapshotResponse = z.infer<\n typeof PrincipalPolicySnapshotResponseSchema\n>;\n\nexport function isPrincipalStateResponse(\n value: unknown,\n): value is PrincipalStateResponse {\n return PrincipalStateResponseSchema.safeParse(value).success;\n}\n\nexport function isPrincipalStatePayloadResponse(\n value: unknown,\n): value is PrincipalStatePayloadResponse {\n return PrincipalStatePayloadResponseSchema.safeParse(value).success;\n}\n\nexport function isCurrentPrincipalMemberEnvelopesResponse(\n value: unknown,\n): value is CurrentPrincipalMemberEnvelopesResponse {\n return CurrentPrincipalMemberEnvelopesResponseSchema.safeParse(value).success;\n}\n\nexport function isPrincipalPolicyStateChainEntryResponse(\n value: unknown,\n): value is PrincipalPolicyStateChainEntryResponse {\n return PrincipalPolicyStateChainEntryResponseSchema.safeParse(value).success;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tearleads/client-sdk",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "React-free Tearleads client runtime: local SQLite persistence, keys, sync, encrypted blobs, and domain workflows.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -11,7 +11,7 @@ export function referencedPrincipalHeadsFromContainerMutationResponse(input) {
11
11
  return input.response.referencedPrincipalHeads.flatMap((head) => {
12
12
  if (!isReferencedPrincipalStateResponse(head) ||
13
13
  !Number.isInteger(head.version) ||
14
- !Number.isInteger(head.keyEpoch)) {
14
+ !Number.isSafeInteger(head.keyEpoch)) {
15
15
  return [];
16
16
  }
17
17
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"mutationResponse.js","sourceRoot":"","sources":["mutationResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,GAEnC,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,uCAAuC,CAAC,KAIvD;IACC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EACnC,oBAAoB,CACrB,CAAC;IACF,IACE,OAAO,kBAAkB,KAAK,QAAQ;QACtC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qDAAqD,CAAC,KAErE;IACC,OAAO,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9D,IACE,CAAC,kCAAkC,CAAC,IAAI,CAAC;YACzC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/B,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAChC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n isReferencedPrincipalStateResponse,\n type ReferencedPrincipalStateResponse,\n} from \"@tearleads/validators/response\";\n\nexport function readContainerMutationMetadataDocumentId(input: {\n response: {\n accessManifest: { state: Record<string, unknown> };\n };\n}): string {\n const metadataDocumentId = Reflect.get(\n input.response.accessManifest.state,\n \"metadataDocumentId\",\n );\n if (\n typeof metadataDocumentId !== \"string\" ||\n metadataDocumentId.length === 0\n ) {\n throw new Error(\"Container mutation response is missing metadata state\");\n }\n\n return metadataDocumentId;\n}\n\nexport function referencedPrincipalHeadsFromContainerMutationResponse(input: {\n response: { referencedPrincipalHeads: readonly unknown[] };\n}): ReferencedPrincipalStateResponse[] {\n return input.response.referencedPrincipalHeads.flatMap((head) => {\n if (\n !isReferencedPrincipalStateResponse(head) ||\n !Number.isInteger(head.version) ||\n !Number.isInteger(head.keyEpoch)\n ) {\n return [];\n }\n\n return [\n {\n principalType: head.principalType,\n principalId: head.principalId,\n version: head.version,\n keyEpoch: head.keyEpoch,\n stateHash: head.stateHash,\n keyFingerprint: head.keyFingerprint,\n },\n ];\n });\n}\n"]}
1
+ {"version":3,"file":"mutationResponse.js","sourceRoot":"","sources":["mutationResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,GAEnC,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,uCAAuC,CAAC,KAIvD;IACC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EACnC,oBAAoB,CACrB,CAAC;IACF,IACE,OAAO,kBAAkB,KAAK,QAAQ;QACtC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qDAAqD,CAAC,KAErE;IACC,OAAO,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9D,IACE,CAAC,kCAAkC,CAAC,IAAI,CAAC;YACzC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n isReferencedPrincipalStateResponse,\n type ReferencedPrincipalStateResponse,\n} from \"@tearleads/validators/response\";\n\nexport function readContainerMutationMetadataDocumentId(input: {\n response: {\n accessManifest: { state: Record<string, unknown> };\n };\n}): string {\n const metadataDocumentId = Reflect.get(\n input.response.accessManifest.state,\n \"metadataDocumentId\",\n );\n if (\n typeof metadataDocumentId !== \"string\" ||\n metadataDocumentId.length === 0\n ) {\n throw new Error(\"Container mutation response is missing metadata state\");\n }\n\n return metadataDocumentId;\n}\n\nexport function referencedPrincipalHeadsFromContainerMutationResponse(input: {\n response: { referencedPrincipalHeads: readonly unknown[] };\n}): ReferencedPrincipalStateResponse[] {\n return input.response.referencedPrincipalHeads.flatMap((head) => {\n if (\n !isReferencedPrincipalStateResponse(head) ||\n !Number.isInteger(head.version) ||\n !Number.isSafeInteger(head.keyEpoch)\n ) {\n return [];\n }\n\n return [\n {\n principalType: head.principalType,\n principalId: head.principalId,\n version: head.version,\n keyEpoch: head.keyEpoch,\n stateHash: head.stateHash,\n keyFingerprint: head.keyFingerprint,\n },\n ];\n });\n}\n"]}