@utiliread/http 1.16.2 → 1.17.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.
Files changed (139) hide show
  1. package/dist/index.d.ts +227 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +534 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +507 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/dist/{esm/json.d.ts → json.d.ts} +15 -17
  8. package/dist/json.d.ts.map +1 -0
  9. package/dist/json.js +100 -0
  10. package/dist/json.js.map +1 -0
  11. package/dist/json.mjs +100 -0
  12. package/dist/json.mjs.map +1 -0
  13. package/dist/{esm/jsonpatch.d.ts → jsonpatch.d.ts} +10 -9
  14. package/dist/jsonpatch.d.ts.map +1 -0
  15. package/dist/jsonpatch.js +18 -0
  16. package/dist/jsonpatch.js.map +1 -0
  17. package/dist/jsonpatch.mjs +18 -0
  18. package/dist/jsonpatch.mjs.map +1 -0
  19. package/dist/{esm/msgpack.d.ts → msgpack.d.ts} +9 -10
  20. package/dist/msgpack.d.ts.map +1 -0
  21. package/dist/msgpack.js +62 -0
  22. package/dist/msgpack.js.map +1 -0
  23. package/dist/msgpack.mjs +62 -0
  24. package/dist/msgpack.mjs.map +1 -0
  25. package/json.d.ts +1 -1
  26. package/jsonpatch.d.ts +1 -1
  27. package/msgpack.d.ts +1 -1
  28. package/package.json +28 -20
  29. package/plugins/json/package-lock.json +145 -0
  30. package/plugins/json/package.json +11 -0
  31. package/{src/json.ts → plugins/json/src/index.ts} +123 -117
  32. package/plugins/json/tsconfig.json +3 -0
  33. package/plugins/jsonpatch/package-lock.json +124 -0
  34. package/plugins/jsonpatch/package.json +13 -0
  35. package/{src/jsonpatch.ts → plugins/jsonpatch/src/index.ts} +31 -30
  36. package/plugins/jsonpatch/tsconfig.json +3 -0
  37. package/plugins/msgpack/package-lock.json +134 -0
  38. package/plugins/msgpack/package.json +12 -0
  39. package/{src/msgpack.ts → plugins/msgpack/src/index.ts} +60 -64
  40. package/plugins/msgpack/tsconfig.json +3 -0
  41. package/src/http-builder.ts +1 -1
  42. package/src/http.ts +132 -116
  43. package/src/index.ts +8 -6
  44. package/src/mapping.ts +1 -0
  45. package/tsconfig.json +8 -17
  46. package/dist/cjs/event-aggregator.js +0 -94
  47. package/dist/cjs/event-aggregator.js.map +0 -1
  48. package/dist/cjs/events.js +0 -23
  49. package/dist/cjs/events.js.map +0 -1
  50. package/dist/cjs/helpers.js +0 -16
  51. package/dist/cjs/helpers.js.map +0 -1
  52. package/dist/cjs/http-builder.js +0 -284
  53. package/dist/cjs/http-builder.js.map +0 -1
  54. package/dist/cjs/http-error.js +0 -53
  55. package/dist/cjs/http-error.js.map +0 -1
  56. package/dist/cjs/http-response.js +0 -102
  57. package/dist/cjs/http-response.js.map +0 -1
  58. package/dist/cjs/http.js +0 -97
  59. package/dist/cjs/http.js.map +0 -1
  60. package/dist/cjs/http.spec.js +0 -144
  61. package/dist/cjs/http.spec.js.map +0 -1
  62. package/dist/cjs/index.js +0 -37
  63. package/dist/cjs/index.js.map +0 -1
  64. package/dist/cjs/json.js +0 -71
  65. package/dist/cjs/json.js.map +0 -1
  66. package/dist/cjs/jsonpatch.js +0 -15
  67. package/dist/cjs/jsonpatch.js.map +0 -1
  68. package/dist/cjs/mapping.js +0 -37
  69. package/dist/cjs/mapping.js.map +0 -1
  70. package/dist/cjs/msgpack.js +0 -173
  71. package/dist/cjs/msgpack.js.map +0 -1
  72. package/dist/cjs/pagination.js +0 -3
  73. package/dist/cjs/pagination.js.map +0 -1
  74. package/dist/cjs/problem-details.js +0 -3
  75. package/dist/cjs/problem-details.js.map +0 -1
  76. package/dist/cjs/query-string.js +0 -69
  77. package/dist/cjs/query-string.js.map +0 -1
  78. package/dist/cjs/query-string.spec.js +0 -52
  79. package/dist/cjs/query-string.spec.js.map +0 -1
  80. package/dist/cjs/status-codes.js +0 -71
  81. package/dist/cjs/status-codes.js.map +0 -1
  82. package/dist/cjs/timeout-error.js +0 -32
  83. package/dist/cjs/timeout-error.js.map +0 -1
  84. package/dist/esm/event-aggregator.d.ts +0 -11
  85. package/dist/esm/event-aggregator.js +0 -91
  86. package/dist/esm/event-aggregator.js.map +0 -1
  87. package/dist/esm/events.d.ts +0 -11
  88. package/dist/esm/events.js +0 -19
  89. package/dist/esm/events.js.map +0 -1
  90. package/dist/esm/helpers.d.ts +0 -5
  91. package/dist/esm/helpers.js +0 -10
  92. package/dist/esm/helpers.js.map +0 -1
  93. package/dist/esm/http-builder.d.ts +0 -60
  94. package/dist/esm/http-builder.js +0 -281
  95. package/dist/esm/http-builder.js.map +0 -1
  96. package/dist/esm/http-error.d.ts +0 -10
  97. package/dist/esm/http-error.js +0 -50
  98. package/dist/esm/http-error.js.map +0 -1
  99. package/dist/esm/http-response.d.ts +0 -18
  100. package/dist/esm/http-response.js +0 -99
  101. package/dist/esm/http-response.js.map +0 -1
  102. package/dist/esm/http.d.ts +0 -32
  103. package/dist/esm/http.js +0 -94
  104. package/dist/esm/http.js.map +0 -1
  105. package/dist/esm/http.spec.d.ts +0 -1
  106. package/dist/esm/http.spec.js +0 -142
  107. package/dist/esm/http.spec.js.map +0 -1
  108. package/dist/esm/index.d.ts +0 -13
  109. package/dist/esm/index.js +0 -10
  110. package/dist/esm/index.js.map +0 -1
  111. package/dist/esm/json.js +0 -69
  112. package/dist/esm/json.js.map +0 -1
  113. package/dist/esm/jsonpatch.js +0 -13
  114. package/dist/esm/jsonpatch.js.map +0 -1
  115. package/dist/esm/mapping.d.ts +0 -8
  116. package/dist/esm/mapping.js +0 -32
  117. package/dist/esm/mapping.js.map +0 -1
  118. package/dist/esm/msgpack.js +0 -171
  119. package/dist/esm/msgpack.js.map +0 -1
  120. package/dist/esm/pagination.d.ts +0 -23
  121. package/dist/esm/pagination.js +0 -2
  122. package/dist/esm/pagination.js.map +0 -1
  123. package/dist/esm/problem-details.d.ts +0 -7
  124. package/dist/esm/problem-details.js +0 -2
  125. package/dist/esm/problem-details.js.map +0 -1
  126. package/dist/esm/query-string.d.ts +0 -6
  127. package/dist/esm/query-string.js +0 -66
  128. package/dist/esm/query-string.js.map +0 -1
  129. package/dist/esm/query-string.spec.d.ts +0 -1
  130. package/dist/esm/query-string.spec.js +0 -50
  131. package/dist/esm/query-string.spec.js.map +0 -1
  132. package/dist/esm/status-codes.d.ts +0 -67
  133. package/dist/esm/status-codes.js +0 -68
  134. package/dist/esm/status-codes.js.map +0 -1
  135. package/dist/esm/timeout-error.d.ts +0 -3
  136. package/dist/esm/timeout-error.js +0 -29
  137. package/dist/esm/timeout-error.js.map +0 -1
  138. package/index.d.ts +0 -1
  139. package/tsconfig.cjs.json +0 -9
