@decaf-ts/for-http 0.3.38 → 0.3.39
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/dist/for-http.cjs +1 -1
- package/dist/for-http.cjs.map +1 -1
- package/dist/for-http.js +1 -1
- package/dist/for-http.js.map +1 -1
- package/lib/HttpDispatcher.cjs +61 -0
- package/lib/HttpDispatcher.d.ts +17 -0
- package/lib/HttpDispatcher.js.map +1 -0
- package/lib/adapter.cjs +28 -25
- package/lib/adapter.d.ts +2 -2
- package/lib/adapter.js.map +1 -1
- package/lib/esm/HttpDispatcher.d.ts +17 -0
- package/lib/esm/HttpDispatcher.js +57 -0
- package/lib/esm/HttpDispatcher.js.map +1 -0
- package/lib/esm/adapter.d.ts +2 -2
- package/lib/esm/adapter.js +5 -2
- package/lib/esm/adapter.js.map +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/stream/ServerEventConnector.d.ts +22 -0
- package/lib/esm/stream/ServerEventConnector.js +103 -0
- package/lib/esm/stream/ServerEventConnector.js.map +1 -0
- package/lib/esm/stream/index.d.ts +2 -0
- package/lib/esm/stream/index.js +3 -0
- package/lib/esm/stream/index.js.map +1 -0
- package/lib/esm/stream/types.d.ts +11 -0
- package/lib/esm/stream/types.js +2 -0
- package/lib/esm/stream/types.js.map +1 -0
- package/lib/esm/types.d.ts +1 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/stream/ServerEventConnector.cjs +107 -0
- package/lib/stream/ServerEventConnector.d.ts +22 -0
- package/lib/stream/ServerEventConnector.js.map +1 -0
- package/lib/stream/index.cjs +19 -0
- package/lib/stream/index.d.ts +2 -0
- package/lib/stream/index.js.map +1 -0
- package/lib/stream/types.cjs +3 -0
- package/lib/stream/types.d.ts +11 -0
- package/lib/stream/types.js.map +1 -0
- package/lib/types.d.ts +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,107 @@
|
|
|
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 parseReceivedEvent(raw) {
|
|
21
|
+
try {
|
|
22
|
+
const data = typeof raw === "string" ? JSON.parse(raw) : raw;
|
|
23
|
+
if (!Array.isArray(data) || data.length < 3)
|
|
24
|
+
return null;
|
|
25
|
+
const [eventName, operationKey, objectId, rawPayload] = data;
|
|
26
|
+
if (typeof eventName !== "string")
|
|
27
|
+
return null;
|
|
28
|
+
const payload = typeof rawPayload === "string"
|
|
29
|
+
? decorator_validation_1.Serialization.deserialize(rawPayload)
|
|
30
|
+
: rawPayload;
|
|
31
|
+
return [eventName, String(operationKey), objectId, payload];
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
constructor(url) {
|
|
38
|
+
this.url = url;
|
|
39
|
+
this.listeners = new Set();
|
|
40
|
+
}
|
|
41
|
+
isOpen() {
|
|
42
|
+
return this.es !== undefined;
|
|
43
|
+
}
|
|
44
|
+
close() {
|
|
45
|
+
if (!this.es)
|
|
46
|
+
return;
|
|
47
|
+
if (this.listeners.size > 0)
|
|
48
|
+
return;
|
|
49
|
+
// Close and drop from cache.
|
|
50
|
+
try {
|
|
51
|
+
this.controller?.abort();
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
this.controller = undefined;
|
|
55
|
+
this.es = undefined;
|
|
56
|
+
this.listeners.clear();
|
|
57
|
+
ServerEventConnector.cache.delete(this.url);
|
|
58
|
+
console.log(`EventSourcePlus close for ${this.url}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Increments refCount and ensures EventSource is created.
|
|
63
|
+
* This method must be called only on the shared singleton instance.
|
|
64
|
+
*/
|
|
65
|
+
startListening(handlers, headers) {
|
|
66
|
+
if (this.es)
|
|
67
|
+
return; // already listening. TODO: Add log
|
|
68
|
+
const url = this.url;
|
|
69
|
+
this.es = new event_source_plus_1.EventSourcePlus(url, {
|
|
70
|
+
headers,
|
|
71
|
+
credentials: "include",
|
|
72
|
+
});
|
|
73
|
+
this.controller = this.es.listen({
|
|
74
|
+
onResponse: () => {
|
|
75
|
+
console.log("EventSourcePlus connected");
|
|
76
|
+
},
|
|
77
|
+
onRequestError: ({ error }) => {
|
|
78
|
+
console.log("EventSourcePlus request error:", error);
|
|
79
|
+
handlers.onError(String(error?.message ?? error));
|
|
80
|
+
},
|
|
81
|
+
onResponseError: ({ response }) => {
|
|
82
|
+
console.log("EventSourcePlus response error:", response);
|
|
83
|
+
handlers.onError(`HTTP ${response.status}`);
|
|
84
|
+
},
|
|
85
|
+
onMessage: (message) => {
|
|
86
|
+
const raw = message && typeof message === "object" && "data" in message
|
|
87
|
+
? message.data
|
|
88
|
+
: message;
|
|
89
|
+
const event = ServerEventConnector.parseReceivedEvent(raw);
|
|
90
|
+
if (!event)
|
|
91
|
+
return;
|
|
92
|
+
handlers.onEvent(event);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
setInterval(() => {
|
|
96
|
+
this.close();
|
|
97
|
+
}, 30000);
|
|
98
|
+
}
|
|
99
|
+
addListener(handlers) {
|
|
100
|
+
this.listeners.add(handlers);
|
|
101
|
+
}
|
|
102
|
+
removeListener(handlers) {
|
|
103
|
+
this.listeners.delete(handlers);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.ServerEventConnector = ServerEventConnector;
|
|
107
|
+
//# sourceMappingURL=ServerEventConnector.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
private static parseReceivedEvent;
|
|
8
|
+
/** Shared connection state (cached singleton instance). */
|
|
9
|
+
private es?;
|
|
10
|
+
private controller?;
|
|
11
|
+
private listeners;
|
|
12
|
+
constructor(url: string);
|
|
13
|
+
isOpen(): boolean;
|
|
14
|
+
close(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Increments refCount and ensures EventSource is created.
|
|
17
|
+
* This method must be called only on the shared singleton instance.
|
|
18
|
+
*/
|
|
19
|
+
startListening(handlers: EventHandlers, headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>)): void;
|
|
20
|
+
private addListener;
|
|
21
|
+
private removeListener;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerEventConnector.js","sourceRoot":"","sources":["../../src/stream/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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAAuC;AACvC,8CAAwB"}
|
|
@@ -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/stream/types.ts"],"names":[],"mappings":""}
|
package/lib/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decaf-ts/for-http",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.39",
|
|
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
|
}
|