@cedvict/http-guardian-rx 0.0.1-next.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 +1 -0
- package/README.md +29 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @cedvict/http-guardian-rx
|
|
2
|
+
|
|
3
|
+
RxJS adapter for `@cedvict/http-guardian`.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
```bash
|
|
7
|
+
npm i @cedvict/http-guardian @cedvict/http-guardian-rx rxjs
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
```ts
|
|
12
|
+
import { createHttpClient, noAuth, createApiParserRestClassic } from "@cedvict/http-guardian";
|
|
13
|
+
import { toObservableClient } from "@cedvict/http-guardian-rx";
|
|
14
|
+
|
|
15
|
+
const api = createHttpClient({
|
|
16
|
+
baseUrl: "https://api.example.com",
|
|
17
|
+
auth: noAuth(),
|
|
18
|
+
parser: createApiParserRestClassic()
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const rxApi = toObservableClient(api);
|
|
22
|
+
|
|
23
|
+
const sub = rxApi.get$("/me").subscribe({
|
|
24
|
+
next: (res) => console.log(res),
|
|
25
|
+
error: (err) => console.error(err),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
sub.unsubscribe(); // aborts fetch
|
|
29
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { RequestOptions, ClientResult } from '@cedvict/http-guardian';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Minimal interface of the promise client we wrap.
|
|
6
|
+
*/
|
|
7
|
+
type PromiseHttpClient = {
|
|
8
|
+
get: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;
|
|
9
|
+
post: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;
|
|
10
|
+
put: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;
|
|
11
|
+
patch: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;
|
|
12
|
+
delete: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Wraps the Promise client to Observable methods.
|
|
16
|
+
* - Each subscription triggers one request.
|
|
17
|
+
* - Unsubscribe aborts the underlying fetch (AbortController).
|
|
18
|
+
*/
|
|
19
|
+
declare function toObservableClient(api: PromiseHttpClient): {
|
|
20
|
+
get$: <T>(path: string, ro?: RequestOptions<T>) => Observable<ClientResult<T>>;
|
|
21
|
+
post$: <T>(path: string, ro?: RequestOptions<T>) => Observable<ClientResult<T>>;
|
|
22
|
+
put$: <T>(path: string, ro?: RequestOptions<T>) => Observable<ClientResult<T>>;
|
|
23
|
+
patch$: <T>(path: string, ro?: RequestOptions<T>) => Observable<ClientResult<T>>;
|
|
24
|
+
delete$: <T>(path: string, ro?: RequestOptions<T>) => Observable<ClientResult<T>>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { type PromiseHttpClient, toObservableClient };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defer, Observable } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
// src/rxClient.ts
|
|
4
|
+
function toObservableClient(api) {
|
|
5
|
+
return {
|
|
6
|
+
get$: (path, ro) => request$(api.get, path, ro),
|
|
7
|
+
post$: (path, ro) => request$(api.post, path, ro),
|
|
8
|
+
put$: (path, ro) => request$(api.put, path, ro),
|
|
9
|
+
patch$: (path, ro) => request$(api.patch, path, ro),
|
|
10
|
+
delete$: (path, ro) => request$(api.delete, path, ro)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function request$(fn, path, ro) {
|
|
14
|
+
return defer(() => {
|
|
15
|
+
const ac = new AbortController();
|
|
16
|
+
const merged = { ...ro ?? {}, signal: ro?.signal ? anySignal([ro.signal, ac.signal]) : ac.signal };
|
|
17
|
+
const p = fn(path, merged);
|
|
18
|
+
return new Observable((subscriber) => {
|
|
19
|
+
p.then((v) => {
|
|
20
|
+
subscriber.next(v);
|
|
21
|
+
subscriber.complete();
|
|
22
|
+
}).catch((e) => subscriber.error(e));
|
|
23
|
+
return () => ac.abort();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function anySignal(signals) {
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const onAbort = () => controller.abort();
|
|
30
|
+
for (const s of signals) {
|
|
31
|
+
if (s.aborted) controller.abort();
|
|
32
|
+
s.addEventListener("abort", onAbort, { once: true });
|
|
33
|
+
}
|
|
34
|
+
return controller.signal;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { toObservableClient };
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rxClient.ts"],"names":[],"mappings":";;;AAmBO,SAAS,mBAAmB,GAAA,EAAwB;AACzD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAI,IAAA,EAAc,EAAA,KAAwD,SAAS,GAAA,CAAI,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IAC1G,KAAA,EAAO,CAAI,IAAA,EAAc,EAAA,KAAwD,SAAS,GAAA,CAAI,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,IAC5G,IAAA,EAAM,CAAI,IAAA,EAAc,EAAA,KAAwD,SAAS,GAAA,CAAI,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IAC1G,MAAA,EAAQ,CAAI,IAAA,EAAc,EAAA,KAAwD,SAAS,GAAA,CAAI,KAAA,EAAO,MAAM,EAAE,CAAA;AAAA,IAC9G,OAAA,EAAS,CAAI,IAAA,EAAc,EAAA,KAAwD,SAAS,GAAA,CAAI,MAAA,EAAQ,MAAM,EAAE;AAAA,GAClH;AACF;AAEA,SAAS,QAAA,CACP,EAAA,EACA,IAAA,EACA,EAAA,EAC6B;AAC7B,EAAA,OAAO,MAAM,MAAM;AACjB,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,IAAA,MAAM,SAA4B,EAAE,GAAI,MAAM,EAAC,EAAI,QAAQ,EAAA,EAAI,MAAA,GAAS,SAAA,CAAU,CAAC,GAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAC,CAAA,GAAI,GAAG,MAAA,EAAO;AACtH,IAAA,MAAM,CAAA,GAAI,EAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAE5B,IAAA,OAAO,IAAI,UAAA,CAA4B,CAAC,UAAA,KAAe;AACrD,MAAA,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,QAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AAAG,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MAAG,CAAC,EAC1D,KAAA,CAAM,CAAC,MAAM,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAClC,MAAA,OAAO,MAAM,GAAG,KAAA,EAAM;AAAA,IACxB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,SAAS,UAAU,OAAA,EAAqC;AACtD,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,KAAA,EAAM;AACvC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAAA,CAAE,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAChC,IAAA,CAAA,CAAE,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,UAAA,CAAW,MAAA;AACpB","file":"index.js","sourcesContent":["import { defer, Observable } from \"rxjs\";\nimport type { ClientResult, RequestOptions } from \"@cedvict/http-guardian\";\n\n/**\n * Minimal interface of the promise client we wrap.\n */\nexport type PromiseHttpClient = {\n get: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;\n post: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;\n put: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;\n patch: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;\n delete: <T>(path: string, ro?: RequestOptions<T>) => Promise<ClientResult<T>>;\n};\n\n/**\n * Wraps the Promise client to Observable methods.\n * - Each subscription triggers one request.\n * - Unsubscribe aborts the underlying fetch (AbortController).\n */\nexport function toObservableClient(api: PromiseHttpClient) {\n return {\n get$: <T>(path: string, ro?: RequestOptions<T>): Observable<ClientResult<T>> => request$(api.get, path, ro),\n post$: <T>(path: string, ro?: RequestOptions<T>): Observable<ClientResult<T>> => request$(api.post, path, ro),\n put$: <T>(path: string, ro?: RequestOptions<T>): Observable<ClientResult<T>> => request$(api.put, path, ro),\n patch$: <T>(path: string, ro?: RequestOptions<T>): Observable<ClientResult<T>> => request$(api.patch, path, ro),\n delete$: <T>(path: string, ro?: RequestOptions<T>): Observable<ClientResult<T>> => request$(api.delete, path, ro),\n };\n}\n\nfunction request$<T>(\n fn: <U>(path: string, ro?: RequestOptions<U>) => Promise<ClientResult<U>>,\n path: string,\n ro?: RequestOptions<T>\n): Observable<ClientResult<T>> {\n return defer(() => {\n const ac = new AbortController();\n const merged: RequestOptions<T> = { ...(ro ?? {}), signal: ro?.signal ? anySignal([ro.signal, ac.signal]) : ac.signal };\n const p = fn<T>(path, merged);\n\n return new Observable<ClientResult<T>>((subscriber) => {\n p.then((v) => { subscriber.next(v); subscriber.complete(); })\n .catch((e) => subscriber.error(e));\n return () => ac.abort();\n });\n });\n}\n\nfunction anySignal(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n for (const s of signals) {\n if (s.aborted) controller.abort();\n s.addEventListener(\"abort\", onAbort, { once: true });\n }\n return controller.signal;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cedvict/http-guardian-rx",
|
|
3
|
+
"version": "0.0.1-next.0",
|
|
4
|
+
"description": "RxJS adapter for @cedvict/http-guardian (Observables).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"default": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=18"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/cedvict/http-guardian.git"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"rxjs": ">=7 <9"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@cedvict/http-guardian": "0.0.1-next.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"dev": "tsup --watch",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"lint": "eslint . --max-warnings=0",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.typecheck.json --noEmit",
|
|
40
|
+
"prepublishOnly": "npm -w @cedvict/http-guardian run build && npm run test && npm run lint && npm run typecheck && npm run build",
|
|
41
|
+
"prebuild": "npm -w @cedvict/http-guardian run build",
|
|
42
|
+
"pretypecheck": "npm -w @cedvict/http-guardian run build"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.0.0",
|
|
46
|
+
"eslint": "^9.0.0",
|
|
47
|
+
"typescript": "^5.4.0",
|
|
48
|
+
"tsup": "^8.0.0",
|
|
49
|
+
"vitest": "^1.5.0",
|
|
50
|
+
"rxjs": "^7.8.0",
|
|
51
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|