@@ -0,0 +1,134 @@
1
+ {
2
+ "name": "@utiliread/http/msgpack",
3
+ "lockfileVersion": 2,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "name": "@utiliread/http/msgpack",
8
+ "dependencies": {
9
+ "@msgpack/msgpack": "^2.7.2",
10
+ "@utiliread/http": "../../",
11
+ "@utiliread/msgpack": "^1.0.1"
12
+ }
13
+ },
14
+ "../..": {
15
+ "name": "@utiliread/http",
16
+ "version": "1.16.2",
17
+ "devDependencies": {
18
+ "@parcel/packager-ts": "^2.5.0",
19
+ "@parcel/transformer-typescript-types": "^2.5.0",
20
+ "@types/chai": "^4.2.16",
21
+ "@types/luxon": "^2.0.5",
22
+ "@types/mocha": "^9.0.0",
23
+ "@utiliread/json": "^1.0.2",
24
+ "@utiliread/jsonpatch": "^1.0.0",
25
+ "@utiliread/msgpack": "^1.0.1",
26
+ "chai": "^4.3.4",
27
+ "karma": "^6.3.8",
28
+ "karma-chai": "^0.1.0",
29
+ "karma-chrome-launcher": "^3.1.0",
30
+ "karma-mocha": "^2.0.1",
31
+ "karma-typescript": "^5.5.1",
32
+ "luxon": "^2.1.0",
33
+ "mocha": "^9.1.3",
34
+ "parcel": "^2.5.0",
35
+ "rimraf": "^3.0.2",
36
+ "typescript": "^4.2.4"
37
+ },
38
+ "peerDependencies": {
39
+ "@utiliread/json": "^1.0.2",
40
+ "@utiliread/jsonpatch": "^1.0.0",
41
+ "@utiliread/msgpack": "^1.0.1",
42
+ "luxon": "^2.1.0"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "@utiliread/json": {
46
+ "optional": true
47
+ },
48
+ "@utiliread/jsonpatch": {
49
+ "optional": true
50
+ },
51
+ "@utiliread/msgpack": {
52
+ "optional": true
53
+ }
54
+ }
55
+ },
56
+ "node_modules/@msgpack/msgpack": {
57
+ "version": "2.7.2",
58
+ "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz",
59
+ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==",
60
+ "engines": {
61
+ "node": ">= 10"
62
+ }
63
+ },
64
+ "node_modules/@utiliread/http": {
65
+ "resolved": "../..",
66
+ "link": true
67
+ },
68
+ "node_modules/@utiliread/msgpack": {
69
+ "version": "1.0.1",
70
+ "resolved": "https://registry.npmjs.org/@utiliread/msgpack/-/msgpack-1.0.1.tgz",
71
+ "integrity": "sha512-M5bG7drhwrp4YLZhL1Al+K2SkFw3rVhsCVJvi+yV2n5M8nD/qnLuMRu5ZvjYT5iNYKfo1MJWUXfSbq30a0GqLA==",
72
+ "dependencies": {
73
+ "@msgpack/msgpack": "^2.4.0"
74
+ },
75
+ "peerDependencies": {
76
+ "luxon": "^2.1.0"
77
+ }
78
+ },
79
+ "node_modules/luxon": {
80
+ "version": "2.4.0",
81
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz",
82
+ "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==",
83
+ "peer": true,
84
+ "engines": {
85
+ "node": ">=12"
86
+ }
87
+ }
88
+ },
89
+ "dependencies": {
90
+ "@msgpack/msgpack": {
91
+ "version": "2.7.2",
92
+ "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz",
93
+ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw=="
94
+ },
95
+ "@utiliread/http": {
96
+ "version": "file:../..",
97
+ "requires": {
98
+ "@parcel/packager-ts": "^2.5.0",
99
+ "@parcel/transformer-typescript-types": "^2.5.0",
100
+ "@types/chai": "^4.2.16",
101
+ "@types/luxon": "^2.0.5",
102
+ "@types/mocha": "^9.0.0",
103
+ "@utiliread/json": "^1.0.2",
104
+ "@utiliread/jsonpatch": "^1.0.0",
105
+ "@utiliread/msgpack": "^1.0.1",
106
+ "chai": "^4.3.4",
107
+ "karma": "^6.3.8",
108
+ "karma-chai": "^0.1.0",
109
+ "karma-chrome-launcher": "^3.1.0",
110
+ "karma-mocha": "^2.0.1",
111
+ "karma-typescript": "^5.5.1",
112
+ "luxon": "^2.1.0",
113
+ "mocha": "^9.1.3",
114
+ "parcel": "^2.5.0",
115
+ "rimraf": "^3.0.2",
116
+ "typescript": "^4.2.4"
117
+ }
118
+ },
119
+ "@utiliread/msgpack": {
120
+ "version": "1.0.1",
121
+ "resolved": "https://registry.npmjs.org/@utiliread/msgpack/-/msgpack-1.0.1.tgz",
122
+ "integrity": "sha512-M5bG7drhwrp4YLZhL1Al+K2SkFw3rVhsCVJvi+yV2n5M8nD/qnLuMRu5ZvjYT5iNYKfo1MJWUXfSbq30a0GqLA==",
123
+ "requires": {
124
+ "@msgpack/msgpack": "^2.4.0"
125
+ }
126
+ },
127
+ "luxon": {
128
+ "version": "2.4.0",
129
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz",
130
+ "integrity": "sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==",
131
+ "peer": true
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "@utiliread/http/msgpack",
3
+ "source": "./src/index.ts",
4
+ "main": "../../dist/msgpack.js",
5
+ "module": "../../dist/msgpack.mjs",
6
+ "types": "../../dist/msgpack.d.ts",
7
+ "dependencies": {
8
+ "@msgpack/msgpack": "^2.7.2",
9
+ "@utiliread/http": "../../",
10
+ "@utiliread/msgpack": "^1.0.1"
11
+ }
12
+ }
@@ -1,64 +1,60 @@
1
- import { deserialize } from "@utiliread/msgpack";
2
- import { HttpBuilder } from "./http-builder";
3
- import { decodeArrayStream, decodeAsync } from "@msgpack/msgpack";
4
- import { getMapper, Mapper, Type } from "./mapping";
5
- import { HttpResponse } from "./http-response";
6
-
7
- type TypeOrMapper<T> = Type<T> | Mapper<T>;
8
-
9
- declare module "./http-builder" {
10
- interface HttpBuilder {
11
- expectMessagePack<T>(
12
- typeOrMapper?: TypeOrMapper<T>
13
- ): HttpBuilderOfT<T>;
14
- expectMessagePackArray<T>(
15
- typeOrMapper?: TypeOrMapper<T>
16
- ): HttpBuilderOfT<T[]>;
17
- streamMessagePackArray<T>(
18
- typeOrMapper?: TypeOrMapper<T>
19
- ): HttpBuilderOfT<AsyncGenerator<T, void, unknown>>;
20
- }
21
- }
22
-
23
- HttpBuilder.prototype.expectMessagePack = function <T>(
24
- this: HttpBuilder,
25
- typeOrMapper?: TypeOrMapper<T>
26
- ) {
27
- this.message.headers.set("Accept", "application/x-msgpack");
28
- return this.useHandler(async (response) => {
29
- const itemFactory = getMapper(deserialize, typeOrMapper);
30
- const decoded = await decodeAsync(response.rawResponse.body!);
31
- return itemFactory(decoded);
32
- });
33
- };
34
-
35
- HttpBuilder.prototype.expectMessagePackArray = function <T>(
36
- this: HttpBuilder,
37
- typeOrMapper?: TypeOrMapper<T>
38
- ) {
39
- this.message.headers.set("Accept", "application/x-msgpack");
40
- return this.useHandler(async (response) => {
41
- const items: T[] = [];
42
- const itemFactory = getMapper(deserialize, typeOrMapper);
43
- for await (const item of decodeArrayStream(response.rawResponse.body!)) {
44
- items.push(itemFactory(item));
45
- }
46
- return items;
47
- });
48
- };
49
-
50
- HttpBuilder.prototype.streamMessagePackArray = function <T>(
51
- this: HttpBuilder,
52
- typeOrMapper?: TypeOrMapper<T>
53
- ) {
54
- this.message.headers.set("Accept", "application/x-msgpack");
55
-
56
- async function* handler(response: HttpResponse) {
57
- const itemFactory = getMapper(deserialize, typeOrMapper);
58
- for await (const item of decodeArrayStream(response.rawResponse.body!)) {
59
- yield itemFactory(item);
60
- }
61
- }
62
-
63
- return this.useHandler((response) => Promise.resolve(handler(response)));
64
- };
1
+ import { deserialize } from "@utiliread/msgpack";
2
+ import { HttpBuilder, HttpBuilderOfT, HttpResponse, TypeOrMapper } from "@utiliread/http";
3
+ import { decodeArrayStream, decodeAsync } from "@msgpack/msgpack";
4
+ import { getMapper } from "../../../src/mapping";
5
+
6
+ // https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
7
+ declare module "@utiliread/http" {
8
+ interface HttpBuilder {
9
+ expectMessagePack<T>(typeOrMapper?: TypeOrMapper<T>): HttpBuilderOfT<T>;
10
+ expectMessagePackArray<T>(
11
+ typeOrMapper?: TypeOrMapper<T>
12
+ ): HttpBuilderOfT<T[]>;
13
+ streamMessagePackArray<T>(
14
+ typeOrMapper?: TypeOrMapper<T>
15
+ ): HttpBuilderOfT<AsyncGenerator<T, void, unknown>>;
16
+ }
17
+ }
18
+
19
+ HttpBuilder.prototype.expectMessagePack = function <T>(
20
+ this: HttpBuilder,
21
+ typeOrMapper?: TypeOrMapper<T>
22
+ ) {
23
+ this.message.headers.set("Accept", "application/x-msgpack");
24
+ return this.useHandler(async (response) => {
25
+ const itemFactory = getMapper(deserialize, typeOrMapper);
26
+ const decoded = await decodeAsync(response.rawResponse.body!);
27
+ return itemFactory(decoded);
28
+ });
29
+ };
30
+
31
+ HttpBuilder.prototype.expectMessagePackArray = function <T>(
32
+ this: HttpBuilder,
33
+ typeOrMapper?: TypeOrMapper<T>
34
+ ) {
35
+ this.message.headers.set("Accept", "application/x-msgpack");
36
+ return this.useHandler(async (response) => {
37
+ const items: T[] = [];
38
+ const itemFactory = getMapper(deserialize, typeOrMapper);
39
+ for await (const item of decodeArrayStream(response.rawResponse.body!)) {
40
+ items.push(itemFactory(item));
41
+ }
42
+ return items;
43
+ });
44
+ };
45
+
46
+ HttpBuilder.prototype.streamMessagePackArray = function <T>(
47
+ this: HttpBuilder,
48
+ typeOrMapper?: TypeOrMapper<T>
49
+ ) {
50
+ this.message.headers.set("Accept", "application/x-msgpack");
51
+
52
+ async function* handler(response: HttpResponse) {
53
+ const itemFactory = getMapper(deserialize, typeOrMapper);
54
+ for await (const item of decodeArrayStream(response.rawResponse.body!)) {
55
+ yield itemFactory(item);
56
+ }
57
+ }
58
+
59
+ return this.useHandler((response) => Promise.resolve(handler(response)));
60
+ };
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../../tsconfig.json"
3
+ }
@@ -2,7 +2,7 @@ import { Fetch } from './http';
2
2
  import { HttpResponse, HttpResponseOfT } from './http-response';
