From 40cfc8380d2b213aa87e42ce07d3de2dff603105 Mon Sep 17 00:00:00 2001 From: Amy Yan Date: Mon, 22 Jul 2024 14:06:02 +1000 Subject: [PATCH] wip: claimNetworkNode payload --- src/claims/payloads/claimNetworkNode.ts | 69 +++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/claims/payloads/claimNetworkNode.ts diff --git a/src/claims/payloads/claimNetworkNode.ts b/src/claims/payloads/claimNetworkNode.ts new file mode 100644 index 000000000..a2db40b80 --- /dev/null +++ b/src/claims/payloads/claimNetworkNode.ts @@ -0,0 +1,69 @@ +import type { Claim, SignedClaim } from '../types'; +import type { NodeIdEncoded } from '../../ids/types'; +import * as ids from '../../ids'; +import * as claimsUtils from '../utils'; +import * as tokensUtils from '../../tokens/utils'; +import * as validationErrors from '../../validation/errors'; +import * as utils from '../../utils'; + +/** + * Asserts that a node is apart of a network + */ +interface ClaimNetworkNode extends Claim { + typ: 'ClaimNetworkNode'; + iss: NodeIdEncoded; + sub: NodeIdEncoded; +} + + +function assertClaimNetworkNode( + claimNetworkNode: unknown, +): asserts claimNetworkNode is ClaimNetworkNode { + if (!utils.isObject(claimNetworkNode)) { + throw new validationErrors.ErrorParse('must be POJO'); + } + if (claimNetworkNode['typ'] !== 'ClaimNetworkNode') { + throw new validationErrors.ErrorParse( + '`typ` property must be `ClaimNetworkNode`', + ); + } + if ( + claimNetworkNode['iss'] == null || + ids.decodeNodeId(claimNetworkNode['iss']) == null + ) { + throw new validationErrors.ErrorParse( + '`iss` property must be an encoded node ID', + ); + } + if ( + claimNetworkNode['sub'] == null || + ids.decodeNodeId(claimNetworkNode['sub']) == null + ) { + throw new validationErrors.ErrorParse( + '`sub` property must be an encoded node ID', + ); + } +} + +function parseClaimNetworkNode(claimNetworkNodeEncoded: unknown): ClaimNetworkNode { + const claimNetworkNode = claimsUtils.parseClaim(claimNetworkNodeEncoded); + assertClaimNetworkNode(claimNetworkNode); + return claimNetworkNode; +} + +function parseSignedClaimNetworkNode( + signedClaimNetworkNodeEncoded: unknown, +): SignedClaim { + const signedClaim = tokensUtils.parseSignedToken(signedClaimNetworkNodeEncoded); + assertClaimNetworkNode(signedClaim.payload); + return signedClaim as SignedClaim; +} + + +export { + assertClaimNetworkNode, + parseClaimNetworkNode, + parseSignedClaimNetworkNode, +}; + +export type { ClaimNetworkNode };