signet-protocol 0.1.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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/anomaly.d.ts +42 -0
  4. package/dist/anomaly.d.ts.map +1 -0
  5. package/dist/anomaly.js +209 -0
  6. package/dist/anomaly.js.map +1 -0
  7. package/dist/badge.d.ts +56 -0
  8. package/dist/badge.d.ts.map +1 -0
  9. package/dist/badge.js +171 -0
  10. package/dist/badge.js.map +1 -0
  11. package/dist/bonds.d.ts +39 -0
  12. package/dist/bonds.d.ts.map +1 -0
  13. package/dist/bonds.js +149 -0
  14. package/dist/bonds.js.map +1 -0
  15. package/dist/challenges.d.ts +18 -0
  16. package/dist/challenges.d.ts.map +1 -0
  17. package/dist/challenges.js +145 -0
  18. package/dist/challenges.js.map +1 -0
  19. package/dist/cold-call.d.ts +74 -0
  20. package/dist/cold-call.d.ts.map +1 -0
  21. package/dist/cold-call.js +176 -0
  22. package/dist/cold-call.js.map +1 -0
  23. package/dist/compliance.d.ts +82 -0
  24. package/dist/compliance.d.ts.map +1 -0
  25. package/dist/compliance.js +478 -0
  26. package/dist/compliance.js.map +1 -0
  27. package/dist/connections.d.ts +63 -0
  28. package/dist/connections.d.ts.map +1 -0
  29. package/dist/connections.js +170 -0
  30. package/dist/connections.js.map +1 -0
  31. package/dist/constants.d.ts +86 -0
  32. package/dist/constants.d.ts.map +1 -0
  33. package/dist/constants.js +124 -0
  34. package/dist/constants.js.map +1 -0
  35. package/dist/credentials.d.ts +190 -0
  36. package/dist/credentials.d.ts.map +1 -0
  37. package/dist/credentials.js +686 -0
  38. package/dist/credentials.js.map +1 -0
  39. package/dist/crypto.d.ts +27 -0
  40. package/dist/crypto.d.ts.map +1 -0
  41. package/dist/crypto.js +75 -0
  42. package/dist/crypto.js.map +1 -0
  43. package/dist/errors.d.ts +17 -0
  44. package/dist/errors.d.ts.map +1 -0
  45. package/dist/errors.js +29 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/i18n.d.ts +98 -0
  48. package/dist/i18n.d.ts.map +1 -0
  49. package/dist/i18n.js +1118 -0
  50. package/dist/i18n.js.map +1 -0
  51. package/dist/identity-bridge.d.ts +52 -0
  52. package/dist/identity-bridge.d.ts.map +1 -0
  53. package/dist/identity-bridge.js +228 -0
  54. package/dist/identity-bridge.js.map +1 -0
  55. package/dist/identity-tree.d.ts +47 -0
  56. package/dist/identity-tree.d.ts.map +1 -0
  57. package/dist/identity-tree.js +69 -0
  58. package/dist/identity-tree.js.map +1 -0
  59. package/dist/index.d.ts +55 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +86 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/key-derivation.d.ts +43 -0
  64. package/dist/key-derivation.d.ts.map +1 -0
  65. package/dist/key-derivation.js +212 -0
  66. package/dist/key-derivation.js.map +1 -0
  67. package/dist/lsag.d.ts +23 -0
  68. package/dist/lsag.d.ts.map +1 -0
  69. package/dist/lsag.js +35 -0
  70. package/dist/lsag.js.map +1 -0
  71. package/dist/merkle.d.ts +19 -0
  72. package/dist/merkle.d.ts.map +1 -0
  73. package/dist/merkle.js +155 -0
  74. package/dist/merkle.js.map +1 -0
  75. package/dist/policies.d.ts +22 -0
  76. package/dist/policies.d.ts.map +1 -0
  77. package/dist/policies.js +123 -0
  78. package/dist/policies.js.map +1 -0
  79. package/dist/range-proof.d.ts +6 -0
  80. package/dist/range-proof.d.ts.map +1 -0
  81. package/dist/range-proof.js +45 -0
  82. package/dist/range-proof.js.map +1 -0
  83. package/dist/relay.d.ts +106 -0
  84. package/dist/relay.d.ts.map +1 -0
  85. package/dist/relay.js +336 -0
  86. package/dist/relay.js.map +1 -0
  87. package/dist/ring-signature.d.ts +35 -0
  88. package/dist/ring-signature.d.ts.map +1 -0
  89. package/dist/ring-signature.js +56 -0
  90. package/dist/ring-signature.js.map +1 -0
  91. package/dist/shamir.d.ts +55 -0
  92. package/dist/shamir.d.ts.map +1 -0
  93. package/dist/shamir.js +253 -0
  94. package/dist/shamir.js.map +1 -0
  95. package/dist/signet-words.d.ts +42 -0
  96. package/dist/signet-words.d.ts.map +1 -0
  97. package/dist/signet-words.js +82 -0
  98. package/dist/signet-words.js.map +1 -0
  99. package/dist/store.d.ts +65 -0
  100. package/dist/store.d.ts.map +1 -0
  101. package/dist/store.js +290 -0
  102. package/dist/store.js.map +1 -0
  103. package/dist/trust-score.d.ts +9 -0
  104. package/dist/trust-score.d.ts.map +1 -0
  105. package/dist/trust-score.js +186 -0
  106. package/dist/trust-score.js.map +1 -0
  107. package/dist/types.d.ts +358 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +15 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist/utils.d.ts +11 -0
  112. package/dist/utils.d.ts.map +1 -0
  113. package/dist/utils.js +21 -0
  114. package/dist/utils.js.map +1 -0
  115. package/dist/validation.d.ts +33 -0
  116. package/dist/validation.d.ts.map +1 -0
  117. package/dist/validation.js +312 -0
  118. package/dist/validation.js.map +1 -0
  119. package/dist/verifiers.d.ts +18 -0
  120. package/dist/verifiers.d.ts.map +1 -0
  121. package/dist/verifiers.js +118 -0
  122. package/dist/verifiers.js.map +1 -0
  123. package/dist/vouches.d.ts +14 -0
  124. package/dist/vouches.d.ts.map +1 -0
  125. package/dist/vouches.js +103 -0
  126. package/dist/vouches.js.map +1 -0
  127. package/package.json +76 -0
  128. package/src/anomaly.ts +307 -0
  129. package/src/badge.ts +208 -0
  130. package/src/bonds.ts +203 -0
  131. package/src/challenges.ts +187 -0
  132. package/src/cold-call.ts +238 -0
  133. package/src/compliance.ts +612 -0
  134. package/src/connections.ts +216 -0
  135. package/src/constants.ts +146 -0
  136. package/src/credentials.ts +908 -0
  137. package/src/crypto.ts +85 -0
  138. package/src/errors.ts +31 -0
  139. package/src/i18n.ts +1347 -0
  140. package/src/identity-bridge.ts +262 -0
  141. package/src/identity-tree.ts +90 -0
  142. package/src/index.ts +452 -0
  143. package/src/lsag.ts +53 -0
  144. package/src/merkle.ts +176 -0
  145. package/src/policies.ts +154 -0
  146. package/src/range-proof.ts +66 -0
  147. package/src/relay.ts +433 -0
  148. package/src/ring-signature.ts +76 -0
  149. package/src/signet-words.ts +122 -0
  150. package/src/store.ts +336 -0
  151. package/src/trust-score.ts +208 -0
  152. package/src/types.ts +482 -0
  153. package/src/utils.ts +20 -0
  154. package/src/validation.ts +391 -0
  155. package/src/verifiers.ts +156 -0
  156. package/src/vouches.ts +141 -0
