n8n-nodes-insign 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.insignRequest = insignRequest;
4
+ exports.isInsignErrorBody = isInsignErrorBody;
5
+ exports.mergeAdditionalFields = mergeAdditionalFields;
6
+ const n8n_workflow_1 = require("n8n-workflow");
7
+ const tokenCache = new Map();
8
+ async function getAccessToken(baseUrl, clientId, clientSecret) {
9
+ const key = `${baseUrl}::${clientId}`;
10
+ const cached = tokenCache.get(key);
11
+ if (cached && Date.now() < cached.expiresAt - 30000)
12
+ return cached.token;
13
+ const res = (await this.helpers.httpRequest({
14
+ method: 'POST',
15
+ url: `${baseUrl}/oauth2/token`,
16
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
17
+ body: new URLSearchParams({
18
+ grant_type: 'client_credentials',
19
+ client_id: clientId,
20
+ client_secret: clientSecret,
21
+ }).toString(),
22
+ }));
23
+ if (!res?.access_token) {
24
+ throw new Error('inSign /oauth2/token did not return an access_token');
25
+ }
26
+ tokenCache.set(key, {
27
+ token: res.access_token,
28
+ expiresAt: Date.now() + (res.expires_in ?? 1800) * 1000,
29
+ });
30
+ return res.access_token;
31
+ }
32
+ async function insignRequest(method, path, body, encoding, extras) {
33
+ const credentials = await this.getCredentials('insignApi');
34
+ const baseUrl = credentials.baseUrl.replace(/\/+$/, '');
35
+ const clientId = credentials.clientId;
36
+ const clientSecret = credentials.clientSecret;
37
+ const traceId = extras?.traceId || `n8n-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
38
+ // Fetch-and-cache the OAuth2 token ourselves. n8n's preAuthentication hook
39
+ // only fires reliably for the credential-test flow; for actual node runs we
40
+ // can't rely on it, so we mint (or reuse) a Bearer token explicitly here.
41
+ const token = await getAccessToken.call(this, baseUrl, clientId, clientSecret);
42
+ const options = {
43
+ method,
44
+ url: `${baseUrl}${path}`,
45
+ json: encoding !== 'arraybuffer',
46
+ body: body,
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ 'X-Request-Id': traceId,
50
+ Authorization: `Bearer ${token}`,
51
+ },
52
+ timeout: extras?.timeout ?? 30000,
53
+ };
54
+ if (encoding === 'arraybuffer') {
55
+ options.encoding = 'arraybuffer';
56
+ options.returnFullResponse = true;
57
+ }
58
+ const started = Date.now();
59
+ this.logger.debug(`[inSign] ${method} ${path} trace=${traceId}`, { body: redactBody(body) });
60
+ let data;
61
+ try {
62
+ data = await this.helpers.httpRequest(options);
63
+ }
64
+ catch (error) {
65
+ // If inSign rejected the token (maybe cached token expired), invalidate
66
+ // and retry once with a fresh one.
67
+ if (error?.response?.status === 401) {
68
+ tokenCache.delete(`${baseUrl}::${clientId}`);
69
+ const fresh = await getAccessToken.call(this, baseUrl, clientId, clientSecret);
70
+ options.headers.Authorization = `Bearer ${fresh}`;
71
+ try {
72
+ data = await this.helpers.httpRequest(options);
73
+ }
74
+ catch (retryError) {
75
+ error = retryError;
76
+ }
77
+ }
78
+ if (!data) {
79
+ const durationMs = Date.now() - started;
80
+ const bodySnippet = extractErrorBody(error);
81
+ this.logger.warn(`[inSign] ${method} ${path} HTTP failure trace=${traceId} (${durationMs}ms): ${error.message}${bodySnippet ? ` — body: ${bodySnippet}` : ''}`);
82
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), error, {
83
+ message: `inSign ${method} ${path} failed`,
84
+ description: `Trace ID: ${traceId}.${bodySnippet ? ` inSign said: ${bodySnippet}` : ''} ${error.message}`.trim(),
85
+ });
86
+ }
87
+ }
88
+ const durationMs = Date.now() - started;
89
+ // inSign returns HTTP 200 with {error: <non-zero>, message: "..."} on
90
+ // many semantic failures (e.g. unknown sessionid). Surface these as
91
+ // real errors instead of silently returning them as success.
92
+ if (encoding !== 'arraybuffer' && isInsignErrorBody(data)) {
93
+ const errCode = data.error;
94
+ const msg = data.message || `inSign returned error=${errCode}`;
95
+ this.logger.warn(`[inSign] ${method} ${path} logical error=${errCode} trace=${traceId} (${durationMs}ms): ${msg}`);
96
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), data, {
97
+ message: `inSign ${method} ${path} → error=${errCode}`,
98
+ description: `${msg} (trace: ${traceId})`,
99
+ httpCode: String(errCode),
100
+ });
101
+ }
102
+ this.logger.debug(`[inSign] ${method} ${path} ok trace=${traceId} (${durationMs}ms)`);
103
+ return { data, meta: { method, path, durationMs, traceId, url: `${baseUrl}${path}` } };
104
+ }
105
+ function isInsignErrorBody(body) {
106
+ if (!body || typeof body !== 'object')
107
+ return false;
108
+ const rec = body;
109
+ if (!('error' in rec))
110
+ return false;
111
+ const v = rec.error;
112
+ // zero / false / null / undefined = success
113
+ if (v === 0 || v === false || v == null)
114
+ return false;
115
+ // "0" treated as success too (defensive)
116
+ if (typeof v === 'string' && (v === '0' || v === ''))
117
+ return false;
118
+ return true;
119
+ }
120
+ function extractErrorBody(error) {
121
+ if (!error || typeof error !== 'object')
122
+ return '';
123
+ const err = error;
124
+ // n8n's httpRequest error shape: response.body / response.data / cause
125
+ const candidates = [err?.response?.body, err?.response?.data, err?.body, err?.cause?.response?.body];
126
+ for (const c of candidates) {
127
+ if (c != null) {
128
+ const str = typeof c === 'string' ? c : JSON.stringify(c);
129
+ return str.slice(0, 500);
130
+ }
131
+ }
132
+ return '';
133
+ }
134
+ function redactBody(body) {
135
+ if (!body)
136
+ return body;
137
+ const clone = { ...body };
138
+ if (Array.isArray(clone.documents)) {
139
+ clone.documents = clone.documents.map((d) => d?.file ? { ...d, file: `<base64:${String(d.file).length} chars>` } : d);
140
+ }
141
+ return clone;
142
+ }
143
+ function mergeAdditionalFields(base, extra) {
144
+ if (!extra)
145
+ return base;
146
+ let parsed;
147
+ if (typeof extra === 'string') {
148
+ const trimmed = extra.trim();
149
+ if (!trimmed)
150
+ return base;
151
+ try {
152
+ parsed = JSON.parse(trimmed);
153
+ }
154
+ catch (e) {
155
+ throw new Error(`Additional Fields is not valid JSON: ${e.message}`);
156
+ }
157
+ }
158
+ else {
159
+ parsed = extra;
160
+ }
161
+ return { ...base, ...parsed };
162
+ }
163
+ //# sourceMappingURL=GenericFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/Insign/GenericFunctions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class Insign implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }