@renown/sdk 6.2.3-dev.23 → 6.2.3-dev.25

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 (85) hide show
  1. package/dist/{browser-key-storage-e3RQsnLS.js → browser-key-storage-wjSwTnhs.js} +3 -2
  2. package/dist/browser-key-storage-wjSwTnhs.js.map +1 -0
  3. package/dist/{constants-BexAR53F.js → constants-DVOF17NB.js} +1 -1
  4. package/dist/{constants-BexAR53F.js.map → constants-DVOF17NB.js.map} +1 -1
  5. package/dist/crypto.d.ts +4 -3
  6. package/dist/crypto.js +2 -2
  7. package/dist/{index-BLIpkdF7.d.ts → index-CGTiUojp.d.ts} +11 -20
  8. package/dist/index-CGTiUojp.d.ts.map +1 -0
  9. package/dist/index.d.ts +12 -11
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +11 -7
  12. package/dist/index.js.map +1 -1
  13. package/dist/local-credential-verifier-BC4HS01T.js +429 -0
  14. package/dist/local-credential-verifier-BC4HS01T.js.map +1 -0
  15. package/dist/{meta-D-5kvwx8.js → meta-4NmijIbE.js} +2 -2
  16. package/dist/{meta-D-5kvwx8.js.map → meta-4NmijIbE.js.map} +1 -1
  17. package/dist/{meta-CHgd9Qd0.js → meta-B2fHYlPD.js} +2 -2
  18. package/dist/{meta-CHgd9Qd0.js.map → meta-B2fHYlPD.js.map} +1 -1
  19. package/dist/{meta-bV7L-1yb.d.ts → meta-CpBbgZnu.d.ts} +3 -3
  20. package/dist/meta-CpBbgZnu.d.ts.map +1 -0
  21. package/dist/{meta-BesJP74N.d.ts → meta-DlON7DmF.d.ts} +3 -3
  22. package/dist/meta-DlON7DmF.d.ts.map +1 -0
  23. package/dist/node.d.ts +42 -25
  24. package/dist/node.d.ts.map +1 -1
  25. package/dist/node.js +23 -7
  26. package/dist/node.js.map +1 -1
  27. package/dist/{signer-DrjINLqt.js → signer-GzTlZLjR.js} +38 -106
  28. package/dist/signer-GzTlZLjR.js.map +1 -0
  29. package/dist/{local-credential-verifier-CU8hmFlR.js → signer-trust-C6UJAsNJ.js} +120 -421
  30. package/dist/signer-trust-C6UJAsNJ.js.map +1 -0
  31. package/dist/signer-trust-DstQutcf.d.ts +53 -0
  32. package/dist/signer-trust-DstQutcf.d.ts.map +1 -0
  33. package/dist/trust.d.ts +3 -0
  34. package/dist/trust.js +2 -0
  35. package/dist/{types-DInveFLz.d.ts → types-Bsve10Ny.d.ts} +3 -3
  36. package/dist/types-Bsve10Ny.d.ts.map +1 -0
  37. package/dist/{types-C-hJrsQg.d.ts → types-CHIgkzKb.d.ts} +3 -3
  38. package/dist/types-CHIgkzKb.d.ts.map +1 -0
  39. package/dist/{types-BGQKPoUr.d.ts → types-DOTk0z2D.d.ts} +16 -6
  40. package/dist/types-DOTk0z2D.d.ts.map +1 -0
  41. package/dist/{types-C_qc_62W.js → types-Dwy6khXb.js} +1 -1
  42. package/dist/{types-C_qc_62W.js.map → types-Dwy6khXb.js.map} +1 -1
  43. package/dist/{utils-DtWREYeO.d.ts → utils-C_2VV8CS.d.ts} +5 -12
  44. package/dist/utils-C_2VV8CS.d.ts.map +1 -0
  45. package/dist/utils-DLQ5VVqT.js +75 -0
  46. package/dist/utils-DLQ5VVqT.js.map +1 -0
  47. package/dist/wallet/index.d.ts +5 -5
  48. package/dist/wallet/index.d.ts.map +1 -1
  49. package/dist/wallet/index.js +1 -1
  50. package/dist/wallet/index.js.map +1 -1
  51. package/dist/wallet/mock/factory.d.ts +4 -5
  52. package/dist/wallet/mock/factory.d.ts.map +1 -1
  53. package/dist/wallet/mock/factory.js +1 -1
  54. package/dist/wallet/mock/factory.js.map +1 -1
  55. package/dist/wallet/mock/index.d.ts +5 -5
  56. package/dist/wallet/mock/index.d.ts.map +1 -1
  57. package/dist/wallet/mock/index.js +1 -1
  58. package/dist/wallet/mock/index.js.map +1 -1
  59. package/dist/wallet/privy/factory.d.ts +9 -11
  60. package/dist/wallet/privy/factory.d.ts.map +1 -1
  61. package/dist/wallet/privy/factory.js +2 -2
  62. package/dist/wallet/privy/factory.js.map +1 -1
  63. package/dist/wallet/privy/index.d.ts +5 -5
  64. package/dist/wallet/privy/index.d.ts.map +1 -1
  65. package/dist/wallet/privy/index.js +1 -1
  66. package/dist/wallet/privy/index.js.map +1 -1
  67. package/dist/wallet/rainbow/factory.d.ts +5 -4
  68. package/dist/wallet/rainbow/factory.d.ts.map +1 -1
  69. package/dist/wallet/rainbow/factory.js +2 -2
  70. package/dist/wallet/rainbow/factory.js.map +1 -1
  71. package/dist/wallet/rainbow/index.d.ts +5 -5
  72. package/dist/wallet/rainbow/index.d.ts.map +1 -1
  73. package/dist/wallet/rainbow/index.js +1 -1
  74. package/dist/wallet/rainbow/index.js.map +1 -1
  75. package/package.json +11 -4
  76. package/dist/browser-key-storage-e3RQsnLS.js.map +0 -1
  77. package/dist/index-BLIpkdF7.d.ts.map +0 -1
  78. package/dist/local-credential-verifier-CU8hmFlR.js.map +0 -1
  79. package/dist/meta-BesJP74N.d.ts.map +0 -1
  80. package/dist/meta-bV7L-1yb.d.ts.map +0 -1
  81. package/dist/signer-DrjINLqt.js.map +0 -1
  82. package/dist/types-BGQKPoUr.d.ts.map +0 -1
  83. package/dist/types-C-hJrsQg.d.ts.map +0 -1
  84. package/dist/types-DInveFLz.d.ts.map +0 -1
  85. package/dist/utils-DtWREYeO.d.ts.map +0 -1
package/dist/node.d.ts CHANGED
@@ -1,17 +1,18 @@
1
- import { A as LoginStatus, B as Service, C as InternalUser, Ct as DOMAIN_TYPE, D as JWTVerifyPolicies, Dt as VERIFIABLE_CREDENTIAL_EIP712_TYPE, E as JWTVerified, Et as RENOWN_SESSION_COOKIE, F as RenownEventEmitter, G as User, H as SignInParams, I as RenownEvents, J as VerificationMethod, K as UserActionSigner, L as RenownProfile, M as PowerhouseVerifiableCredential, N as ProfileFetcher, O as JsonWebKey, P as Proof, Q as BaseStorage, R as RenownStorage, S as IVerifiableCredential, St as DEFAULT_RENOWN_URL, T as JWTPayload, Tt as RENOWN_READ_MODEL_SUBGRAPH, U as Signer, V as ServiceEndpoint, W as Unsubscribe, X as VerifiedJWT, Y as VerifiedCredential, Z as W3CCredential, _ as IPowerhouseCredentialSubject, _t as CREDENTIAL_SCHEMA_EIP712_TYPE, a as JwkKeyPair, at as SignCredentialTypedData, b as IRenown, bt as DEFAULT_RENOWN_CHAIN_ID, c as ConditionWeightedThreshold, ct as buildAndSignCredential, d as DIDDocument, dt as verifyAuthCredential, et as IEventEmitter, f as DIDDocumentMetadata, ft as verifyCredentialSignature, g as IAuthCredentialSubject, gt as SwitchboardSource, h as EcdsaSignature, ht as SwitchboardRequestFn, i as JsonWebKeyPairStorage, it as FetchDelegationCredentialOptions, j as PKHDid, k as KeyCapabilitySection, l as CreateBearerTokenOptions, lt as fetchDelegationCredential, m as DIDResolutionResult, mt as SwitchboardClient, n as IConnectCrypto, nt as CredentialDomain, o as AuthVerifiableCredential, ot as VerifiedAuthCredential, p as DIDResolutionMetadata, pt as MissingSwitchboardError, q as Verifiable, r as IRenownCrypto, rt as CredentialMessage, s as AuthVerifiedCredential, st as VerifyAuthCredentialOptions, t as DID, tt as BuildCredentialParams, u as CredentialStatus, ut as recoverCredentialSigner, v as IPowerhouseIssuerType, vt as CREDENTIAL_SUBJECT_TYPE, w as Issuer, wt as ISSUER_TYPE, x as ISigner, xt as DEFAULT_RENOWN_NETWORK_ID, y as IProof, yt as CREDENTIAL_TYPES, z as RenownStorageMap } from "./types-BGQKPoUr.js";
2
- import { a as parseSignatureHashField, c as RenownCryptoBuilder, i as extractResultingHashFromSignature, l as ConnectCrypto, n as RenownCryptoSigner, o as signatureHasResultingHash, r as createSignatureVerifier, s as MemoryKeyStorage, u as RenownCrypto } from "./index-BLIpkdF7.js";
3
- import { C as resolveSwitchboardEndpoint, S as ResolveSwitchboardEndpointOptions, T as RenownMemoryStorage, _ as CredentialCheck, a as getResolver, b as BaseRenownBuilder, c as RenownSession, d as RenownSessionProfile, f as VerifyRenownSessionOptions, g as fetchRenownProfile, h as verifyRenownSession, i as createAuthBearerToken, l as RenownSessionClaims, m as serializeRenownSessionCookie, n as VerifyAuthBearerTokenOptions, o as parsePkhDid, p as readSessionClaims, r as assertIsAuthCredential, s as verifyAuthBearerToken, t as ILogger, u as RenownSessionCookie, v as LocalCredentialVerifierOptions, w as Renown, x as RenownBuilderOptions, y as createLocalCredentialVerifier } from "./utils-DtWREYeO.js";
4
-
1
+ import { A as LoginStatus, B as Service, C as InternalUser, Ct as DEFAULT_RENOWN_URL, D as JWTVerifyPolicies, Dt as RENOWN_SESSION_COOKIE, E as JWTVerified, Et as RENOWN_READ_MODEL_SUBGRAPH, F as RenownEventEmitter, G as User, H as SignInParams, I as RenownEvents, J as VerificationMethod, K as UserActionSigner, L as RenownProfile, M as PowerhouseVerifiableCredential, N as ProfileFetcher, O as JsonWebKey, Ot as VERIFIABLE_CREDENTIAL_EIP712_TYPE, P as Proof, Q as BaseStorage, R as RenownStorage, S as IVerifiableCredential, St as DEFAULT_RENOWN_NETWORK_ID, T as JWTPayload, Tt as ISSUER_TYPE, U as Signer, V as ServiceEndpoint, W as Unsubscribe, X as VerifiedJWT, Y as VerifiedCredential, Z as W3CCredential, _ as IPowerhouseCredentialSubject, _t as SwitchboardSource, a as JwkKeyPair, at as SignCredentialTypedData, b as IRenown, bt as CREDENTIAL_TYPES, c as ConditionWeightedThreshold, ct as buildAndSignCredential, d as DIDDocument, dt as verifyAuthCredential, et as IEventEmitter, f as DIDDocumentMetadata, ft as verifyCredentialSignature, g as IAuthCredentialSubject, gt as SwitchboardRequestFn, h as EcdsaSignature, ht as SwitchboardClient, i as JsonWebKeyPairStorage, it as FetchDelegationCredentialOptions, j as PKHDid, k as KeyCapabilitySection, l as CreateBearerTokenOptions, lt as fetchDelegationCredential, m as DIDResolutionResult, mt as MissingSwitchboardError, n as IConnectCrypto, nt as CredentialDomain, o as AuthVerifiableCredential, ot as VerifiedAuthCredential, p as DIDResolutionMetadata, pt as verifyDelegationProof, q as Verifiable, r as IRenownCrypto, rt as CredentialMessage, s as AuthVerifiedCredential, st as VerifyAuthCredentialOptions, t as DID, tt as BuildCredentialParams, u as CredentialStatus, ut as recoverCredentialSigner, v as IPowerhouseIssuerType, vt as CREDENTIAL_SCHEMA_EIP712_TYPE, w as Issuer, wt as DOMAIN_TYPE, x as ISigner, xt as DEFAULT_RENOWN_CHAIN_ID, y as IProof, yt as CREDENTIAL_SUBJECT_TYPE, z as RenownStorageMap } from "./types-DOTk0z2D.js";
2
+ import { a as parseSignatureHashField, c as RenownCryptoBuilder, i as extractResultingHashFromSignature, l as ConnectCrypto, n as RenownCryptoSigner, o as signatureHasResultingHash, r as createSignatureVerifier, s as MemoryKeyStorage, u as RenownCrypto } from "./index-CGTiUojp.js";
3
+ import { C as RenownMemoryStorage, S as Renown, _ as CredentialCheck, a as getResolver, b as BaseRenownBuilder, c as RenownSession, d as RenownSessionProfile, f as VerifyRenownSessionOptions, g as fetchRenownProfile, h as verifyRenownSession, i as createAuthBearerToken, l as RenownSessionClaims, m as serializeRenownSessionCookie, n as VerifyAuthBearerTokenOptions, o as parsePkhDid, p as readSessionClaims, r as assertIsAuthCredential, s as verifyAuthBearerToken, t as ILogger, u as RenownSessionCookie, v as LocalCredentialVerifierOptions, x as RenownBuilderOptions, y as createLocalCredentialVerifier } from "./utils-C_2VV8CS.js";
4
+ import { a as ResolveSwitchboardEndpointOptions, i as createRenownTrustPolicy, n as RenownTrustPolicy, o as resolveSwitchboardEndpoint, r as RenownTrustPolicyOptions, t as RenownOwnSigner } from "./signer-trust-DstQutcf.js";
5
+ import { UserActionSigner as UserActionSigner$1 } from "@powerhousedao/shared/document-model";
5
6
  //#region src/crypto/node-key-storage.d.ts
