signyu 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.
package/dist/index.js ADDED
@@ -0,0 +1,229 @@
1
+ // src/errors.ts
2
+ var SignYuError = class extends Error {
3
+ status;
4
+ code;
5
+ /** Parsed response body, when there was one. */
6
+ body;
7
+ constructor(opts) {
8
+ super(opts.message);
9
+ this.name = "SignYuError";
10
+ this.status = opts.status;
11
+ this.code = opts.code;
12
+ this.body = opts.body;
13
+ if (opts.cause !== void 0) {
14
+ this.cause = opts.cause;
15
+ }
16
+ }
17
+ };
18
+ var WebhookSignatureError = class extends Error {
19
+ constructor(message = "Webhook signature verification failed.") {
20
+ super(message);
21
+ this.name = "WebhookSignatureError";
22
+ }
23
+ };
24
+
25
+ // src/webhooks.ts
26
+ import { createHmac, timingSafeEqual } from "crypto";
27
+ var SIGNATURE_HEADER = "X-SignSetu-Signature";
28
+ var EVENT_HEADER = "X-SignSetu-Event";
29
+ function toBuffer(payload) {
30
+ if (typeof payload === "string") return Buffer.from(payload, "utf8");
31
+ if (payload instanceof ArrayBuffer) return Buffer.from(new Uint8Array(payload));
32
+ return Buffer.from(payload.buffer, payload.byteOffset, payload.byteLength);
33
+ }
34
+ function computeSignature(payload, secret) {
35
+ const hex = createHmac("sha256", secret).update(toBuffer(payload)).digest("hex");
36
+ return `sha256=${hex}`;
37
+ }
38
+ function verifySignature(payload, signatureHeader, secret) {
39
+ if (!signatureHeader || !secret) return false;
40
+ const expected = Buffer.from(computeSignature(payload, secret), "utf8");
41
+ const received = Buffer.from(signatureHeader.trim(), "utf8");
42
+ if (expected.length !== received.length) return false;
43
+ return timingSafeEqual(expected, received);
44
+ }
45
+ function constructEvent(payload, signatureHeader, secret) {
46
+ if (!verifySignature(payload, signatureHeader, secret)) {
47
+ throw new WebhookSignatureError();
48
+ }
49
+ return JSON.parse(toBuffer(payload).toString("utf8"));
50
+ }
51
+ var webhooks = {
52
+ SIGNATURE_HEADER,
53
+ EVENT_HEADER,
54
+ computeSignature,
55
+ verifySignature,
56
+ constructEvent
57
+ };
58
+
59
+ // src/version.ts
60
+ var VERSION = "0.1.0";
61
+
62
+ // src/client.ts
63
+ var DEFAULT_BASE_URL = "https://signyu.com";
64
+ function toPdfBlob(file) {
65
+ if (typeof Blob !== "undefined" && file instanceof Blob) {
66
+ return file.type === "application/pdf" ? file : new Blob([file], { type: "application/pdf" });
67
+ }
68
+ if (file instanceof ArrayBuffer) {
69
+ return new Blob([file], { type: "application/pdf" });
70
+ }
71
+ if (file instanceof Uint8Array) {
72
+ const copy = new Uint8Array(file.byteLength);
73
+ copy.set(file);
74
+ return new Blob([copy], { type: "application/pdf" });
75
+ }
76
+ throw new TypeError("file must be a Buffer, Uint8Array, ArrayBuffer or Blob.");
77
+ }
78
+ var Documents = class {
79
+ constructor(client) {
80
+ this.client = client;
81
+ }
82
+ client;
83
+ /** `POST /api/v1/documents`: upload a PDF and create a `PENDING` document. */
84
+ create(params) {
85
+ if (!params || params.file === void 0 || params.file === null) {
86
+ throw new TypeError("documents.create requires a `file`.");
87
+ }
88
+ const form = new FormData();
89
+ form.append("file", toPdfBlob(params.file), params.fileName ?? "document.pdf");
90
+ if (params.name !== void 0) form.append("name", params.name);
91
+ return this.client._request({
92
+ method: "POST",
93
+ path: "/api/v1/documents",
94
+ body: form
95
+ });
96
+ }
97
+ /** `GET /api/v1/documents`: your documents, most recent first. */
98
+ list(params = {}) {
99
+ return this.client._request({
100
+ method: "GET",
101
+ path: "/api/v1/documents",
102
+ query: { limit: params.limit, offset: params.offset }
103
+ });
104
+ }
105
+ /** `GET /api/v1/documents/{documentId}`: status and per-signer progress. */
106
+ get(documentId) {
107
+ return this.client._request({
108
+ method: "GET",
109
+ path: `/api/v1/documents/${encodeURIComponent(documentId)}`
110
+ });
111
+ }
112
+ /** `POST /api/v1/documents/{documentId}/signers`: add signers while `PENDING` (max 6 per document). */
113
+ addSigners(documentId, signers) {
114
+ return this.client._request({
115
+ method: "POST",
116
+ path: `/api/v1/documents/${encodeURIComponent(documentId)}/signers`,
117
+ json: { signers }
118
+ });
119
+ }
120
+ /**
121
+ * `POST /api/v1/documents/{documentId}/send`: deducts one credit per signer,
122
+ * emails signing links and returns them. Not idempotent: call it once.
123
+ */
124
+ send(documentId) {
125
+ return this.client._request({
126
+ method: "POST",
127
+ path: `/api/v1/documents/${encodeURIComponent(documentId)}/send`
128
+ });
129
+ }
130
+ /**
131
+ * `GET /api/v1/documents/{documentId}/certificate`: the completion
132
+ * certificate and audit trail PDF as raw bytes. Only available once the
133
+ * document is `COMPLETED` (otherwise `409 invalid_state`).
134
+ */
135
+ getCertificate(documentId) {
136
+ return this.client._request({
137
+ method: "GET",
138
+ path: `/api/v1/documents/${encodeURIComponent(documentId)}/certificate`,
139
+ expect: "binary"
140
+ });
141
+ }
142
+ };
143
+ var SignYu = class {
144
+ documents;
145
+ webhooks = webhooks;
146
+ baseUrl;
147
+ apiKey;
148
+ timeoutMs;
149
+ fetchImpl;
150
+ constructor(options) {
151
+ if (!options || !options.apiKey) {
152
+ throw new TypeError("SignYu requires an `apiKey`.");
153
+ }
154
+ this.apiKey = options.apiKey;
155
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
156
+ this.timeoutMs = options.timeoutMs ?? 6e4;
157
+ const f = options.fetch ?? globalThis.fetch;
158
+ if (typeof f !== "function") {
159
+ throw new TypeError("No global fetch found. SignYu requires Node.js 18 or newer.");
160
+ }
161
+ this.fetchImpl = f;
162
+ this.documents = new Documents(this);
163
+ }
164
+ /** @internal */
165
+ async _request(opts) {
166
+ const url = new URL(this.baseUrl + opts.path);
167
+ for (const [k, v] of Object.entries(opts.query ?? {})) {
168
+ if (v !== void 0) url.searchParams.set(k, String(v));
169
+ }
170
+ const headers = {
171
+ Authorization: `Bearer ${this.apiKey}`,
172
+ Accept: opts.expect === "binary" ? "application/pdf" : "application/json",
173
+ "User-Agent": `signyu-node/${VERSION}`
174
+ };
175
+ let body = opts.body;
176
+ if (opts.json !== void 0) {
177
+ headers["Content-Type"] = "application/json";
178
+ body = JSON.stringify(opts.json);
179
+ }
180
+ let res;
181
+ try {
182
+ res = await this.fetchImpl(url.toString(), {
183
+ method: opts.method,
184
+ headers,
185
+ body,
186
+ signal: AbortSignal.timeout(this.timeoutMs)
187
+ });
188
+ } catch (err) {
189
+ const isTimeout = err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError");
190
+ throw new SignYuError({
191
+ status: 0,
192
+ code: isTimeout ? "timeout" : "connection_error",
193
+ message: isTimeout ? `Request timed out after ${this.timeoutMs}ms.` : `Could not reach the SignYu API: ${err instanceof Error ? err.message : String(err)}`,
194
+ cause: err
195
+ });
196
+ }
197
+ if (!res.ok) {
198
+ const text = await res.text().catch(() => "");
199
+ let parsed = void 0;
200
+ try {
201
+ parsed = text ? JSON.parse(text) : void 0;
202
+ } catch {
203
+ parsed = text;
204
+ }
205
+ const errBody = parsed && typeof parsed === "object" ? parsed : {};
206
+ const code = typeof errBody.error === "string" ? errBody.error : res.status === 429 ? "rate_limited" : "http_error";
207
+ const message = typeof errBody.message === "string" ? errBody.message : `SignYu API request failed with status ${res.status}.`;
208
+ throw new SignYuError({ status: res.status, code, message, body: parsed });
209
+ }
210
+ if (opts.expect === "binary") {
211
+ return new Uint8Array(await res.arrayBuffer());
212
+ }
213
+ return await res.json();
214
+ }
215
+ };
216
+ export {
217
+ DEFAULT_BASE_URL,
218
+ EVENT_HEADER,
219
+ SIGNATURE_HEADER,
220
+ SignYu,
221
+ SignYuError,
222
+ VERSION,
223
+ WebhookSignatureError,
224
+ computeSignature,
225
+ constructEvent,
226
+ verifySignature,
227
+ webhooks
228
+ };
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/webhooks.ts","../src/version.ts","../src/client.ts"],"sourcesContent":["/**\n * Thrown for any non-2xx API response, network failure or timeout.\n *\n * `code` is the API's machine readable `error` field (for example\n * `insufficient_credits`). For responses without a JSON error body it is\n * `rate_limited` (429) or `http_error`; for network failures it is\n * `connection_error` and for timeouts `timeout`, both with `status` 0.\n */\nexport class SignYuError extends Error {\n readonly status: number;\n readonly code: string;\n /** Parsed response body, when there was one. */\n readonly body: unknown;\n\n constructor(opts: {\n status: number;\n code: string;\n message: string;\n body?: unknown;\n cause?: unknown;\n }) {\n super(opts.message);\n this.name = \"SignYuError\";\n this.status = opts.status;\n this.code = opts.code;\n this.body = opts.body;\n if (opts.cause !== undefined) {\n (this as { cause?: unknown }).cause = opts.cause;\n }\n }\n}\n\n/** Thrown by `webhooks.constructEvent` when the signature does not match. */\nexport class WebhookSignatureError extends Error {\n constructor(message = \"Webhook signature verification failed.\") {\n super(message);\n this.name = \"WebhookSignatureError\";\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookSignatureError } from \"./errors\";\nimport type { WebhookEvent } from \"./types\";\n\n/** Header carrying the signature, `sha256=<hex>`. */\nexport const SIGNATURE_HEADER = \"X-SignSetu-Signature\";\n/** Header carrying the event type, for example `signer.signed`. */\nexport const EVENT_HEADER = \"X-SignSetu-Event\";\n\nexport type WebhookPayload = string | Uint8Array | ArrayBuffer;\n\nfunction toBuffer(payload: WebhookPayload): Buffer {\n if (typeof payload === \"string\") return Buffer.from(payload, \"utf8\");\n if (payload instanceof ArrayBuffer) return Buffer.from(new Uint8Array(payload));\n return Buffer.from(payload.buffer, payload.byteOffset, payload.byteLength);\n}\n\n/** Computes the `sha256=<hex>` header value SignYu sends for a raw body. */\nexport function computeSignature(payload: WebhookPayload, secret: string): string {\n const hex = createHmac(\"sha256\", secret).update(toBuffer(payload)).digest(\"hex\");\n return `sha256=${hex}`;\n}\n\n/**\n * Returns true when `signatureHeader` (the `X-SignSetu-Signature` value) is a\n * valid HMAC-SHA256 of the raw request body under `secret`. Pass the raw body\n * bytes exactly as received; a re-serialized object will not match.\n * Comparison is constant time.\n */\nexport function verifySignature(\n payload: WebhookPayload,\n signatureHeader: string | null | undefined,\n secret: string\n): boolean {\n if (!signatureHeader || !secret) return false;\n const expected = Buffer.from(computeSignature(payload, secret), \"utf8\");\n const received = Buffer.from(signatureHeader.trim(), \"utf8\");\n if (expected.length !== received.length) return false;\n return timingSafeEqual(expected, received);\n}\n\n/**\n * Verifies the signature and returns the parsed event. Throws\n * `WebhookSignatureError` if the signature is missing or invalid.\n */\nexport function constructEvent(\n payload: WebhookPayload,\n signatureHeader: string | null | undefined,\n secret: string\n): WebhookEvent {\n if (!verifySignature(payload, signatureHeader, secret)) {\n throw new WebhookSignatureError();\n }\n return JSON.parse(toBuffer(payload).toString(\"utf8\")) as WebhookEvent;\n}\n\nexport const webhooks = {\n SIGNATURE_HEADER,\n EVENT_HEADER,\n computeSignature,\n verifySignature,\n constructEvent,\n};\n\nexport type Webhooks = typeof webhooks;\n","// Keep in sync with package.json \"version\".\nexport const VERSION = \"0.1.0\";\n","import { SignYuError } from \"./errors\";\nimport { webhooks, type Webhooks } from \"./webhooks\";\nimport type {\n AddSignersResponse,\n CreatedDocument,\n Document,\n DocumentList,\n SendDocumentResponse,\n SignerInput,\n} from \"./types\";\nimport { VERSION } from \"./version\";\n\nexport const DEFAULT_BASE_URL = \"https://signyu.com\";\n\nexport interface SignYuOptions {\n /** Your secret API key, `sk_live_...`. Keep it server side. */\n apiKey: string;\n /** Defaults to `https://signyu.com`. */\n baseUrl?: string;\n /** Per-request timeout in milliseconds. Defaults to 60000. */\n timeoutMs?: number;\n /** Custom fetch implementation (defaults to the global `fetch`). */\n fetch?: typeof fetch;\n}\n\nexport type FileInput = Blob | Uint8Array | ArrayBuffer;\n\nexport interface CreateDocumentParams {\n /** The PDF to sign, at most 10MB. A Node.js `Buffer` works here. */\n file: FileInput;\n /** File name sent with the upload. Defaults to `document.pdf`. */\n fileName?: string;\n /** Label for the document. Defaults to the file name. */\n name?: string;\n}\n\nexport interface ListDocumentsParams {\n /** 1 to 100, default 20. */\n limit?: number;\n /** Default 0. */\n offset?: number;\n}\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: BodyInit;\n json?: unknown;\n expect?: \"json\" | \"binary\";\n}\n\nfunction toPdfBlob(file: FileInput): Blob {\n if (typeof Blob !== \"undefined\" && file instanceof Blob) {\n // The API rejects anything whose part type is not application/pdf.\n return file.type === \"application/pdf\"\n ? file\n : new Blob([file], { type: \"application/pdf\" });\n }\n if (file instanceof ArrayBuffer) {\n return new Blob([file], { type: \"application/pdf\" });\n }\n if (file instanceof Uint8Array) {\n // Copy into a plain ArrayBuffer-backed view so Blob accepts it everywhere.\n const copy = new Uint8Array(file.byteLength);\n copy.set(file);\n return new Blob([copy], { type: \"application/pdf\" });\n }\n throw new TypeError(\"file must be a Buffer, Uint8Array, ArrayBuffer or Blob.\");\n}\n\nclass Documents {\n constructor(private readonly client: SignYu) {}\n\n /** `POST /api/v1/documents`: upload a PDF and create a `PENDING` document. */\n create(params: CreateDocumentParams): Promise<CreatedDocument> {\n if (!params || params.file === undefined || params.file === null) {\n throw new TypeError(\"documents.create requires a `file`.\");\n }\n const form = new FormData();\n form.append(\"file\", toPdfBlob(params.file), params.fileName ?? \"document.pdf\");\n if (params.name !== undefined) form.append(\"name\", params.name);\n return this.client._request<CreatedDocument>({\n method: \"POST\",\n path: \"/api/v1/documents\",\n body: form,\n });\n }\n\n /** `GET /api/v1/documents`: your documents, most recent first. */\n list(params: ListDocumentsParams = {}): Promise<DocumentList> {\n return this.client._request<DocumentList>({\n method: \"GET\",\n path: \"/api/v1/documents\",\n query: { limit: params.limit, offset: params.offset },\n });\n }\n\n /** `GET /api/v1/documents/{documentId}`: status and per-signer progress. */\n get(documentId: string): Promise<Document> {\n return this.client._request<Document>({\n method: \"GET\",\n path: `/api/v1/documents/${encodeURIComponent(documentId)}`,\n });\n }\n\n /** `POST /api/v1/documents/{documentId}/signers`: add signers while `PENDING` (max 6 per document). */\n addSigners(documentId: string, signers: SignerInput[]): Promise<AddSignersResponse> {\n return this.client._request<AddSignersResponse>({\n method: \"POST\",\n path: `/api/v1/documents/${encodeURIComponent(documentId)}/signers`,\n json: { signers },\n });\n }\n\n /**\n * `POST /api/v1/documents/{documentId}/send`: deducts one credit per signer,\n * emails signing links and returns them. Not idempotent: call it once.\n */\n send(documentId: string): Promise<SendDocumentResponse> {\n return this.client._request<SendDocumentResponse>({\n method: \"POST\",\n path: `/api/v1/documents/${encodeURIComponent(documentId)}/send`,\n });\n }\n\n /**\n * `GET /api/v1/documents/{documentId}/certificate`: the completion\n * certificate and audit trail PDF as raw bytes. Only available once the\n * document is `COMPLETED` (otherwise `409 invalid_state`).\n */\n getCertificate(documentId: string): Promise<Uint8Array> {\n return this.client._request<Uint8Array>({\n method: \"GET\",\n path: `/api/v1/documents/${encodeURIComponent(documentId)}/certificate`,\n expect: \"binary\",\n });\n }\n}\n\nexport class SignYu {\n readonly documents: Documents;\n readonly webhooks: Webhooks = webhooks;\n readonly baseUrl: string;\n\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: SignYuOptions) {\n if (!options || !options.apiKey) {\n throw new TypeError(\"SignYu requires an `apiKey`.\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeoutMs = options.timeoutMs ?? 60_000;\n const f = options.fetch ?? globalThis.fetch;\n if (typeof f !== \"function\") {\n throw new TypeError(\"No global fetch found. SignYu requires Node.js 18 or newer.\");\n }\n this.fetchImpl = f;\n this.documents = new Documents(this);\n }\n\n /** @internal */\n async _request<T>(opts: RequestOptions): Promise<T> {\n const url = new URL(this.baseUrl + opts.path);\n for (const [k, v] of Object.entries(opts.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: opts.expect === \"binary\" ? \"application/pdf\" : \"application/json\",\n \"User-Agent\": `signyu-node/${VERSION}`,\n };\n let body = opts.body;\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n }\n\n let res: Response;\n try {\n res = await this.fetchImpl(url.toString(), {\n method: opts.method,\n headers,\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (err) {\n const isTimeout =\n err instanceof Error && (err.name === \"TimeoutError\" || err.name === \"AbortError\");\n throw new SignYuError({\n status: 0,\n code: isTimeout ? \"timeout\" : \"connection_error\",\n message: isTimeout\n ? `Request timed out after ${this.timeoutMs}ms.`\n : `Could not reach the SignYu API: ${err instanceof Error ? err.message : String(err)}`,\n cause: err,\n });\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let parsed: unknown = undefined;\n try {\n parsed = text ? JSON.parse(text) : undefined;\n } catch {\n parsed = text;\n }\n const errBody =\n parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : {};\n const code =\n typeof errBody.error === \"string\"\n ? errBody.error\n : res.status === 429\n ? \"rate_limited\"\n : \"http_error\";\n const message =\n typeof errBody.message === \"string\"\n ? errBody.message\n : `SignYu API request failed with status ${res.status}.`;\n throw new SignYuError({ status: res.status, code, message, body: parsed });\n }\n\n if (opts.expect === \"binary\") {\n return new Uint8Array(await res.arrayBuffer()) as T;\n }\n return (await res.json()) as T;\n }\n}\n\nexport type { Documents };\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "signyu",
3
+ "version": "0.1.0",
4
+ "description": "Official Node.js SDK for the SignYu Aadhaar eSign API",
5
+ "keywords": [
6
+ "aadhaar",
7
+ "esign",
8
+ "aadhaar-esign",
9
+ "e-signature",
10
+ "digital-signature",
11
+ "india",
12
+ "emudhra",
13
+ "signyu"
14
+ ],
15
+ "homepage": "https://signyu.com/api",
16
+ "bugs": {
17
+ "url": "https://signyu.com/contact",
18
+ "email": "contact@mail.signyu.com"
19
+ },
20
+ "author": "SignYu <contact@mail.signyu.com> (https://signyu.com)",
21
+ "license": "MIT",
22
+ "type": "module",
23
+ "main": "./dist/index.cjs",
24
+ "module": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "import": {
29
+ "types": "./dist/index.d.ts",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "require": {
33
+ "types": "./dist/index.d.cts",
34
+ "default": "./dist/index.cjs"
35
+ }
36
+ },
37
+ "./package.json": "./package.json"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "sideEffects": false,
45
+ "engines": {
46
+ "node": ">=18"
47
+ },
48
+ "scripts": {
49
+ "build": "tsup",
50
+ "typecheck": "tsc --noEmit",
51
+ "test": "npm run build && node --test test/client.test.mjs test/webhooks.test.mjs",
52
+ "prepublishOnly": "npm run typecheck && npm test"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^20.11.0",
56
+ "tsup": "^8.3.0",
57
+ "typescript": "^5.6.0"
58
+ }
59
+ }