@atcute/util-fetch 1.0.3 → 1.0.5
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/README.md +7 -1
- package/dist/doh-json.d.ts +65 -0
- package/dist/doh-json.d.ts.map +1 -0
- package/dist/doh-json.js +48 -0
- package/dist/doh-json.js.map +1 -0
- package/dist/errors.d.ts +3 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -4
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline.js.map +1 -1
- package/dist/streams/size-limit.d.ts.map +1 -1
- package/dist/streams/size-limit.js.map +1 -1
- package/dist/transformers.d.ts +2 -4
- package/dist/transformers.d.ts.map +1 -1
- package/dist/transformers.js +1 -4
- package/dist/transformers.js.map +1 -1
- package/lib/doh-json.ts +60 -0
- package/lib/errors.ts +6 -5
- package/lib/index.ts +1 -0
- package/lib/transformers.ts +1 -5
- package/package.json +5 -6
package/README.md
CHANGED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as v from '@badrap/valita';
|
|
2
|
+
/** DoH JSON response schema for TXT record queries */
|
|
3
|
+
export declare const dohJsonTxtResult: v.ObjectType<{
|
|
4
|
+
/** DNS response code */
|
|
5
|
+
Status: v.Type<number>;
|
|
6
|
+
/** whether response is truncated */
|
|
7
|
+
TC: v.Type<boolean>;
|
|
8
|
+
/** whether recursive desired bit is set, always true for Google and Cloudflare DoH */
|
|
9
|
+
RD: v.Type<boolean>;
|
|
10
|
+
/** whether recursive available bit is set, always true for Google and Cloudflare DoH */
|
|
11
|
+
RA: v.Type<boolean>;
|
|
12
|
+
/** whether response data was validated with DNSSEC */
|
|
13
|
+
AD: v.Type<boolean>;
|
|
14
|
+
/** whether client asked to disable DNSSEC validation */
|
|
15
|
+
CD: v.Type<boolean>;
|
|
16
|
+
/** requested records */
|
|
17
|
+
Question: v.TupleType<[v.ObjectType<{
|
|
18
|
+
name: v.Type<string>;
|
|
19
|
+
type: v.Type<16>;
|
|
20
|
+
}, undefined>]>;
|
|
21
|
+
/** answers */
|
|
22
|
+
Answer: v.Type<{
|
|
23
|
+
name: string;
|
|
24
|
+
type: 16;
|
|
25
|
+
TTL: number;
|
|
26
|
+
data: string;
|
|
27
|
+
}[]>;
|
|
28
|
+
/** authority */
|
|
29
|
+
Authority: v.Optional<{
|
|
30
|
+
name: string;
|
|
31
|
+
type: number;
|
|
32
|
+
TTL: number;
|
|
33
|
+
data: string;
|
|
34
|
+
}[]>;
|
|
35
|
+
/** comment from the DNS server */
|
|
36
|
+
Comment: v.Optional<string | string[]>;
|
|
37
|
+
}, undefined>;
|
|
38
|
+
export type DohJsonTxtResult = v.Infer<typeof dohJsonTxtResult>;
|
|
39
|
+
/** fetch handler pipeline for DoH JSON TXT record responses */
|
|
40
|
+
export declare const fetchDohJsonTxt: (input: Response) => Promise<import("./transformers.js").ParsedJsonResponse<{
|
|
41
|
+
Status: number;
|
|
42
|
+
TC: boolean;
|
|
43
|
+
RD: boolean;
|
|
44
|
+
RA: boolean;
|
|
45
|
+
AD: boolean;
|
|
46
|
+
CD: boolean;
|
|
47
|
+
Question: [{
|
|
48
|
+
name: string;
|
|
49
|
+
type: 16;
|
|
50
|
+
}];
|
|
51
|
+
Answer: {
|
|
52
|
+
name: string;
|
|
53
|
+
type: 16;
|
|
54
|
+
TTL: number;
|
|
55
|
+
data: string;
|
|
56
|
+
}[];
|
|
57
|
+
Authority?: {
|
|
58
|
+
name: string;
|
|
59
|
+
type: number;
|
|
60
|
+
TTL: number;
|
|
61
|
+
data: string;
|
|
62
|
+
}[] | undefined;
|
|
63
|
+
Comment?: string | string[] | undefined;
|
|
64
|
+
}>>;
|
|
65
|
+
//# sourceMappingURL=doh-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doh-json.d.ts","sourceRoot":"","sources":["../lib/doh-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AA4BpC,sDAAsD;AACtD,eAAO,MAAM,gBAAgB;IAC5B,wBAAwB;;IAExB,oCAAoC;;IAEpC,sFAAsF;;IAEtF,wFAAwF;;IAExF,sDAAsD;;IAEtD,wDAAwD;;IAExD,wBAAwB;;;;;IAExB,cAAc;;;;;;;IAEd,gBAAgB;;;;;;;IAEhB,kCAAkC;;aAEjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,+DAA+D;AAC/D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;GAI3B,CAAC"}
|
package/dist/doh-json.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as v from '@badrap/valita';
|
|
2
|
+
import { pipe } from './pipeline.js';
|
|
3
|
+
import { isResponseOk, parseResponseAsJson, validateJsonWith } from './transformers.js';
|
|
4
|
+
const uint32 = v.number().assert((input) => Number.isInteger(input) && input >= 0 && input <= 2 ** 32 - 1);
|
|
5
|
+
const question = v.object({
|
|
6
|
+
name: v.string(),
|
|
7
|
+
type: v.literal(16), // TXT
|
|
8
|
+
});
|
|
9
|
+
const answer = v.object({
|
|
10
|
+
name: v.string(),
|
|
11
|
+
type: v.literal(16), // TXT
|
|
12
|
+
TTL: uint32,
|
|
13
|
+
data: v.string().chain((input) => {
|
|
14
|
+
return v.ok(input.replace(/^"|"$/g, '').replace(/\\"/g, '"'));
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
17
|
+
const authority = v.object({
|
|
18
|
+
name: v.string(),
|
|
19
|
+
type: uint32,
|
|
20
|
+
TTL: uint32,
|
|
21
|
+
data: v.string(),
|
|
22
|
+
});
|
|
23
|
+
/** DoH JSON response schema for TXT record queries */
|
|
24
|
+
export const dohJsonTxtResult = v.object({
|
|
25
|
+
/** DNS response code */
|
|
26
|
+
Status: uint32,
|
|
27
|
+
/** whether response is truncated */
|
|
28
|
+
TC: v.boolean(),
|
|
29
|
+
/** whether recursive desired bit is set, always true for Google and Cloudflare DoH */
|
|
30
|
+
RD: v.boolean(),
|
|
31
|
+
/** whether recursive available bit is set, always true for Google and Cloudflare DoH */
|
|
32
|
+
RA: v.boolean(),
|
|
33
|
+
/** whether response data was validated with DNSSEC */
|
|
34
|
+
AD: v.boolean(),
|
|
35
|
+
/** whether client asked to disable DNSSEC validation */
|
|
36
|
+
CD: v.boolean(),
|
|
37
|
+
/** requested records */
|
|
38
|
+
Question: v.tuple([question]),
|
|
39
|
+
/** answers */
|
|
40
|
+
Answer: v.array(answer).optional(() => []),
|
|
41
|
+
/** authority */
|
|
42
|
+
Authority: v.array(authority).optional(),
|
|
43
|
+
/** comment from the DNS server */
|
|
44
|
+
Comment: v.union(v.string(), v.array(v.string())).optional(),
|
|
45
|
+
});
|
|
46
|
+
/** fetch handler pipeline for DoH JSON TXT record responses */
|
|
47
|
+
export const fetchDohJsonTxt = pipe(isResponseOk, parseResponseAsJson(/^application\/(dns-)?json$/, 16 * 1024), validateJsonWith(dohJsonTxtResult, { mode: 'passthrough' }));
|
|
48
|
+
//# sourceMappingURL=doh-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doh-json.js","sourceRoot":"","sources":["../lib/doh-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAE3G,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM;CAC3B,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM;IAC3B,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAAA,CAC9D,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,wBAAwB;IACxB,MAAM,EAAE,MAAM;IACd,oCAAoC;IACpC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,sFAAsF;IACtF,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,wFAAwF;IACxF,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,sDAAsD;IACtD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,wDAAwD;IACxD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,wBAAwB;IACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7B,cAAc;IACd,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IAC1C,gBAAgB;IAChB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IACxC,kCAAkC;IAClC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC5D,CAAC,CAAC;AAIH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAClC,YAAY,EACZ,mBAAmB,CAAC,4BAA4B,EAAE,EAAE,GAAG,IAAI,CAAC,EAC5D,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAC3D,CAAC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ export declare class FetchResponseError extends Error {
|
|
|
2
2
|
name: string;
|
|
3
3
|
}
|
|
4
4
|
export declare class FailedResponseError extends FetchResponseError {
|
|
5
|
-
|
|
5
|
+
response: Response;
|
|
6
6
|
name: string;
|
|
7
|
-
constructor(
|
|
7
|
+
constructor(response: Response);
|
|
8
|
+
get status(): number;
|
|
8
9
|
}
|
|
9
10
|
export declare class ImproperContentTypeError extends FetchResponseError {
|
|
10
11
|
contentType: string | null;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;IACnC,IAAI,SAAwB;CACrC;AAED,qBAAa,mBAAoB,SAAQ,kBAAkB;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;IACnC,IAAI,SAAwB;CACrC;AAED,qBAAa,mBAAoB,SAAQ,kBAAkB;IAGvC,QAAQ,EAAE,QAAQ;IAF5B,IAAI,SAAyB;IAEtC,YAAmB,QAAQ,EAAE,QAAQ,EAEpC;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACD;AAED,qBAAa,wBAAyB,SAAQ,kBAAkB;IAIvD,WAAW,EAAE,MAAM,GAAG,IAAI;IAHzB,IAAI,SAA8B;IAE3C,YACQ,WAAW,EAAE,MAAM,GAAG,IAAI,EACjC,MAAM,EAAE,MAAM,EAGd;CACD;AAED,qBAAa,0BAA2B,SAAQ,kBAAkB;IAIzD,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI;IAJxB,IAAI,SAAgC;IAE7C,YACQ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,EAChC,MAAM,EAAE,MAAM,EAGd;CACD;AAED,qBAAa,qBAAsB,SAAQ,kBAAkB;IACnD,IAAI,SAA2B;IAExC,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAEjD;CACD"}
|
package/dist/errors.js
CHANGED
|
@@ -2,11 +2,14 @@ export class FetchResponseError extends Error {
|
|
|
2
2
|
name = 'FetchResponseError';
|
|
3
3
|
}
|
|
4
4
|
export class FailedResponseError extends FetchResponseError {
|
|
5
|
-
|
|
5
|
+
response;
|
|
6
6
|
name = 'FailedResponseError';
|
|
7
|
-
constructor(
|
|
8
|
-
super(
|
|
9
|
-
this.
|
|
7
|
+
constructor(response) {
|
|
8
|
+
super(`got http ${response.status}`);
|
|
9
|
+
this.response = response;
|
|
10
|
+
}
|
|
11
|
+
get status() {
|
|
12
|
+
return this.response.status;
|
|
10
13
|
}
|
|
11
14
|
}
|
|
12
15
|
export class ImproperContentTypeError extends FetchResponseError {
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,IAAI,GAAG,oBAAoB,CAAC;CACrC;AAED,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,IAAI,GAAG,oBAAoB,CAAC;CACrC;AAED,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;IAGvC,QAAQ;IAFlB,IAAI,GAAG,qBAAqB,CAAC;IAEtC,YAAmB,QAAkB,EAAE;QACtC,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;wBADnB,QAAQ;IACW,CACrC;IAED,IAAI,MAAM,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAAA,CAC5B;CACD;AAED,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAIvD,WAAW;IAHV,IAAI,GAAG,0BAA0B,CAAC;IAE3C,YACQ,WAA0B,EACjC,MAAc,EACb;QACD,KAAK,CAAC,MAAM,CAAC,CAAC;2BAHP,WAAW;IAGJ,CACd;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,kBAAkB;IAIzD,YAAY;IACZ,UAAU;IAJT,IAAI,GAAG,4BAA4B,CAAC;IAE7C,YACQ,YAAoB,EACpB,UAAyB,EAChC,MAAc,EACb;QACD,KAAK,CAAC,MAAM,CAAC,CAAC;4BAJP,YAAY;0BACZ,UAAU;IAGH,CACd;CACD;AAED,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IACnD,IAAI,GAAG,uBAAuB,CAAC;IAExC,YAAY,MAAc,EAAE,OAAsB,EAAE;QACnD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAA,CACvB;CACD"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../lib/pipeline.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,IAAI,CACnB,GAAG,QAAiD;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../lib/pipeline.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,IAAI,CACnB,GAAG,QAAiD,EACM;IAC1D,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAAA,CAChC;AAED,MAAM,OAAO,GAAG,CACf,KAAwB,EACxB,MAAyB,EACI,EAAE,CAAC;IAChC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAAA,CAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"size-limit.d.ts","sourceRoot":"","sources":["../../lib/streams/size-limit.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAgB,SAAQ,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"size-limit.d.ts","sourceRoot":"","sources":["../../lib/streams/size-limit.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAgB,SAAQ,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACrG,YAAY,OAAO,EAAE,MAAM,EAkB1B;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"size-limit.js","sourceRoot":"","sources":["../../lib/streams/size-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,MAAM,OAAO,eAAgB,SAAQ,eAAiE;IACrG,YAAY,OAAe;
|
|
1
|
+
{"version":3,"file":"size-limit.js","sourceRoot":"","sources":["../../lib/streams/size-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAEpC,MAAM,OAAO,eAAgB,SAAQ,eAAiE;IACrG,YAAY,OAAe,EAAE;QAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,CAAC;YACL,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE;gBAC5B,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;gBAE1B,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;oBACzB,UAAU,CAAC,KAAK,CACf,IAAI,GAAG,CAAC,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,mCAAmC,CAAC,CAC3F,CAAC;oBAEF,OAAO;gBACR,CAAC;gBAED,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAA,CAC1B;SACD,CAAC,CAAC;IAAA,CACH;CACD"}
|
package/dist/transformers.d.ts
CHANGED
|
@@ -9,8 +9,6 @@ export type ParsedJsonResponse<T = unknown> = {
|
|
|
9
9
|
};
|
|
10
10
|
export declare const isResponseOk: (response: Response) => Promise<Response>;
|
|
11
11
|
export declare const readResponseAsText: (maxSize: number) => (response: Response) => Promise<TextResponse>;
|
|
12
|
-
export declare const parseResponseAsJson: (typeRegex: RegExp, maxSize: number) => (response: Response) => Promise<ParsedJsonResponse
|
|
13
|
-
|
|
14
|
-
export declare const validateJsonWith: <T>(schema: v.Type<T>, options?: ParseOptions) => (parsed: ParsedJsonResponse) => Promise<ParsedJsonResponse<T>>;
|
|
15
|
-
export {};
|
|
12
|
+
export declare const parseResponseAsJson: (typeRegex: RegExp, maxSize: number) => (response: Response) => Promise<ParsedJsonResponse<unknown>>;
|
|
13
|
+
export declare const validateJsonWith: <T>(schema: v.Type<T>, options?: v.ParseOptions | undefined) => (parsed: ParsedJsonResponse<unknown>) => Promise<ParsedJsonResponse<T>>;
|
|
16
14
|
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAKpC,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;CACR,CAAC;AAEF,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAKpC,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;CACR,CAAC;AAEF,eAAO,MAAM,YAAY,2CAMxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,oEAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB,sGAa9B,CAAC;AAIH,eAAO,MAAM,gBAAgB,GAC3B,CAAC,qIAID,CAAC"}
|
package/dist/transformers.js
CHANGED
|
@@ -5,10 +5,7 @@ export const isResponseOk = async (response) => {
|
|
|
5
5
|
if (response.ok) {
|
|
6
6
|
return response;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
await response.body.cancel();
|
|
10
|
-
}
|
|
11
|
-
throw new err.FailedResponseError(response.status, `got http ${response.status}`);
|
|
8
|
+
throw new err.FailedResponseError(response);
|
|
12
9
|
};
|
|
13
10
|
export const readResponseAsText = (maxSize) => async (response) => {
|
|
14
11
|
const text = await readResponse(response, maxSize);
|
package/dist/transformers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAY1D,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,QAAkB,EAAqB,EAAE;
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"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"}
|
package/lib/doh-json.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as v from '@badrap/valita';
|
|
2
|
+
|
|
3
|
+
import { pipe } from './pipeline.js';
|
|
4
|
+
import { isResponseOk, parseResponseAsJson, validateJsonWith } from './transformers.js';
|
|
5
|
+
|
|
6
|
+
const uint32 = v.number().assert((input) => Number.isInteger(input) && input >= 0 && input <= 2 ** 32 - 1);
|
|
7
|
+
|
|
8
|
+
const question = v.object({
|
|
9
|
+
name: v.string(),
|
|
10
|
+
type: v.literal(16), // TXT
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const answer = v.object({
|
|
14
|
+
name: v.string(),
|
|
15
|
+
type: v.literal(16), // TXT
|
|
16
|
+
TTL: uint32,
|
|
17
|
+
data: v.string().chain((input) => {
|
|
18
|
+
return v.ok(input.replace(/^"|"$/g, '').replace(/\\"/g, '"'));
|
|
19
|
+
}),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const authority = v.object({
|
|
23
|
+
name: v.string(),
|
|
24
|
+
type: uint32,
|
|
25
|
+
TTL: uint32,
|
|
26
|
+
data: v.string(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/** DoH JSON response schema for TXT record queries */
|
|
30
|
+
export const dohJsonTxtResult = v.object({
|
|
31
|
+
/** DNS response code */
|
|
32
|
+
Status: uint32,
|
|
33
|
+
/** whether response is truncated */
|
|
34
|
+
TC: v.boolean(),
|
|
35
|
+
/** whether recursive desired bit is set, always true for Google and Cloudflare DoH */
|
|
36
|
+
RD: v.boolean(),
|
|
37
|
+
/** whether recursive available bit is set, always true for Google and Cloudflare DoH */
|
|
38
|
+
RA: v.boolean(),
|
|
39
|
+
/** whether response data was validated with DNSSEC */
|
|
40
|
+
AD: v.boolean(),
|
|
41
|
+
/** whether client asked to disable DNSSEC validation */
|
|
42
|
+
CD: v.boolean(),
|
|
43
|
+
/** requested records */
|
|
44
|
+
Question: v.tuple([question]),
|
|
45
|
+
/** answers */
|
|
46
|
+
Answer: v.array(answer).optional(() => []),
|
|
47
|
+
/** authority */
|
|
48
|
+
Authority: v.array(authority).optional(),
|
|
49
|
+
/** comment from the DNS server */
|
|
50
|
+
Comment: v.union(v.string(), v.array(v.string())).optional(),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export type DohJsonTxtResult = v.Infer<typeof dohJsonTxtResult>;
|
|
54
|
+
|
|
55
|
+
/** fetch handler pipeline for DoH JSON TXT record responses */
|
|
56
|
+
export const fetchDohJsonTxt = pipe(
|
|
57
|
+
isResponseOk,
|
|
58
|
+
parseResponseAsJson(/^application\/(dns-)?json$/, 16 * 1024),
|
|
59
|
+
validateJsonWith(dohJsonTxtResult, { mode: 'passthrough' }),
|
|
60
|
+
);
|
package/lib/errors.ts
CHANGED
|
@@ -5,11 +5,12 @@ export class FetchResponseError extends Error {
|
|
|
5
5
|
export class FailedResponseError extends FetchResponseError {
|
|
6
6
|
override name = 'FailedResponseError';
|
|
7
7
|
|
|
8
|
-
constructor(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
constructor(public response: Response) {
|
|
9
|
+
super(`got http ${response.status}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get status(): number {
|
|
13
|
+
return this.response.status;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
|
package/lib/index.ts
CHANGED
package/lib/transformers.ts
CHANGED
|
@@ -18,11 +18,7 @@ export const isResponseOk = async (response: Response): Promise<Response> => {
|
|
|
18
18
|
return response;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
await response.body.cancel();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
throw new err.FailedResponseError(response.status, `got http ${response.status}`);
|
|
21
|
+
throw new err.FailedResponseError(response);
|
|
26
22
|
};
|
|
27
23
|
|
|
28
24
|
export const readResponseAsText =
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/util-fetch",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.5",
|
|
5
5
|
"description": "internal fetch utilities",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"atproto",
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
"url": "https://github.com/mary-ext/atcute",
|
|
13
13
|
"directory": "packages/misc/util-fetch"
|
|
14
14
|
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
15
18
|
"files": [
|
|
16
19
|
"dist/",
|
|
17
20
|
"lib/",
|
|
@@ -22,15 +25,11 @@
|
|
|
22
25
|
".": "./dist/index.js"
|
|
23
26
|
},
|
|
24
27
|
"sideEffects": false,
|
|
25
|
-
"devDependencies": {
|
|
26
|
-
"@types/bun": "^1.2.21"
|
|
27
|
-
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@badrap/valita": "^0.4.6"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
|
-
"build": "
|
|
33
|
-
"test": "bun test --coverage",
|
|
32
|
+
"build": "tsgo --project tsconfig.build.json",
|
|
34
33
|
"prepublish": "rm -rf dist; pnpm run build"
|
|
35
34
|
}
|
|
36
35
|
}
|