@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 +11 -0
- package/package.json +16 -0
- package/src/controllers/sse.hub.controller.d.ts +9 -0
- package/src/controllers/sse.hub.controller.js +39 -0
- package/src/controllers/sse.hub.controller.js.map +1 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +7 -0
- package/src/index.js.map +1 -0
- package/src/sse.module.d.ts +2 -0
- package/src/sse.module.js +17 -0
- package/src/sse.module.js.map +1 -0
- package/src/sse.service.d.ts +9 -0
- package/src/sse.service.js +50 -0
- package/src/sse.service.js.map +1 -0
package/README.md
ADDED
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
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
|
package/src/index.js.map
ADDED
|
@@ -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,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"}
|