@furystack/websocket-api 8.0.3 → 8.0.6

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.
@@ -9,10 +9,6 @@ const ws_1 = tslib_1.__importDefault(require("ws"));
9
9
  * Example action that returns the current user instance
10
10
  */
11
11
  let WhoAmI = class WhoAmI {
12
- constructor(httpUserContext, websocket) {
13
- this.httpUserContext = httpUserContext;
14
- this.websocket = websocket;
15
- }
16
12
  dispose() {
17
13
  /** */
18
14
  }
@@ -29,9 +25,16 @@ let WhoAmI = class WhoAmI {
29
25
  }
30
26
  }
31
27
  };
28
+ tslib_1.__decorate([
29
+ (0, inject_1.Injected)(rest_service_1.HttpUserContext),
30
+ tslib_1.__metadata("design:type", rest_service_1.HttpUserContext)
31
+ ], WhoAmI.prototype, "httpUserContext", void 0);
32
+ tslib_1.__decorate([
33
+ (0, inject_1.Injected)(ws_1.default),
34
+ tslib_1.__metadata("design:type", ws_1.default)
35
+ ], WhoAmI.prototype, "websocket", void 0);
32
36
  WhoAmI = tslib_1.__decorate([
33
- (0, inject_1.Injectable)({ lifetime: 'transient' }),
34
- tslib_1.__metadata("design:paramtypes", [rest_service_1.HttpUserContext, ws_1.default])
37
+ (0, inject_1.Injectable)({ lifetime: 'transient' })
35
38
  ], WhoAmI);
36
39
  exports.WhoAmI = WhoAmI;
37
40
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;;AAAA,0DAAyD;AACzD,8CAA8C;AAC9C,oDAA6B;AAI7B;;GAEG;AAEH,IAAa,MAAM,GAAnB,MAAa,MAAM;IAiBjB,YAAoB,eAAgC,EAAU,SAAa;QAAvD,oBAAe,GAAf,eAAe,CAAiB;QAAU,cAAS,GAAT,SAAS,CAAI;IAAG,CAAC;IAhBxE,OAAO;QACZ,MAAM;IACR,CAAC;IACM,MAAM,CAAC,UAAU,CAAC,OAAiD;QACxE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,gBAAgB,CAAA;IAC7F,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiD;QACpE,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;SACrD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;SAC3D;IACH,CAAC;CAGF,CAAA;AAlBY,MAAM;IADlB,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;6CAkBC,8BAAe,EAAqB,YAAE;GAjBhE,MAAM,CAkBlB;AAlBY,wBAAM"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;;AAAA,0DAAyD;AACzD,8CAAwD;AACxD,oDAA6B;AAI7B;;GAEG;AAEH,IAAa,MAAM,GAAnB,MAAa,MAAM;IACV,OAAO;QACZ,MAAM;IACR,CAAC;IACM,MAAM,CAAC,UAAU,CAAC,OAAiD;QACxE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,gBAAgB,CAAA;IAC7F,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiD;QACpE,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;SACrD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;SAC3D;IACH,CAAC;CAOF,CAAA;AAJC;IADC,IAAA,iBAAQ,EAAC,8BAAe,CAAC;sCACS,8BAAe;+CAAA;AAGlD;IADC,IAAA,iBAAQ,EAAC,YAAE,CAAC;sCACgB,YAAE;yCAAA;AArBpB,MAAM;IADlB,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,MAAM,CAsBlB;AAtBY,wBAAM"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
3
4
  const whoami_1 = require("./whoami");
5
+ const rest_service_1 = require("@furystack/rest-service");
6
+ const ws_1 = tslib_1.__importDefault(require("ws"));
4
7
  const utils_1 = require("@furystack/utils");
