@tak-ps/node-tak 12.12.0 → 12.13.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/CHANGELOG.md +4 -0
- package/dist/lib/api.js +33 -1
- package/dist/lib/api.js.map +1 -1
- package/dist/test/uploadPackage.test.js +30 -1
- package/dist/test/uploadPackage.test.js.map +1 -1
- package/lib/api.ts +43 -1
- package/package.json +1 -1
- package/test/uploadPackage.test.ts +47 -1
package/CHANGELOG.md
CHANGED
package/dist/lib/api.js
CHANGED
|
@@ -21,6 +21,38 @@ import Subscription from './api/subscriptions.js';
|
|
|
21
21
|
import Video from './api/video.js';
|
|
22
22
|
import Export from './api/export.js';
|
|
23
23
|
import Err from '@openaddresses/batch-error';
|
|
24
|
+
function formatFetchError(err) {
|
|
25
|
+
if (!(err instanceof Error))
|
|
26
|
+
return String(err);
|
|
27
|
+
const root = err;
|
|
28
|
+
const messages = new Set();
|
|
29
|
+
const push = (value) => {
|
|
30
|
+
if (!value)
|
|
31
|
+
return;
|
|
32
|
+
const message = String(value).trim();
|
|
33
|
+
if (!message || message === 'fetch failed')
|
|
34
|
+
return;
|
|
35
|
+
messages.add(message);
|
|
36
|
+
};
|
|
37
|
+
push(root.code);
|
|
38
|
+
push(root.message);
|
|
39
|
+
let cause = root.cause;
|
|
40
|
+
while (cause) {
|
|
41
|
+
if (cause instanceof Error) {
|
|
42
|
+
const nested = cause;
|
|
43
|
+
push(nested.code);
|
|
44
|
+
push(nested.message);
|
|
45
|
+
cause = nested.cause;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
push(cause);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (messages.size)
|
|
53
|
+
return Array.from(messages).join(': ');
|
|
54
|
+
return root.message;
|
|
55
|
+
}
|
|
24
56
|
export const CommandList = {
|
|
25
57
|
package: 'Package',
|
|
26
58
|
security: 'Security',
|
|
@@ -164,7 +196,7 @@ export default class TAKAPI {
|
|
|
164
196
|
catch (err) {
|
|
165
197
|
if (err instanceof Error && err.name === 'PublicError')
|
|
166
198
|
throw err;
|
|
167
|
-
throw new Err(400, null,
|
|
199
|
+
throw new Err(400, null, formatFetchError(err));
|
|
168
200
|
}
|
|
169
201
|
}
|
|
170
202
|
}
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,aAAa,EAAE,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,GAAG,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { Readable } from 'node:stream';
|
|
4
4
|
import { Client } from 'undici';
|
|
5
5
|
import TAKAPI from '../lib/api.js';
|
|
6
|
-
import { APIAuthCertificate } from '../lib/auth.js';
|
|
6
|
+
import { APIAuthCertificate, APIAuthPassword } from '../lib/auth.js';
|
|
7
7
|
import stream2buffer from '../lib/stream.js';
|
|
8
8
|
test('Files.uploadPackage serializes multipart for certificate auth', async () => {
|
|
9
9
|
const originalRequest = Client.prototype.request;
|
|
@@ -48,4 +48,33 @@ test('Files.uploadPackage serializes multipart for certificate auth', async () =
|
|
|
48
48
|
Client.prototype.request = originalRequest;
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
|
+
test('APIAuthPassword surfaces transport causes during login', async () => {
|
|
52
|
+
const api = new TAKAPI(new URL('https://tak.example.com'), new APIAuthPassword('alice', 'secret'));
|
|
53
|
+
const originalFetch = api.auth.fetch;
|
|
54
|
+
api.auth.fetch = async () => {
|
|
55
|
+
const cause = new Error('certificate has expired');
|
|
56
|
+
cause.code = 'CERT_HAS_EXPIRED';
|
|
57
|
+
throw new TypeError('fetch failed', { cause });
|
|
58
|
+
};
|
|
59
|
+
await assert.rejects(api.auth.init(api), (err) => {
|
|
60
|
+
assert.ok(err instanceof Error);
|
|
61
|
+
assert.equal(err.name, 'PublicError');
|
|
62
|
+
assert.match(err.message, /CERT_HAS_EXPIRED/);
|
|
63
|
+
assert.match(err.message, /certificate has expired/);
|
|
64
|
+
return true;
|
|
65
|
+
});
|
|
66
|
+
api.auth.fetch = async () => {
|
|
67
|
+
const cause = new Error('connect ECONNREFUSED 127.0.0.1:8443');
|
|
68
|
+
cause.code = 'ECONNREFUSED';
|
|
69
|
+
throw new TypeError('fetch failed', { cause });
|
|
70
|
+
};
|
|
71
|
+
await assert.rejects(api.auth.init(api), (err) => {
|
|
72
|
+
assert.ok(err instanceof Error);
|
|
73
|
+
assert.equal(err.name, 'PublicError');
|
|
74
|
+
assert.match(err.message, /ECONNREFUSED/);
|
|
75
|
+
assert.match(err.message, /connect ECONNREFUSED 127\.0\.0\.1:8443/);
|
|
76
|
+
return true;
|
|
77
|
+
});
|
|
78
|
+
api.auth.fetch = originalFetch;
|
|
79
|
+
});
|
|
51
80
|
//# sourceMappingURL=uploadPackage.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPackage.test.js","sourceRoot":"","sources":["../../test/uploadPackage.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,MAAM,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"uploadPackage.test.js","sourceRoot":"","sources":["../../test/uploadPackage.test.ts"],"names":[],"mappings":"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"}
|
package/lib/api.ts
CHANGED
|
@@ -23,6 +23,48 @@ import Export from './api/export.js';
|
|
|
23
23
|
import Err from '@openaddresses/batch-error';
|
|
24
24
|
import * as auth from './auth.js';
|
|
25
25
|
|
|
26
|
+
type ErrorWithCause = Error & {
|
|
27
|
+
code?: unknown;
|
|
28
|
+
cause?: unknown;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function formatFetchError(err: unknown): string {
|
|
32
|
+
if (!(err instanceof Error)) return String(err);
|
|
33
|
+
|
|
34
|
+
const root = err as ErrorWithCause;
|
|
35
|
+
|
|
36
|
+
const messages = new Set<string>();
|
|
37
|
+
|
|
38
|
+
const push = (value: unknown) => {
|
|
39
|
+
if (!value) return;
|
|
40
|
+
|
|
41
|
+
const message = String(value).trim();
|
|
42
|
+
|
|
43
|
+
if (!message || message === 'fetch failed') return;
|
|
44
|
+
|
|
45
|
+
messages.add(message);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
push(root.code);
|
|
49
|
+
push(root.message);
|
|
50
|
+
|
|
51
|
+
let cause: unknown = root.cause;
|
|
52
|
+
while (cause) {
|
|
53
|
+
if (cause instanceof Error) {
|
|
54
|
+
const nested = cause as ErrorWithCause;
|
|
55
|
+
push(nested.code);
|
|
56
|
+
push(nested.message);
|
|
57
|
+
cause = nested.cause;
|
|
58
|
+
} else {
|
|
59
|
+
push(cause);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (messages.size) return Array.from(messages).join(': ');
|
|
65
|
+
return root.message;
|
|
66
|
+
}
|
|
67
|
+
|
|
26
68
|
export const CommandList: Record<string, keyof TAKAPI> = {
|
|
27
69
|
package: 'Package',
|
|
28
70
|
security: 'Security',
|
|
@@ -178,7 +220,7 @@ export default class TAKAPI {
|
|
|
178
220
|
}
|
|
179
221
|
} catch (err) {
|
|
180
222
|
if (err instanceof Error && err.name === 'PublicError') throw err;
|
|
181
|
-
throw new Err(400, null,
|
|
223
|
+
throw new Err(400, null, formatFetchError(err));
|
|
182
224
|
}
|
|
183
225
|
}
|
|
184
226
|
}
|
package/package.json
CHANGED
|
@@ -5,10 +5,11 @@ import { Client } from 'undici';
|
|
|
5
5
|
import type { IncomingHttpHeaders } from 'node:http';
|
|
6
6
|
import type { Dispatcher } from 'undici';
|
|
7
7
|
import TAKAPI from '../lib/api.js';
|
|
8
|
-
import { APIAuthCertificate } from '../lib/auth.js';
|
|
8
|
+
import { APIAuthCertificate, APIAuthPassword } from '../lib/auth.js';
|
|
9
9
|
import stream2buffer from '../lib/stream.js';
|
|
10
10
|
|
|
11
11
|
type RequestArgs = Parameters<Client['request']>[0];
|
|
12
|
+
type ErrorWithCode = Error & { code?: string };
|
|
12
13
|
|
|
13
14
|
test('Files.uploadPackage serializes multipart for certificate auth', async () => {
|
|
14
15
|
const originalRequest = Client.prototype.request;
|
|
@@ -59,4 +60,49 @@ test('Files.uploadPackage serializes multipart for certificate auth', async () =
|
|
|
59
60
|
} finally {
|
|
60
61
|
Client.prototype.request = originalRequest;
|
|
61
62
|
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('APIAuthPassword surfaces transport causes during login', async () => {
|
|
66
|
+
const api = new TAKAPI(new URL('https://tak.example.com'), new APIAuthPassword('alice', 'secret'));
|
|
67
|
+
const originalFetch = api.auth.fetch;
|
|
68
|
+
|
|
69
|
+
api.auth.fetch = async () => {
|
|
70
|
+
const cause: ErrorWithCode = new Error('certificate has expired');
|
|
71
|
+
cause.code = 'CERT_HAS_EXPIRED';
|
|
72
|
+
|
|
73
|
+
throw new TypeError('fetch failed', { cause });
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
await assert.rejects(
|
|
77
|
+
api.auth.init(api),
|
|
78
|
+
(err: unknown) => {
|
|
79
|
+
assert.ok(err instanceof Error);
|
|
80
|
+
assert.equal(err.name, 'PublicError');
|
|
81
|
+
assert.match(err.message, /CERT_HAS_EXPIRED/);
|
|
82
|
+
assert.match(err.message, /certificate has expired/);
|
|
83
|
+
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
api.auth.fetch = async () => {
|
|
89
|
+
const cause: ErrorWithCode = new Error('connect ECONNREFUSED 127.0.0.1:8443');
|
|
90
|
+
cause.code = 'ECONNREFUSED';
|
|
91
|
+
|
|
92
|
+
throw new TypeError('fetch failed', { cause });
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
await assert.rejects(
|
|
96
|
+
api.auth.init(api),
|
|
97
|
+
(err: unknown) => {
|
|
98
|
+
assert.ok(err instanceof Error);
|
|
99
|
+
assert.equal(err.name, 'PublicError');
|
|
100
|
+
assert.match(err.message, /ECONNREFUSED/);
|
|
101
|
+
assert.match(err.message, /connect ECONNREFUSED 127\.0\.0\.1:8443/);
|
|
102
|
+
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
api.auth.fetch = originalFetch;
|
|
62
108
|
});
|