@fastxyz/fastid-sdk 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 (95) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +65 -0
  3. package/dist/address.d.ts +12 -0
  4. package/dist/address.d.ts.map +1 -0
  5. package/dist/address.js +57 -0
  6. package/dist/address.js.map +1 -0
  7. package/dist/canonical-json.d.ts +12 -0
  8. package/dist/canonical-json.d.ts.map +1 -0
  9. package/dist/canonical-json.js +95 -0
  10. package/dist/canonical-json.js.map +1 -0
  11. package/dist/claim-data.d.ts +9 -0
  12. package/dist/claim-data.d.ts.map +1 -0
  13. package/dist/claim-data.js +151 -0
  14. package/dist/claim-data.js.map +1 -0
  15. package/dist/claim-fee.d.ts +26 -0
  16. package/dist/claim-fee.d.ts.map +1 -0
  17. package/dist/claim-fee.js +144 -0
  18. package/dist/claim-fee.js.map +1 -0
  19. package/dist/claim-preflight.d.ts +7 -0
  20. package/dist/claim-preflight.d.ts.map +1 -0
  21. package/dist/claim-preflight.js +34 -0
  22. package/dist/claim-preflight.js.map +1 -0
  23. package/dist/claim-tx.d.ts +35 -0
  24. package/dist/claim-tx.d.ts.map +1 -0
  25. package/dist/claim-tx.js +140 -0
  26. package/dist/claim-tx.js.map +1 -0
  27. package/dist/claims.d.ts +44 -0
  28. package/dist/claims.d.ts.map +1 -0
  29. package/dist/claims.js +348 -0
  30. package/dist/claims.js.map +1 -0
  31. package/dist/client.d.ts +37 -0
  32. package/dist/client.d.ts.map +1 -0
  33. package/dist/client.js +139 -0
  34. package/dist/client.js.map +1 -0
  35. package/dist/errors.d.ts +252 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +410 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/fasttx.d.ts +10 -0
  40. package/dist/fasttx.d.ts.map +1 -0
  41. package/dist/fasttx.js +35 -0
  42. package/dist/fasttx.js.map +1 -0
  43. package/dist/http.d.ts +15 -0
  44. package/dist/http.d.ts.map +1 -0
  45. package/dist/http.js +67 -0
  46. package/dist/http.js.map +1 -0
  47. package/dist/index.d.ts +12 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/name.d.ts +15 -0
  52. package/dist/name.d.ts.map +1 -0
  53. package/dist/name.js +34 -0
  54. package/dist/name.js.map +1 -0
  55. package/dist/networks.d.ts +8 -0
  56. package/dist/networks.d.ts.map +1 -0
  57. package/dist/networks.js +32 -0
  58. package/dist/networks.js.map +1 -0
  59. package/dist/profile-message.d.ts +22 -0
  60. package/dist/profile-message.d.ts.map +1 -0
  61. package/dist/profile-message.js +53 -0
  62. package/dist/profile-message.js.map +1 -0
  63. package/dist/profile.d.ts +30 -0
  64. package/dist/profile.d.ts.map +1 -0
  65. package/dist/profile.js +363 -0
  66. package/dist/profile.js.map +1 -0
  67. package/dist/proofs.d.ts +92 -0
  68. package/dist/proofs.d.ts.map +1 -0
  69. package/dist/proofs.js +770 -0
  70. package/dist/proofs.js.map +1 -0
  71. package/dist/reads.d.ts +76 -0
  72. package/dist/reads.d.ts.map +1 -0
  73. package/dist/reads.js +244 -0
  74. package/dist/reads.js.map +1 -0
  75. package/dist/report-wire.d.ts +35 -0
  76. package/dist/report-wire.d.ts.map +1 -0
  77. package/dist/report-wire.js +131 -0
  78. package/dist/report-wire.js.map +1 -0
  79. package/dist/report.d.ts +36 -0
  80. package/dist/report.d.ts.map +1 -0
  81. package/dist/report.js +255 -0
  82. package/dist/report.js.map +1 -0
  83. package/dist/share.d.ts +9 -0
  84. package/dist/share.d.ts.map +1 -0
  85. package/dist/share.js +16 -0
  86. package/dist/share.js.map +1 -0
  87. package/dist/signer.d.ts +23 -0
  88. package/dist/signer.d.ts.map +1 -0
  89. package/dist/signer.js +73 -0
  90. package/dist/signer.js.map +1 -0
  91. package/dist/verify.d.ts +6 -0
  92. package/dist/verify.d.ts.map +1 -0
  93. package/dist/verify.js +33 -0
  94. package/dist/verify.js.map +1 -0
  95. package/package.json +53 -0