@@ -0,0 +1,22 @@
1
+ import type { NostrEvent, UnsignedEvent, PolicyParams, PolicyCheckResult, ParsedPolicy, SignetTier } from './types.js';
2
+ /** Build an unsigned policy event */
3
+ export declare function buildPolicyEvent(operatorPubkey: string, params: PolicyParams): UnsignedEvent;
4
+ /** Create and sign a community policy */
5
+ export declare function createPolicy(operatorPrivateKey: string, params: PolicyParams): Promise<NostrEvent>;
6
+ /** Parse a policy event into a structured object */
7
+ export declare function parsePolicy(event: NostrEvent): ParsedPolicy | null;
8
+ /** Check if a user meets a policy's requirements */
9
+ export declare function checkPolicyCompliance(policy: ParsedPolicy, userTier: SignetTier, userScore: number, opts?: {
10
+ isChild?: boolean;
11
+ isModerator?: boolean;
12
+ }): PolicyCheckResult;
13
+ /** Policy checker that holds a policy and checks multiple users */
14
+ export declare class PolicyChecker {
15
+ private policy;
16
+ constructor(policyEvent: NostrEvent);
17
+ getPolicy(): ParsedPolicy;
18
+ checkAdult(tier: SignetTier, score: number): PolicyCheckResult;
19
+ checkChild(tier: SignetTier, score: number): PolicyCheckResult;
20
+ checkModerator(tier: SignetTier, score: number): PolicyCheckResult;
21
+ }
22
+ //# sourceMappingURL=policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,UAAU,EAGX,MAAM,YAAY,CAAC;AAEpB,qCAAqC;AACrC,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,YAAY,GACnB,aAAa,CAqBf;AAED,yCAAyC;AACzC,wBAAsB,YAAY,CAChC,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAyBlE;AAED,oDAAoD;AACpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CAClB,GACL,iBAAiB,CAkCnB;AAED,mEAAmE;AACnE,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;gBAEjB,WAAW,EAAE,UAAU;IAMnC,SAAS,IAAI,YAAY;IAIzB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAI9D,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;IAI9D,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB;CAGnE"}
@@ -0,0 +1,123 @@
1
+ // Community Verification Policy (kind 30078, NIP-78)
2
+ // Create policies and check compliance
3
+ import { APP_DATA_KIND, DEFAULT_CRYPTO_ALGORITHM } from './constants.js';
4
+ import { signEvent, getPublicKey } from './crypto.js';
5
+ import { getTagValue } from './validation.js';
6
+ import { SignetValidationError } from './errors.js';
7
+ /** Build an unsigned policy event */
8
+ export function buildPolicyEvent(operatorPubkey, params) {
9
+ const tags = [
10
+ ['d', `signet:policy:${params.communityId}`],
11
+ ['adult-min-tier', String(params.adultMinTier)],
12
+ ['child-min-tier', String(params.childMinTier)],
13
+ ['enforcement', params.enforcement],
14
+ ['algo', DEFAULT_CRYPTO_ALGORITHM],
15
+ ];
16
+ if (params.minScore !== undefined)
17
+ tags.push(['min-score', String(params.minScore)]);
18
+ if (params.modMinTier !== undefined)
19
+ tags.push(['mod-min-tier', String(params.modMinTier)]);
20
+ if (params.verifierBond !== undefined)
21
+ tags.push(['verifier-bond', String(params.verifierBond)]);
22
+ if (params.revocationThreshold !== undefined)
23
+ tags.push(['revocation-threshold', String(params.revocationThreshold)]);
24
+ return {
25
+ kind: APP_DATA_KIND,
26
+ pubkey: operatorPubkey,
27
+ created_at: Math.floor(Date.now() / 1000),
28
+ tags,
29
+ content: params.description || '',
30
+ };
31
+ }
32
+ /** Create and sign a community policy */
33
+ export async function createPolicy(operatorPrivateKey, params) {
34
+ const pubkey = getPublicKey(operatorPrivateKey);
35
+ const event = buildPolicyEvent(pubkey, params);
36
+ return signEvent(event, operatorPrivateKey);
37
+ }
38
+ /** Parse a policy event into a structured object */
39
+ export function parsePolicy(event) {
40
+ if (event.kind !== APP_DATA_KIND)
41
+ return null;
42
+ // NIP-78 policy events are identified by the signet:policy: d-tag prefix
43
+ const dTag = getTagValue(event, 'd') || '';
44
+ if (!dTag.startsWith('signet:policy:'))
45
+ return null;
46
+ const adultTier = getTagValue(event, 'adult-min-tier');
47
+ const childTier = getTagValue(event, 'child-min-tier');
48
+ const algorithm = (getTagValue(event, 'algo') || DEFAULT_CRYPTO_ALGORITHM);
49
+ // Strip 'signet:policy:' prefix from d-tag to get community ID
50
+ const communityId = dTag.slice('signet:policy:'.length);
51
+ return {
52
+ communityId,
53
+ adultMinTier: (() => { const t = adultTier ? parseInt(adultTier, 10) : NaN; return (!isNaN(t) && t >= 1 && t <= 4 ? t : 1); })(),
54
+ childMinTier: (() => { const t = childTier ? parseInt(childTier, 10) : NaN; return (!isNaN(t) && t >= 1 && t <= 4 ? t : 1); })(),
55
+ enforcement: (getTagValue(event, 'enforcement') || 'client'),
56
+ minScore: (() => { const s = getTagValue(event, 'min-score'); if (!s)
57
+ return undefined; const v = parseInt(s, 10); return isNaN(v) ? undefined : Math.max(0, Math.min(v, 200)); })(),
58
+ modMinTier: (() => { const s = getTagValue(event, 'mod-min-tier'); if (!s)
59
+ return undefined; const t = parseInt(s, 10); if (isNaN(t) || t < 1 || t > 4)
60
+ return undefined; return t; })(),
61
+ verifierBond: (() => { const s = getTagValue(event, 'verifier-bond'); if (!s)
62
+ return undefined; const v = parseInt(s, 10); return isNaN(v) || v < 0 ? undefined : v; })(),
63
+ revocationThreshold: (() => { const s = getTagValue(event, 'revocation-threshold'); if (!s)
64
+ return undefined; const v = parseInt(s, 10); return isNaN(v) || v < 1 ? undefined : v; })(),
65
+ algorithm,
66
+ };
67
+ }
68
+ /** Check if a user meets a policy's requirements */
69
+ export function checkPolicyCompliance(policy, userTier, userScore, opts = {}) {
70
+ const requiredTier = opts.isChild
71
+ ? policy.childMinTier
72
+ : opts.isModerator && policy.modMinTier
73
+ ? policy.modMinTier
74
+ : policy.adultMinTier;
75
+ if (userTier < requiredTier) {
76
+ return {
77
+ allowed: false,
78
+ reason: `Tier ${userTier} does not meet minimum tier ${requiredTier}`,
79
+ requiredTier,
80
+ actualTier: userTier,
81
+ };
82
+ }
83
+ if (policy.minScore !== undefined && userScore < policy.minScore) {
84
+ return {
85
+ allowed: false,
86
+ reason: `Score ${userScore} does not meet minimum score ${policy.minScore}`,
87
+ requiredTier,
88
+ actualTier: userTier,
89
+ requiredScore: policy.minScore,
90
+ actualScore: userScore,
91
+ };
92
+ }
93
+ return {
94
+ allowed: true,
95
+ requiredTier,
96
+ actualTier: userTier,
97
+ requiredScore: policy.minScore,
98
+ actualScore: userScore,
99
+ };
100
+ }
101
+ /** Policy checker that holds a policy and checks multiple users */
102
+ export class PolicyChecker {
103
+ policy;
104
+ constructor(policyEvent) {
105
+ const parsed = parsePolicy(policyEvent);
106
+ if (!parsed)
107
+ throw new SignetValidationError('Invalid policy event');
108
+ this.policy = parsed;
109
+ }
110
+ getPolicy() {
111
+ return this.policy;
112
+ }
113
+ checkAdult(tier, score) {
114
+ return checkPolicyCompliance(this.policy, tier, score, { isChild: false });
115
+ }
116
+ checkChild(tier, score) {
117
+ return checkPolicyCompliance(this.policy, tier, score, { isChild: true });
118
+ }
119
+ checkModerator(tier, score) {
120
+ return checkPolicyCompliance(this.policy, tier, score, { isModerator: true });
121
+ }
122
+ }
123
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { commit, verifyCommitment, createRangeProof, createAgeRangeProof, serializeRangeProof, deserializeRangeProof, type PedersenCommitment, type RangeProof } from '@forgesworn/range-proof';
2
+ export { commit, verifyCommitment, createRangeProof, createAgeRangeProof, serializeRangeProof, deserializeRangeProof };
3
+ export type { PedersenCommitment, RangeProof };
4
+ export declare function verifyRangeProof(proof: RangeProof, expectedMin: number, expectedMax: number, expectedBindingContext?: string): boolean;
5
+ export declare function verifyAgeRangeProof(proof: RangeProof, expectedAgeRange: string, expectedSubjectPubkey?: string): boolean;
6
+ //# sourceMappingURL=range-proof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-proof.d.ts","sourceRoot":"","sources":["../src/range-proof.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AA4BjC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;AACvH,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC;AAE/C,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,sBAAsB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAMT;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,CAAC,EAAE,MAAM,GAC7B,OAAO,CAIT"}
@@ -0,0 +1,45 @@
1
+ // Pedersen Commitments + Range Proofs — compatibility wrapper over @forgesworn/range-proof
2
+ // Proves "value is in [min, max]" without revealing the exact value.
3
+ // Used for Tier 4 age range proofs: "child aged 8-12" without revealing exact age.
4
+ import { commit, verifyCommitment, createRangeProof, createAgeRangeProof, serializeRangeProof, deserializeRangeProof, } from '@forgesworn/range-proof';
5
+ import { verifyRangeProof as verifyRangeProofUpstream, } from '@forgesworn/range-proof';
6
+ function normalizeBindingContext(bindingContext) {
7
+ return bindingContext === '' ? undefined : bindingContext;
8
+ }
9
+ function parseAgeRange(ageRange) {
10
+ const digitsOnly = /^\d+$/;
11
+ if (ageRange.endsWith('+')) {
12
+ const minStr = ageRange.slice(0, -1);
13
+ if (!digitsOnly.test(minStr))
14
+ return null;
15
+ return { min: parseInt(minStr, 10), max: 150 };
16
+ }
17
+ const parts = ageRange.split('-');
18
+ if (parts.length !== 2)
19
+ return null;
20
+ if (!digitsOnly.test(parts[0]) || !digitsOnly.test(parts[1]))
21
+ return null;
22
+ return {
23
+ min: parseInt(parts[0], 10),
24
+ max: parseInt(parts[1], 10),
25
+ };
26
+ }
27
+ export { commit, verifyCommitment, createRangeProof, createAgeRangeProof, serializeRangeProof, deserializeRangeProof };
28
+ export function verifyRangeProof(proof, expectedMin, expectedMax, expectedBindingContext) {
29
+ if (!Number.isSafeInteger(expectedMin) || !Number.isSafeInteger(expectedMax))
30
+ return false;
31
+ if (expectedMin < 0 || expectedMax < 0 || expectedMax < expectedMin)
32
+ return false;
33
+ if (proof.min !== expectedMin || proof.max !== expectedMax)
34
+ return false;
35
+ if (normalizeBindingContext(proof.context) !== normalizeBindingContext(expectedBindingContext))
36
+ return false;
37
+ return verifyRangeProofUpstream(proof, expectedMin, expectedMax, expectedBindingContext);
38
+ }
39
+ export function verifyAgeRangeProof(proof, expectedAgeRange, expectedSubjectPubkey) {
40
+ const parsed = parseAgeRange(expectedAgeRange);
41
+ if (!parsed)
42
+ return false;
43
+ return verifyRangeProof(proof, parsed.min, parsed.max, expectedSubjectPubkey);
44
+ }
45
+ //# sourceMappingURL=range-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-proof.js","sourceRoot":"","sources":["../src/range-proof.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,qEAAqE;AACrE,mFAAmF;AAEnF,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,IAAI,wBAAwB,GAE7C,MAAM,yBAAyB,CAAC;AAEjC,SAAS,uBAAuB,CAAC,cAAuB;IACtD,OAAO,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC;IAE3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;AAGvH,MAAM,UAAU,gBAAgB,CAC9B,KAAiB,EACjB,WAAmB,EACnB,WAAmB,EACnB,sBAA+B;IAE/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,WAAW;QAAE,OAAO,KAAK,CAAC;IAClF,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,uBAAuB,CAAC,sBAAsB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,OAAO,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,gBAAwB,EACxB,qBAA8B;IAE9B,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,106 @@
1
+ import type { NostrEvent } from './types.js';
2
+ /** Nostr relay message types (relay → client) */
3
+ export type RelayMessage = ['EVENT', string, NostrEvent] | ['OK', string, boolean, string] | ['EOSE', string] | ['NOTICE', string] | ['AUTH', string];
4
+ /** Nostr subscription filter */
5
+ export interface NostrFilter {
6
+ ids?: string[];
7
+ authors?: string[];
8
+ kinds?: number[];
9
+ '#d'?: string[];
10
+ '#p'?: string[];
11
+ '#L'?: string[];
12
+ '#l'?: string[];
13
+ since?: number;
14
+ until?: number;
15
+ limit?: number;
16
+ }
17
+ /** Subscription callback */
18
+ export type SubscriptionCallback = (event: NostrEvent) => void;
19
+ /** Relay connection state */
20
+ export type RelayState = 'connecting' | 'connected' | 'disconnected' | 'error';
21
+ /** Options for the relay client */
22
+ export interface RelayOptions {
23
+ /** Private key for NIP-42 AUTH (hex) */
24
+ authPrivateKey?: string;
25
+ /** Connection timeout in ms (default: 5000) */
26
+ connectTimeout?: number;
27
+ /** Auto-reconnect on disconnect (default: true) */
28
+ autoReconnect?: boolean;
29
+ /** Reconnect delay in ms (default: 3000) */
30
+ reconnectDelay?: number;
31
+ /** Max reconnect attempts (default: 5) */
32
+ maxReconnectAttempts?: number;
33
+ /** Verify event signatures before delivering to callbacks (default: true).
34
+ * Events that fail verification are silently dropped. */
35
+ verifyEvents?: boolean;
36
+ /** Callback for rejected events (signature or ID verification failed) */
37
+ onEventRejected?: (event: NostrEvent, reason: string) => void;
38
+ }
39
+ /**
40
+ * Nostr relay client with NIP-42 AUTH support.
41
+ * Handles publishing events, subscribing to filters, and authentication.
42
+ */
43
+ export declare class RelayClient {
44
+ private url;
45
+ private options;
46
+ private ws;
47
+ private state;
48
+ private subscriptions;
49
+ private pendingPublishes;
50
+ private subCounter;
51
+ private reconnectAttempts;
52
+ private reconnectTimer;
53
+ private disconnectRequested;
54
+ private onStateChange?;
55
+ constructor(url: string, options?: RelayOptions);
56
+ /** Get current connection state */
57
+ getState(): RelayState;
58
+ /** Set a state change listener */
59
+ onStateChanged(callback: (state: RelayState) => void): void;
60
+ private setState;
61
+ /** Connect to the relay */
62
+ connect(): Promise<void>;
63
+ /** Disconnect from the relay */
64
+ disconnect(): void;
65
+ /** Publish an event to the relay */
66
+ publish(event: NostrEvent): Promise<{
67
+ ok: boolean;
68
+ message: string;
69
+ }>;
70
+ /**
71
+ * Subscribe to events matching the given filters.
72
+ * @returns Subscription ID (use to close the subscription)
73
+ */
74
+ subscribe(filters: NostrFilter[], onEvent: SubscriptionCallback, onEose?: () => void): string;
75
+ /** Close a subscription */
76
+ closeSubscription(subId: string): void;
77
+ /**
78
+ * Fetch events matching filters (returns after EOSE).
79
+ * Convenience method that subscribes, collects events, and closes.
80
+ */
81
+ fetch(filters: NostrFilter[], timeoutMs?: number): Promise<NostrEvent[]>;
82
+ private sendSubscription;
83
+ private handleMessage;
84
+ /** Handle NIP-42 AUTH challenge */
85
+ private handleAuth;
86
+ private handleReconnect;
87
+ }
88
+ /**
89
+ * Publish a Signet event to multiple relays.
90
+ *
91
+ * WARNING: Relay URLs are accepted as-is. Callers are responsible for
92
+ * validating that URLs come from trusted sources and do not encode credentials.
93
+ * The RelayClient constructor enforces wss:// for non-localhost connections.
94
+ */
95
+ export declare function publishToRelays(event: NostrEvent, relayUrls: string[]): Promise<Map<string, {
96
+ ok: boolean;
97
+ message: string;
98
+ }>>;
99
+ /**
100
+ * Fetch Signet events from a relay by kind and optional filters.
101
+ *
102
+ * WARNING: Relay URL is accepted as-is. Callers are responsible for
103
+ * validating that URLs come from trusted sources and do not encode credentials.
104
+ */
105
+ export declare function fetchFromRelay(relayUrl: string, filters: NostrFilter[]): Promise<NostrEvent[]>;
106
+ //# sourceMappingURL=relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}