3
3
  import { TimeoutError } from './timeout-error';
4
4
  import { EventAggregator } from './event-aggregator';
5
- import { Http } from '.';
5
+ import { Http } from './http';
6
6
 
7
7
  export class HttpBuilder {
8
8
  private _ensureSuccessStatusCode = true;
package/src/http.ts CHANGED
@@ -1,122 +1,138 @@
1
- import { EventAggregator } from './event-aggregator';
2
- import { HttpBuilder, HttpMethod, Message } from './http-builder';
3
- import { HttpResponse, HttpResponseOfT } from './http-response';
4
- import { QueryString } from './query-string';
1
+ import { EventAggregator } from "./event-aggregator";
2
+ import type { Subscription } from "./event-aggregator";
3
+ import { HttpBuilder, HttpMethod, Message } from "./http-builder";
4
+ import { HttpResponse, HttpResponseOfT } from "./http-response";
5
+ import { QueryString } from "./query-string";
5
6
 
6
- export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
7
+ export type Fetch = (
8
+ input: RequestInfo,
9
+ init?: RequestInit
10
+ ) => Promise<Response>;
7
11
 
8
12
  export class Http {
9
- static defaults: HttpOptions = {
10
- fetch: self.fetch ? self.fetch.bind(self) : undefined,
11
- }
12
- private static instance?: Http;
13
- options: HttpOptions;
14
- /** @internal */
15
- _onSend = new EventAggregator<[Message]>();
16
- /** @internal */
17
- _onSent = new EventAggregator<[HttpResponse, Message]>();
18
- /** @internal */
19
- _onReceived = new EventAggregator<[HttpResponseOfT<any>, Message, any]>();
20
-
21
- constructor(options?: Partial<HttpOptions>) {
22
- this.options = Object.assign({}, Http.defaults, options); // Later sources' properties overwrite earlier ones.
23
- }
24
-
25
- static request(method: HttpMethod, url: string, params?: any) {
26
- return this.getInstance().request(method, url, params);
27
- }
28
-
29
- static head(url: string, params?: any) {
30
- return this.getInstance().head(url, params);
31
- }
32
-
33
- static post(url: string, params?: any) {
34
- return this.getInstance().post(url, params);
35
- }
36
-
37
- static get(url: string, params?: any) {
38
- return this.getInstance().get(url, params);
39
- }
40
-
41
- static put(url: string, params?: any) {
42
- return this.getInstance().put(url, params);
43
- }
44
-
45
- static patch(url: string, params?: any) {
46
- return this.getInstance().patch(url, params);
47
- }
48
-
49
- static delete(url: string, params?: any) {
50
- return this.getInstance().delete(url, params);
51
- }
52
-
53
- private static getInstance() {
54
- if (!this.instance) {
55
- this.instance = new Http();
56
- // The singleton instance should always use the static options
57
- this.instance.options = Http.defaults;
58
- }
59
- return this.instance;
60
- }
61
-
62
- request(method: HttpMethod, url: string, params?: any) {
63
- const message = {
64
- method,
65
- url: url + QueryString.serialize(params),
66
- headers: new Headers(),
67
- properties: {},
68
- };
69
- const fetch = this.options.fetch;
70
- if (!fetch) {
71
- throw Error('fetch() is not properly configured');
72
- }
73
- const builder = new HttpBuilder(message, {
74
- fetch,
75
- timeout: this.options.timeout,
76
- baseUrl: this.options.baseUrl,
77
- }, this);
78
- return builder;
79
- }
80
-
81
- head(url: string, params?: any) {
82
- return this.request('HEAD', url, params);
83
- }
84
-
85
- post(url: string, params?: any) {
86
- return this.request('POST', url, params);
87
- }
88
-
89
- get(url: string, params?: any) {
90
- return this.request('GET', url, params);
91
- }
92
-
93
- put(url: string, params?: any) {
94
- return this.request('PUT', url, params);
95
- }
96
-
97
- patch(url: string, params?: any) {
98
- return this.request('PATCH', url, params);
99
- }
100
-
101
- delete(url: string, params?: any) {
102
- return this.request('DELETE', url, params);
103
- }
104
-
105
- onSend(callback: (request: Message) => void | Promise<void>) {
106
- return this._onSend.subscribe(callback);
107
- }
108
-
109
- onSent(callback: (response: HttpResponse, request: Message) => void | Promise<void>) {
110
- return this._onSent.subscribe(callback);
111
- }
112
-
113
- onReceived(callback: (response: HttpResponseOfT<any>, request: Message, value: any) => void | Promise<void>) {
114
- return this._onReceived.subscribe(callback);
115
- }
13
+ static defaults: HttpOptions = {
14
+ fetch: self.fetch ? self.fetch.bind(self) : undefined,
15
+ };
16
+ private static instance?: Http;
17
+ options: HttpOptions;
18
+ /** @internal */
19
+ _onSend = new EventAggregator<[Message]>();
20
+ /** @internal */
21
+ _onSent = new EventAggregator<[HttpResponse, Message]>();
22
+ /** @internal */
23
+ _onReceived = new EventAggregator<[HttpResponseOfT<any>, Message, any]>();
24
+
25
+ constructor(options?: Partial<HttpOptions>) {
26
+ this.options = Object.assign({}, Http.defaults, options); // Later sources' properties overwrite earlier ones.
27
+ }
28
+
29
+ static request(method: HttpMethod, url: string, params?: any) {
30
+ return this.getInstance().request(method, url, params);
31
+ }
32
+
33
+ static head(url: string, params?: any) {
34
+ return this.getInstance().head(url, params);
35
+ }
36
+
37
+ static post(url: string, params?: any) {
38
+ return this.getInstance().post(url, params);
39
+ }
40
+
41
+ static get(url: string, params?: any) {
42
+ return this.getInstance().get(url, params);
43
+ }
44
+
45
+ static put(url: string, params?: any) {
46
+ return this.getInstance().put(url, params);
47
+ }
48
+
49
+ static patch(url: string, params?: any) {
50
+ return this.getInstance().patch(url, params);
51
+ }
52
+
53
+ static delete(url: string, params?: any) {
54
+ return this.getInstance().delete(url, params);
55
+ }
56
+
57
+ private static getInstance() {
58
+ if (!this.instance) {
59
+ this.instance = new Http();
60
+ // The singleton instance should always use the static options
61
+ this.instance.options = Http.defaults;
62
+ }
63
+ return this.instance;
64
+ }
65
+
66
+ request(method: HttpMethod, url: string, params?: any) {
67
+ const message = {
68
+ method,
69
+ url: url + QueryString.serialize(params),
70
+ headers: new Headers(),
71
+ properties: {},
72
+ };
73
+ const fetch = this.options.fetch;
74
+ if (!fetch) {
75
+ throw Error("fetch() is not properly configured");
76
+ }
77
+ const builder = new HttpBuilder(
78
+ message,
79
+ {
80
+ fetch,
81
+ timeout: this.options.timeout,
82
+ baseUrl: this.options.baseUrl,
83
+ },
84
+ this
85
+ );
86
+ return builder;
87
+ }
88
+
89
+ head(url: string, params?: any) {
90
+ return this.request("HEAD", url, params);
91
+ }
92
+
93
+ post(url: string, params?: any) {
94
+ return this.request("POST", url, params);
95
+ }
96
+
97
+ get(url: string, params?: any) {
98
+ return this.request("GET", url, params);
99
+ }
100
+
101
+ put(url: string, params?: any) {
102
+ return this.request("PUT", url, params);
103
+ }
104
+
105
+ patch(url: string, params?: any) {
106
+ return this.request("PATCH", url, params);
107
+ }
108
+
109
+ delete(url: string, params?: any) {
110
+ return this.request("DELETE", url, params);
111
+ }
112
+
113
+ onSend(callback: (request: Message) => void | Promise<void>): Subscription {
114
+ return this._onSend.subscribe(callback);
115
+ }
116
+
117
+ onSent(
118
+ callback: (response: HttpResponse, request: Message) => void | Promise<void>
119
+ ): Subscription {
120
+ return this._onSent.subscribe(callback);
121
+ }
122
+
123
+ onReceived(
124
+ callback: (
125
+ response: HttpResponseOfT<any>,
126
+ request: Message,
127
+ value: any
128
+ ) => void | Promise<void>
129
+ ): Subscription {
130
+ return this._onReceived.subscribe(callback);
131
+ }
116
132
  }
117
133
 
118
134
  export interface HttpOptions {
119
- fetch?: Fetch,
120
- timeout?: number,
121
- baseUrl?: string,
122
- }
135
+ fetch?: Fetch;
136
+ timeout?: number;
137
+ baseUrl?: string;
138
+ }
package/src/index.ts CHANGED
@@ -1,18 +1,20 @@
1
1
  export { Http } from "./http";