8
+ const inject_1 = require("@furystack/inject");
5
9
  describe('Whoami action', () => {
6
10
  const currentUser = { username: 'testuser' };
7
11
  const contextMock = { getCurrentUser: async () => currentUser };
@@ -19,7 +23,10 @@ describe('Whoami action', () => {
19
23
  expect(whoami_1.WhoAmI.canExecute({ request, data: 'whoami /claims' })).toBeTruthy();
20
24
  });
21
25
  it('Should return the current user', async () => {
22
- await (0, utils_1.usingAsync)(new whoami_1.WhoAmI(contextMock, wsMock), async (instance) => {
26
+ await (0, utils_1.usingAsync)(new inject_1.Injector(), async (injector) => {
27
+ injector.setExplicitInstance(contextMock, rest_service_1.HttpUserContext);
28
+ injector.setExplicitInstance(wsMock, ws_1.default);
29
+ const instance = injector.getInstance(whoami_1.WhoAmI);
23
30
  await instance.execute({ request, data: '' });
24
31
  expect(wsMock.send).toBeCalledWith(JSON.stringify({ currentUser }));
25
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.spec.js","sourceRoot":"","sources":["../../src/actions/whoami.spec.ts"],"names":[],"mappings":";;AAAA,qCAAiC;AAGjC,4CAA6C;AAG7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;IAC5C,MAAM,WAAW,GAAoB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAgC,CAAA;IAE9G,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAqB,CAAA;IAEhE,MAAM,MAAM,GAAO;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACd,CAAA;IAElB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAA,kBAAU,EAAC,IAAI,eAAM,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACnE,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"whoami.spec.js","sourceRoot":"","sources":["../../src/actions/whoami.spec.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;AACjC,0DAAyD;AACzD,oDAAmB;AACnB,4CAA6C;AAE7C,8CAA4C;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;IAC5C,MAAM,WAAW,GAAoB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAgC,CAAA;IAE9G,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAqB,CAAA;IAEhE,MAAM,MAAM,GAAO;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACd,CAAA;IAElB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAA,kBAAU,EAAC,IAAI,iBAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClD,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,8BAAe,CAAC,CAAA;YAC1D,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAE,CAAC,CAAA;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,eAAM,CAAC,CAAA;YAE7C,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/helpers.js CHANGED
@@ -12,6 +12,7 @@ const websocket_api_settings_1 = require("./websocket-api-settings");
12
12
  * actions: [...my custom actions]
13
13
  * })
14
14
  * ````
15
+ *
15
16
  * @param injector The injector instance
16
17
  * @param settings The Settings object for the WebSocket API
17
18
  */
@@ -19,7 +20,7 @@ const useWebsockets = (injector, settings) => {
19
20
  const s = new websocket_api_settings_1.WebSocketApiSettings();
20
21
  Object.assign(s, settings);
21
22
  injector.setExplicitInstance(s, websocket_api_settings_1.WebSocketApiSettings);
22
- injector.getInstance(websocket_api_1.WebSocketApi);
23
+ injector.getInstance(websocket_api_1.WebSocketApi).init();
23
24
  };
24
25
  exports.useWebsockets = useWebsockets;
25
26
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AACA,mDAA8C;AAC9C,qEAA+D;AAE/D;;;;;;;;;;;GAWG;AACI,MAAM,aAAa,GAAG,CAAC,QAAkB,EAAE,QAAwC,EAAE,EAAE;IAC5F,MAAM,CAAC,GAAG,IAAI,6CAAoB,EAAE,CAAA;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,6CAAoB,CAAC,CAAA;IACrD,QAAQ,CAAC,WAAW,CAAC,4BAAY,CAAC,CAAA;AACpC,CAAC,CAAA;AALY,QAAA,aAAa,iBAKzB"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AACA,mDAA8C;AAC9C,qEAA+D;AAE/D;;;;;;;;;;;;GAYG;AACI,MAAM,aAAa,GAAG,CAAC,QAAkB,EAAE,QAAwC,EAAE,EAAE;IAC5F,MAAM,CAAC,GAAG,IAAI,6CAAoB,EAAE,CAAA;IACpC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,6CAAoB,CAAC,CAAA;IACrD,QAAQ,CAAC,WAAW,CAAC,4BAAY,CAAC,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC,CAAA;AALY,QAAA,aAAa,iBAKzB"}
@@ -1,16 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WebSocketApiSettings = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const inject_1 = require("@furystack/inject");
4
6
  const whoami_1 = require("./actions/whoami");
5
7
  /**
6
8
  * A configuration object for FuryStack WebSocket API
7
9
  */
8
- class WebSocketApiSettings {
10
+ let WebSocketApiSettings = class WebSocketApiSettings {
9
11
  constructor() {
10
12
  this.port = 19090;
11
13
  this.path = '/socket';
12
14
  this.actions = [whoami_1.WhoAmI];
13
15
  }
14
- }
16
+ };
17
+ WebSocketApiSettings = tslib_1.__decorate([
18
+ (0, inject_1.Injectable)({ lifetime: 'scoped' })
19
+ ], WebSocketApiSettings);
15
20
  exports.WebSocketApiSettings = WebSocketApiSettings;
16
21
  //# sourceMappingURL=websocket-api-settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-api-settings.js","sourceRoot":"","sources":["../src/websocket-api-settings.ts"],"names":[],"mappings":";;;AACA,6CAAyC;AAGzC;;GAEG;AACH,MAAa,oBAAoB;IAAjC;QACS,SAAI,GAAG,KAAK,CAAA;QAEZ,SAAI,GAAG,SAAS,CAAA;QAChB,YAAO,GAAkE,CAAC,eAAM,CAAC,CAAA;IAC1F,CAAC;CAAA;AALD,oDAKC"}
1
+ {"version":3,"file":"websocket-api-settings.js","sourceRoot":"","sources":["../src/websocket-api-settings.ts"],"names":[],"mappings":";;;;AAAA,8CAA6D;AAC7D,6CAAyC;AAGzC;;GAEG;AAEH,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IAAjC;QACS,SAAI,GAAG,KAAK,CAAA;QAEZ,SAAI,GAAG,SAAS,CAAA;QAChB,YAAO,GAAkE,CAAC,eAAM,CAAC,CAAA;IAC1F,CAAC;CAAA,CAAA;AALY,oBAAoB;IADhC,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;GACtB,oBAAoB,CAKhC;AALY,oDAAoB"}
@@ -14,35 +14,40 @@ const websocket_user_context_1 = require("./websocket-user-context");
14
14
  * A WebSocket API implementation for FuryStack
15
15
  */
16
16
  let WebSocketApi = class WebSocketApi {
17
- constructor(settings, serverManager, parentInjector) {
18
- this.settings = settings;
19
- this.serverManager = serverManager;
20
- this.clients = new Map();
17
+ constructor() {
21
18
  this.socket = new ws_1.Server({ noServer: true });
22
- this.injector = parentInjector.createChild({ owner: this });
23
- this.socket.on('connection', (websocket, msg) => {
24
- const connectionInjector = this.injector.createChild({ owner: msg });
25
- connectionInjector.setExplicitInstance(websocket, ws_1.default);
26
- connectionInjector.setExplicitInstance(msg, http_1.IncomingMessage);
27
- connectionInjector.setExplicitInstance(new websocket_user_context_1.WebsocketUserContext(connectionInjector), core_1.IdentityContext);
28
- this.clients.set(websocket, { injector: connectionInjector, message: msg, ws: websocket });
29
- websocket.on('message', (message) => {
30
- this.execute(message, connectionInjector);
31
- });
32
- websocket.on('close', () => {
33
- this.clients.delete(websocket);
19
+ this.clients = new Map();
20
+ this.isInitialized = false;
21
+ }
22
+ init() {
23
+ if (!this.isInitialized) {
24
+ this.socket.on('connection', (websocket, msg) => {
25
+ const connectionInjector = this.injector.createChild({ owner: msg });
26
+ connectionInjector.setExplicitInstance(websocket, ws_1.default);
27
+ connectionInjector.setExplicitInstance(msg, http_1.IncomingMessage);
28
+ connectionInjector.setExplicitInstance(connectionInjector.getInstance(websocket_user_context_1.WebsocketUserContext), core_1.IdentityContext);
29
+ this.clients.set(websocket, { injector: connectionInjector, message: msg, ws: websocket });
30
+ websocket.on('message', (message) => {
31
+ this.execute(message, connectionInjector);
32
+ });
33
+ websocket.on('close', () => {
34
+ this.clients.delete(websocket);
35
+ });
34
36
  });
35
- });
36
- serverManager.getOrCreate({ port: this.settings.port, hostName: this.settings.host }).then((server) => {
37
- server.server.on('upgrade', (request, socket, head) => {
38
- const { pathname } = new url_1.URL(request.url, `http://${request.headers.host}`);
39
- if (pathname === this.settings.path) {
40
- this.socket.handleUpgrade(request, socket, head, (websocket) => {
41
- this.socket.emit('connection', websocket, request);
42
- });
43
- }
37
+ this.serverManager.getOrCreate({ port: this.settings.port, hostName: this.settings.host }).then((server) => {
38
+ server.server.on('upgrade', (request, socket, head) => {
39
+ const { pathname } = new url_1.URL(request.url, `http://${request.headers.host}`);
40
+ if (pathname === this.settings.path) {
41
+ this.socket.handleUpgrade(request, socket, head, (websocket) => {
42
+ this.socket.emit('connection', websocket, request);
43
+ });
44
+ }
45
+ });
44
46
  });
45
- });
47
+ }
48
+ else {
49
+ throw Error('WebSocket API is already initialized');
50
+ }
46
51
  }
47
52
  async dispose() {
48
53
  this.socket.clients.forEach((client) => client.close());
@@ -73,9 +78,20 @@ let WebSocketApi = class WebSocketApi {
73
78
  }
74
79
  }
75
80
  };
81
+ tslib_1.__decorate([
82
+ (0, inject_1.Injected)(websocket_api_settings_1.WebSocketApiSettings),
83
+ tslib_1.__metadata("design:type", websocket_api_settings_1.WebSocketApiSettings)
84
+ ], WebSocketApi.prototype, "settings", void 0);
85
+ tslib_1.__decorate([
86
+ (0, inject_1.Injected)(rest_service_1.ServerManager),
87
+ tslib_1.__metadata("design:type", rest_service_1.ServerManager)
88
+ ], WebSocketApi.prototype, "serverManager", void 0);
89
+ tslib_1.__decorate([
90
+ (0, inject_1.Injected)(inject_1.Injector),
91
+ tslib_1.__metadata("design:type", inject_1.Injector)
92
+ ], WebSocketApi.prototype, "injector", void 0);
76
93
  WebSocketApi = tslib_1.__decorate([
77
- (0, inject_1.Injectable)({ lifetime: 'scoped' }),
78
- tslib_1.__metadata("design:paramtypes", [websocket_api_settings_1.WebSocketApiSettings, rest_service_1.ServerManager, inject_1.Injector])
94
+ (0, inject_1.Injectable)({ lifetime: 'scoped' })
79
95
  ], WebSocketApi);
80
96
  exports.WebSocketApi = WebSocketApi;
81
97
  //# sourceMappingURL=websocket-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-api.js","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-api.js","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,6 @@ const http_1 = require("http");
6
6
  const inject_1 = require("@furystack/inject");
7
7
  const rest_service_1 = require("@furystack/rest-service");
8
8
  let WebsocketUserContext = class WebsocketUserContext {
9
- constructor(injector) {
10
- this.injector = injector;
11
- }
12
9
  async isAuthenticated() {
13
10
  try {
14
11
  return (await this.getCurrentUser()) ? true : false;
@@ -38,9 +35,12 @@ let WebsocketUserContext = class WebsocketUserContext {
38
35
  return user;
39
36
  }
40
37
  };
38
+ tslib_1.__decorate([
39
+ (0, inject_1.Injected)(inject_1.Injector),
40
+ tslib_1.__metadata("design:type", inject_1.Injector)
41
+ ], WebsocketUserContext.prototype, "injector", void 0);
41
42
  WebsocketUserContext = tslib_1.__decorate([
42
- (0, inject_1.Injectable)({ lifetime: 'scoped' }),
43
- tslib_1.__metadata("design:paramtypes", [inject_1.Injector])
43
+ (0, inject_1.Injectable)({ lifetime: 'scoped' })
44
44
  ], WebsocketUserContext);
45
45
  exports.WebsocketUserContext = WebsocketUserContext;
46
46
  //# sourceMappingURL=websocket-user-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-user-context.js","sourceRoot":"","sources":["../src/websocket-user-context.ts"],"names":[],"mappings":";;;;AAAA,+BAAsC;AAEtC,8CAAwD;AACxD,0DAAyD;AAGzD,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IA4B/B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IA3B5C,KAAK,CAAC,eAAe;QAC1B,IAAI;YACF,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;SACpD;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IACM,KAAK,CAAC,YAAY,CAAC,GAAG,KAAe;QAC1C,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;YAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;oBAC9D,OAAO,KAAK,CAAA;iBACb;aACF;YACD,OAAO,IAAI,CAAA;SACZ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IACM,KAAK,CAAC,cAAc;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ;aAC7B,WAAW,CAAC,8BAAe,CAAC;aAC5B,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,sBAAe,CAAC,CAAC,CAAA;QAClE,OAAO,IAAa,CAAA;IACtB,CAAC;CAGF,CAAA;AA7BY,oBAAoB;IADhC,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;6CA6BM,iBAAQ;GA5BpC,oBAAoB,CA6BhC;AA7BY,oDAAoB"}
1
+ {"version":3,"file":"websocket-user-context.js","sourceRoot":"","sources":["../src/websocket-user-context.ts"],"names":[],"mappings":";;;;AAAA,+BAAsC;AAEtC,8CAAkE;AAClE,0DAAyD;AAGzD,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IACxB,KAAK,CAAC,eAAe;QAC1B,IAAI;YACF,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;SACpD;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IACM,KAAK,CAAC,YAAY,CAAC,GAAG,KAAe;QAC1C,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;YAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;oBAC9D,OAAO,KAAK,CAAA;iBACb;aACF;YACD,OAAO,IAAI,CAAA;SACZ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,KAAK,CAAA;SACb;IACH,CAAC;IACM,KAAK,CAAC,cAAc;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ;aAC7B,WAAW,CAAC,8BAAe,CAAC;aAC5B,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,sBAAe,CAAC,CAAC,CAAA;QAClE,OAAO,IAAa,CAAA;IACtB,CAAC;CAIF,CAAA;AADC;IADC,IAAA,iBAAQ,EAAC,iBAAQ,CAAC;sCACS,iBAAQ;sDAAA;AA7BzB,oBAAoB;IADhC,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;GACtB,oBAAoB,CA8BhC;AA9BY,oDAAoB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/websocket-api",
3
- "version": "8.0.3",
3
+ "version": "8.0.6",
4
4
  "description": "HTTP Api FuryStack package",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -26,16 +26,16 @@
26
26
  },
27
27
  "homepage": "https://github.com/furystack/furystack",
28
28
  "dependencies": {
29
- "@furystack/core": "^11.0.3",
30
- "@furystack/inject": "^6.0.3",
31
- "@furystack/logging": "^3.0.3",
32
- "@furystack/rest-service": "^6.0.3",
33
- "@furystack/utils": "^3.0.3",
29
+ "@furystack/core": "^11.0.5",
30
+ "@furystack/inject": "^7.0.1",
31
+ "@furystack/logging": "^3.0.5",
32
+ "@furystack/rest-service": "^6.0.6",
33
+ "@furystack/utils": "^3.0.5",
34
34
  "tslib": "^2.4.0",
35
- "ws": "^8.6.0"
35
+ "ws": "^8.8.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/jest": "^27.5.0",
38
+ "@types/jest": "^28.1.4",
39
39
  "@types/ws": "^8.5.3"
40
40
  },
41
41
  "typings": "./types/index.d.ts",
@@ -3,6 +3,7 @@ import { HttpUserContext } from '@furystack/rest-service'
3
3
  import ws from 'ws'
4
4
  import { usingAsync } from '@furystack/utils'
5
5
  import { IncomingMessage } from 'http'
6
+ import { Injector } from '@furystack/inject'
6
7
 
7
8
  describe('Whoami action', () => {
8
9
  const currentUser = { username: 'testuser' }
@@ -27,7 +28,11 @@ describe('Whoami action', () => {
27
28
  })
28
29
 
29
30
  it('Should return the current user', async () => {
30
- await usingAsync(new WhoAmI(contextMock, wsMock), async (instance) => {
31
+ await usingAsync(new Injector(), async (injector) => {
32
+ injector.setExplicitInstance(contextMock, HttpUserContext)
33
+ injector.setExplicitInstance(wsMock, ws)
34
+ const instance = injector.getInstance(WhoAmI)
35
+
31
36
  await instance.execute({ request, data: '' })
32
37
  expect(wsMock.send).toBeCalledWith(JSON.stringify({ currentUser }))
33
38
  })
@@ -1,5 +1,5 @@
1
1
  import { HttpUserContext } from '@furystack/rest-service'
2
- import { Injectable } from '@furystack/inject'
2
+ import { Injectable, Injected } from '@furystack/inject'
3
3
  import ws, { Data } from 'ws'
4
4
  import { WebSocketAction } from '../models/websocket-action'
5
5
  import { IncomingMessage } from 'http'
@@ -25,5 +25,9 @@ export class WhoAmI implements WebSocketAction {
25
25
  }
26
26
  }
27
27
 
28
- constructor(private httpUserContext: HttpUserContext, private websocket: ws) {}
28
+ @Injected(HttpUserContext)
29
+ private readonly httpUserContext!: HttpUserContext
30
+
31
+ @Injected(ws)
32
+ private readonly websocket!: ws
29
33
  }
package/src/helpers.ts CHANGED
@@ -11,6 +11,7 @@ import { WebSocketApiSettings } from './websocket-api-settings'
11
11
  * actions: [...my custom actions]
12
12
  * })
13
13
  * ````
14
+ *
14
15
  * @param injector The injector instance
15
16
  * @param settings The Settings object for the WebSocket API
16
17
  */
@@ -18,5 +19,5 @@ export const useWebsockets = (injector: Injector, settings?: Partial<WebSocketAp
18
19
  const s = new WebSocketApiSettings()
19
20
  Object.assign(s, settings)
20
21
  injector.setExplicitInstance(s, WebSocketApiSettings)
21
- injector.getInstance(WebSocketApi)
22
+ injector.getInstance(WebSocketApi).init()
22
23
  }
@@ -1,10 +1,11 @@
1
- import { Constructable } from '@furystack/inject'
1
+ import { Constructable, Injectable } from '@furystack/inject'
2
2
  import { WhoAmI } from './actions/whoami'
3
3
  import { WebSocketAction, WebSocketActionStatic } from '.'
4
4
 
5
5
  /**
6
6
  * A configuration object for FuryStack WebSocket API
7
7
  */
8
+ @Injectable({ lifetime: 'scoped' })
8
9
  export class WebSocketApiSettings {
9
10
  public port = 19090
10
11
  public host?: string
@@ -2,7 +2,7 @@ import { URL } from 'url'
2
2
  import { Socket } from 'net'
3
3
  import { IncomingMessage } from 'http'
4
4
  import { ServerManager } from '@furystack/rest-service'
5
- import { Injectable, Injector } from '@furystack/inject'
5
+ import { Injectable, Injected, Injector } from '@furystack/inject'
6
6
  import { Disposable } from '@furystack/utils'
7
7
  import ws, { Data, Server as WebSocketServer } from 'ws'
8
8
  import { WebSocketApiSettings } from './websocket-api-settings'
@@ -15,39 +15,50 @@ import { WebsocketUserContext } from './websocket-user-context'
15
15
  */
16
16
  @Injectable({ lifetime: 'scoped' })
17
17
  export class WebSocketApi implements Disposable {
18
- public readonly socket: WebSocketServer
19
- private readonly injector: Injector
18
+ public readonly socket = new WebSocketServer({ noServer: true })
20
19
 
21
20
  private clients = new Map<ws, { injector: Injector; ws: ws; message: IncomingMessage }>()
22
21
 
23
- constructor(private settings: WebSocketApiSettings, public serverManager: ServerManager, parentInjector: Injector) {
24
- this.socket = new WebSocketServer({ noServer: true })
25
- this.injector = parentInjector.createChild({ owner: this })
26
- this.socket.on('connection', (websocket, msg) => {
27
- const connectionInjector = this.injector.createChild({ owner: msg })
28
- connectionInjector.setExplicitInstance(websocket, ws)
29
- connectionInjector.setExplicitInstance(msg, IncomingMessage)
30
- connectionInjector.setExplicitInstance(new WebsocketUserContext(connectionInjector), IdentityContext)
31
- this.clients.set(websocket, { injector: connectionInjector, message: msg, ws: websocket })
32
- websocket.on('message', (message) => {
33
- this.execute(message, connectionInjector)
34
- })
22
+ @Injected(WebSocketApiSettings)
23
+ private readonly settings!: WebSocketApiSettings
24
+
25
+ @Injected(ServerManager)
26
+ private readonly serverManager!: ServerManager
27
+
28
+ @Injected(Injector)
29
+ private readonly injector!: Injector
35
30
 
36
- websocket.on('close', () => {
37
- this.clients.delete(websocket)
31
+ private isInitialized = false
32
+ public init() {
33
+ if (!this.isInitialized) {
34
+ this.socket.on('connection', (websocket, msg) => {
35
+ const connectionInjector = this.injector.createChild({ owner: msg })
36
+ connectionInjector.setExplicitInstance(websocket, ws)
37
+ connectionInjector.setExplicitInstance(msg, IncomingMessage)
38
+ connectionInjector.setExplicitInstance(connectionInjector.getInstance(WebsocketUserContext), IdentityContext)
39
+ this.clients.set(websocket, { injector: connectionInjector, message: msg, ws: websocket })
40
+ websocket.on('message', (message) => {
41
+ this.execute(message, connectionInjector)
42
+ })
43
+
44
+ websocket.on('close', () => {
45
+ this.clients.delete(websocket)
46
+ })
38
47
  })
39
- })
40
48
 
41
- serverManager.getOrCreate({ port: this.settings.port, hostName: this.settings.host }).then((server) => {
42
- server.server.on('upgrade', (request: IncomingMessage, socket: Socket, head: Buffer) => {
43
- const { pathname } = new URL(request.url as string, `http://${request.headers.host}`)
44
- if (pathname === this.settings.path) {
45
- this.socket.handleUpgrade(request, socket, head, (websocket) => {
46
- this.socket.emit('connection', websocket, request)
47
- })
48
- }
49
+ this.serverManager.getOrCreate({ port: this.settings.port, hostName: this.settings.host }).then((server) => {
50
+ server.server.on('upgrade', (request: IncomingMessage, socket: Socket, head: Buffer) => {
51
+ const { pathname } = new URL(request.url as string, `http://${request.headers.host}`)
52
+ if (pathname === this.settings.path) {
53
+ this.socket.handleUpgrade(request, socket, head, (websocket) => {
54
+ this.socket.emit('connection', websocket, request)
55
+ })
56
+ }
57
+ })
49
58
  })
50
- })
59
+ } else {
60
+ throw Error('WebSocket API is already initialized')
61
+ }
51
62
  }
52
63
  public async dispose() {
53
64
  this.socket.clients.forEach((client) => client.close())
@@ -1,6 +1,6 @@
1
1
  import { IncomingMessage } from 'http'
2
2
  import { IdentityContext, User } from '@furystack/core'
3
- import { Injectable, Injector } from '@furystack/inject'
3
+ import { Injectable, Injected, Injector } from '@furystack/inject'
4
4
  import { HttpUserContext } from '@furystack/rest-service'
5
5
 
6
6
  @Injectable({ lifetime: 'scoped' })
@@ -32,5 +32,6 @@ export class WebsocketUserContext implements IdentityContext {
32
32
  return user as TUser
33
33
  }
34
34
 
35
- constructor(private readonly injector: Injector) {}
35
+ @Injected(Injector)
36
+ private readonly injector!: Injector
36
37
  }
@@ -1,13 +1,10 @@
1
- import { HttpUserContext } from '@furystack/rest-service';
2
- import ws, { Data } from 'ws';
1
+ import { Data } from 'ws';
3
2
  import { WebSocketAction } from '../models/websocket-action';
4
3
  import { IncomingMessage } from 'http';
5
4
  /**
6
5
  * Example action that returns the current user instance
7
6
  */
8
7
  export declare class WhoAmI implements WebSocketAction {
9
- private httpUserContext;
10
- private websocket;
11
8
  dispose(): void;
12
9
  static canExecute(options: {
13
10
  data: Data;
@@ -17,6 +14,7 @@ export declare class WhoAmI implements WebSocketAction {
17
14
  data: Data;
18
15
  request: IncomingMessage;
19
16
  }): Promise<void>;
20
- constructor(httpUserContext: HttpUserContext, websocket: ws);
17
+ private readonly httpUserContext;
18
+ private readonly websocket;
21
19
  }
22
20
  //# sourceMappingURL=whoami.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC;;GAEG;AACH,qBACa,MAAO,YAAW,eAAe;IAiBhC,OAAO,CAAC,eAAe;IAAmB,OAAO,CAAC,SAAS;IAhBhE,OAAO;WAGA,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO;IAIvE,OAAO,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE;gBASlD,eAAe,EAAE,eAAe,EAAU,SAAS,EAAE,EAAE;CAC5E"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":"AAEA,OAAW,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC;;GAEG;AACH,qBACa,MAAO,YAAW,eAAe;IACrC,OAAO;WAGA,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO;IAIvE,OAAO,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE;IAUtE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAGlD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAK;CAChC"}
@@ -9,8 +9,9 @@ import { WebSocketApiSettings } from './websocket-api-settings';
9
9
  * actions: [...my custom actions]
10
10
  * })
11
11
  * ````
12
+ *
12
13
  * @param injector The injector instance
13
14
  * @param settings The Settings object for the WebSocket API
14
15
  */
15
- export declare const useWebsockets: (injector: Injector, settings?: Partial<WebSocketApiSettings> | undefined) => void;
16
+ export declare const useWebsockets: (injector: Injector, settings?: Partial<WebSocketApiSettings>) => void;
16
17
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAE/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,aAAc,QAAQ,+DAK/C,CAAA"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAE/D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,aAAc,QAAQ,aAAa,QAAQ,oBAAoB,CAAC,SAKzF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-api-settings.d.ts","sourceRoot":"","sources":["../src/websocket-api-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;AAE1D;;GAEG;AACH,qBAAa,oBAAoB;IACxB,IAAI,SAAQ;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,SAAY;IAChB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,CAAW;CACzF"}
1
+ {"version":3,"file":"websocket-api-settings.d.ts","sourceRoot":"","sources":["../src/websocket-api-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAE7D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;AAE1D;;GAEG;AACH,qBACa,oBAAoB;IACxB,IAAI,SAAQ;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,SAAY;IAChB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,CAAW;CACzF"}
@@ -1,19 +1,18 @@
1
1
  import { IncomingMessage } from 'http';
2
- import { ServerManager } from '@furystack/rest-service';
3
2
  import { Injector } from '@furystack/inject';
4
3
  import { Disposable } from '@furystack/utils';
5
- import ws, { Data, Server as WebSocketServer } from 'ws';
6
- import { WebSocketApiSettings } from './websocket-api-settings';
4
+ import ws, { Data } from 'ws';
7
5
  /**
8
6
  * A WebSocket API implementation for FuryStack
9
7
  */
10
8
  export declare class WebSocketApi implements Disposable {
11
- private settings;
12
- serverManager: ServerManager;
13
- readonly socket: WebSocketServer;
14
- private readonly injector;
9
+ readonly socket: ws.Server<ws.WebSocket>;
15
10
  private clients;
16
- constructor(settings: WebSocketApiSettings, serverManager: ServerManager, parentInjector: Injector);
11
+ private readonly settings;
12
+ private readonly serverManager;
13
+ private readonly injector;
14
+ private isInitialized;
15
+ init(): void;
17
16
  dispose(): Promise<void>;
18
17
  broadcast(callback: (options: {
19
18
  injector: Injector;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-api.d.ts","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAc,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,IAAI,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAK/D;;GAEG;AACH,qBACa,YAAa,YAAW,UAAU;IAMjC,OAAO,CAAC,QAAQ;IAA+B,aAAa,EAAE,aAAa;IALvF,SAAgB,MAAM,EAAE,eAAe,CAAA;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAEnC,OAAO,CAAC,OAAO,CAA0E;gBAErE,QAAQ,EAAE,oBAAoB,EAAS,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ;IA6BpG,OAAO;IAMP,SAAS,CACpB,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ;CAO9C"}
1
+ {"version":3,"file":"websocket-api.d.ts","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC,OAAO,EAAwB,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAA6B,MAAM,IAAI,CAAA;AAMxD;;GAEG;AACH,qBACa,YAAa,YAAW,UAAU;IAC7C,SAAgB,MAAM,0BAA0C;IAEhE,OAAO,CAAC,OAAO,CAA0E;IAGzF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAGhD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAG9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,OAAO,CAAC,aAAa,CAAQ;IACtB,IAAI;IA+BE,OAAO;IAMP,SAAS,CACpB,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ;CAO9C"}
@@ -1,10 +1,8 @@
1
1
  import { IdentityContext, User } from '@furystack/core';
2
- import { Injector } from '@furystack/inject';
3
2
  export declare class WebsocketUserContext implements IdentityContext {
4
- private readonly injector;
5
3
  isAuthenticated(): Promise<boolean>;
6
4
  isAuthorized(...roles: string[]): Promise<boolean>;
7
5
  getCurrentUser<TUser extends User>(): Promise<TUser>;
8
- constructor(injector: Injector);
6
+ private readonly injector;
9
7
  }
10
8
  //# sourceMappingURL=websocket-user-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-user-context.d.ts","sourceRoot":"","sources":["../src/websocket-user-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAc,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGxD,qBACa,oBAAqB,YAAW,eAAe;IA4B9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IA3BxB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAOnC,YAAY,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD,cAAc,CAAC,KAAK,SAAS,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC;gBAOpC,QAAQ,EAAE,QAAQ;CAChD"}
1
+ {"version":3,"file":"websocket-user-context.d.ts","sourceRoot":"","sources":["../src/websocket-user-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAIvD,qBACa,oBAAqB,YAAW,eAAe;IAC7C,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAOnC,YAAY,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD,cAAc,CAAC,KAAK,SAAS,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC;IAQjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;CACrC"}