6
- declare const RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
7
- declare const DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
7
+ export declare const RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
8
+ export declare const DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
8
9
  /**
9
10
  * Key storage that supports:
10
11
  * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)
11
12
  * 2. Custom file path passed via options
12
13
  * 3. Falls back to file storage at .ph/.keypair.json in current working directory
13
14
  */
14
- declare class NodeKeyStorage implements JsonWebKeyPairStorage {
15
+ export declare class NodeKeyStorage implements JsonWebKeyPairStorage {
15
16
  #private;
16
17
  static readonly DEFAULT_KEYPAIR_PATH = ".ph/.keypair.json";
17
18
  static readonly RENOWN_PRIVATE_KEY_ENV = "PH_RENOWN_PRIVATE_KEY";
@@ -24,8 +25,23 @@ declare class NodeKeyStorage implements JsonWebKeyPairStorage {
24
25
  removeKeyPair(): Promise<void>;
25
26
  }
26
27
  //#endregion
28
+ //#region src/crypto/node-signer.d.ts
29
+ type NodeRenownSignerArgs = {
30
+ appName: string;
31
+ /** Defaults to `.ph/.keypair.json` in cwd; `PH_RENOWN_PRIVATE_KEY` wins. */
32
+ keypairPath?: string;
33
+ user?: UserActionSigner$1;
34
+ /** The did the stored key must have. */
35
+ did?: string;
36
+ };
37
+ /**
38
+ * Rebuilds the signer of a key another thread already holds, for a pooled
39
+ * reactor worker that cannot be handed the key itself. Never generates a key.
40
+ */
41
+ export declare function createNodeRenownSigner(args: NodeRenownSignerArgs): Promise<RenownCryptoSigner>;
42
+ //#endregion
27
43
  //#region src/event/event.node.d.ts
28
- declare class NodeEventEmitter<Events extends Record<string, unknown>> implements IEventEmitter<Events> {
44
+ export declare class NodeEventEmitter<Events extends Record<string, unknown>> implements IEventEmitter<Events> {
29
45
  #private;
30
46
  constructor();
31
47
  on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): () => void;
@@ -33,7 +49,7 @@ declare class NodeEventEmitter<Events extends Record<string, unknown>> implement
33
49
  }
34
50
  //#endregion
35
51
  //#region src/storage/storage.node.d.ts
36
- declare class NodeStorage<T extends Record<string, unknown> = Record<string, unknown>> extends BaseStorage<T> {
52
+ export declare class NodeStorage<T extends Record<string, unknown> = Record<string, unknown>> extends BaseStorage<T> {
37
53
  private readonly filePath;
38
54
  constructor(filePath: string);
39
55
  private readData;
@@ -44,10 +60,10 @@ declare class NodeStorage<T extends Record<string, unknown> = Record<string, unk
44
60
  }
45
61
  //#endregion
46
62
  //#region src/init.node.d.ts
47
- declare class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}
48
- declare class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}
49
- declare const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
50
- interface NodeRenownBuilderOptions {
63
+ export declare class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}
64
+ export declare class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}
65
+ export declare const DEFAULT_RENOWN_STORAGE_PATH = "./.ph/.renown.json";
66
+ export interface NodeRenownBuilderOptions {
51
67
  /** File path for user storage. Defaults to ".ph/.renown.json" in cwd */
52
68
  storagePath?: string;
53
69
  /** File path for keypair storage. Defaults to ".ph/.keypair.json" in cwd */
@@ -60,14 +76,14 @@ interface NodeRenownBuilderOptions {
60
76
  revalidate?: "always" | "never";
61
77
  }
62
78
  /** Node.js Renown builder: file-based user + key storage. */
63
- declare class RenownBuilder extends BaseRenownBuilder {
79
+ export declare class RenownBuilder extends BaseRenownBuilder {
64
80
  #private;
65
81
  constructor(appName: string, options?: NodeRenownBuilderOptions);
66
82
  build(): Promise<Renown>;
67
83
  }
68
84
  //#endregion
69
85
  //#region src/login.node.d.ts
70
- interface BrowserLoginOptions {
86
+ export interface BrowserLoginOptions {
71
87
  /** Renown server URL */
72
88
  renownUrl: string;
73
89
  /** Timeout in milliseconds. Defaults to 5 minutes. */
@@ -81,11 +97,11 @@ interface BrowserLoginOptions {
81
97
  /** AbortSignal to cancel the login flow */
82
98
  signal?: AbortSignal;
83
99
  }
84
- interface BrowserLoginResult {
100
+ export interface BrowserLoginResult {
85
101
  user: User;
86
102
  cliDid: string;
87
103
  }
88
- interface AuthStatusResult {
104
+ export interface AuthStatusResult {
89
105
  authenticated: boolean;
90
106
  address?: string;
91
107
  userDid?: string;
@@ -97,7 +113,7 @@ interface AuthStatusResult {
97
113
  /**
98
114
  * Open a URL in the default browser (cross-platform).
99
115
  */
100
- declare function openBrowser(url: string): Promise<void>;
116
+ export declare function openBrowser(url: string): Promise<void>;
101
117
  /**
102
118
  * Perform a browser-based login flow with Renown.
103
119
  * Opens the user's browser to authenticate, then polls for completion.
@@ -105,12 +121,12 @@ declare function openBrowser(url: string): Promise<void>;
105
121
  * If the browser fails to open, the flow continues polling — callers
106
122
  * can use onBrowserOpenFailed to show the URL as a fallback.
107
123
  */
108
- declare function browserLogin(renown: IRenown, options: BrowserLoginOptions): Promise<BrowserLoginResult>;
124
+ export declare function browserLogin(renown: IRenown, options: BrowserLoginOptions): Promise<BrowserLoginResult>;
109
125
  /**
110
126
  * Get the current authentication status from a Renown instance.
111
127
  */
112
- declare function getAuthStatus(renown: IRenown): AuthStatusResult;
113
- interface AccessTokenResult {
128
+ export declare function getAuthStatus(renown: IRenown): AuthStatusResult;
129
+ export interface AccessTokenResult {
114
130
  token: string;
115
131
  did: string;
116
132
  address: string;
@@ -121,17 +137,18 @@ interface AccessTokenResult {
121
137
  * Requires the user to be authenticated (via browserLogin or equivalent).
122
138
  * Throws if not authenticated.
123
139
  */
124
- declare function generateAccessToken(renown: IRenown, options?: CreateBearerTokenOptions): Promise<AccessTokenResult>;
140
+ export declare function generateAccessToken(renown: IRenown, options?: CreateBearerTokenOptions): Promise<AccessTokenResult>;
125
141
  /**
126
142
  * Parse a human-readable expiry string to seconds.
127
143
  * Supports formats: "7d" (days), "24h" (hours), "3600" (seconds), "3600s" (seconds).
128
144
  * Only accepts positive integers — decimals like "1.5h" are rejected.
129
145
  */
130
- declare function parseExpiry(expiry: string): number;
146
+ export declare function parseExpiry(expiry: string): number;
131
147
  /**
132
148
  * Format an expiry duration in seconds to a human-readable string.
133
149
  */
134
- declare function formatExpiry(expiresIn: number): string;
150
+ export declare function formatExpiry(expiresIn: number): string;
135
151
  //#endregion
136
- export { AccessTokenResult, AuthStatusResult, AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, BrowserLoginOptions, BrowserLoginResult, BuildCredentialParams, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConditionWeightedThreshold, ConnectCrypto, CreateBearerTokenOptions, CredentialCheck, CredentialDomain, CredentialMessage, CredentialStatus, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DID, DIDDocument, DIDDocumentMetadata, DIDResolutionMetadata, DIDResolutionResult, DOMAIN_TYPE, EcdsaSignature, FetchDelegationCredentialOptions, IAuthCredentialSubject, IConnectCrypto, ILogger, IPowerhouseCredentialSubject, IPowerhouseIssuerType, IProof, IRenown, IRenownCrypto, ISSUER_TYPE, ISigner, IVerifiableCredential, InternalUser, Issuer, JWTPayload, JWTVerified, JWTVerifyPolicies, JsonWebKey, JsonWebKeyPairStorage, JwkKeyPair, KeyCapabilitySection, LocalCredentialVerifierOptions, LoginStatus, MemoryKeyStorage, MissingSwitchboardError, NodeEventEmitter, NodeKeyStorage, NodeRenownBuilderOptions, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, PKHDid, PowerhouseVerifiableCredential, ProfileFetcher, Proof, RENOWN_PRIVATE_KEY_ENV, RENOWN_READ_MODEL_SUBGRAPH, RENOWN_SESSION_COOKIE, Renown, RenownBuilder, RenownBuilderOptions, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownEventEmitter, RenownEvents, RenownMemoryStorage, RenownProfile, RenownSession, RenownSessionClaims, RenownSessionCookie, RenownSessionProfile, RenownStorage, RenownStorageMap, ResolveSwitchboardEndpointOptions, Service, ServiceEndpoint, SignCredentialTypedData, SignInParams, Signer, SwitchboardClient, SwitchboardRequestFn, SwitchboardSource, Unsubscribe, User, UserActionSigner, VERIFIABLE_CREDENTIAL_EIP712_TYPE, Verifiable, VerificationMethod, VerifiedAuthCredential, VerifiedCredential, VerifiedJWT, VerifyAuthBearerTokenOptions, VerifyAuthCredentialOptions, VerifyRenownSessionOptions, W3CCredential, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createLocalCredentialVerifier, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyRenownSession };
152
+ export { AuthVerifiableCredential, AuthVerifiedCredential, BaseRenownBuilder, BuildCredentialParams, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConditionWeightedThreshold, ConnectCrypto, CreateBearerTokenOptions, CredentialCheck, CredentialDomain, CredentialMessage, CredentialStatus, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_URL, type DID, DIDDocument, DIDDocumentMetadata, DIDResolutionMetadata, DIDResolutionResult, DOMAIN_TYPE, EcdsaSignature, FetchDelegationCredentialOptions, IAuthCredentialSubject, type IConnectCrypto, ILogger, IPowerhouseCredentialSubject, IPowerhouseIssuerType, IProof, IRenown, type IRenownCrypto, ISSUER_TYPE, type ISigner, IVerifiableCredential, InternalUser, Issuer, JWTPayload, JWTVerified, JWTVerifyPolicies, JsonWebKey, type JsonWebKeyPairStorage, type JwkKeyPair, KeyCapabilitySection, LocalCredentialVerifierOptions, LoginStatus, MemoryKeyStorage, MissingSwitchboardError, type NodeRenownSignerArgs, PKHDid, PowerhouseVerifiableCredential, ProfileFetcher, Proof, RENOWN_READ_MODEL_SUBGRAPH, RENOWN_SESSION_COOKIE, Renown, RenownBuilderOptions, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownEventEmitter, RenownEvents, RenownMemoryStorage, RenownOwnSigner, RenownProfile, RenownSession, RenownSessionClaims, RenownSessionCookie, RenownSessionProfile, RenownStorage, RenownStorageMap, RenownTrustPolicy, RenownTrustPolicyOptions, ResolveSwitchboardEndpointOptions, Service, ServiceEndpoint, SignCredentialTypedData, SignInParams, Signer, SwitchboardClient, SwitchboardRequestFn, SwitchboardSource, Unsubscribe, User, type UserActionSigner, VERIFIABLE_CREDENTIAL_EIP712_TYPE, Verifiable, VerificationMethod, VerifiedAuthCredential, VerifiedCredential, VerifiedJWT, VerifyAuthBearerTokenOptions, VerifyAuthCredentialOptions, VerifyRenownSessionOptions, W3CCredential, assertIsAuthCredential, buildAndSignCredential, createAuthBearerToken, createLocalCredentialVerifier, createRenownTrustPolicy, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, getResolver, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyDelegationProof, verifyRenownSession };
153
+ export {};
137
154
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","names":[],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts"],"mappings":";;;;;cAWa,sBAAA;AAAA,cACA,oBAAA;;AADb;;;;;cASa,cAAA,YAA0B,qBAAA;EAAA;kBAKrB,oBAAA;EAAA,gBACA,sBAAA;cAGd,QAAA,WACA,OAAA;IAAW,UAAA;IAAqB,MAAA,GAAS,OAAA;EAAA;EAa3C,WAAA,CAAA,GAAe,OAAA,CAAQ,UAAA;EAyBjB,WAAA,CAAY,OAAA,EAAS,UAAA,GAAa,OAAA;EAWxC,aAAA,CAAA,GAAiB,OAAA;AAAA;;;cC5EN,gBAAA,gBACI,MAAA,8BACJ,aAAA,CAAc,MAAA;EAAA;;EAOzB,EAAA,iBAAmB,MAAA,CAAA,CACjB,KAAA,EAAO,CAAA,EACP,QAAA,GAAW,IAAA,EAAM,MAAA,CAAO,CAAA;EAQ1B,IAAA,iBAAqB,MAAA,CAAA,CAAQ,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,CAAA;AAAA;;;cClBzC,WAAA,WACD,MAAA,oBAA0B,MAAA,2BAC5B,WAAA,CAAY,CAAA;EAAA,iBACH,QAAA;cAEL,QAAA;EAAA,QAYJ,QAAA;EAAA,QAKA,SAAA;EAIR,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,GAAM,CAAA,CAAE,GAAA;EAKtC,GAAA,mBAAsB,CAAA,CAAA,CAAG,GAAA,EAAK,GAAA,EAAK,KAAA,GAAQ,CAAA,CAAE,GAAA;EAU7C,MAAA,CAAO,GAAA,QAAW,CAAA;AAAA;;;cCtCP,sBAAA,SAA+B,gBAAA,CAAiB,YAAA;AAAA,cAChD,iBAAA,SAA0B,WAAA,CAAY,gBAAA;AAAA,cAEtC,2BAAA;AAAA,UAEI,wBAAA;EHAgB;EGE/B,WAAA;EHF+B;EGI/B,OAAA;EHIW;EGFX,OAAA;;EAEA,cAAA;EHuBuB;EGrBvB,UAAA;AAAA;;cAIW,aAAA,SAAsB,iBAAA;EAAA;cAGrB,OAAA,UAAiB,OAAA,GAAS,wBAAA;EAyBhC,KAAA,CAAA,GAAS,OAAA,CAAQ,MAAA;AAAA;;;UChDR,mBAAA;;EAEf,SAAA;;EAEA,SAAA;EJCiC;EICjC,UAAA,IAAc,GAAA,UAAa,SAAA;EJDM;EIGjC,UAAA;EJFW;EIIX,mBAAA,IAAuB,GAAA;;EAEvB,MAAA,GAAS,WAAA;AAAA;AAAA,UAGM,kBAAA;EACf,IAAA,EAAM,IAAA;EACN,MAAA;AAAA;AAAA,UAGe,gBAAA;EACf,aAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,eAAA,GAAkB,IAAA;EAClB,OAAA;AAAA;;;;iBA+CoB,WAAA,CAAY,GAAA,WAAc,OAAA;;;;;;;;iBAyD1B,YAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,EAAS,mBAAA,GACR,OAAA,CAAQ,kBAAA;;;;iBA2CK,aAAA,CAAc,MAAA,EAAQ,OAAA,GAAU,gBAAA;AAAA,UAe/B,iBAAA;EACf,KAAA;EACA,GAAA;EACA,OAAA;EACA,SAAA;AAAA;;AHvMF;;;;iBG+MsB,mBAAA,CACpB,MAAA,EAAQ,OAAA,EACR,OAAA,GAAU,wBAAA,GACT,OAAA,CAAQ,iBAAA;;;;;;iBAuBK,WAAA,CAAY,MAAA;;;;iBAgCZ,YAAA,CAAa,SAAA"}
1
+ {"version":3,"file":"node.d.ts","names":[],"sources":["../src/crypto/node-key-storage.ts","../src/crypto/node-signer.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts"],"mappings":";;;;;;qBAWa;qBACA;;;;;;;qBAQA,0BAA0B;;kBAKrB;kBACA;EAEhB,YACE,mBACA;IAAW;IAAqB,SAAS;;EAa3C,eAAe,QAAQ;EAyBjB,YAAY,SAAS,aAAa;EAWxC,iBAAiB;;;;KC1EP;EACV;;EAEA;EACA,OAAO;;EAEP;;;;;;wBAOoB,uBACpB,MAAM,uBACL,QAAQ;;;qBCjBE,iBACX,eAAe,oCACJ,cAAc;;EAGzB;EAIA,GAAG,gBAAgB,QACjB,OAAO,GACP,WAAW,MAAM,OAAO;EAQ1B,KAAK,gBAAgB,QAAQ,OAAO,GAAG,MAAM,OAAO;;;;qBClBzC,YACX,UAAU,0BAA0B,iCAC5B,YAAY;mBACH;EAEjB,YAAY;UAYJ;UAKA;EAIR,IAAI,kBAAkB,GAAG,KAAK,MAAM,EAAE;EAKtC,IAAI,kBAAkB,GAAG,KAAK,KAAK,QAAQ,EAAE;EAU7C,OAAO,WAAW;;;;qBCtCP,+BAA+B,iBAAiB;qBAChD,0BAA0B,YAAY;qBAEtC;iBAEI;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;;qBAIW,sBAAsB;;EAGjC,YAAY,iBAAiB,UAAS;EAyBhC,SAAS,QAAQ;;;;iBChDR;;EAEf;;EAEA;;EAEA,cAAc,aAAa;;EAE3B;;EAEA,uBAAuB;;EAEvB,SAAS;;iBAGM;EACf,MAAM;EACN;;iBAGe;EACf;EACA;EACA;EACA;EACA;EACA,kBAAkB;EAClB;;;;;wBA+CoB,YAAY,cAAc;;;;;;;;wBAyD1B,aACpB,QAAQ,SACR,SAAS,sBACR,QAAQ;;;;wBA2CK,cAAc,QAAQ,UAAU;iBAe/B;EACf;EACA;EACA;EACA;;;;;;;wBAQoB,oBACpB,QAAQ,SACR,UAAU,2BACT,QAAQ;;;;;;wBAuBK,YAAY;;;;wBAgCZ,aAAa"}
package/dist/node.js CHANGED
@@ -1,6 +1,8 @@
1
- import { a as DEFAULT_RENOWN_NETWORK_ID, c as ISSUER_TYPE, d as VERIFIABLE_CREDENTIAL_EIP712_TYPE, i as DEFAULT_RENOWN_CHAIN_ID, l as RENOWN_READ_MODEL_SUBGRAPH, n as CREDENTIAL_SUBJECT_TYPE, o as DEFAULT_RENOWN_URL, r as CREDENTIAL_TYPES, s as DOMAIN_TYPE, t as CREDENTIAL_SCHEMA_EIP712_TYPE, u as RENOWN_SESSION_COOKIE } from "./constants-BexAR53F.js";
2
- import { a as RenownMemoryStorage, c as fetchDelegationCredential, d as verifyCredentialSignature, f as MissingSwitchboardError, i as Renown, l as recoverCredentialSigner, m as resolveSwitchboardEndpoint, n as BaseRenownBuilder, o as BaseStorage, p as SwitchboardClient, r as fetchRenownProfile, s as buildAndSignCredential, t as createLocalCredentialVerifier, u as verifyAuthCredential } from "./local-credential-verifier-CU8hmFlR.js";
3
- import { a as signatureHasResultingHash, c as ConnectCrypto, d as createAuthBearerToken, f as getResolver, i as parseSignatureHashField, l as RenownCrypto, m as verifyAuthBearerToken, n as createSignatureVerifier, o as MemoryKeyStorage, p as parsePkhDid, r as extractResultingHashFromSignature, s as RenownCryptoBuilder, t as RenownCryptoSigner, u as assertIsAuthCredential } from "./signer-DrjINLqt.js";
1
+ import { a as DEFAULT_RENOWN_NETWORK_ID, c as ISSUER_TYPE, d as VERIFIABLE_CREDENTIAL_EIP712_TYPE, i as DEFAULT_RENOWN_CHAIN_ID, l as RENOWN_READ_MODEL_SUBGRAPH, n as CREDENTIAL_SUBJECT_TYPE, o as DEFAULT_RENOWN_URL, r as CREDENTIAL_TYPES, s as DOMAIN_TYPE, t as CREDENTIAL_SCHEMA_EIP712_TYPE, u as RENOWN_SESSION_COOKIE } from "./constants-DVOF17NB.js";
2
+ import { a as verifyAuthCredential, c as MissingSwitchboardError, i as recoverCredentialSigner, l as SwitchboardClient, n as buildAndSignCredential, o as verifyCredentialSignature, r as fetchDelegationCredential, s as verifyDelegationProof, t as createRenownTrustPolicy, u as resolveSwitchboardEndpoint } from "./signer-trust-C6UJAsNJ.js";
3
+ import { a as verifyAuthBearerToken, i as parsePkhDid, n as createAuthBearerToken, r as getResolver, t as assertIsAuthCredential } from "./utils-DLQ5VVqT.js";
4
+ import { a as signatureHasResultingHash, c as ConnectCrypto, i as parseSignatureHashField, l as RenownCrypto, n as createSignatureVerifier, o as MemoryKeyStorage, r as extractResultingHashFromSignature, s as RenownCryptoBuilder, t as RenownCryptoSigner } from "./signer-GzTlZLjR.js";
5
+ import { a as RenownMemoryStorage, i as Renown, n as BaseRenownBuilder, o as BaseStorage, r as fetchRenownProfile, t as createLocalCredentialVerifier } from "./local-credential-verifier-BC4HS01T.js";
4
6
  import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
5
7
  import { dirname, join } from "node:path";
6
8
  import { EventEmitter } from "node:events";
@@ -76,6 +78,19 @@ var NodeKeyStorage = class {
76
78
  }
77
79
  };
78
80
  //#endregion
81
+ //#region src/crypto/node-signer.ts
82
+ /**
83
+ * Rebuilds the signer of a key another thread already holds, for a pooled
84
+ * reactor worker that cannot be handed the key itself. Never generates a key.
85
+ */
86
+ async function createNodeRenownSigner(args) {
87
+ const storage = new NodeKeyStorage(args.keypairPath);
88
+ if (!await storage.loadKeyPair()) throw new Error(`No Renown keypair at ${args.keypairPath ?? NodeKeyStorage.DEFAULT_KEYPAIR_PATH}`);
89
+ const crypto = await new RenownCryptoBuilder().withKeyPairStorage(storage).build();
90
+ if (args.did !== void 0 && crypto.did !== args.did) throw new Error(`Renown keypair has did ${crypto.did}, expected ${args.did}`);
91
+ return new RenownCryptoSigner(crypto, args.appName, args.user);
92
+ }
93
+ //#endregion
79
94
  //#region src/event/event.node.ts
80
95
  var NodeEventEmitter = class {
81
96
  #emitter = new EventEmitter();
@@ -99,7 +114,8 @@ var NodeStorage = class extends BaseStorage {
99
114
  constructor(filePath) {
100
115
  super();
101
116
  this.filePath = filePath;
102
- mkdirSync(dirname(this.filePath), { recursive: true });
117
+ const parentFolder = dirname(this.filePath);
118
+ mkdirSync(parentFolder, { recursive: true });
103
119
  if (!existsSync(this.filePath)) writeFileSync(this.filePath, JSON.stringify({}));
104
120
  }
105
121
  readData() {
@@ -150,9 +166,9 @@ var RenownBuilder = class extends BaseRenownBuilder {
150
166
  };
151
167
  //#endregion
152
168
  //#region src/login.node.ts
153
- const DEFAULT_TIMEOUT_MS = 300 * 1e3;
169
+ const DEFAULT_TIMEOUT_MS = 3e5;
154
170
  const POLL_INTERVAL_MS = 500;
155
- const SECONDS_IN_DAY = 1440 * 60;
171
+ const SECONDS_IN_DAY = 86400;
156
172
  function abortReason(signal) {
157
173
  if (signal.reason instanceof Error) return signal.reason;
158
174
  if (signal.reason) return new Error(String(signal.reason));
@@ -393,6 +409,6 @@ async function verifyRenownSession(value, options = {}) {
393
409
  return session;
394
410
  }
395
411
  //#endregion
396
- export { BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DOMAIN_TYPE, ISSUER_TYPE, MemoryKeyStorage, MissingSwitchboardError, NodeEventEmitter, NodeKeyStorage, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, RENOWN_PRIVATE_KEY_ENV, RENOWN_READ_MODEL_SUBGRAPH, RENOWN_SESSION_COOKIE, Renown, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, SwitchboardClient, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createLocalCredentialVerifier, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyRenownSession };
412
+ export { BaseRenownBuilder, CREDENTIAL_SCHEMA_EIP712_TYPE, CREDENTIAL_SUBJECT_TYPE, CREDENTIAL_TYPES, ConnectCrypto, DEFAULT_KEYPAIR_PATH, DEFAULT_RENOWN_CHAIN_ID, DEFAULT_RENOWN_NETWORK_ID, DEFAULT_RENOWN_STORAGE_PATH, DEFAULT_RENOWN_URL, DOMAIN_TYPE, ISSUER_TYPE, MemoryKeyStorage, MissingSwitchboardError, NodeEventEmitter, NodeKeyStorage, NodeRenownEventEmitter, NodeRenownStorage, NodeStorage, RENOWN_PRIVATE_KEY_ENV, RENOWN_READ_MODEL_SUBGRAPH, RENOWN_SESSION_COOKIE, Renown, RenownBuilder, RenownCrypto, RenownCryptoBuilder, RenownCryptoSigner, RenownMemoryStorage, SwitchboardClient, VERIFIABLE_CREDENTIAL_EIP712_TYPE, assertIsAuthCredential, browserLogin, buildAndSignCredential, createAuthBearerToken, createLocalCredentialVerifier, createNodeRenownSigner, createRenownTrustPolicy, createSignatureVerifier, extractResultingHashFromSignature, fetchDelegationCredential, fetchRenownProfile, formatExpiry, generateAccessToken, getAuthStatus, getResolver, openBrowser, parseExpiry, parsePkhDid, parseSignatureHashField, readSessionClaims, recoverCredentialSigner, resolveSwitchboardEndpoint, serializeRenownSessionCookie, signatureHasResultingHash, verifyAuthBearerToken, verifyAuthCredential, verifyCredentialSignature, verifyDelegationProof, verifyRenownSession };
397
413
 
398
414
  //# sourceMappingURL=node.js.map
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":["#filePath","#envKeyName","#logger","#parseKeyPair","#loadFromFile","#saveToFile","#emitter","#revalidate"],"sources":["../src/crypto/node-key-storage.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts","../src/session.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { ILogger } from \"../utils.js\";\nimport type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport const RENOWN_PRIVATE_KEY_ENV = \"PH_RENOWN_PRIVATE_KEY\";\nexport const DEFAULT_KEYPAIR_PATH = \".ph/.keypair.json\";\n\n/**\n * Key storage that supports:\n * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)\n * 2. Custom file path passed via options\n * 3. Falls back to file storage at .ph/.keypair.json in current working directory\n */\nexport class NodeKeyStorage implements JsonWebKeyPairStorage {\n #filePath: string;\n #envKeyName: string;\n #logger?: ILogger;\n\n static readonly DEFAULT_KEYPAIR_PATH = DEFAULT_KEYPAIR_PATH;\n static readonly RENOWN_PRIVATE_KEY_ENV = RENOWN_PRIVATE_KEY_ENV;\n\n constructor(\n filePath?: string,\n options: { envKeyName?: string; logger?: ILogger } = {},\n ) {\n this.#filePath = filePath || join(process.cwd(), DEFAULT_KEYPAIR_PATH);\n this.#envKeyName = options.envKeyName || RENOWN_PRIVATE_KEY_ENV;\n this.#logger = options.logger;\n\n // Ensure directory exists\n const dir = dirname(this.#filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n loadKeyPair(): Promise<JwkKeyPair | undefined> {\n // First check environment variable\n const envKey = process.env[this.#envKeyName];\n if (envKey) {\n try {\n const keyPairJson = JSON.parse(envKey) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(keyPairJson);\n\n // Validate it has the required structure\n this.#logger?.debug(\"Loaded keypair from environment variable\");\n return Promise.resolve(keyPair);\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#envKeyName}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n // Fall back to file storage\n return Promise.resolve(this.#loadFromFile());\n }\n\n async saveKeyPair(keyPair: JwkKeyPair): Promise<void> {\n // Don't save if using env var\n if (process.env[this.#envKeyName]) {\n return;\n }\n\n // Save to file\n this.#saveToFile(keyPair);\n return Promise.resolve();\n }\n\n removeKeyPair(): Promise<void> {\n if (process.env[this.#envKeyName]) {\n delete process.env[this.#envKeyName];\n }\n if (existsSync(this.#filePath)) {\n unlinkSync(this.#filePath);\n }\n return Promise.resolve();\n }\n\n #loadFromFile(): JwkKeyPair | undefined {\n try {\n if (!existsSync(this.#filePath)) {\n return undefined;\n }\n const data = readFileSync(this.#filePath, \"utf-8\");\n const parsed = JSON.parse(data) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(parsed);\n this.#logger?.debug(`Loaded keypair from ${this.#filePath}`);\n return keyPair;\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#filePath}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n #saveToFile(keyPair: JwkKeyPair): void {\n const data = { keyPair };\n writeFileSync(this.#filePath, JSON.stringify(data, null, 2), \"utf-8\");\n this.#logger?.debug(`Saved keypair to ${this.#filePath}`);\n }\n\n #parseKeyPair(json: unknown): JwkKeyPair {\n if (typeof json !== \"object\") {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n\n const object = json as JwkKeyPair | { keyPair: JwkKeyPair };\n let keyPair: JwkKeyPair;\n if (\"keyPair\" in object) {\n keyPair = object.keyPair;\n } else {\n keyPair = object;\n }\n\n if (\"publicKey\" in keyPair && \"privateKey\" in keyPair) {\n return keyPair;\n } else {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class NodeEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #emitter = new EventEmitter();\n\n constructor() {\n this.#emitter.setMaxListeners(0);\n }\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n this.#emitter.on(event as string, listener);\n return () => {\n this.#emitter.removeListener(event.toString(), listener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n this.#emitter.emit(event.toString(), data);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { BaseStorage } from \"./common.js\";\n\nexport class NodeStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n super();\n this.filePath = filePath;\n\n const parentFolder = dirname(this.filePath);\n mkdirSync(parentFolder, { recursive: true });\n\n if (!existsSync(this.filePath)) {\n writeFileSync(this.filePath, JSON.stringify({}));\n }\n }\n\n private readData(): T {\n const data = readFileSync(this.filePath, \"utf-8\");\n return JSON.parse(data) as T;\n }\n\n private writeData(data: T): void {\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n }\n\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const data = this.readData();\n return data[key];\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n const data = this.readData();\n if (value === undefined) {\n delete data[key];\n } else {\n data[key] = value;\n }\n this.writeData(data);\n }\n\n delete(key: keyof T): void {\n const data = this.readData();\n delete data[key];\n this.writeData(data);\n }\n}\n","import type { Renown } from \"./common.js\";\nimport { NodeKeyStorage } from \"./crypto/node-key-storage.js\";\nimport { NodeEventEmitter } from \"./event/event.node.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { NodeStorage } from \"./storage/storage.node.js\";\nimport type { RenownEvents, RenownStorageMap } from \"./types.js\";\n\nexport class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}\nexport class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}\n\nexport const DEFAULT_RENOWN_STORAGE_PATH = \"./.ph/.renown.json\";\n\nexport interface NodeRenownBuilderOptions {\n /** File path for user storage. Defaults to \".ph/.renown.json\" in cwd */\n storagePath?: string;\n /** File path for keypair storage. Defaults to \".ph/.keypair.json\" in cwd */\n keyPath?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n /** Switchboard GraphQL endpoint for the direct-to-reactor flow. */\n switchboardUrl?: string;\n /** Re-check a stored credential on build (default \"always\"). */\n revalidate?: \"always\" | \"never\";\n}\n\n/** Node.js Renown builder: file-based user + key storage. */\nexport class RenownBuilder extends BaseRenownBuilder {\n #revalidate: \"always\" | \"never\";\n\n constructor(appName: string, options: NodeRenownBuilderOptions = {}) {\n super(appName);\n\n const {\n storagePath = DEFAULT_RENOWN_STORAGE_PATH,\n keyPath,\n baseUrl,\n switchboardUrl,\n revalidate = \"always\",\n } = options;\n\n this.#revalidate = revalidate;\n this.withKeyPairStorage(new NodeKeyStorage(keyPath));\n this.withStorage(new NodeRenownStorage(storagePath));\n this.withEventEmitter(new NodeRenownEventEmitter());\n if (baseUrl) {\n this.withBaseUrl(baseUrl);\n }\n if (switchboardUrl) {\n this.withSwitchboardUrl(switchboardUrl);\n }\n }\n\n // Node scripts/CLI act on auth state once and exit, so revalidation must\n // finish before build() resolves — block on it (unlike the browser builder).\n async build(): Promise<Renown> {\n const renown = await super.build();\n if (this.#revalidate === \"always\" && renown.user) {\n await renown.revalidate();\n }\n return renown;\n }\n}\n","import type { CreateBearerTokenOptions, IRenown, User } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst POLL_INTERVAL_MS = 500; // 0.5s: session store is in-memory, cheap to poll\nconst SECONDS_IN_DAY = 24 * 60 * 60;\n\nexport interface BrowserLoginOptions {\n /** Renown server URL */\n renownUrl: string;\n /** Timeout in milliseconds. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Called with the login URL and session ID before the browser is opened */\n onLoginUrl?: (url: string, sessionId: string) => void;\n /** Called on each poll tick while waiting for authentication */\n onPollTick?: () => void;\n /** Called when the browser failed to open automatically */\n onBrowserOpenFailed?: (url: string) => void;\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal;\n}\n\nexport interface BrowserLoginResult {\n user: User;\n cliDid: string;\n}\n\nexport interface AuthStatusResult {\n authenticated: boolean;\n address?: string;\n userDid?: string;\n chainId?: number;\n cliDid: string;\n authenticatedAt?: Date;\n baseUrl: string;\n}\n\ninterface PendingSessionResponse {\n sessionId: string;\n status: \"pending\";\n}\n\ninterface ReadySessionResponse {\n sessionId: string;\n status: \"ready\";\n address: string;\n chainId: number;\n did: string;\n credentialId: string;\n userDocumentId: string;\n}\n\ntype SessionResponse = PendingSessionResponse | ReadySessionResponse;\n\nfunction abortReason(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n if (signal.reason) return new Error(String(signal.reason));\n return new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortReason(signal));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortReason(signal!));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Open a URL in the default browser (cross-platform).\n */\nexport async function openBrowser(url: string): Promise<void> {\n const { execFile } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execFileAsync = promisify(execFile);\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n await execFileAsync(\"open\", [url]);\n } else if (platform === \"win32\") {\n await execFileAsync(\"cmd\", [\"/c\", \"start\", \"\", url]);\n } else {\n await execFileAsync(\"xdg-open\", [url]);\n }\n}\n\nasync function pollSession(\n renownUrl: string,\n sessionId: string,\n timeoutMs: number,\n onPollTick?: () => void,\n signal?: AbortSignal,\n): Promise<ReadySessionResponse | null> {\n const startTime = Date.now();\n const sessionUrl = new URL(\n `/api/console/session/${sessionId}`,\n renownUrl,\n ).toString();\n\n while (Date.now() - startTime < timeoutMs) {\n signal?.throwIfAborted();\n try {\n const response = await fetch(sessionUrl, { signal });\n if (response.ok) {\n const data = (await response.json()) as SessionResponse;\n if (data.status === \"ready\") {\n return data;\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n throw error;\n // Network error, will retry\n }\n onPollTick?.();\n await sleep(POLL_INTERVAL_MS, signal);\n }\n\n return null;\n}\n\n/**\n * Perform a browser-based login flow with Renown.\n * Opens the user's browser to authenticate, then polls for completion.\n * Throws if already authenticated or if the flow times out.\n * If the browser fails to open, the flow continues polling — callers\n * can use onBrowserOpenFailed to show the URL as a fallback.\n */\nexport async function browserLogin(\n renown: IRenown,\n options: BrowserLoginOptions,\n): Promise<BrowserLoginResult> {\n if (renown.user?.credential) {\n throw new Error(\n `Already authenticated as ${renown.user.address}. Logout first.`,\n );\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sessionId = crypto.randomUUID();\n\n const loginUrl = new URL(\"/console\", options.renownUrl);\n loginUrl.searchParams.set(\"session\", sessionId);\n loginUrl.searchParams.set(\"connect\", renown.did);\n loginUrl.searchParams.set(\"app\", renown.did);\n\n const url = loginUrl.toString();\n options.onLoginUrl?.(url, sessionId);\n\n try {\n await openBrowser(url);\n } catch {\n options.onBrowserOpenFailed?.(url);\n }\n\n const result = await pollSession(\n options.renownUrl,\n sessionId,\n timeoutMs,\n options.onPollTick,\n options.signal,\n );\n\n if (!result) {\n throw new Error(\"Authentication timed out.\");\n }\n\n const user = await renown.login(result.did);\n return { user, cliDid: renown.did };\n}\n\n/**\n * Get the current authentication status from a Renown instance.\n */\nexport function getAuthStatus(renown: IRenown): AuthStatusResult {\n const user = renown.user;\n const credential = user?.credential;\n\n return {\n authenticated: !!credential,\n address: user?.address,\n userDid: user?.did,\n chainId: user?.chainId,\n cliDid: renown.did,\n authenticatedAt: credential ? new Date(credential.issuanceDate) : undefined,\n baseUrl: renown.baseUrl,\n };\n}\n\nexport interface AccessTokenResult {\n token: string;\n did: string;\n address: string;\n expiresIn: number;\n}\n\n/**\n * Generate a bearer token for API authentication.\n * Requires the user to be authenticated (via browserLogin or equivalent).\n * Throws if not authenticated.\n */\nexport async function generateAccessToken(\n renown: IRenown,\n options?: CreateBearerTokenOptions,\n): Promise<AccessTokenResult> {\n const user = renown.user;\n if (!user?.credential) {\n throw new Error(\n \"Not authenticated. Login first to generate access tokens.\",\n );\n }\n\n const token = await renown.getBearerToken(options ?? {});\n\n return {\n token,\n did: renown.did,\n address: user.address,\n expiresIn: options?.expiresIn ?? 0,\n };\n}\n\n/**\n * Parse a human-readable expiry string to seconds.\n * Supports formats: \"7d\" (days), \"24h\" (hours), \"3600\" (seconds), \"3600s\" (seconds).\n * Only accepts positive integers — decimals like \"1.5h\" are rejected.\n */\nexport function parseExpiry(expiry: string): number {\n const trimmed = expiry.trim().toLowerCase();\n const match = trimmed.match(/^(\\d+)(d|h|s)?$/);\n\n if (!match) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Expected a positive integer with optional suffix: \"7d\", \"24h\", \"3600s\", or \"3600\".`,\n );\n }\n\n const value = Number(match[1]);\n const unit = match[2];\n\n if (value <= 0) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Value must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"d\":\n return value * SECONDS_IN_DAY;\n case \"h\":\n return value * 60 * 60;\n default:\n return value;\n }\n}\n\n/**\n * Format an expiry duration in seconds to a human-readable string.\n */\nexport function formatExpiry(expiresIn: number): string {\n const days = Math.floor(expiresIn / SECONDS_IN_DAY);\n const hours = Math.floor((expiresIn % SECONDS_IN_DAY) / 3600);\n\n if (days > 0) {\n const dayStr = `${days} day${days !== 1 ? \"s\" : \"\"}`;\n if (hours > 0) {\n return `${dayStr} and ${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n return dayStr;\n }\n\n if (hours > 0) {\n return `${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n\n return `${expiresIn} second${expiresIn !== 1 ? \"s\" : \"\"}`;\n}\n","import { verifyAuthCredential } from \"./credential.js\";\nimport type { User } from \"./types.js\";\nimport { verifyAuthBearerToken } from \"./utils.js\";\n\n/** Server-side view of an authenticated Renown session. */\nexport interface RenownSession {\n /** Authenticated user identity derived from the session token. */\n user: User;\n /** App/client DID the token was issued by. */\n appDid: string;\n /** Token expiry (epoch seconds), when present. */\n expiresAt?: number;\n}\n\n/** Display hint carried alongside the token (unverified; not for auth). */\nexport interface RenownSessionProfile {\n name?: string | null;\n avatar?: string | null;\n /** Renown profile document id, so SSR can resolve profile links. */\n documentId?: string | null;\n username?: string | null;\n userImage?: string | null;\n}\n\n/** The `renown_session` cookie payload: the bearer token + a display hint. */\nexport interface RenownSessionCookie {\n token: string;\n profile?: RenownSessionProfile | null;\n}\n\nexport interface VerifyRenownSessionOptions {\n /** Expected `aud` claim on the token. */\n audience?: string;\n /** Switchboard GraphQL endpoint used when re-verifying the credential. */\n switchboardUrl?: string;\n /** Renown service base URL used when re-verifying the credential. */\n renownUrl?: string;\n /** Also re-verify the credential against Switchboard (default false = token-only, no network). */\n verifyCredential?: boolean;\n}\n\n/** Claims read from a session token without verifying its signature. */\nexport interface RenownSessionClaims {\n address?: string;\n chainId?: number;\n networkId?: string;\n /** Expiry in epoch seconds. */\n expiresAt?: number;\n}\n\n/** Serialize a session cookie value (token + optional display hint). */\nexport function serializeRenownSessionCookie(\n value: RenownSessionCookie,\n): string {\n return JSON.stringify(value);\n}\n\n// Parse the JSON cookie envelope { token, profile }; undefined if malformed.\nfunction parseSessionCookie(value: string): RenownSessionCookie | undefined {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as RenownSessionCookie).token === \"string\"\n ) {\n return parsed as RenownSessionCookie;\n }\n } catch {\n // Malformed cookie.\n }\n return undefined;\n}\n\n// Decode a session cookie's claims WITHOUT verifying the signature — cheap\n// optimistic checks only (e.g. proxy redirect); never trust for access control.\nexport function readSessionClaims(\n value: string,\n): RenownSessionClaims | undefined {\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const parts = parsed.token.split(\".\");\n if (parts.length < 2) return undefined;\n try {\n const json = Buffer.from(parts[1], \"base64url\").toString(\"utf8\");\n const payload = JSON.parse(json) as {\n exp?: number;\n vc?: {\n credentialSubject?: {\n address?: string;\n chainId?: number;\n networkId?: string;\n };\n };\n };\n const subject = payload.vc?.credentialSubject;\n return {\n address: subject?.address,\n chainId: subject?.chainId,\n networkId: subject?.networkId,\n expiresAt: payload.exp,\n };\n } catch {\n return undefined;\n }\n}\n\n// Verify a session cookie (envelope or bare token) → user, or undefined. Pass\n// verifyCredential:true to also check vs Switchboard; envelope hint is merged.\nexport async function verifyRenownSession(\n value: string,\n options: VerifyRenownSessionOptions = {},\n): Promise<RenownSession | undefined> {\n const { verifyCredential = false } = options;\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const { token, profile } = parsed;\n\n let session: RenownSession | undefined;\n if (verifyCredential) {\n const verified = await verifyAuthCredential(token, {\n audience: options.audience,\n renownUrl: options.renownUrl,\n switchboardUrl: options.switchboardUrl,\n });\n if (verified) {\n session = {\n user: {\n address: verified.address as `0x${string}`,\n chainId: verified.chainId,\n networkId: verified.networkId,\n did: verified.did,\n credential: verified.credential,\n },\n appDid: verified.appDid,\n };\n }\n } else {\n const verified = await verifyAuthBearerToken(token, {\n audience: options.audience,\n });\n if (verified) {\n const subject = verified.verifiableCredential.credentialSubject;\n const did = `did:pkh:${subject.networkId}:${subject.chainId}:${subject.address.toLowerCase()}`;\n session = {\n user: {\n address: subject.address as `0x${string}`,\n chainId: subject.chainId,\n networkId: subject.networkId,\n did,\n credential: undefined,\n },\n appDid: verified.issuer,\n expiresAt: verified.payload.exp,\n };\n }\n }\n\n if (!session) return undefined;\n\n // Merge the (unverified) display hint from the envelope — display only. The\n // richer fields make this seed shape-identical to the client's restored user.\n if (profile) {\n const name = profile.name ?? profile.username ?? undefined;\n const avatarUrl = profile.avatar ?? profile.userImage ?? undefined;\n const user = { ...session.user };\n if (name || avatarUrl) {\n user.ens = { name, avatarUrl };\n }\n // Only `documentId` makes a seeded profile useful (profile links); display\n // already flows through `ens`, so there is nothing to seed without it.\n if (profile.documentId) {\n user.profile = {\n documentId: profile.documentId,\n username: profile.username ?? null,\n userImage: profile.userImage ?? null,\n ethAddress: session.user.address,\n };\n }\n session.user = user;\n }\n return session;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"node.js","names":[],"sources":["../src/crypto/node-key-storage.ts","../src/crypto/node-signer.ts","../src/event/event.node.ts","../src/storage/storage.node.ts","../src/init.node.ts","../src/login.node.ts","../src/session.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { ILogger } from \"../utils.js\";\nimport type { JsonWebKeyPairStorage, JwkKeyPair } from \"./types.js\";\n\nexport const RENOWN_PRIVATE_KEY_ENV = \"PH_RENOWN_PRIVATE_KEY\";\nexport const DEFAULT_KEYPAIR_PATH = \".ph/.keypair.json\";\n\n/**\n * Key storage that supports:\n * 1. PH_RENOWN_PRIVATE_KEY environment variable (JSON-encoded JwkKeyPair)\n * 2. Custom file path passed via options\n * 3. Falls back to file storage at .ph/.keypair.json in current working directory\n */\nexport class NodeKeyStorage implements JsonWebKeyPairStorage {\n #filePath: string;\n #envKeyName: string;\n #logger?: ILogger;\n\n static readonly DEFAULT_KEYPAIR_PATH = DEFAULT_KEYPAIR_PATH;\n static readonly RENOWN_PRIVATE_KEY_ENV = RENOWN_PRIVATE_KEY_ENV;\n\n constructor(\n filePath?: string,\n options: { envKeyName?: string; logger?: ILogger } = {},\n ) {\n this.#filePath = filePath || join(process.cwd(), DEFAULT_KEYPAIR_PATH);\n this.#envKeyName = options.envKeyName || RENOWN_PRIVATE_KEY_ENV;\n this.#logger = options.logger;\n\n // Ensure directory exists\n const dir = dirname(this.#filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n loadKeyPair(): Promise<JwkKeyPair | undefined> {\n // First check environment variable\n const envKey = process.env[this.#envKeyName];\n if (envKey) {\n try {\n const keyPairJson = JSON.parse(envKey) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(keyPairJson);\n\n // Validate it has the required structure\n this.#logger?.debug(\"Loaded keypair from environment variable\");\n return Promise.resolve(keyPair);\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#envKeyName}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n // Fall back to file storage\n return Promise.resolve(this.#loadFromFile());\n }\n\n async saveKeyPair(keyPair: JwkKeyPair): Promise<void> {\n // Don't save if using env var\n if (process.env[this.#envKeyName]) {\n return;\n }\n\n // Save to file\n this.#saveToFile(keyPair);\n return Promise.resolve();\n }\n\n removeKeyPair(): Promise<void> {\n if (process.env[this.#envKeyName]) {\n delete process.env[this.#envKeyName];\n }\n if (existsSync(this.#filePath)) {\n unlinkSync(this.#filePath);\n }\n return Promise.resolve();\n }\n\n #loadFromFile(): JwkKeyPair | undefined {\n try {\n if (!existsSync(this.#filePath)) {\n return undefined;\n }\n const data = readFileSync(this.#filePath, \"utf-8\");\n const parsed = JSON.parse(data) as unknown;\n const keyPair: JwkKeyPair = this.#parseKeyPair(parsed);\n this.#logger?.debug(`Loaded keypair from ${this.#filePath}`);\n return keyPair;\n } catch (e) {\n throw new Error(\n `Failed to parse ${this.#filePath}: ${e instanceof Error ? e.message : String(e)}`,\n {\n cause: e,\n },\n );\n }\n }\n\n #saveToFile(keyPair: JwkKeyPair): void {\n const data = { keyPair };\n writeFileSync(this.#filePath, JSON.stringify(data, null, 2), \"utf-8\");\n this.#logger?.debug(`Saved keypair to ${this.#filePath}`);\n }\n\n #parseKeyPair(json: unknown): JwkKeyPair {\n if (typeof json !== \"object\") {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n\n const object = json as JwkKeyPair | { keyPair: JwkKeyPair };\n let keyPair: JwkKeyPair;\n if (\"keyPair\" in object) {\n keyPair = object.keyPair;\n } else {\n keyPair = object;\n }\n\n if (\"publicKey\" in keyPair && \"privateKey\" in keyPair) {\n return keyPair;\n } else {\n throw new Error(\"Invalid keyPair format:\" + JSON.stringify(json));\n }\n }\n}\n","import type { UserActionSigner } from \"@powerhousedao/shared/document-model\";\nimport { NodeKeyStorage } from \"./node-key-storage.js\";\nimport { RenownCryptoBuilder } from \"./renown-crypto-builder.js\";\nimport { RenownCryptoSigner } from \"./signer.js\";\n\nexport type NodeRenownSignerArgs = {\n appName: string;\n /** Defaults to `.ph/.keypair.json` in cwd; `PH_RENOWN_PRIVATE_KEY` wins. */\n keypairPath?: string;\n user?: UserActionSigner;\n /** The did the stored key must have. */\n did?: string;\n};\n\n/**\n * Rebuilds the signer of a key another thread already holds, for a pooled\n * reactor worker that cannot be handed the key itself. Never generates a key.\n */\nexport async function createNodeRenownSigner(\n args: NodeRenownSignerArgs,\n): Promise<RenownCryptoSigner> {\n const storage = new NodeKeyStorage(args.keypairPath);\n const stored = await storage.loadKeyPair();\n if (!stored) {\n throw new Error(\n `No Renown keypair at ${args.keypairPath ?? NodeKeyStorage.DEFAULT_KEYPAIR_PATH}`,\n );\n }\n\n const crypto = await new RenownCryptoBuilder()\n .withKeyPairStorage(storage)\n .build();\n if (args.did !== undefined && crypto.did !== args.did) {\n throw new Error(\n `Renown keypair has did ${crypto.did}, expected ${args.did}`,\n );\n }\n\n return new RenownCryptoSigner(crypto, args.appName, args.user);\n}\n","import { EventEmitter } from \"node:events\";\nimport type { IEventEmitter } from \"./types.js\";\n\nexport class NodeEventEmitter<\n Events extends Record<string, unknown>,\n> implements IEventEmitter<Events> {\n #emitter = new EventEmitter();\n\n constructor() {\n this.#emitter.setMaxListeners(0);\n }\n\n on<K extends keyof Events>(\n event: K,\n listener: (data: Events[K]) => void,\n ): () => void {\n this.#emitter.on(event as string, listener);\n return () => {\n this.#emitter.removeListener(event.toString(), listener);\n };\n }\n\n emit<K extends keyof Events>(event: K, data: Events[K]): void {\n this.#emitter.emit(event.toString(), data);\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { BaseStorage } from \"./common.js\";\n\nexport class NodeStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n private readonly filePath: string;\n\n constructor(filePath: string) {\n super();\n this.filePath = filePath;\n\n const parentFolder = dirname(this.filePath);\n mkdirSync(parentFolder, { recursive: true });\n\n if (!existsSync(this.filePath)) {\n writeFileSync(this.filePath, JSON.stringify({}));\n }\n }\n\n private readData(): T {\n const data = readFileSync(this.filePath, \"utf-8\");\n return JSON.parse(data) as T;\n }\n\n private writeData(data: T): void {\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n }\n\n get<Key extends keyof T>(key: Key): T[Key] | undefined {\n const data = this.readData();\n return data[key];\n }\n\n set<Key extends keyof T>(key: Key, value?: T[Key]): void {\n const data = this.readData();\n if (value === undefined) {\n delete data[key];\n } else {\n data[key] = value;\n }\n this.writeData(data);\n }\n\n delete(key: keyof T): void {\n const data = this.readData();\n delete data[key];\n this.writeData(data);\n }\n}\n","import type { Renown } from \"./common.js\";\nimport { NodeKeyStorage } from \"./crypto/node-key-storage.js\";\nimport { NodeEventEmitter } from \"./event/event.node.js\";\nimport { BaseRenownBuilder } from \"./renown-builder.js\";\nimport { NodeStorage } from \"./storage/storage.node.js\";\nimport type { RenownEvents, RenownStorageMap } from \"./types.js\";\n\nexport class NodeRenownEventEmitter extends NodeEventEmitter<RenownEvents> {}\nexport class NodeRenownStorage extends NodeStorage<RenownStorageMap> {}\n\nexport const DEFAULT_RENOWN_STORAGE_PATH = \"./.ph/.renown.json\";\n\nexport interface NodeRenownBuilderOptions {\n /** File path for user storage. Defaults to \".ph/.renown.json\" in cwd */\n storagePath?: string;\n /** File path for keypair storage. Defaults to \".ph/.keypair.json\" in cwd */\n keyPath?: string;\n /** Renown server URL. Defaults to https://www.renown.id */\n baseUrl?: string;\n /** Switchboard GraphQL endpoint for the direct-to-reactor flow. */\n switchboardUrl?: string;\n /** Re-check a stored credential on build (default \"always\"). */\n revalidate?: \"always\" | \"never\";\n}\n\n/** Node.js Renown builder: file-based user + key storage. */\nexport class RenownBuilder extends BaseRenownBuilder {\n #revalidate: \"always\" | \"never\";\n\n constructor(appName: string, options: NodeRenownBuilderOptions = {}) {\n super(appName);\n\n const {\n storagePath = DEFAULT_RENOWN_STORAGE_PATH,\n keyPath,\n baseUrl,\n switchboardUrl,\n revalidate = \"always\",\n } = options;\n\n this.#revalidate = revalidate;\n this.withKeyPairStorage(new NodeKeyStorage(keyPath));\n this.withStorage(new NodeRenownStorage(storagePath));\n this.withEventEmitter(new NodeRenownEventEmitter());\n if (baseUrl) {\n this.withBaseUrl(baseUrl);\n }\n if (switchboardUrl) {\n this.withSwitchboardUrl(switchboardUrl);\n }\n }\n\n // Node scripts/CLI act on auth state once and exit, so revalidation must\n // finish before build() resolves — block on it (unlike the browser builder).\n async build(): Promise<Renown> {\n const renown = await super.build();\n if (this.#revalidate === \"always\" && renown.user) {\n await renown.revalidate();\n }\n return renown;\n }\n}\n","import type { CreateBearerTokenOptions, IRenown, User } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst POLL_INTERVAL_MS = 500; // 0.5s: session store is in-memory, cheap to poll\nconst SECONDS_IN_DAY = 24 * 60 * 60;\n\nexport interface BrowserLoginOptions {\n /** Renown server URL */\n renownUrl: string;\n /** Timeout in milliseconds. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Called with the login URL and session ID before the browser is opened */\n onLoginUrl?: (url: string, sessionId: string) => void;\n /** Called on each poll tick while waiting for authentication */\n onPollTick?: () => void;\n /** Called when the browser failed to open automatically */\n onBrowserOpenFailed?: (url: string) => void;\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal;\n}\n\nexport interface BrowserLoginResult {\n user: User;\n cliDid: string;\n}\n\nexport interface AuthStatusResult {\n authenticated: boolean;\n address?: string;\n userDid?: string;\n chainId?: number;\n cliDid: string;\n authenticatedAt?: Date;\n baseUrl: string;\n}\n\ninterface PendingSessionResponse {\n sessionId: string;\n status: \"pending\";\n}\n\ninterface ReadySessionResponse {\n sessionId: string;\n status: \"ready\";\n address: string;\n chainId: number;\n did: string;\n credentialId: string;\n userDocumentId: string;\n}\n\ntype SessionResponse = PendingSessionResponse | ReadySessionResponse;\n\nfunction abortReason(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n if (signal.reason) return new Error(String(signal.reason));\n return new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortReason(signal));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortReason(signal!));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Open a URL in the default browser (cross-platform).\n */\nexport async function openBrowser(url: string): Promise<void> {\n const { execFile } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execFileAsync = promisify(execFile);\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n await execFileAsync(\"open\", [url]);\n } else if (platform === \"win32\") {\n await execFileAsync(\"cmd\", [\"/c\", \"start\", \"\", url]);\n } else {\n await execFileAsync(\"xdg-open\", [url]);\n }\n}\n\nasync function pollSession(\n renownUrl: string,\n sessionId: string,\n timeoutMs: number,\n onPollTick?: () => void,\n signal?: AbortSignal,\n): Promise<ReadySessionResponse | null> {\n const startTime = Date.now();\n const sessionUrl = new URL(\n `/api/console/session/${sessionId}`,\n renownUrl,\n ).toString();\n\n while (Date.now() - startTime < timeoutMs) {\n signal?.throwIfAborted();\n try {\n const response = await fetch(sessionUrl, { signal });\n if (response.ok) {\n const data = (await response.json()) as SessionResponse;\n if (data.status === \"ready\") {\n return data;\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n throw error;\n // Network error, will retry\n }\n onPollTick?.();\n await sleep(POLL_INTERVAL_MS, signal);\n }\n\n return null;\n}\n\n/**\n * Perform a browser-based login flow with Renown.\n * Opens the user's browser to authenticate, then polls for completion.\n * Throws if already authenticated or if the flow times out.\n * If the browser fails to open, the flow continues polling — callers\n * can use onBrowserOpenFailed to show the URL as a fallback.\n */\nexport async function browserLogin(\n renown: IRenown,\n options: BrowserLoginOptions,\n): Promise<BrowserLoginResult> {\n if (renown.user?.credential) {\n throw new Error(\n `Already authenticated as ${renown.user.address}. Logout first.`,\n );\n }\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sessionId = crypto.randomUUID();\n\n const loginUrl = new URL(\"/console\", options.renownUrl);\n loginUrl.searchParams.set(\"session\", sessionId);\n loginUrl.searchParams.set(\"connect\", renown.did);\n loginUrl.searchParams.set(\"app\", renown.did);\n\n const url = loginUrl.toString();\n options.onLoginUrl?.(url, sessionId);\n\n try {\n await openBrowser(url);\n } catch {\n options.onBrowserOpenFailed?.(url);\n }\n\n const result = await pollSession(\n options.renownUrl,\n sessionId,\n timeoutMs,\n options.onPollTick,\n options.signal,\n );\n\n if (!result) {\n throw new Error(\"Authentication timed out.\");\n }\n\n const user = await renown.login(result.did);\n return { user, cliDid: renown.did };\n}\n\n/**\n * Get the current authentication status from a Renown instance.\n */\nexport function getAuthStatus(renown: IRenown): AuthStatusResult {\n const user = renown.user;\n const credential = user?.credential;\n\n return {\n authenticated: !!credential,\n address: user?.address,\n userDid: user?.did,\n chainId: user?.chainId,\n cliDid: renown.did,\n authenticatedAt: credential ? new Date(credential.issuanceDate) : undefined,\n baseUrl: renown.baseUrl,\n };\n}\n\nexport interface AccessTokenResult {\n token: string;\n did: string;\n address: string;\n expiresIn: number;\n}\n\n/**\n * Generate a bearer token for API authentication.\n * Requires the user to be authenticated (via browserLogin or equivalent).\n * Throws if not authenticated.\n */\nexport async function generateAccessToken(\n renown: IRenown,\n options?: CreateBearerTokenOptions,\n): Promise<AccessTokenResult> {\n const user = renown.user;\n if (!user?.credential) {\n throw new Error(\n \"Not authenticated. Login first to generate access tokens.\",\n );\n }\n\n const token = await renown.getBearerToken(options ?? {});\n\n return {\n token,\n did: renown.did,\n address: user.address,\n expiresIn: options?.expiresIn ?? 0,\n };\n}\n\n/**\n * Parse a human-readable expiry string to seconds.\n * Supports formats: \"7d\" (days), \"24h\" (hours), \"3600\" (seconds), \"3600s\" (seconds).\n * Only accepts positive integers — decimals like \"1.5h\" are rejected.\n */\nexport function parseExpiry(expiry: string): number {\n const trimmed = expiry.trim().toLowerCase();\n const match = trimmed.match(/^(\\d+)(d|h|s)?$/);\n\n if (!match) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Expected a positive integer with optional suffix: \"7d\", \"24h\", \"3600s\", or \"3600\".`,\n );\n }\n\n const value = Number(match[1]);\n const unit = match[2];\n\n if (value <= 0) {\n throw new Error(\n `Invalid expiry format: ${expiry}. Value must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"d\":\n return value * SECONDS_IN_DAY;\n case \"h\":\n return value * 60 * 60;\n default:\n return value;\n }\n}\n\n/**\n * Format an expiry duration in seconds to a human-readable string.\n */\nexport function formatExpiry(expiresIn: number): string {\n const days = Math.floor(expiresIn / SECONDS_IN_DAY);\n const hours = Math.floor((expiresIn % SECONDS_IN_DAY) / 3600);\n\n if (days > 0) {\n const dayStr = `${days} day${days !== 1 ? \"s\" : \"\"}`;\n if (hours > 0) {\n return `${dayStr} and ${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n return dayStr;\n }\n\n if (hours > 0) {\n return `${hours} hour${hours !== 1 ? \"s\" : \"\"}`;\n }\n\n return `${expiresIn} second${expiresIn !== 1 ? \"s\" : \"\"}`;\n}\n","import { verifyAuthCredential } from \"./credential.js\";\nimport type { User } from \"./types.js\";\nimport { verifyAuthBearerToken } from \"./utils.js\";\n\n/** Server-side view of an authenticated Renown session. */\nexport interface RenownSession {\n /** Authenticated user identity derived from the session token. */\n user: User;\n /** App/client DID the token was issued by. */\n appDid: string;\n /** Token expiry (epoch seconds), when present. */\n expiresAt?: number;\n}\n\n/** Display hint carried alongside the token (unverified; not for auth). */\nexport interface RenownSessionProfile {\n name?: string | null;\n avatar?: string | null;\n /** Renown profile document id, so SSR can resolve profile links. */\n documentId?: string | null;\n username?: string | null;\n userImage?: string | null;\n}\n\n/** The `renown_session` cookie payload: the bearer token + a display hint. */\nexport interface RenownSessionCookie {\n token: string;\n profile?: RenownSessionProfile | null;\n}\n\nexport interface VerifyRenownSessionOptions {\n /** Expected `aud` claim on the token. */\n audience?: string;\n /** Switchboard GraphQL endpoint used when re-verifying the credential. */\n switchboardUrl?: string;\n /** Renown service base URL used when re-verifying the credential. */\n renownUrl?: string;\n /** Also re-verify the credential against Switchboard (default false = token-only, no network). */\n verifyCredential?: boolean;\n}\n\n/** Claims read from a session token without verifying its signature. */\nexport interface RenownSessionClaims {\n address?: string;\n chainId?: number;\n networkId?: string;\n /** Expiry in epoch seconds. */\n expiresAt?: number;\n}\n\n/** Serialize a session cookie value (token + optional display hint). */\nexport function serializeRenownSessionCookie(\n value: RenownSessionCookie,\n): string {\n return JSON.stringify(value);\n}\n\n// Parse the JSON cookie envelope { token, profile }; undefined if malformed.\nfunction parseSessionCookie(value: string): RenownSessionCookie | undefined {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as RenownSessionCookie).token === \"string\"\n ) {\n return parsed as RenownSessionCookie;\n }\n } catch {\n // Malformed cookie.\n }\n return undefined;\n}\n\n// Decode a session cookie's claims WITHOUT verifying the signature — cheap\n// optimistic checks only (e.g. proxy redirect); never trust for access control.\nexport function readSessionClaims(\n value: string,\n): RenownSessionClaims | undefined {\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const parts = parsed.token.split(\".\");\n if (parts.length < 2) return undefined;\n try {\n const json = Buffer.from(parts[1], \"base64url\").toString(\"utf8\");\n const payload = JSON.parse(json) as {\n exp?: number;\n vc?: {\n credentialSubject?: {\n address?: string;\n chainId?: number;\n networkId?: string;\n };\n };\n };\n const subject = payload.vc?.credentialSubject;\n return {\n address: subject?.address,\n chainId: subject?.chainId,\n networkId: subject?.networkId,\n expiresAt: payload.exp,\n };\n } catch {\n return undefined;\n }\n}\n\n// Verify a session cookie (envelope or bare token) → user, or undefined. Pass\n// verifyCredential:true to also check vs Switchboard; envelope hint is merged.\nexport async function verifyRenownSession(\n value: string,\n options: VerifyRenownSessionOptions = {},\n): Promise<RenownSession | undefined> {\n const { verifyCredential = false } = options;\n const parsed = parseSessionCookie(value);\n if (!parsed) return undefined;\n const { token, profile } = parsed;\n\n let session: RenownSession | undefined;\n if (verifyCredential) {\n const verified = await verifyAuthCredential(token, {\n audience: options.audience,\n renownUrl: options.renownUrl,\n switchboardUrl: options.switchboardUrl,\n });\n if (verified) {\n session = {\n user: {\n address: verified.address as `0x${string}`,\n chainId: verified.chainId,\n networkId: verified.networkId,\n did: verified.did,\n credential: verified.credential,\n },\n appDid: verified.appDid,\n };\n }\n } else {\n const verified = await verifyAuthBearerToken(token, {\n audience: options.audience,\n });\n if (verified) {\n const subject = verified.verifiableCredential.credentialSubject;\n const did = `did:pkh:${subject.networkId}:${subject.chainId}:${subject.address.toLowerCase()}`;\n session = {\n user: {\n address: subject.address as `0x${string}`,\n chainId: subject.chainId,\n networkId: subject.networkId,\n did,\n credential: undefined,\n },\n appDid: verified.issuer,\n expiresAt: verified.payload.exp,\n };\n }\n }\n\n if (!session) return undefined;\n\n // Merge the (unverified) display hint from the envelope — display only. The\n // richer fields make this seed shape-identical to the client's restored user.\n if (profile) {\n const name = profile.name ?? profile.username ?? undefined;\n const avatarUrl = profile.avatar ?? profile.userImage ?? undefined;\n const user = { ...session.user };\n if (name || avatarUrl) {\n user.ens = { name, avatarUrl };\n }\n // Only `documentId` makes a seeded profile useful (profile links); display\n // already flows through `ens`, so there is nothing to seed without it.\n if (profile.documentId) {\n user.profile = {\n documentId: profile.documentId,\n username: profile.username ?? null,\n userImage: profile.userImage ?? null,\n ethAddress: session.user.address,\n };\n }\n session.user = user;\n }\n return session;\n}\n"],"mappings":"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"}
@@ -1,77 +1,8 @@
1
- import { a as DEFAULT_RENOWN_NETWORK_ID } from "./constants-BexAR53F.js";
2
- import { createVerifiableCredentialJwt, verifyCredential } from "did-jwt-vc";
3
- import { Resolver } from "did-resolver";
4
- import { getResolver } from "key-did-resolver";
1
+ import { a as DEFAULT_RENOWN_NETWORK_ID } from "./constants-DVOF17NB.js";
2
+ import { n as createAuthBearerToken } from "./utils-DLQ5VVqT.js";
3
+ import { actionSignerIdentity, signActionV2 } from "@powerhousedao/shared/document-model";
5
4
  import { fromString, toString } from "uint8arrays";
6
5
  import { encodeDIDFromPub, getPublicKey } from "@didtools/key-webcrypto";
7
- //#region src/utils.ts
8
- /**
9
- * Parse a DID:pkh string to extract network, chain ID, and address information
10
- * @param did - The DID string in format "did:pkh:networkId:chainId:address"
11
- * @returns Parsed DID information
12
- * @throws Error if the DID format is invalid
13
- */
14
- function parsePkhDid(did) {
15
- const parts = did.split(":");
16
- if (!did.startsWith("did:pkh:") || parts.length !== 5) throw new Error("Invalid pkh did");
17
- const [, , networkId, chainIdStr, address] = parts;
18
- if (!address.startsWith("0x")) throw new Error(`Invalid address: ${address}`);
19
- const chainId = Number(chainIdStr);
20
- if (isNaN(chainId)) throw new Error(`Invalid chain id: ${chainIdStr}`);
21
- return {
22
- chainId,
23
- networkId,
24
- address
25
- };
26
- }
27
- async function verifyAuthBearerToken(jwt, options) {
28
- try {
29
- const now = parseInt(String(Date.now() / 1e3));
30
- const verified = await verifyCredential(jwt, getResolver$1(), {
31
- ...options?.audience !== void 0 && { audience: options.audience },
32
- policies: {
33
- now: parseInt(String(Date.now() / 1e3)),
34
- expirationDate: true,
35
- issuanceDate: true
36
- }
37
- });
38
- if (verified.payload.exp && verified.payload.exp < now) return false;
39
- assertIsAuthCredential(verified);
40
- return verified;
41
- } catch (e) {
42
- console.error(e);
43
- return false;
44
- }
45
- }
46
- function assertIsAuthCredential(credential) {
47
- const subjectKeys = Object.keys(credential.verifiableCredential.credentialSubject);
48
- if (![
49
- "address",
50
- "chainId",
51
- "networkId"
52
- ].every((key) => subjectKeys.includes(key))) throw new Error("Invalid Auth Credential Subject:" + JSON.stringify(credential.verifiableCredential.credentialSubject, null, 2));
53
- }
54
- async function createAuthBearerToken(chainId, networkId, address, issuer, options) {
55
- return await createVerifiableCredentialJwt({
56
- sub: issuer.did,
57
- vc: {
58
- "@context": ["https://www.w3.org/2018/credentials/v1"],
59
- type: ["VerifiableCredential"],
60
- credentialSubject: {
61
- chainId,
62
- networkId,
63
- address
64
- }
65
- },
66
- aud: options?.aud
67
- }, issuer, { expiresIn: options?.expiresIn });
68
- }
69
- const getResolver$1 = () => {
70
- const keyResolver = getResolver();
71
- if (!keyResolver) throw new Error("Failed to get key resolver");
72
- return new Resolver(keyResolver);
73
- };
74
- //#endregion
75
6
  //#region src/crypto/utils.ts
76
7
  const ECDSA_ALGORITHM = {
77
8
  name: "ECDSA",
@@ -145,7 +76,8 @@ var RenownCrypto = class RenownCrypto {
145
76
  return {
146
77
  did: this.did,
147
78
  signer: async (data) => {
148
- return toString(await this.sign(typeof data === "string" ? new TextEncoder().encode(data) : data), "base64url");
79
+ const signature = await this.sign(typeof data === "string" ? new TextEncoder().encode(data) : data);
80
+ return toString(signature, "base64url");
149
81
  },
150
82
  alg: "ES256"
151
83
  };
@@ -216,6 +148,9 @@ var InvalidSignatureError = class extends Error {
216
148
  }
217
149
  };
218
150
  var RenownCryptoSigner = class {
151
+ crypto;
152
+ appName;
153
+ user;
219
154
  app;
220
155
  constructor(crypto, appName, user) {
221
156
  this.crypto = crypto;
@@ -235,48 +170,45 @@ var RenownCryptoSigner = class {
235
170
  async verify(data, signature) {
236
171
  if (!await this.crypto.verify(data, signature)) throw new InvalidSignatureError();
237
172
  }
238
- async signAction(action, abortSignal) {
173
+ async signAction(action, target, abortSignal) {
239
174
  const hashField = action.context?.prevOpHash ?? "";
240
- return this._signAction(action, hashField, abortSignal);
175
+ return this._signAction(action, target, hashField, abortSignal);
241
176
  }
242
177
  /**
243
- * Signs an action including a predicted resulting state hash.
244
- *
245
- * The resulting hash is packed into the signature tuple's 4th element (index 3)
246
- * using the format: `${prevStateHash}:${resultingStateHash}`
247
- *
248
- * This allows offline verification of documents without reducer logic:
249
- * - Verifier can check that the signature is valid for the claimed resulting state
250
- * - Verifier can compare claimed resulting state to actual operation.hash
251
- *
252
- * @param action - The action to sign
253
- * @param resultingStateHash - The predicted hash of document state AFTER this action runs
254
- * @param abortSignal - Optional abort signal
255
- * @returns A Signature tuple with the resulting hash encoded in element [3]
178
+ * Signs an action including a predicted resulting state hash, packed into
179
+ * element [3] as `${prevStateHash}:${resultingStateHash}`.
256
180
  */
257
- async signActionWithResultingState(action, resultingStateHash, abortSignal) {
181
+ async signActionWithResultingState(action, target, resultingStateHash, abortSignal) {
258
182
  const hashField = `${action.context?.prevOpHash ?? ""}:${resultingStateHash}`;
259
- return this._signAction(action, hashField, abortSignal);
183
+ return this._signAction(action, target, hashField, abortSignal);
260
184
  }
261
185
  /**
262
- * Internal signing implementation shared by signAction and signActionWithResultingState.
186
+ * The pre-v2 tuple, over scope, type and input only. For peers and tests
187
+ * that still need one; it binds neither the document nor the signer.
263
188
  */
264
- async _signAction(action, hashField, abortSignal) {
265
- if (abortSignal?.aborted) throw new Error("Signing aborted");
266
- const timestamp = ((/* @__PURE__ */ new Date()).getTime() / 1e3).toFixed(0);
267
- const hash = await this.hashAction(action);
189
+ async signActionLegacy(action, abortSignal) {
268
190
  if (abortSignal?.aborted) throw new Error("Signing aborted");
269
191
  const params = [
270
- timestamp,
192
+ ((/* @__PURE__ */ new Date()).getTime() / 1e3).toFixed(0),
271
193
  this.crypto.did,
272
- hash,
273
- hashField
194
+ await this.hashAction(action),
195
+ action.context?.prevOpHash ?? ""
274
196
  ];
275
- const message = this.buildSignatureMessage(params);
276
- const signatureBytes = await this.crypto.sign(message);
277
- const signatureHex = `0x${this.arrayBufferToHex(signatureBytes)}`;
197
+ const signatureBytes = await this.crypto.sign(this.buildSignatureMessage(params));
198
+ if (abortSignal?.aborted) throw new Error("Signing aborted");
199
+ return [...params, `0x${this.arrayBufferToHex(signatureBytes)}`];
200
+ }
201
+ async _signAction(action, target, hashField, abortSignal) {
202
+ if (abortSignal?.aborted) throw new Error("Signing aborted");
203
+ const signature = await signActionV2({
204
+ action,
205
+ target,
206
+ signer: actionSignerIdentity(this),
207
+ sign: (message) => this.crypto.sign(message),
208
+ previousStateHash: hashField
209
+ });
278
210
  if (abortSignal?.aborted) throw new Error("Signing aborted");
279
- return [...params, signatureHex];
211
+ return signature;
280
212
  }
281
213
  async hashAction(action) {
282
214
  const payload = [
@@ -361,7 +293,7 @@ function base58Decode(input) {
361
293
  const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
362
294
  const ALPHABET_MAP = /* @__PURE__ */ new Map();
363
295
  for (let i = 0; i < 58; i++) ALPHABET_MAP.set(ALPHABET[i], i);
364
- if (input.length === 0) return new Uint8Array(0);
296
+ if (input.length === 0) return /* @__PURE__ */ new Uint8Array(0);
365
297
  const bytes = [0];
366
298
  for (const char of input) {
367
299
  const value = ALPHABET_MAP.get(char);
@@ -394,7 +326,7 @@ function decompressP256PublicKey(compressed) {
394
326
  for (let i = 1; i < compressed.length; i++) x = x << BigInt(8) | BigInt(compressed[i]);
395
327
  let y = modPow((modPow(x, BigInt(3), p) + a * x + b) % p, (p + BigInt(1)) / BigInt(4), p);
396
328
  if (y % BigInt(2) === BigInt(0) !== (prefix === 2)) y = p - y;
397
- const uncompressed = new Uint8Array(65);
329
+ const uncompressed = /* @__PURE__ */ new Uint8Array(65);
398
330
  uncompressed[0] = 4;
399
331
  const xBytes = bigIntToBytes(x, 32);
400
332
  const yBytes = bigIntToBytes(y, 32);
@@ -462,6 +394,6 @@ function signatureHasResultingHash(signature) {
462
394
  return extractResultingHashFromSignature(signature) !== void 0;
463
395
  }
464
396
  //#endregion
465
- export { signatureHasResultingHash as a, ConnectCrypto as c, createAuthBearerToken as d, getResolver$1 as f, parseSignatureHashField as i, RenownCrypto as l, verifyAuthBearerToken as m, createSignatureVerifier as n, MemoryKeyStorage as o, parsePkhDid as p, extractResultingHashFromSignature as r, RenownCryptoBuilder as s, RenownCryptoSigner as t, assertIsAuthCredential as u };
397
+ export { signatureHasResultingHash as a, ConnectCrypto as c, parseSignatureHashField as i, RenownCrypto as l, createSignatureVerifier as n, MemoryKeyStorage as o, extractResultingHashFromSignature as r, RenownCryptoBuilder as s, RenownCryptoSigner as t };
466
398
 
467
- //# sourceMappingURL=signer-DrjINLqt.js.map
399
+ //# sourceMappingURL=signer-GzTlZLjR.js.map