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.
- package/LICENSE +21 -0
- package/README.md +430 -0
- package/dist/credentials/InsignApi.credentials.d.ts +12 -0
- package/dist/credentials/InsignApi.credentials.js +116 -0
- package/dist/credentials/InsignApi.credentials.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/Insign/GenericFunctions.d.ts +21 -0
- package/dist/nodes/Insign/GenericFunctions.js +163 -0
- package/dist/nodes/Insign/GenericFunctions.js.map +1 -0
- package/dist/nodes/Insign/Insign.node.d.ts +5 -0
- package/dist/nodes/Insign/Insign.node.js +615 -0
- package/dist/nodes/Insign/Insign.node.js.map +1 -0
- package/dist/nodes/Insign/insign.svg +8 -0
- package/dist/nodes/InsignTrigger/InsignTrigger.node.d.ts +5 -0
- package/dist/nodes/InsignTrigger/InsignTrigger.node.js +143 -0
- package/dist/nodes/InsignTrigger/InsignTrigger.node.js.map +1 -0
- package/dist/nodes/InsignTrigger/insign.svg +8 -0
- package/package.json +69 -0
|
@@ -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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"}
|