package/dist/report.js ADDED
@@ -0,0 +1,255 @@
1
+ import { IndeterminateReportSubmissionError, InvalidReportError, LocalVerificationError, ReportBodyTooLargeError, ReportCiphertextTooLargeError, ReportConfigError, ReportRejectedError, ReportSealError, SigningError, } from "./errors.js";
2
+ import { anonymousEnvelope, attributionMessage, formatReceivedHour, hourUnixSecs, HPKE_INFO, HPKE_SUITE, reportAad, sealToRecipients, signedEnvelope, } from "./report-wire.js";
3
+ import { verifyStrict } from "./verify.js";
4
+ export const REPORT_BODY_LIMIT = 2 * 1024 * 1024;
5
+ export const REPORT_CIPHERTEXT_LIMIT = 64 * 1024;
6
+ export const REPORT_TEXT_MAX = 2_000;
7
+ const HPKE_AEAD_TAG_BYTES = 16;
8
+ function isObject(value) {
9
+ return typeof value === "object" && value !== null;
10
+ }
11
+ function isReportConfig(value) {
12
+ if (!isObject(value) || !Array.isArray(value.areas) || !isObject(value.hpke)) {
13
+ return false;
14
+ }
15
+ return (value.areas.every((area) => typeof area === "string") &&
16
+ value.hpke.suite === HPKE_SUITE &&
17
+ value.hpke.info === HPKE_INFO &&
18
+ Array.isArray(value.recipients) &&
19
+ value.recipients.length > 0 &&
20
+ value.recipients.length <= 8 &&
21
+ value.recipients.every((recipient) => isObject(recipient) &&
22
+ typeof recipient.key_id === "string" &&
23
+ recipient.key_id.length >= 1 &&
24
+ recipient.key_id.length <= 64 &&
25
+ /^[\x21-\x7e]+$/.test(recipient.key_id) &&
26
+ typeof recipient.public_key === "string" &&
27
+ /^[0-9a-f]{64}$/.test(recipient.public_key)));
28
+ }
29
+ function codePoints(value) {
30
+ return [...value].length;
31
+ }
32
+ function isOptionalString(value) {
33
+ return value === undefined || typeof value === "string";
34
+ }
35
+ function snapshotReportInput(value) {
36
+ const reason = "report input is malformed or exceeds protocol limits";
37
+ if (!isObject(value))
38
+ throw new InvalidReportError(reason);
39
+ let fields;
40
+ try {
41
+ fields = {
42
+ area: value.area,
43
+ whatHappened: value.whatHappened,
44
+ whatExpected: value.whatExpected,
45
+ severity: value.severity,
46
+ page: value.page,
47
+ attribution: value.attribution,
48
+ connectionId: value.connectionId,
49
+ viewport: value.viewport,
50
+ locale: value.locale,
51
+ at: value.at,
52
+ };
53
+ }
54
+ catch {
55
+ throw new InvalidReportError(reason);
56
+ }
57
+ const { area, whatHappened, whatExpected, severity, page, attribution, connectionId, viewport, locale, at, } = fields;
58
+ if (typeof area !== "string" ||
59
+ typeof whatHappened !== "string" ||
60
+ typeof whatExpected !== "string" ||
61
+ (severity !== "blocked" &&
62
+ severity !== "annoying" &&
63
+ severity !== "cosmetic") ||
64
+ typeof page !== "string" ||
65
+ (attribution !== "anonymous" && attribution !== "signed") ||
66
+ !isOptionalString(connectionId) ||
67
+ !isOptionalString(viewport) ||
68
+ !isOptionalString(locale)) {
69
+ throw new InvalidReportError(reason);
70
+ }
71
+ let atMs;
72
+ try {
73
+ atMs =
74
+ at === undefined
75
+ ? Date.now()
76
+ : at instanceof Date
77
+ ? at.getTime()
78
+ : Number.NaN;
79
+ }
80
+ catch {
81
+ throw new InvalidReportError(reason);
82
+ }
83
+ if (!Number.isFinite(atMs) ||
84
+ whatHappened.trim().length === 0 ||
85
+ codePoints(whatHappened) > REPORT_TEXT_MAX ||
86
+ codePoints(whatExpected) > REPORT_TEXT_MAX ||
87
+ new TextEncoder().encode(area).length > 0xff) {
88
+ throw new InvalidReportError(reason);
89
+ }
90
+ return {
91
+ area,
92
+ whatHappened,
93
+ whatExpected,
94
+ severity,
95
+ page,
96
+ attribution,
97
+ ...(connectionId !== undefined ? { connectionId } : {}),
98
+ ...(viewport !== undefined ? { viewport } : {}),
99
+ ...(locale !== undefined ? { locale } : {}),
100
+ at: new Date(atMs),
101
+ };
102
+ }
103
+ function anonymousPlaintext(input) {
104
+ return {
105
+ what_happened: input.whatHappened.trim(),
106
+ what_expected: input.whatExpected.trim(),
107
+ severity: input.severity,
108
+ diagnostics: { page: input.page },
109
+ };
110
+ }
111
+ function signedPlaintext(input) {
112
+ return {
113
+ what_happened: input.whatHappened.trim(),
114
+ what_expected: input.whatExpected.trim(),
115
+ severity: input.severity,
116
+ diagnostics: {
117
+ page: input.page,
118
+ ...(input.connectionId !== undefined
119
+ ? { connection_id: input.connectionId }
120
+ : {}),
121
+ ...(input.viewport !== undefined ? { viewport: input.viewport } : {}),
122
+ ...(input.locale !== undefined ? { locale: input.locale } : {}),
123
+ },
124
+ };
125
+ }
126
+ /** Internal exact-byte guard for the backend's serialized request ceiling. */
127
+ export function serializeReportEnvelope(envelope) {
128
+ const serialized = JSON.stringify(envelope);
129
+ const serializedBytes = new TextEncoder().encode(serialized).byteLength;
130
+ if (serializedBytes > REPORT_BODY_LIMIT) {
131
+ throw new ReportBodyTooLargeError(serializedBytes, REPORT_BODY_LIMIT);
132
+ }
133
+ return serialized;
134
+ }
135
+ export class ReportService {
136
+ #config;
137
+ #signer;
138
+ #fetch;
139
+ constructor(options) {
140
+ this.#config = options.config;
141
+ this.#signer = options.signer;
142
+ this.#fetch = options.fetchImpl;
143
+ }
144
+ async submitReport(input) {
145
+ const snapshot = snapshotReportInput(input);
146
+ const receivedHour = formatReceivedHour(snapshot.at);
147
+ const currentHour = Date.parse(formatReceivedHour(new Date()));
148
+ const receivedHourMs = Date.parse(receivedHour);
149
+ if (!Number.isFinite(receivedHourMs) ||
150
+ Math.abs(receivedHourMs - currentHour) > 60 * 60 * 1_000) {
151
+ throw new InvalidReportError("report hour is outside the accepted one-hour window");
152
+ }
153
+ const config = await this.#loadConfig();
154
+ if (!config.areas.includes(snapshot.area)) {
155
+ throw new InvalidReportError("area is not offered by the report service");
156
+ }
157
+ const plaintext = new TextEncoder().encode(JSON.stringify(snapshot.attribution === "signed"
158
+ ? signedPlaintext(snapshot)
159
+ : anonymousPlaintext(snapshot)));
160
+ const predictedCiphertextBytes = plaintext.byteLength + HPKE_AEAD_TAG_BYTES;
161
+ if (predictedCiphertextBytes > REPORT_CIPHERTEXT_LIMIT) {
162
+ throw new ReportCiphertextTooLargeError(predictedCiphertextBytes, REPORT_CIPHERTEXT_LIMIT, config.recipients[0].key_id);
163
+ }
164
+ let seals;
165
+ try {
166
+ seals = await sealToRecipients(config.recipients, plaintext, reportAad(snapshot.area, receivedHour));
167
+ }
168
+ catch (cause) {
169
+ throw new ReportSealError({ cause });
170
+ }
171
+ for (const seal of seals) {
172
+ const ciphertextBytes = seal.ciphertext.length / 2;
173
+ if (ciphertextBytes > REPORT_CIPHERTEXT_LIMIT) {
174
+ throw new ReportCiphertextTooLargeError(ciphertextBytes, REPORT_CIPHERTEXT_LIMIT, seal.recipient_key_id);
175
+ }
176
+ }
177
+ let envelope;
178
+ if (snapshot.attribution === "anonymous") {
179
+ envelope = anonymousEnvelope(snapshot.area, receivedHour, seals);
180
+ }
181
+ else {
182
+ const message = attributionMessage(snapshot.area, hourUnixSecs(receivedHour), seals);
183
+ let signatureHex;
184
+ try {
185
+ signatureHex = await this.#signer.sign(message);
186
+ }
187
+ catch (cause) {
188
+ throw new SigningError({ cause });
189
+ }
190
+ if (!verifyStrict(message, signatureHex, this.#signer.publicKey)) {
191
+ throw new LocalVerificationError();
192
+ }
193
+ envelope = signedEnvelope(snapshot.area, receivedHour, seals, this.#signer.signerHex, signatureHex.toLowerCase());
194
+ }
195
+ const serialized = serializeReportEnvelope(envelope);
196
+ let response;
197
+ try {
198
+ response = await this.#fetch(`${this.#config.idOrigin}/api/report`, {
199
+ method: "POST",
200
+ headers: { "content-type": "application/json" },
201
+ body: serialized,
202
+ });
203
+ }
204
+ catch (cause) {
205
+ throw new IndeterminateReportSubmissionError({ cause });
206
+ }
207
+ if (!response.ok) {
208
+ const reason = (await response.text().catch(() => "")) || undefined;
209
+ if (response.status >= 500 && response.status < 600) {
210
+ throw new IndeterminateReportSubmissionError({
211
+ cause: new Error(`report intake returned HTTP ${response.status}${reason ? `: ${reason}` : ""}`),
212
+ });
213
+ }
214
+ throw new ReportRejectedError(response.status, reason);
215
+ }
216
+ let acknowledgement;
217
+ try {
218
+ acknowledgement = await response.json();
219
+ }
220
+ catch (cause) {
221
+ throw new IndeterminateReportSubmissionError({ cause });
222
+ }
223
+ if (response.status !== 200 ||
224
+ typeof acknowledgement !== "object" ||
225
+ acknowledgement === null ||
226
+ acknowledgement.status !== "stored" ||
227
+ Object.keys(acknowledgement).length !== 1) {
228
+ throw new IndeterminateReportSubmissionError();
229
+ }
230
+ return { status: "stored" };
231
+ }
232
+ async #loadConfig() {
233
+ let response;
234
+ try {
235
+ response = await this.#fetch(`${this.#config.idOrigin}/api/report/config`, { cache: "no-store" });
236
+ }
237
+ catch (cause) {
238
+ throw new ReportConfigError({ cause });
239
+ }
240
+ if (!response.ok)
241
+ throw new ReportConfigError(undefined, response.status);
242
+ let body;
243
+ try {
244
+ body = await response.json();
245
+ }
246
+ catch (cause) {
247
+ throw new ReportConfigError({ cause });
248
+ }
249
+ if (!isReportConfig(body)) {
250
+ throw new ReportConfigError();
251
+ }
252
+ return body;
253
+ }
254
+ }
255
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { IdNetworkConfig } from "./networks.js";
2
+ export declare class ShareLinks {
3
+ private readonly config;
4
+ constructor(config: IdNetworkConfig);
5
+ profileUrl(identity: string): string;
6
+ idJsonUrl(identity: string): string;
7
+ ogImageUrl(identity: string): string;
8
+ }
9
+ //# sourceMappingURL=share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIpC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAInC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGrC"}
package/dist/share.js ADDED
@@ -0,0 +1,16 @@
1
+ export class ShareLinks {
2
+ config;
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ profileUrl(identity) {
7
+ return `${this.config.idOrigin}/${encodeURIComponent(identity)}`;
8
+ }
9
+ idJsonUrl(identity) {
10
+ return `${this.profileUrl(identity)}/id.json`;
11
+ }
12
+ ogImageUrl(identity) {
13
+ return `${this.profileUrl(identity)}/opengraph-image`;
14
+ }
15
+ }
16
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAExD,UAAU,CAAC,QAAgB;QACzB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;IAChD,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Signing seam for IdClient. It is intentionally small so an account managed
3
+ * by another Fast SDK can adapt to it without changing the protocol pipeline.
4
+ */
5
+ export interface Signer {
6
+ readonly address: string;
7
+ readonly signerHex: string;
8
+ readonly publicKey: Uint8Array;
9
+ sign(bytes: Uint8Array): Promise<string>;
10
+ }
11
+ /** Validate and snapshot the three public representations exposed by a signer adapter. */
12
+ export declare function validatedSigner(signer: Signer): Signer;
13
+ export declare class KeySigner implements Signer {
14
+ #private;
15
+ readonly address: string;
16
+ readonly signerHex: string;
17
+ private constructor();
18
+ get publicKey(): Uint8Array;
19
+ static fromPrivateKey(input: Uint8Array | string): Promise<KeySigner>;
20
+ static generate(): Promise<KeySigner>;
21
+ sign(bytes: Uint8Array): Promise<string>;
22
+ }
23
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BtD;AAeD,qBAAa,SAAU,YAAW,MAAM;;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAI3B,OAAO;IAOP,IAAI,SAAS,IAAI,UAAU,CAE1B;WAEY,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;WAO9D,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAIrC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAI/C"}
package/dist/signer.js ADDED
@@ -0,0 +1,73 @@
1
+ import * as ed from "@noble/ed25519";
2
+ import { toFastAddress } from "@fastxyz/sdk";
3
+ import { toHex } from "./address.js";
4
+ import { InvalidSignerError } from "./errors.js";
5
+ import { ensureEd25519Sync, hexToBytes } from "./verify.js";
6
+ /** Validate and snapshot the three public representations exposed by a signer adapter. */
7
+ export function validatedSigner(signer) {
8
+ const publicKey = signer.publicKey;
9
+ if (!(publicKey instanceof Uint8Array) || publicKey.length !== 32) {
10
+ throw new InvalidSignerError();
11
+ }
12
+ const snapshot = new Uint8Array(publicKey);
13
+ const signerHex = signer.signerHex;
14
+ const address = signer.address;
15
+ if (!/^[0-9a-f]{64}$/.test(signerHex) ||
16
+ toHex(snapshot) !== signerHex ||
17
+ toFastAddress(snapshot) !== address) {
18
+ throw new InvalidSignerError();
19
+ }
20
+ return Object.freeze({
21
+ address,
22
+ signerHex,
23
+ publicKey: snapshot,
24
+ sign: async (bytes) => {
25
+ const raw = await signer.sign(new Uint8Array(bytes));
26
+ if (typeof raw !== "string" || !/^(?:0x)?[0-9a-f]{128}$/i.test(raw)) {
27
+ throw new InvalidSignerError();
28
+ }
29
+ return raw.replace(/^0x/i, "").toLowerCase();
30
+ },
31
+ });
32
+ }
33
+ function parsePrivateKey(input) {
34
+ if (typeof input === "string") {
35
+ if (!/^[0-9a-f]{64}$/i.test(input)) {
36
+ throw new Error("private key must be a bare 64-hex string");
37
+ }
38
+ return hexToBytes(input);
39
+ }
40
+ if (!(input instanceof Uint8Array) || input.length !== 32) {
41
+ throw new Error("private key must be exactly 32 bytes");
42
+ }
43
+ return new Uint8Array(input);
44
+ }
45
+ export class KeySigner {
46
+ address;
47
+ signerHex;
48
+ #privateKey;
49
+ #publicKey;
50
+ constructor(privateKey, publicKey) {
51
+ this.#privateKey = privateKey;
52
+ this.#publicKey = publicKey;
53
+ this.signerHex = toHex(publicKey);
54
+ this.address = toFastAddress(publicKey);
55
+ }
56
+ get publicKey() {
57
+ return new Uint8Array(this.#publicKey);
58
+ }
59
+ static async fromPrivateKey(input) {
60
+ const privateKey = parsePrivateKey(input);
61
+ ensureEd25519Sync();
62
+ const publicKey = ed.getPublicKey(privateKey);
63
+ return new KeySigner(privateKey, publicKey);
64
+ }
65
+ static async generate() {
66
+ return KeySigner.fromPrivateKey(ed.utils.randomPrivateKey());
67
+ }
68
+ async sign(bytes) {
69
+ ensureEd25519Sync();
70
+ return toHex(ed.sign(new Uint8Array(bytes), this.#privateKey));
71
+ }
72
+ }
73
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Noble v2 requires SHA-512 wiring for every synchronous signing operation. */
2
+ export declare function ensureEd25519Sync(): void;
3
+ export declare function hexToBytes(hex: string): Uint8Array;
4
+ /** Strict Ed25519 verification matching dalek `verify_strict`. */
5
+ export declare function verifyStrict(message: Uint8Array, signatureHex: string, publicKey: Uint8Array): boolean;
6
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAUlD;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAC1B,OAAO,EAAE,UAAU,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,UAAU,GACpB,OAAO,CAST"}
package/dist/verify.js ADDED
@@ -0,0 +1,33 @@
1
+ import * as ed from "@noble/ed25519";
2
+ import { sha512 } from "@noble/hashes/sha2";
3
+ /** Noble v2 requires SHA-512 wiring for every synchronous signing operation. */
4
+ export function ensureEd25519Sync() {
5
+ if (typeof ed.etc.sha512Sync !== "function") {
6
+ ed.etc.sha512Sync = (...messages) => sha512(ed.etc.concatBytes(...messages));
7
+ }
8
+ }
9
+ export function hexToBytes(hex) {
10
+ const clean = hex.replace(/^0x/i, "");
11
+ if (clean.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(clean)) {
12
+ throw new Error("bad hex");
13
+ }
14
+ const output = new Uint8Array(clean.length / 2);
15
+ for (let index = 0; index < output.length; index += 1) {
16
+ output[index] = Number.parseInt(clean.slice(index * 2, index * 2 + 2), 16);
17
+ }
18
+ return output;
19
+ }
20
+ /** Strict Ed25519 verification matching dalek `verify_strict`. */
21
+ export function verifyStrict(message, signatureHex, publicKey) {
22
+ try {
23
+ ensureEd25519Sync();
24
+ const signature = hexToBytes(signatureHex);
25
+ if (signature.length !== 64 || publicKey.length !== 32)
26
+ return false;
27
+ return ed.verify(signature, message, publicKey, { zip215: false });
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,gFAAgF;AAChF,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5C,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,QAAsB,EAAE,EAAE,CAChD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAC1B,OAAmB,EACnB,YAAoB,EACpB,SAAqB;IAErB,IAAI,CAAC;QACH,iBAAiB,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACrE,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@fastxyz/fastid-sdk",
3
+ "version": "0.1.0",
4
+ "description": "Programmatic client for id.fast.xyz — everything a non-admin user can do, for agents",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/fastxyz/fast-sdk.git",
9
+ "directory": "packages/fastid-sdk"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "provenance": true
14
+ },
15
+ "sideEffects": false,
16
+ "type": "module",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ }
22
+ },
23
+ "main": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "engines": {
29
+ "node": ">=20.19.0"
30
+ },
31
+ "dependencies": {
32
+ "@hpke/core": "^1.9.0",
33
+ "@noble/ed25519": "^2.1.0",
34
+ "@noble/hashes": "^1.5.0",
35
+ "effect": "^3.21.0",
36
+ "tr46": "6.0.0",
37
+ "@fastxyz/schema": "2.0.0",
38
+ "@fastxyz/sdk": "2.4.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22",
42
+ "@types/tr46": "5.0.1",
43
+ "typescript": "^5",
44
+ "vitest": "^3.0.0"
45
+ },
46
+ "scripts": {
47
+ "prebuild": "node scripts/package-artifact.mjs clean",
48
+ "build": "tsc -p tsconfig.build.json",
49
+ "test": "vitest run",
50
+ "typecheck": "tsc --noEmit",
51
+ "smoke:package": "node scripts/package-consumer.mjs"
52
+ }
53
+ }