@decaf-ts/for-http 0.3.38 → 0.3.40

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 (43) hide show
  1. package/dist/for-http.cjs +1 -1
  2. package/dist/for-http.cjs.map +1 -1
  3. package/dist/for-http.js +1 -1
  4. package/dist/for-http.js.map +1 -1
  5. package/lib/HttpDispatcher.cjs +61 -0
  6. package/lib/HttpDispatcher.d.ts +17 -0
  7. package/lib/HttpDispatcher.js.map +1 -0
  8. package/lib/adapter.cjs +28 -25
  9. package/lib/adapter.d.ts +2 -2
  10. package/lib/adapter.js.map +1 -1
  11. package/lib/esm/HttpDispatcher.d.ts +17 -0
  12. package/lib/esm/HttpDispatcher.js +57 -0
  13. package/lib/esm/HttpDispatcher.js.map +1 -0
  14. package/lib/esm/adapter.d.ts +2 -2
  15. package/lib/esm/adapter.js +5 -2
  16. package/lib/esm/adapter.js.map +1 -1
  17. package/lib/esm/event/ServerEventConnector.d.ts +23 -0
  18. package/lib/esm/event/ServerEventConnector.js +109 -0
  19. package/lib/esm/event/ServerEventConnector.js.map +1 -0
  20. package/lib/esm/event/index.d.ts +2 -0
  21. package/lib/esm/event/index.js +3 -0
  22. package/lib/esm/event/index.js.map +1 -0
  23. package/lib/esm/event/types.d.ts +11 -0
  24. package/lib/esm/event/types.js +2 -0
  25. package/lib/esm/event/types.js.map +1 -0
  26. package/lib/esm/index.d.ts +2 -1
  27. package/lib/esm/index.js +2 -1
  28. package/lib/esm/index.js.map +1 -1
  29. package/lib/esm/types.d.ts +1 -0
  30. package/lib/event/ServerEventConnector.cjs +113 -0
  31. package/lib/event/ServerEventConnector.d.ts +23 -0
  32. package/lib/event/ServerEventConnector.js.map +1 -0
  33. package/lib/event/index.cjs +19 -0
  34. package/lib/event/index.d.ts +2 -0
  35. package/lib/event/index.js.map +1 -0
  36. package/lib/event/types.cjs +3 -0
  37. package/lib/event/types.d.ts +11 -0
  38. package/lib/event/types.js.map +1 -0
  39. package/lib/index.cjs +2 -1
  40. package/lib/index.d.ts +2 -1
  41. package/lib/index.js.map +1 -1
  42. package/lib/types.d.ts +1 -0
  43. package/package.json +3 -2
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerEventConnector = void 0;
4
+ const event_source_plus_1 = require("event-source-plus");
5
+ const decorator_validation_1 = require("@decaf-ts/decorator-validation");
6
+ class ServerEventConnector {
7
+ static { this.cache = new Map(); }
8
+ static get(url) {
9
+ if (this.cache.has(url))
10
+ return this.cache.get(url);
11
+ throw new Error(`Server event connector not found for URL '${url}'. Did you forget to call open()?`);
12
+ }
13
+ static open(url) {
14
+ if (this.cache.has(url))
15
+ return this.cache.get(url);
16
+ const connector = new ServerEventConnector(url);
17
+ this.cache.set(url, connector);
18
+ return this.cache.get(url);
19
+ }
20
+ static close(url) {
21
+ if (this.cache.has(url)) {
22
+ const connector = this.cache.get(url);
23
+ connector.close();
24
+ }
25
+ }
26
+ static parseReceivedEvent(raw) {
27
+ try {
28
+ const data = typeof raw === "string" ? JSON.parse(raw) : raw;
29
+ if (!Array.isArray(data) || data.length < 3)
30
+ return null;
31
+ const [eventName, operationKey, objectId, rawPayload] = data;
32
+ if (typeof eventName !== "string")
33
+ return null;
34
+ const payload = typeof rawPayload === "string"
35
+ ? decorator_validation_1.Serialization.deserialize(rawPayload)
36
+ : rawPayload;
37
+ return [eventName, String(operationKey), objectId, payload];
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ constructor(url) {
44
+ this.url = url;
45
+ this.listeners = new Set();
46
+ }
47
+ isOpen() {
48
+ return this.es !== undefined;
49
+ }
50
+ close() {
51
+ if (!this.es)
52
+ return;
53
+ if (this.listeners.size > 0)
54
+ return;
55
+ // Close and drop from cache.
56
+ try {
57
+ this.controller?.abort();
58
+ }
59
+ finally {
60
+ this.controller = undefined;
61
+ this.es = undefined;
62
+ this.listeners.clear();
63
+ ServerEventConnector.cache.delete(this.url);
64
+ console.log(`EventSourcePlus close for ${this.url}`);
65
+ }
66
+ }
67
+ /**
68
+ * Increments refCount and ensures EventSource is created.
69
+ * This method must be called only on the shared singleton instance.
70
+ */
71
+ startListening(handlers, headers) {
72
+ if (this.es)
73
+ return; // already listening. TODO: Add log
74
+ const url = this.url;
75
+ this.es = new event_source_plus_1.EventSourcePlus(url, {
76
+ headers,
77
+ credentials: "include",
78
+ });
79
+ this.controller = this.es.listen({
80
+ onResponse: () => {
81
+ console.log("EventSourcePlus connected");
82
+ },
83
+ onRequestError: ({ error }) => {
84
+ console.log("EventSourcePlus request error:", error);
85
+ handlers.onError(String(error?.message ?? error));
86
+ },
87
+ onResponseError: ({ response }) => {
88
+ console.log("EventSourcePlus response error:", response);
89
+ handlers.onError(`HTTP ${response.status}`);
90
+ },
91
+ onMessage: (message) => {
92
+ const raw = message && typeof message === "object" && "data" in message
93
+ ? message.data
94
+ : message;
95
+ const event = ServerEventConnector.parseReceivedEvent(raw);
96
+ if (!event)
97
+ return;
98
+ handlers.onEvent(event);
99
+ },
100
+ });
101
+ // setInterval(() => {
102
+ // this.close();
103
+ // }, 30000);
104
+ }
105
+ addListener(handlers) {
106
+ this.listeners.add(handlers);
107
+ }
108
+ removeListener(handlers) {
109
+ this.listeners.delete(handlers);
110
+ }
111
+ }
112
+ exports.ServerEventConnector = ServerEventConnector;
113
+ //# sourceMappingURL=ServerEventConnector.js.map
@@ -0,0 +1,23 @@
1
+ import { EventHandlers } from "./types";
2
+ export declare class ServerEventConnector {
3
+ private readonly url;
4
+ private static readonly cache;
5
+ static get(url: string): ServerEventConnector;
6
+ static open(url: string): ServerEventConnector;
7
+ static close(url: string): void;
8
+ private static parseReceivedEvent;
9
+ /** Shared connection state (cached singleton instance). */
10
+ private es?;
11
+ private controller?;
12
+ private listeners;
13
+ constructor(url: string);
14
+ isOpen(): boolean;
15
+ close(): void;
16
+ /**
17
+ * Increments refCount and ensures EventSource is created.
18
+ * This method must be called only on the shared singleton instance.
19
+ */
20
+ startListening(handlers: EventHandlers, headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>)): void;
21
+ private addListener;
22
+ private removeListener;
23
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerEventConnector.js","sourceRoot":"","sources":["../../src/event/ServerEventConnector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ServerEventConnector.cjs"), exports);
18
+ __exportStar(require("./types.cjs"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export * from "./ServerEventConnector";
2
+ export * from "./types";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAAuC;AACvC,8CAAwB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,11 @@
1
+ import { BulkCrudOperationKeys, OperationKeys } from "@decaf-ts/db-decorators";
2
+ export type ServerEvent = readonly [
3
+ modelName: string,
4
+ operation: OperationKeys | BulkCrudOperationKeys | string,
5
+ id: string,
6
+ payload: any
7
+ ];
8
+ export type EventHandlers = {
9
+ onEvent: ([tableName, operation, id]: ServerEvent) => void;
10
+ onError: (err: unknown) => void;
11
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/event/types.ts"],"names":[],"mappings":""}
package/lib/index.cjs CHANGED
@@ -32,12 +32,13 @@ __exportStar(require("./HttpStatement.cjs"), exports);
32
32
  __exportStar(require("./RestRepository.cjs"), exports);
33
33
  __exportStar(require("./RestService.cjs"), exports);
34
34
  __exportStar(require("./types.cjs"), exports);
35
+ __exportStar(require("./event/index.cjs"), exports);
35
36
  /**
36
37
  * @description Current version of the for-http module
37
38
  * @summary Version identifier for the module
38
39
  * @const VERSION
39
40
  */
40
- exports.VERSION = "0.3.37";
41
+ exports.VERSION = "0.3.40";
41
42
  exports.PACKAGE_NAME = "@decaf-ts/for-http";
42
43
  decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
43
44
  //# sourceMappingURL=index.js.map
package/lib/index.d.ts CHANGED
@@ -14,10 +14,11 @@ export * from "./HttpStatement";
14
14
  export * from "./RestRepository";
15
15
  export * from "./RestService";
16
16
  export * from "./types";
17
+ export * from "./event";
17
18
  /**
18
19
  * @description Current version of the for-http module
19
20
  * @summary Version identifier for the module
20
21
  * @const VERSION
21
22
  */
22
- export declare const VERSION = "0.3.37";
23
+ export declare const VERSION = "0.3.40";
23
24
  export declare const PACKAGE_NAME = "@decaf-ts/for-http";
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0BAAwB;AACxB,qDAAgD;AAEhD;;;;;;;GAOG;AACH,oDAAwB;AACxB,gDAA0B;AAC1B,sDAAgC;AAChC,sDAAgC;AAChC,uDAAiC;AACjC,oDAA8B;AAC9B,8CAAwB;AAExB;;;;GAIG;AACU,QAAA,OAAO,GAAG,aAAa,CAAC;AAExB,QAAA,YAAY,GAAG,aAAa,CAAC;AAE1C,qBAAQ,CAAC,eAAe,CAAC,oBAAY,EAAE,eAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0BAAwB;AACxB,qDAAgD;AAEhD;;;;;;;GAOG;AACH,oDAAwB;AACxB,gDAA0B;AAC1B,sDAAgC;AAChC,sDAAgC;AAChC,uDAAiC;AACjC,oDAA8B;AAC9B,8CAAwB;AACxB,oDAAwB;AAExB;;;;GAIG;AACU,QAAA,OAAO,GAAG,aAAa,CAAC;AAExB,QAAA,YAAY,GAAG,aAAa,CAAC;AAE1C,qBAAQ,CAAC,eAAe,CAAC,oBAAY,EAAE,eAAO,CAAC,CAAC"}
package/lib/types.d.ts CHANGED
@@ -12,6 +12,7 @@ export type HttpConfig = {
12
12
  protocol: "http" | "https";
13
13
  host: string;
14
14
  parsers?: ResponseParser[];
15
+ eventsListenerPath?: string;
15
16
  };
16
17
  /**
17
18
  * @description HTTP flags interface
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/for-http",
3
- "version": "0.3.38",
3
+ "version": "0.3.40",
4
4
  "description": "http wrappers for decaf-ts",
5
5
  "type": "module",
6
6
  "exports": {
@@ -91,6 +91,7 @@
91
91
  "@decaf-ts/injectable-decorators": "latest",
92
92
  "@decaf-ts/logging": "latest",
93
93
  "@decaf-ts/transactional-decorators": "latest",
94
- "axios": "^1.13.2"
94
+ "axios": "^1.13.2",
95
+ "event-source-plus": "^0.1.15"
95
96
  }
96
97
  }