@receiz/sdk 93.2.0 → 94.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,6 +21,10 @@ const receiz = createReceizClient({
21
21
 
22
22
  The SDK is convenience, not authority. It reads public API projections, sends delegated actions, validates developer manifests, and verifies webhook delivery signatures. Sealed artifacts, proof bundles, verified appends, ownership appends, and settlement ledger records remain the stronger source of truth.
23
23
 
24
+ Receiz ID is the default account-continuity rail for everyday login. It does not replace PBI/passkey, email magic-link recovery, Receiz Key, Identity Record, Identity Seal, or OIDC/Connect. Those rails all preserve the same account when bound: PBI/passkey can create or recover a Receiz account, email can recover the account, Receiz identity artifacts can restore it locally, and OIDC/Connect can delegate API access after identity proof.
25
+
26
+ Receiz Key, Identity Record, and Identity Seal are Receiz identity primitives exposed through the SDK for developer apps. Their current account-state envelope is `receiz.account.state.v3`; it carries admitted account proof memory across profile, action ledger, calendar, wallet settlement, Sports vault/cards/appends/event proofs, and related entries. The SDK mirrors the same law for developer apps through local proof registers: admit verified truth once, persist it, and ask Receiz only for verified additions after the known head. Connect is delegated API access; it is not the identity proof root.
27
+
24
28
  Default integration order:
25
29
 
26
30
  1. Verify first, then project.
@@ -82,6 +86,43 @@ const snapshot = memory.snapshot();
82
86
 
83
87
  Use schemas for developer validation, projections for display-ready proof rows, and proof memory for first-admission-then-append-forever UX.
84
88
 
89
+ ## Receiz ID Account Creation And Recovery
90
+
91
+ Developers can let users create a fresh Receiz ID account, recover from a Receiz Key, or login with an Identity Record / Identity Seal image without inventing a parallel login model. Receiz ID is the default login path, but it does not replace the existing rails: PBI/passkey stays available for account creation, account recovery, and account signing; email magic-link stays available for recovery; OIDC/Connect stays available for delegated API access. The result is one account, not separate accounts for each rail.
92
+
93
+ ```ts
94
+ import {
95
+ buildReceizIdContinueRequest,
96
+ createReceizIdIdentity,
97
+ projectReceizIdentityAccount,
98
+ readReceizIdentityArtifact,
99
+ signReceizIdentityLoginProof,
100
+ } from "@receiz/sdk";
101
+
102
+ const identity = await createReceizIdIdentity({
103
+ username: "builder",
104
+ displayName: "Builder",
105
+ });
106
+
107
+ const keyFile = await readReceizIdentityArtifact(fileOrImageBytes);
108
+ const account = await projectReceizIdentityAccount(keyFile);
109
+
110
+ if (!account.portableStateVerified) throw new Error("identity proof failed");
111
+
112
+ const proof = await signReceizIdentityLoginProof({
113
+ keyFile,
114
+ challengeText: "your-app-login-challenge",
115
+ });
116
+
117
+ const receizPublication = await buildReceizIdContinueRequest(identity, {
118
+ next: "/profile",
119
+ });
120
+ ```
121
+
122
+ Use the local projection for first paint in your app. Send the continuation request to Receiz only when you need Receiz infrastructure to append global continuity or issue a Receiz session. Use Connect after proof login when your app needs delegated Receiz API access.
123
+
124
+ Full quickstart: `docs/identity-login-and-recovery.md`.
125
+
85
126
  ## Artifact Verification
86
127
 
87
128
  ```ts
@@ -0,0 +1,172 @@
1
+ export declare const RECEIZ_KEY_SCHEMA = "receiz.key.v1";
2
+ export declare const RECEIZ_KEY_NAME = "Receiz Key";
3
+ export declare const RECEIZ_ACCOUNT_STATE_SCHEMA = "receiz.account.state.v3";
4
+ export declare const RECEIZ_DEVICE_IDENTITY_SCHEMA = "receiz.device.identity.v1";
5
+ export declare const RECEIZ_IDENTITY_LOGIN_PROOF_SCHEMA = "receiz.identity.login_proof.v1";
6
+ export declare const RECEIZ_IDENTITY_ACCOUNT_PROJECTION_SCHEMA = "receiz.sdk.identity_account_projection.v1";
7
+ export declare const RECEIZ_IDENTITY_RECORD_KEY_CHUNK_KEY = "receiz.identity_record.keyfile.v1";
8
+ export type ReceizIdentityKeyAlgorithm = "Ed25519" | "P-256";
9
+ export type ReceizPortableStateProofMethod = "ed25519.jcs.v1" | "ecdsa-p256-sha256.jcs.v1";
10
+ export type ReceizKeyOwner = {
11
+ uid: string;
12
+ email: string | null;
13
+ username: string | null;
14
+ displayName: string | null;
15
+ };
16
+ export type ReceizPortableStateProof = {
17
+ method: ReceizPortableStateProofMethod;
18
+ digestSha256Hex: string;
19
+ signatureB64u: string;
20
+ signedAt: string;
21
+ };
22
+ export type ReceizPortableState = {
23
+ schema: string;
24
+ exportedAt: string;
25
+ snapshot: unknown;
26
+ proof: ReceizPortableStateProof | null;
27
+ };
28
+ export type ReceizKeyAttestation = {
29
+ pbiDecision: string;
30
+ pbiReceiptHash: string;
31
+ pbiChallengeId: string;
32
+ pbiRequestId: string | null;
33
+ attestedAt: string;
34
+ };
35
+ export type ReceizKeyFileV1 = {
36
+ schema: typeof RECEIZ_KEY_SCHEMA;
37
+ name: typeof RECEIZ_KEY_NAME;
38
+ version: 1;
39
+ issuedAt: string;
40
+ keyId: string;
41
+ alg: ReceizIdentityKeyAlgorithm;
42
+ owner: ReceizKeyOwner;
43
+ crypto: {
44
+ publicKeyRawB64u: string;
45
+ privateKeyPkcs8CiphertextB64u: string;
46
+ privateKeyPkcs8B64u?: string | null;
47
+ kdf: {
48
+ name: "PBKDF2-SHA256";
49
+ iterations: number;
50
+ saltB64u: string;
51
+ };
52
+ cipher: {
53
+ name: "AES-GCM-256";
54
+ ivB64u: string;
55
+ aad: string;
56
+ };
57
+ };
58
+ attestation: ReceizKeyAttestation | null;
59
+ portableState: ReceizPortableState | null;
60
+ };
61
+ export type ReceizKeyFile = ReceizKeyFileV1;
62
+ export type ReceizDeviceIdentity = {
63
+ schema: typeof RECEIZ_DEVICE_IDENTITY_SCHEMA;
64
+ createdAt: string;
65
+ updatedAt: string;
66
+ localUid: string;
67
+ username: string;
68
+ displayName: string;
69
+ deviceName: string | null;
70
+ keyFile: ReceizKeyFile;
71
+ };
72
+ export type ReceizIdIdentityOptions = {
73
+ username?: string | null | undefined;
74
+ displayName?: string | null | undefined;
75
+ deviceName?: string | null | undefined;
76
+ createdAt?: string | undefined;
77
+ passphrase?: string | undefined;
78
+ allowP256Fallback?: boolean | undefined;
79
+ pbkdf2Iterations?: number | undefined;
80
+ };
81
+ export type ReceizIdentityLoginProof = {
82
+ schema: typeof RECEIZ_IDENTITY_LOGIN_PROOF_SCHEMA;
83
+ keyId: string;
84
+ alg: ReceizIdentityKeyAlgorithm;
85
+ challengeB64Url: string;
86
+ signatureB64Url: string;
87
+ };
88
+ export type ReceizIdentityLoginProofInput = {
89
+ keyFile: ReceizKeyFile;
90
+ passphrase?: string | undefined;
91
+ challengeText?: string | undefined;
92
+ challengeB64Url?: string | undefined;
93
+ };
94
+ export type ReceizIdContinueRequest = {
95
+ keyId: string;
96
+ alg: ReceizIdentityKeyAlgorithm;
97
+ publicKeyRawB64u: string;
98
+ localUid: string;
99
+ username: string;
100
+ displayName: string;
101
+ deviceName: string | null;
102
+ createdAt: string;
103
+ challengeB64Url: string;
104
+ signatureB64Url: string;
105
+ next?: string;
106
+ };
107
+ export type ReceizIdContinueOptions = {
108
+ next?: string | undefined;
109
+ nowMs?: number | undefined;
110
+ nonceB64Url?: string | undefined;
111
+ passphrase?: string | undefined;
112
+ };
113
+ export type ReceizIdentityAccountProjection = {
114
+ schema: typeof RECEIZ_IDENTITY_ACCOUNT_PROJECTION_SCHEMA;
115
+ keyId: string;
116
+ alg: ReceizIdentityKeyAlgorithm;
117
+ owner: ReceizKeyOwner;
118
+ accountStateSchema: string | null;
119
+ portableStateVerified: boolean;
120
+ portableStateStatus: "verified" | "missing" | "invalid";
121
+ snapshot: unknown;
122
+ domains: {
123
+ profile: boolean;
124
+ actionLedger: boolean;
125
+ calendar: boolean;
126
+ wallet: boolean;
127
+ sports: boolean;
128
+ };
129
+ };
130
+ export declare function receizBase64UrlEncode(bytes: Uint8Array): string;
131
+ export declare function receizBase64UrlDecode(value: string): Uint8Array;
132
+ export declare function parseReceizIdentityArtifactText(text: string): ReceizKeyFileV1;
133
+ export declare function appendReceizIdentityArtifactTrailerToPng(pngBytes: Uint8Array, keyFile: ReceizKeyFile): Uint8Array;
134
+ export declare function readReceizIdentityArtifact(input: Blob | ArrayBuffer | Uint8Array | string): Promise<ReceizKeyFileV1>;
135
+ export declare function serializeReceizIdentityArtifact(keyFile: ReceizKeyFile): string;
136
+ export declare function deriveReceizIdentityKeyIdFromPublicKeyRawB64u(publicKeyRawB64u: string, alg?: ReceizIdentityKeyAlgorithm): Promise<string>;
137
+ export declare function createReceizIdentityKeyFile(args: {
138
+ passphrase?: string | undefined;
139
+ owner: {
140
+ uid: string;
141
+ email?: string | null;
142
+ username?: string | null;
143
+ displayName?: string | null;
144
+ };
145
+ portableState?: {
146
+ schema?: string;
147
+ snapshot: unknown;
148
+ } | null;
149
+ issuedAt?: string | undefined;
150
+ pbkdf2Iterations?: number | undefined;
151
+ allowP256Fallback?: boolean | undefined;
152
+ }): Promise<{
153
+ keyFile: ReceizKeyFileV1;
154
+ keyId: string;
155
+ publicKeyRawB64u: string;
156
+ alg: ReceizIdentityKeyAlgorithm;
157
+ }>;
158
+ export declare function createReceizIdIdentity(options?: ReceizIdIdentityOptions): Promise<ReceizDeviceIdentity>;
159
+ export declare function decryptReceizIdentityPrivateSigningKey(args: {
160
+ keyFile: ReceizKeyFile;
161
+ passphrase?: string | undefined;
162
+ }): Promise<CryptoKey>;
163
+ export declare function signReceizIdentityLoginProof(input: ReceizIdentityLoginProofInput): Promise<ReceizIdentityLoginProof>;
164
+ export declare function verifyReceizIdentityLoginProof(args: {
165
+ keyFile: ReceizKeyFile;
166
+ challengeB64Url: string;
167
+ signatureB64Url: string;
168
+ }): Promise<boolean>;
169
+ export declare function verifyReceizIdentityPortableStateProof(keyFileInput: ReceizKeyFile): Promise<"verified" | "missing" | "invalid">;
170
+ export declare function buildReceizIdContinueRequest(identity: ReceizDeviceIdentity, options?: ReceizIdContinueOptions): Promise<ReceizIdContinueRequest>;
171
+ export declare function projectReceizIdentityAccount(keyFileInput: ReceizKeyFile): Promise<ReceizIdentityAccountProjection>;
172
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}