@tc-libs/sse 2.0.1

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 ADDED
@@ -0,0 +1,11 @@
1
+ # sse
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Building
6
+
7
+ Run `nx build sse` to build the library.
8
+
9
+ ## Running unit tests
10
+
11
+ Run `nx test sse` to execute the unit tests via [Jest](https://jestjs.io).
package/package.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@tc-libs/sse",
3
+ "version": "2.0.1",
4
+ "dependencies": {
5
+ "@nestjs/common": "^11.0.12",
6
+ "@nestjs/throttler": "^6.4.0",
7
+ "express": "5.0.1",
8
+ "rxjs": "^7.8.2",
9
+ "uuid": "^11.1.0",
10
+ "tslib": "^2.8.1"
11
+ },
12
+ "type": "commonjs",
13
+ "main": "./src/index.js",
14
+ "typings": "./src/index.d.ts",
15
+ "types": "./src/index.d.ts"
16
+ }
@@ -0,0 +1,9 @@
1
+ import { Request } from 'express';
2
+ import { Observable } from 'rxjs';
3
+ import { MessageEvent } from '@nestjs/common';
4
+ import { SseHubService } from '../sse.service';
5
+ export declare class SseController {
6
+ private readonly hub;
7
+ constructor(hub: SseHubService);
8
+ stream(req: Request): Observable<MessageEvent>;
9
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SseController = void 0;
4
+ const tslib_1 = require("tslib");
5
+ // sse/sse.controller.ts
6
+ const common_1 = require("@nestjs/common");
7
+ const throttler_1 = require("@nestjs/throttler");
8
+ const rxjs_1 = require("rxjs");
9
+ const sse_service_1 = require("../sse.service");
10
+ const uuid_1 = require("uuid");
11
+ let SseController = class SseController {
12
+ constructor(hub) {
13
+ this.hub = hub;
14
+ }
15
+ stream(req) {
16
+ const id = (0, uuid_1.v4)();
17
+ const stream$ = this.hub.addClient(id);
18
+ // quando il client chiude la connessione, puliamo
19
+ req.on('close', () => {
20
+ this.hub.removeClient(id);
21
+ });
22
+ return stream$;
23
+ }
24
+ };
25
+ exports.SseController = SseController;
26
+ tslib_1.__decorate([
27
+ (0, common_1.Sse)('sse'),
28
+ (0, throttler_1.SkipThrottle)() // nessun interceptor su questa route
29
+ ,
30
+ tslib_1.__param(0, (0, common_1.Req)()),
31
+ tslib_1.__metadata("design:type", Function),
32
+ tslib_1.__metadata("design:paramtypes", [Object]),
33
+ tslib_1.__metadata("design:returntype", rxjs_1.Observable)
34
+ ], SseController.prototype, "stream", null);
35
+ exports.SseController = SseController = tslib_1.__decorate([
36
+ (0, common_1.Controller)(),
37
+ tslib_1.__metadata("design:paramtypes", [sse_service_1.SseHubService])
38
+ ], SseController);
39
+ //# sourceMappingURL=sse.hub.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.hub.controller.js","sourceRoot":"","sources":["../../../../../packages/sse/src/controllers/sse.hub.controller.ts"],"names":[],"mappings":";;;;AAAA,wBAAwB;AACxB,2CAAuE;AACvE,iDAAiD;AAEjD,+BAAkC;AAElC,gDAA+C;AAC/C,+BAA0B;AAEnB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAA6B,GAAkB;QAAlB,QAAG,GAAH,GAAG,CAAe;IAAG,CAAC;IAInD,MAAM,CAAQ,GAAY;QACxB,MAAM,EAAE,GAAG,IAAA,SAAE,GAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAEvC,kDAAkD;QAClD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAhBY,sCAAa;AAKxB;IAFC,IAAA,YAAG,EAAC,KAAK,CAAC;IACV,IAAA,wBAAY,GAAE,CAAC,qCAAqC;;IAC7C,mBAAA,IAAA,YAAG,GAAE,CAAA;;;4CAAgB,iBAAU;2CAUtC;wBAfU,aAAa;IADzB,IAAA,mBAAU,GAAE;6CAEuB,2BAAa;GADpC,aAAa,CAgBzB"}
package/src/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './sse.module';
2
+ export * from './sse.service';
3
+ export * from './controllers/sse.hub.controller';
package/src/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./sse.module"), exports);
5
+ tslib_1.__exportStar(require("./sse.service"), exports);
6
+ tslib_1.__exportStar(require("./controllers/sse.hub.controller"), exports);
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/sse/src/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,wDAA8B;AAC9B,2EAAiD"}
@@ -0,0 +1,2 @@
1
+ export declare class SseModule {
2
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SseModule = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const sse_service_1 = require("./sse.service");
7
+ let SseModule = class SseModule {
8
+ };
9
+ exports.SseModule = SseModule;
10
+ exports.SseModule = SseModule = tslib_1.__decorate([
11
+ (0, common_1.Global)(),
12
+ (0, common_1.Module)({
13
+ providers: [sse_service_1.SseHubService],
14
+ exports: [sse_service_1.SseHubService],
15
+ })
16
+ ], SseModule);
17
+ //# sourceMappingURL=sse.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.module.js","sourceRoot":"","sources":["../../../../packages/sse/src/sse.module.ts"],"names":[],"mappings":";;;;AAAA,2CAAgD;AAChD,+CAA8C;AAOvC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,2BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,2BAAa,CAAC;KACzB,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,9 @@
1
+ import { MessageEvent } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export declare class SseHubService {
4
+ private clients;
5
+ addClient(id: string): Observable<MessageEvent>;
6
+ removeClient(id: string): void;
7
+ broadcast(type: string, payload: string | object): void;
8
+ count(): number;
9
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SseHubService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ // sse/sse-hub.service.ts
6
+ const common_1 = require("@nestjs/common");
7
+ const rxjs_1 = require("rxjs");
8
+ let SseHubService = class SseHubService {
9
+ constructor() {
10
+ this.clients = new Map();
11
+ }
12
+ addClient(id) {
13
+ const stream$ = new rxjs_1.Subject();
14
+ this.clients.set(id, { id, stream$, connectedAt: Date.now() });
15
+ // opzionale: messaggio iniziale
16
+ stream$.next({
17
+ type: 'hello',
18
+ data: { id, connectedAt: new Date().toISOString() },
19
+ });
20
+ return stream$.asObservable();
21
+ }
22
+ removeClient(id) {
23
+ const client = this.clients.get(id);
24
+ if (!client)
25
+ return;
26
+ client.stream$.complete();
27
+ this.clients.delete(id);
28
+ }
29
+ broadcast(type, payload) {
30
+ const evt = {
31
+ type,
32
+ data: {
33
+ ts: new Date().toISOString(),
34
+ payload,
35
+ },
36
+ };
37
+ for (const [, client] of this.clients) {
38
+ // se un client fosse in errore, puoi try/catchare, ma Subject di solito regge bene
39
+ client.stream$.next(evt);
40
+ }
41
+ }
42
+ count() {
43
+ return this.clients.size;
44
+ }
45
+ };
46
+ exports.SseHubService = SseHubService;
47
+ exports.SseHubService = SseHubService = tslib_1.__decorate([
48
+ (0, common_1.Injectable)()
49
+ ], SseHubService);
50
+ //# sourceMappingURL=sse.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../../packages/sse/src/sse.service.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,2CAA4C;AAE5C,+BAA2C;AASpC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAAnB;QACG,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAyC9C,CAAC;IAvCC,SAAS,CAAC,EAAU;QAClB,MAAM,OAAO,GAAG,IAAI,cAAO,EAAgB,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE/D,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;SACpD,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;IAChC,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,OAAwB;QAC9C,MAAM,GAAG,GAAiB;YACxB,IAAI;YACJ,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,OAAO;aACR;SACF,CAAC;QAEF,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,mFAAmF;YACnF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF,CAAA;AA1CY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CA0CzB"}