2
- export {
2
+ export type {
3
3
  Page,
4
4
  PaginationResult,
5
5
  InfinitePage,
6
6
  InfinitePaginationResult,
7
7
  } from "./pagination";
8
- export { ProblemDetails } from "./problem-details";
8
+ export type { ProblemDetails } from "./problem-details";
9
9
  export { QueryString } from "./query-string";
10
10
  export { HttpResponse, HttpResponseOfT } from "./http-response";
11
- export { HttpBuilder, HttpBuilderOfT, Message } from "./http-builder";
11
+ export { HttpBuilder, HttpBuilderOfT } from "./http-builder";
12
+ export type { Message } from "./http-builder";
12
13
  export { HttpError } from "./http-error";
13
14
  export { TimeoutError } from "./timeout-error";
14
15
  export { events } from "./events";
15
16
  export * from "./helpers";
16
- export { Fetch } from "./http";
17
- export { Subscription } from "./event-aggregator";
18
- export { statusCodes } from "./status-codes";
17
+ export type { Fetch } from "./http";
18
+ export type { Subscription } from "./event-aggregator";
19
+ export { statusCodes } from "./status-codes";
20
+ export type { TypeOrMapper } from "./mapping";
package/src/mapping.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  type DeserializeFn<T> = (source: any, type: Type<T>) => T | null | undefined;
2
2
  export type Type<T> = { new(): T };
3
3
  export type Mapper<T> = ((source: any) => T);
4
+ export type TypeOrMapper<T> = Type<T> | Mapper<T>;
4
5
 
5
6
  export function getNullableMapper<T>(deserialize: DeserializeFn<T>, typeOrMap: Type<T> | Mapper<T> | undefined): Mapper<T | null> {
6
7
  if (!typeOrMap) {
package/tsconfig.json CHANGED
@@ -1,18 +1,9 @@
1
1
  {
2
- "compilerOptions": {
3
- "target": "es5",
4
- "module": "esnext",
5
- "moduleResolution": "node",
6
- "declaration": true,
7
- "sourceMap": true,
8
- "strict": true,
9
- "rootDir": "src",
10
- "outDir": "dist/esm",
11
- "lib": [ "es2017", "dom" ],
12
- "stripInternal": true,
13
- },
14
- "exclude": [
15
- "./*.d.ts",
16
- "dist"
17
- ]
18
- }
2
+ "compilerOptions": {
3
+ "target": "ES2018",
4
+ "strict": true,
5
+ "stripInternal": true,
6
+ "lib": ["ES2018", "DOM"]
7
+ },
8
+ "exclude": ["dist/*", "*.d.ts"]
9
+ }