@opra/socketio 1.20.0 → 1.21.0

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.
@@ -32,6 +32,32 @@ class SocketioAdapter extends core_1.PlatformAdapter {
32
32
  this._initSocket(socket);
33
33
  this.emit('connection', socket, this);
34
34
  });
35
+ }
36
+ get api() {
37
+ return this.document.getWsApi();
38
+ }
39
+ get scope() {
40
+ return this._scope;
41
+ }
42
+ async close() {
43
+ return this.server.close().finally(() => {
44
+ this._controllerInstances.clear();
45
+ this._eventsRegByName.clear();
46
+ this._eventsRegByPattern = [];
47
+ });
48
+ }
49
+ /**
50
+ * Attaches socket.io to a server or port.
51
+ *
52
+ * @param srv - server or port
53
+ * @param opts - options passed to engine.io
54
+ * @return self
55
+ */
56
+ listen(srv, opts) {
57
+ if (this.server.httpServer?.listening)
58
+ throw new Error('Server is already listening');
59
+ if (opts?.path)
60
+ this.server.path(opts?.path);
35
61
  for (const contDef of this.api.controllers.values()) {
36
62
  for (const oprDef of contDef.operations.values()) {
37
63
  const fn = contDef.instance[oprDef.name];
@@ -50,8 +76,8 @@ class SocketioAdapter extends core_1.PlatformAdapter {
50
76
  this._eventsRegByPattern.push(reg);
51
77
  /** Generate decoders */
52
78
  if (oprDef.arguments?.length) {
53
- for (const dt of oprDef.arguments) {
54
- reg.decoders.push(dt.generateCodec('decode', {
79
+ for (const arg of oprDef.arguments) {
80
+ reg.decoders.push(arg.type.generateCodec('decode', {
55
81
  scope: this.scope,
56
82
  ignoreReadonlyFields: true,
57
83
  }));
@@ -66,28 +92,6 @@ class SocketioAdapter extends core_1.PlatformAdapter {
66
92
  }
67
93
  }
68
94
  }
69
- }
70
- get api() {
71
- return this.document.getWsApi();
72
- }
73
- get scope() {
74
- return this._scope;
75
- }
76
- close() {
77
- return this.server.close();
78
- }
79
- /**
80
- * Attaches socket.io to a server or port.
81
- *
82
- * @param srv - server or port
83
- * @param opts - options passed to engine.io
84
- * @return self
85
- */
86
- listen(srv, opts) {
87
- if (this.server.httpServer?.listening)
88
- throw new Error('Server is already listening');
89
- if (opts?.path)
90
- this.server.path(opts?.path);
91
95
  this.server.listen(srv, opts);
92
96
  return this;
93
97
  }
@@ -104,26 +108,40 @@ class SocketioAdapter extends core_1.PlatformAdapter {
104
108
  this._eventsRegByPattern.find(r => r.event.test(event));
105
109
  if (!reg) {
106
110
  if (callback)
107
- callback(new Error(`Unknown event "${event}"`));
111
+ callback(new common_1.OpraException(`Unknown event "${event}"`));
108
112
  return;
109
113
  }
110
- const parameters = callback ? args.slice(0, -1) : args;
111
114
  Promise.resolve().then(async () => {
112
- const ctx = new socketio_context_js_1.SocketioContext({
113
- __adapter: this,
114
- __contDef: reg.contDef,
115
- __oprDef: reg.oprDef,
116
- __controller: reg.contDef.instance,
117
- __handler: reg.handler,
118
- socket,
119
- event,
120
- parameters,
121
- });
122
115
  try {
123
- let x = await reg.handler.apply(reg.contDef.instance, [
124
- ctx,
125
- ...parameters,
126
- ]);
116
+ const inputParameters = callback ? args.slice(0, -1) : args;
117
+ const ctx = new socketio_context_js_1.SocketioContext({
118
+ __adapter: this,
119
+ __contDef: reg.contDef,
120
+ __oprDef: reg.oprDef,
121
+ __controller: reg.contDef.instance,
122
+ __handler: reg.handler,
123
+ socket,
124
+ event,
125
+ });
126
+ const callArgs = [ctx];
127
+ let i = 0;
128
+ for (const prm of inputParameters) {
129
+ try {
130
+ const v = reg.decoders[i](prm);
131
+ const arg = reg.oprDef.arguments[i];
132
+ ctx.parameters.push(v);
133
+ if (arg.parameterIndex != null)
134
+ callArgs[arg.parameterIndex] = v;
135
+ else
136
+ callArgs.push(v);
137
+ }
138
+ catch (err) {
139
+ err.message = `Failed to decode parameter ${i} of event "${event}": ${err.message}`;
140
+ throw err;
141
+ }
142
+ i++;
143
+ }
144
+ let x = await reg.handler.apply(reg.contDef.instance, callArgs);
127
145
  if (reg.encoder)
128
146
  x = reg.encoder(x);
129
147
  if (x != null && typeof x !== 'string')
@@ -131,8 +149,8 @@ class SocketioAdapter extends core_1.PlatformAdapter {
131
149
  callback(x);
132
150
  }
133
151
  catch (err) {
134
- const error = new common_1.OpraException(err);
135
- callback(error);
152
+ const error = err instanceof common_1.OpraException ? err : new common_1.OpraException(err);
153
+ callback({ error });
136
154
  }
137
155
  });
138
156
  });
@@ -28,6 +28,32 @@ export class SocketioAdapter extends PlatformAdapter {
28
28
  this._initSocket(socket);
29
29
  this.emit('connection', socket, this);
30
30
  });
31
+ }
32
+ get api() {
33
+ return this.document.getWsApi();
34
+ }
35
+ get scope() {
36
+ return this._scope;
37
+ }
38
+ async close() {
39
+ return this.server.close().finally(() => {
40
+ this._controllerInstances.clear();
41
+ this._eventsRegByName.clear();
42
+ this._eventsRegByPattern = [];
43
+ });
44
+ }
45
+ /**
46
+ * Attaches socket.io to a server or port.
47
+ *
48
+ * @param srv - server or port
49
+ * @param opts - options passed to engine.io
50
+ * @return self
51
+ */
52
+ listen(srv, opts) {
53
+ if (this.server.httpServer?.listening)
54
+ throw new Error('Server is already listening');
55
+ if (opts?.path)
56
+ this.server.path(opts?.path);
31
57
  for (const contDef of this.api.controllers.values()) {
32
58
  for (const oprDef of contDef.operations.values()) {
33
59
  const fn = contDef.instance[oprDef.name];
@@ -46,8 +72,8 @@ export class SocketioAdapter extends PlatformAdapter {
46
72
  this._eventsRegByPattern.push(reg);
47
73
  /** Generate decoders */
48
74
  if (oprDef.arguments?.length) {
49
- for (const dt of oprDef.arguments) {
50
- reg.decoders.push(dt.generateCodec('decode', {
75
+ for (const arg of oprDef.arguments) {
76
+ reg.decoders.push(arg.type.generateCodec('decode', {
51
77
  scope: this.scope,
52
78
  ignoreReadonlyFields: true,
53
79
  }));
@@ -62,28 +88,6 @@ export class SocketioAdapter extends PlatformAdapter {
62
88
  }
63
89
  }
64
90
  }
65
- }
66
- get api() {
67
- return this.document.getWsApi();
68
- }
69
- get scope() {
70
- return this._scope;
71
- }
72
- close() {
73
- return this.server.close();
74
- }
75
- /**
76
- * Attaches socket.io to a server or port.
77
- *
78
- * @param srv - server or port
79
- * @param opts - options passed to engine.io
80
- * @return self
81
- */
82
- listen(srv, opts) {
83
- if (this.server.httpServer?.listening)
84
- throw new Error('Server is already listening');
85
- if (opts?.path)
86
- this.server.path(opts?.path);
87
91
  this.server.listen(srv, opts);
88
92
  return this;
89
93
  }
@@ -100,26 +104,40 @@ export class SocketioAdapter extends PlatformAdapter {
100
104
  this._eventsRegByPattern.find(r => r.event.test(event));
101
105
  if (!reg) {
102
106
  if (callback)
103
- callback(new Error(`Unknown event "${event}"`));
107
+ callback(new OpraException(`Unknown event "${event}"`));
104
108
  return;
105
109
  }
106
- const parameters = callback ? args.slice(0, -1) : args;
107
110
  Promise.resolve().then(async () => {
108
- const ctx = new SocketioContext({
109
- __adapter: this,
110
- __contDef: reg.contDef,
111
- __oprDef: reg.oprDef,
112
- __controller: reg.contDef.instance,
113
- __handler: reg.handler,
114
- socket,
115
- event,
116
- parameters,
117
- });
118
111
  try {
119
- let x = await reg.handler.apply(reg.contDef.instance, [
120
- ctx,
121
- ...parameters,
122
- ]);
112
+ const inputParameters = callback ? args.slice(0, -1) : args;
113
+ const ctx = new SocketioContext({
114
+ __adapter: this,
115
+ __contDef: reg.contDef,
116
+ __oprDef: reg.oprDef,
117
+ __controller: reg.contDef.instance,
118
+ __handler: reg.handler,
119
+ socket,
120
+ event,
121
+ });
122
+ const callArgs = [ctx];
123
+ let i = 0;
124
+ for (const prm of inputParameters) {
125
+ try {
126
+ const v = reg.decoders[i](prm);
127
+ const arg = reg.oprDef.arguments[i];
128
+ ctx.parameters.push(v);
129
+ if (arg.parameterIndex != null)
130
+ callArgs[arg.parameterIndex] = v;
131
+ else
132
+ callArgs.push(v);
133
+ }
134
+ catch (err) {
135
+ err.message = `Failed to decode parameter ${i} of event "${event}": ${err.message}`;
136
+ throw err;
137
+ }
138
+ i++;
139
+ }
140
+ let x = await reg.handler.apply(reg.contDef.instance, callArgs);
123
141
  if (reg.encoder)
124
142
  x = reg.encoder(x);
125
143
  if (x != null && typeof x !== 'string')
@@ -127,8 +145,8 @@ export class SocketioAdapter extends PlatformAdapter {
127
145
  callback(x);
128
146
  }
129
147
  catch (err) {
130
- const error = new OpraException(err);
131
- callback(error);
148
+ const error = err instanceof OpraException ? err : new OpraException(err);
149
+ callback({ error });
132
150
  }
133
151
  });
134
152
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/socketio",
3
- "version": "1.20.0",
3
+ "version": "1.21.0",
4
4
  "description": "Opra Socket.IO adapter",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -14,8 +14,8 @@
14
14
  "valgen": "^5.18.2"
15
15
  },
16
16
  "peerDependencies": {
17
- "@opra/common": "^1.20.0",
18
- "@opra/core": "^1.20.0",
17
+ "@opra/common": "^1.21.0",
18
+ "@opra/core": "^1.21.0",
19
19
  "socket.io": ">=4.0.0"
20
20
  },
21
21
  "type": "module",