@xemahq/realtime-stream 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +67 -0
  3. package/dist/index.d.ts +15 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +31 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/cached-membership-resolver.d.ts +25 -0
  8. package/dist/lib/cached-membership-resolver.d.ts.map +1 -0
  9. package/dist/lib/cached-membership-resolver.js +69 -0
  10. package/dist/lib/cached-membership-resolver.js.map +1 -0
  11. package/dist/lib/connection-lifecycle.d.ts +14 -0
  12. package/dist/lib/connection-lifecycle.d.ts.map +1 -0
  13. package/dist/lib/connection-lifecycle.js +3 -0
  14. package/dist/lib/connection-lifecycle.js.map +1 -0
  15. package/dist/lib/control-frame.d.ts +54 -0
  16. package/dist/lib/control-frame.d.ts.map +1 -0
  17. package/dist/lib/control-frame.js +14 -0
  18. package/dist/lib/control-frame.js.map +1 -0
  19. package/dist/lib/cursor.d.ts +11 -0
  20. package/dist/lib/cursor.d.ts.map +1 -0
  21. package/dist/lib/cursor.js +101 -0
  22. package/dist/lib/cursor.js.map +1 -0
  23. package/dist/lib/default-hub-stream-source.d.ts +9 -0
  24. package/dist/lib/default-hub-stream-source.d.ts.map +1 -0
  25. package/dist/lib/default-hub-stream-source.js +43 -0
  26. package/dist/lib/default-hub-stream-source.js.map +1 -0
  27. package/dist/lib/frame-authz.d.ts +17 -0
  28. package/dist/lib/frame-authz.d.ts.map +1 -0
  29. package/dist/lib/frame-authz.js +49 -0
  30. package/dist/lib/frame-authz.js.map +1 -0
  31. package/dist/lib/hub-stream-source.d.ts +4 -0
  32. package/dist/lib/hub-stream-source.d.ts.map +1 -0
  33. package/dist/lib/hub-stream-source.js +3 -0
  34. package/dist/lib/hub-stream-source.js.map +1 -0
  35. package/dist/lib/membership-resolver.d.ts +15 -0
  36. package/dist/lib/membership-resolver.d.ts.map +1 -0
  37. package/dist/lib/membership-resolver.js +13 -0
  38. package/dist/lib/membership-resolver.js.map +1 -0
  39. package/dist/lib/module-options.d.ts +17 -0
  40. package/dist/lib/module-options.d.ts.map +1 -0
  41. package/dist/lib/module-options.js +3 -0
  42. package/dist/lib/module-options.js.map +1 -0
  43. package/dist/lib/realtime-fanout.service.d.ts +57 -0
  44. package/dist/lib/realtime-fanout.service.d.ts.map +1 -0
  45. package/dist/lib/realtime-fanout.service.js +384 -0
  46. package/dist/lib/realtime-fanout.service.js.map +1 -0
  47. package/dist/lib/realtime-stream.controller.d.ts +19 -0
  48. package/dist/lib/realtime-stream.controller.d.ts.map +1 -0
  49. package/dist/lib/realtime-stream.controller.js +185 -0
  50. package/dist/lib/realtime-stream.controller.js.map +1 -0
  51. package/dist/lib/realtime-stream.module.d.ts +14 -0
  52. package/dist/lib/realtime-stream.module.d.ts.map +1 -0
  53. package/dist/lib/realtime-stream.module.js +80 -0
  54. package/dist/lib/realtime-stream.module.js.map +1 -0
  55. package/dist/lib/role-based-fetcher.d.ts +14 -0
  56. package/dist/lib/role-based-fetcher.d.ts.map +1 -0
  57. package/dist/lib/role-based-fetcher.js +23 -0
  58. package/dist/lib/role-based-fetcher.js.map +1 -0
  59. package/dist/lib/tokens.d.ts +5 -0
  60. package/dist/lib/tokens.d.ts.map +1 -0
  61. package/dist/lib/tokens.js +8 -0
  62. package/dist/lib/tokens.js.map +1 -0
  63. package/package.json +59 -0
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var RealtimeStreamModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RealtimeStreamModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const default_hub_stream_source_1 = require("./default-hub-stream-source");
13
+ const realtime_fanout_service_1 = require("./realtime-fanout.service");
14
+ const realtime_stream_controller_1 = require("./realtime-stream.controller");
15
+ const tokens_1 = require("./tokens");
16
+ let RealtimeStreamModule = RealtimeStreamModule_1 = class RealtimeStreamModule {
17
+ static forRoot(options) {
18
+ const providers = [
19
+ { provide: tokens_1.REALTIME_STREAM_OPTIONS, useValue: options },
20
+ { provide: tokens_1.MEMBERSHIP_RESOLVER, useValue: options.membershipResolver },
21
+ { provide: tokens_1.HUB_STREAM_SOURCE, useValue: options.hubStreamSource },
22
+ {
23
+ provide: tokens_1.CALLER_IDENTITY_EXTRACTOR,
24
+ useValue: options.callerIdentityExtractor,
25
+ },
26
+ realtime_fanout_service_1.RealtimeFanoutService,
27
+ ];
28
+ return {
29
+ module: RealtimeStreamModule_1,
30
+ controllers: [realtime_stream_controller_1.RealtimeStreamController],
31
+ providers,
32
+ exports: [realtime_fanout_service_1.RealtimeFanoutService],
33
+ };
34
+ }
35
+ static defaultSourceProvider() {
36
+ return default_hub_stream_source_1.DefaultHubStreamSource;
37
+ }
38
+ static forRootAsync(options) {
39
+ const optionsProvider = {
40
+ provide: tokens_1.REALTIME_STREAM_OPTIONS,
41
+ useFactory: options.useFactory,
42
+ inject: options.inject ?? [],
43
+ };
44
+ const membershipProvider = {
45
+ provide: tokens_1.MEMBERSHIP_RESOLVER,
46
+ useFactory: (resolved) => resolved.membershipResolver,
47
+ inject: [tokens_1.REALTIME_STREAM_OPTIONS],
48
+ };
49
+ const hubProvider = {
50
+ provide: tokens_1.HUB_STREAM_SOURCE,
51
+ useFactory: (resolved) => resolved.hubStreamSource,
52
+ inject: [tokens_1.REALTIME_STREAM_OPTIONS],
53
+ };
54
+ const extractorProvider = {
55
+ provide: tokens_1.CALLER_IDENTITY_EXTRACTOR,
56
+ useFactory: (resolved) => resolved.callerIdentityExtractor,
57
+ inject: [tokens_1.REALTIME_STREAM_OPTIONS],
58
+ };
59
+ const extra = options.extraProviders ?? [];
60
+ return {
61
+ module: RealtimeStreamModule_1,
62
+ imports: options.imports ?? [],
63
+ controllers: [realtime_stream_controller_1.RealtimeStreamController],
64
+ providers: [
65
+ optionsProvider,
66
+ membershipProvider,
67
+ hubProvider,
68
+ extractorProvider,
69
+ ...extra,
70
+ realtime_fanout_service_1.RealtimeFanoutService,
71
+ ],
72
+ exports: [realtime_fanout_service_1.RealtimeFanoutService],
73
+ };
74
+ }
75
+ };
76
+ exports.RealtimeStreamModule = RealtimeStreamModule;
77
+ exports.RealtimeStreamModule = RealtimeStreamModule = RealtimeStreamModule_1 = __decorate([
78
+ (0, common_1.Module)({})
79
+ ], RealtimeStreamModule);
80
+ //# sourceMappingURL=realtime-stream.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-stream.module.js","sourceRoot":"","sources":["../../src/lib/realtime-stream.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAMwB;AACxB,2EAAqE;AACrE,uEAAkE;AAClE,6EAAwE;AACxE,qCAKkB;AA8BX,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAC/B,MAAM,CAAC,OAAO,CAAC,OAAoC;QACjD,MAAM,SAAS,GAAe;YAC5B,EAAE,OAAO,EAAE,gCAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE;YACvD,EAAE,OAAO,EAAE,4BAAmB,EAAE,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE;YACtE,EAAE,OAAO,EAAE,0BAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,EAAE;YACjE;gBACE,OAAO,EAAE,kCAAyB;gBAClC,QAAQ,EAAE,OAAO,CAAC,uBAAuB;aAC1C;YACD,+CAAqB;SACtB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,sBAAoB;YAC5B,WAAW,EAAE,CAAC,qDAAwB,CAAC;YACvC,SAAS;YACT,OAAO,EAAE,CAAC,+CAAqB,CAAC;SACjC,CAAC;IACJ,CAAC;IAGD,MAAM,CAAC,qBAAqB;QAC1B,OAAO,kDAAsB,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAyC;QAC3D,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,gCAAuB;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;QACF,MAAM,kBAAkB,GAAa;YACnC,OAAO,EAAE,4BAAmB;YAC5B,UAAU,EAAE,CAAC,QAAqC,EAAE,EAAE,CACpD,QAAQ,CAAC,kBAAkB;YAC7B,MAAM,EAAE,CAAC,gCAAuB,CAAC;SAClC,CAAC;QACF,MAAM,WAAW,GAAa;YAC5B,OAAO,EAAE,0BAAiB;YAC1B,UAAU,EAAE,CAAC,QAAqC,EAAE,EAAE,CACpD,QAAQ,CAAC,eAAe;YAC1B,MAAM,EAAE,CAAC,gCAAuB,CAAC;SAClC,CAAC;QACF,MAAM,iBAAiB,GAAa;YAClC,OAAO,EAAE,kCAAyB;YAClC,UAAU,EAAE,CAAC,QAAqC,EAAE,EAAE,CACpD,QAAQ,CAAC,uBAAuB;YAClC,MAAM,EAAE,CAAC,gCAAuB,CAAC;SAClC,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,sBAAoB;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,WAAW,EAAE,CAAC,qDAAwB,CAAC;YACvC,SAAS,EAAE;gBACT,eAAe;gBACf,kBAAkB;gBAClB,WAAW;gBACX,iBAAiB;gBACjB,GAAG,KAAK;gBACR,+CAAqB;aACR;YACf,OAAO,EAAE,CAAC,+CAAqB,CAAC;SACjC,CAAC;IACJ,CAAC;CACF,CAAA;AAjEY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,oBAAoB,CAiEhC"}
@@ -0,0 +1,14 @@
1
+ import type { CallerIdentity } from './membership-resolver';
2
+ import type { MembershipFetcher } from './cached-membership-resolver';
3
+ export interface RoleBasedFetcherOptions {
4
+ projectRoleMatcher?: (roles: ReadonlyArray<string>, projectId: string) => boolean;
5
+ sessionRoleMatcher?: (roles: ReadonlyArray<string>, sessionId: string) => boolean;
6
+ }
7
+ export declare class RoleBasedMembershipFetcher implements MembershipFetcher {
8
+ private readonly projectMatcher;
9
+ private readonly sessionMatcher;
10
+ constructor(options?: RoleBasedFetcherOptions);
11
+ fetchProjectMembership(caller: CallerIdentity, projectId: string): Promise<boolean>;
12
+ fetchSessionMembership(caller: CallerIdentity, sessionId: string): Promise<boolean>;
13
+ }
14
+ //# sourceMappingURL=role-based-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-based-fetcher.d.ts","sourceRoot":"","sources":["../../src/lib/role-based-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAiBtE,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAClF,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACnF;AAgBD,qBAAa,0BAA2B,YAAW,iBAAiB;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6D;IAC5F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6D;gBAEhF,OAAO,GAAE,uBAA4B;IAK3C,sBAAsB,CAC1B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;IAIb,sBAAsB,CAC1B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;CAGpB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RoleBasedMembershipFetcher = void 0;
4
+ const DEFAULT_PROJECT_MATCHER = (roles, projectId) => roles.includes(`project:${projectId}:member`) ||
5
+ roles.includes(`project:${projectId}:admin`);
6
+ const DEFAULT_SESSION_MATCHER = (roles, sessionId) => roles.includes(`session:${sessionId}:member`) ||
7
+ roles.includes(`session:${sessionId}:owner`);
8
+ class RoleBasedMembershipFetcher {
9
+ projectMatcher;
10
+ sessionMatcher;
11
+ constructor(options = {}) {
12
+ this.projectMatcher = options.projectRoleMatcher ?? DEFAULT_PROJECT_MATCHER;
13
+ this.sessionMatcher = options.sessionRoleMatcher ?? DEFAULT_SESSION_MATCHER;
14
+ }
15
+ async fetchProjectMembership(caller, projectId) {
16
+ return this.projectMatcher(caller.roles ?? [], projectId);
17
+ }
18
+ async fetchSessionMembership(caller, sessionId) {
19
+ return this.sessionMatcher(caller.roles ?? [], sessionId);
20
+ }
21
+ }
22
+ exports.RoleBasedMembershipFetcher = RoleBasedMembershipFetcher;
23
+ //# sourceMappingURL=role-based-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-based-fetcher.js","sourceRoot":"","sources":["../../src/lib/role-based-fetcher.ts"],"names":[],"mappings":";;;AAuBA,MAAM,uBAAuB,GAAG,CAC9B,KAA4B,EAC5B,SAAiB,EACR,EAAE,CACX,KAAK,CAAC,QAAQ,CAAC,WAAW,SAAS,SAAS,CAAC;IAC7C,KAAK,CAAC,QAAQ,CAAC,WAAW,SAAS,QAAQ,CAAC,CAAC;AAE/C,MAAM,uBAAuB,GAAG,CAC9B,KAA4B,EAC5B,SAAiB,EACR,EAAE,CACX,KAAK,CAAC,QAAQ,CAAC,WAAW,SAAS,SAAS,CAAC;IAC7C,KAAK,CAAC,QAAQ,CAAC,WAAW,SAAS,QAAQ,CAAC,CAAC;AAE/C,MAAa,0BAA0B;IACpB,cAAc,CAA6D;IAC3E,cAAc,CAA6D;IAE5F,YAAY,UAAmC,EAAE;QAC/C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,uBAAuB,CAAC;QAC5E,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,uBAAuB,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,MAAsB,EACtB,SAAiB;QAEjB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,MAAsB,EACtB,SAAiB;QAEjB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAtBD,gEAsBC"}
@@ -0,0 +1,5 @@
1
+ export declare const REALTIME_STREAM_OPTIONS: unique symbol;
2
+ export declare const MEMBERSHIP_RESOLVER: unique symbol;
3
+ export declare const HUB_STREAM_SOURCE: unique symbol;
4
+ export declare const CALLER_IDENTITY_EXTRACTOR: unique symbol;
5
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/lib/tokens.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,eAAoC,CAAC;AACzE,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AACjE,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAC7D,eAAO,MAAM,yBAAyB,eAAsC,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CALLER_IDENTITY_EXTRACTOR = exports.HUB_STREAM_SOURCE = exports.MEMBERSHIP_RESOLVER = exports.REALTIME_STREAM_OPTIONS = void 0;
4
+ exports.REALTIME_STREAM_OPTIONS = Symbol('REALTIME_STREAM_OPTIONS');
5
+ exports.MEMBERSHIP_RESOLVER = Symbol('MEMBERSHIP_RESOLVER');
6
+ exports.HUB_STREAM_SOURCE = Symbol('HUB_STREAM_SOURCE');
7
+ exports.CALLER_IDENTITY_EXTRACTOR = Symbol('CALLER_IDENTITY_EXTRACTOR');
8
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/lib/tokens.ts"],"names":[],"mappings":";;;AAGa,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAC5D,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AACpD,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAChD,QAAA,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@xemahq/realtime-stream",
3
+ "version": "0.1.1",
4
+ "publishConfig": {
5
+ "registry": "https://npm.pkg.github.com"
6
+ },
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "peerDependencies": {
13
+ "@nestjs/common": ">=10",
14
+ "@nestjs/core": ">=10",
15
+ "@nestjs/swagger": ">=7",
16
+ "@xemahq/event-hub-client": "^8.3.1",
17
+ "class-transformer": ">=0.5",
18
+ "class-validator": ">=0.14",
19
+ "rxjs": ">=7"
20
+ },
21
+ "dependencies": {
22
+ "@xemahq/events": "^0.1.1"
23
+ },
24
+ "devDependencies": {
25
+ "@nestjs/common": "11.1.13",
26
+ "@nestjs/core": "11.1.13",
27
+ "@nestjs/swagger": "11.2.6",
28
+ "@nestjs/testing": "11.1.13",
29
+ "@xemahq/event-hub-client": "^8.3.1",
30
+ "@types/jest": "^30.0.0",
31
+ "@types/node": "25.2.3",
32
+ "class-transformer": "0.5.1",
33
+ "class-validator": "0.14.4",
34
+ "jest": "^30.3.0",
35
+ "prettier": "3.6.2",
36
+ "reflect-metadata": "0.2.2",
37
+ "rxjs": "7.8.2",
38
+ "ts-jest": "^29.4.9",
39
+ "typescript": "5.9.3"
40
+ },
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.ts",
44
+ "xema-source": "./src/index.ts",
45
+ "default": "./dist/index.js"
46
+ },
47
+ "./dist/lib/*": {
48
+ "types": "./dist/lib/*.d.ts",
49
+ "default": "./dist/lib/*.js"
50
+ }
51
+ },
52
+ "scripts": {
53
+ "clean": "rm -rf dist",
54
+ "build": "tsc -p tsconfig.json",
55
+ "format": "prettier --write \"src/**/*.ts\"",
56
+ "typecheck": "tsc -p tsconfig.json --noEmit",
57
+ "test": "jest --config jest.config.ts"
58
+ }
59
+ }