@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 CHANGED
@@ -1,3 +1,9 @@
1
1
  # @atcute/util-fetch
2
2
 
3
- random fetch utilities.
3
+ fetch response utilities used internally by atcute packages.
4
+
5
+ ```sh
6
+ npm install @atcute/util-fetch
7
+ ```
8
+
9
+ this library provides composable fetch response transformers.
@@ -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"}
@@ -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
- status: number;
5
+ response: Response;
6
6
  name: string;
7
- constructor(status: number, reason: string);
7
+ constructor(response: Response);
8
+ get status(): number;
8
9
  }
9
10
  export declare class ImproperContentTypeError extends FetchResponseError {
10
11
  contentType: string | null;
@@ -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;IAIlD,MAAM,EAAE,MAAM;IAHb,IAAI,SAAyB;gBAG9B,MAAM,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM;CAIf;AAED,qBAAa,wBAAyB,SAAQ,kBAAkB;IAIvD,WAAW,EAAE,MAAM,GAAG,IAAI;IAHzB,IAAI,SAA8B;gBAGnC,WAAW,EAAE,MAAM,GAAG,IAAI,EACjC,MAAM,EAAE,MAAM;CAIf;AAED,qBAAa,0BAA2B,SAAQ,kBAAkB;IAIzD,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI;IAJxB,IAAI,SAAgC;gBAGrC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,EAChC,MAAM,EAAE,MAAM;CAIf;AAED,qBAAa,qBAAsB,SAAQ,kBAAkB;IACnD,IAAI,SAA2B;gBAE5B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGlD"}
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
- status;
5
+ response;
6
6
  name = 'FailedResponseError';
7
- constructor(status, reason) {
8
- super(reason);
9
- this.status = status;
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 {
@@ -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;IAIlD;IAHC,IAAI,GAAG,qBAAqB,CAAC;IAEtC,YACQ,MAAc,EACrB,MAAc;QAEd,KAAK,CAAC,MAAM,CAAC,CAAC;QAHP,WAAM,GAAN,MAAM,CAAQ;IAItB,CAAC;CACD;AAED,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAIvD;IAHC,IAAI,GAAG,0BAA0B,CAAC;IAE3C,YACQ,WAA0B,EACjC,MAAc;QAEd,KAAK,CAAC,MAAM,CAAC,CAAC;QAHP,gBAAW,GAAX,WAAW,CAAe;IAIlC,CAAC;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,kBAAkB;IAIzD;IACA;IAJC,IAAI,GAAG,4BAA4B,CAAC;IAE7C,YACQ,YAAoB,EACpB,UAAyB,EAChC,MAAc;QAEd,KAAK,CAAC,MAAM,CAAC,CAAC;QAJP,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAe;IAIjC,CAAC;CACD;AAED,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IACnD,IAAI,GAAG,uBAAuB,CAAC;IAExC,YAAY,MAAc,EAAE,OAAsB;QACjD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;CACD"}
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
@@ -1,3 +1,4 @@
1
+ export * from './doh-json.js';
1
2
  export * from './errors.js';
2
3
  export * from './pipeline.js';
3
4
  export * from './transformers.js';
@@ -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
@@ -1,3 +1,4 @@
1
+ export * from './doh-json.js';
1
2
  export * from './errors.js';
2
3
  export * from './pipeline.js';
3
4
  export * from './transformers.js';
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../lib/pipeline.ts"],"names":[],"mappings":"AA6BA,MAAM,UAAU,IAAI,CACnB,GAAG,QAAiD;IAEpD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,GAAG,CACf,KAAwB,EACxB,MAAyB,EACI,EAAE;IAC/B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC,CAAC"}
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;gBACzF,OAAO,EAAE,MAAM;CAmB3B"}
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;QAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,CAAC;YACL,SAAS,CAAC,KAAK,EAAE,UAAU;gBAC1B,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;YAC3B,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;CACD"}
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"}
@@ -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
- type ParseOptions = NonNullable<Parameters<v.Type['parse']>[1]>;
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,GAAU,UAAU,QAAQ,KAAG,OAAO,CAAC,QAAQ,CAUvE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,MAAM,MACT,UAAU,QAAQ,KAAG,OAAO,CAAC,YAAY,CAG/C,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,EAAE,SAAS,MAAM,MAC5B,UAAU,QAAQ,KAAG,OAAO,CAAC,kBAAkB,CAWrD,CAAC;AAEH,KAAK,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB,GAC3B,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,YAAY,MACtC,QAAQ,kBAAkB,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAGhE,CAAC"}
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"}
@@ -5,10 +5,7 @@ export const isResponseOk = async (response) => {
5
5
  if (response.ok) {
6
6
  return response;
7
7
  }
8
- if (response.body) {
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);
@@ -1 +1 @@
1
- {"version":3,"file":"transformers.js","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"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"}
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,CAAC;IAC5E,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAAA,CAC5C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAC9B,CAAC,OAAe,EAAE,EAAE,CACpB,KAAK,EAAE,QAAkB,EAAyB,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,CAC1B,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAC/B,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CACvC,KAAK,EAAE,QAAkB,EAA+B,EAAE,CAAC;IAC1D,MAAM,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AAAA,CACD,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAC5B,CAAI,MAAiB,EAAE,OAAsB,EAAE,EAAE,CACjD,KAAK,EAAE,MAA0B,EAAkC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;AAAA,CAC3C,CAAC;AAEH,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAkB,EAAE,SAAiB,EAAiB,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;IAClF,CAAC;AAAA,CACD,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,QAAkB,EAAE,OAAe,EAAmB,EAAE,CAAC;IACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,EAAE,mCAAmC,CAAC,CAAC;QAC9F,CAAC;IACF,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ;SACrB,IAAK,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;SAC/C,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAEvC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AAAA,CACZ,CAAC;AAEF,MAAM,oBAAoB,GACzB,MAAM,CAAC,aAAa,IAAI,cAAc,CAAC,SAAS;IAC/C,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;IAC5C,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAElC,OAAO;YACN,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;gBACxB,OAAO,IAAI,CAAC;YAAA,CACZ;YACD,IAAI,GAAG;gBACN,OAAO,MAAM,CAAC,IAAI,EAAkC,CAAC;YAAA,CACrD;YACD,KAAK,CAAC,MAAM,GAAG;gBACd,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAAA,CACxC;YACD,KAAK,CAAC,KAAK,CAAC,KAAc,EAAE;gBAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAAA,CACxC;SACD,CAAC;IAAA,CACF,CAAC"}
@@ -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
- public status: number,
10
- reason: string,
11
- ) {
12
- super(reason);
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
@@ -1,3 +1,4 @@
1
+ export * from './doh-json.js';
1
2
  export * from './errors.js';
2
3
  export * from './pipeline.js';
3
4
  export * from './transformers.js';
@@ -18,11 +18,7 @@ export const isResponseOk = async (response: Response): Promise<Response> => {
18
18
  return response;
19
19
  }
20
20
 
21
- if (response.body) {
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.3",
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": "tsc --project tsconfig.build.json",
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
  }