isomorfeus-transport 2.5.5 → 22.9.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isomorfeus/core_ext/hash/deep_merge.rb +34 -0
  3. data/lib/isomorfeus/core_ext/kernel.rb +56 -0
  4. data/lib/isomorfeus/core_ext/object/deep_dup.rb +53 -0
  5. data/lib/isomorfeus/core_ext/object/duplicable.rb +60 -0
  6. data/lib/isomorfeus/transport/compressor_rack.rb +1 -1
  7. data/lib/isomorfeus/transport/config.rb +37 -0
  8. data/lib/isomorfeus/transport/rack_middleware.rb +16 -9
  9. data/lib/isomorfeus/transport/request_agent.rb +1 -0
  10. data/lib/isomorfeus/transport/server_socket_processor.rb +13 -1
  11. data/lib/isomorfeus/transport/version.rb +1 -1
  12. data/lib/isomorfeus/transport.rb +45 -38
  13. data/lib/isomorfeus-transport.rb +25 -16
  14. data/lib/lucid_channel.rb +103 -0
  15. data/lib/lucid_handler.rb +25 -0
  16. metadata +40 -90
  17. data/lib/isomorfeus/transport/handler/authentication_handler.rb +0 -55
  18. data/lib/isomorfeus/transport/imports.rb +0 -10
  19. data/lib/isomorfeus/transport/ssr_login.rb +0 -30
  20. data/lib/lucid_channel/base.rb +0 -8
  21. data/lib/lucid_channel/mixin.rb +0 -105
  22. data/lib/lucid_handler/base.rb +0 -8
  23. data/lib/lucid_handler/mixin.rb +0 -27
  24. data/node_modules/.package-lock.json +0 -27
  25. data/node_modules/ws/LICENSE +0 -19
  26. data/node_modules/ws/README.md +0 -489
  27. data/node_modules/ws/browser.js +0 -8
  28. data/node_modules/ws/index.js +0 -13
  29. data/node_modules/ws/lib/buffer-util.js +0 -126
  30. data/node_modules/ws/lib/constants.js +0 -12
  31. data/node_modules/ws/lib/event-target.js +0 -266
  32. data/node_modules/ws/lib/extension.js +0 -203
  33. data/node_modules/ws/lib/limiter.js +0 -55
  34. data/node_modules/ws/lib/permessage-deflate.js +0 -511
  35. data/node_modules/ws/lib/receiver.js +0 -618
  36. data/node_modules/ws/lib/sender.js +0 -478
  37. data/node_modules/ws/lib/stream.js +0 -159
  38. data/node_modules/ws/lib/subprotocol.js +0 -62
  39. data/node_modules/ws/lib/validation.js +0 -124
  40. data/node_modules/ws/lib/websocket-server.js +0 -488
  41. data/node_modules/ws/lib/websocket.js +0 -1264
  42. data/node_modules/ws/package.json +0 -61
  43. data/node_modules/ws/wrapper.mjs +0 -8
  44. data/package.json +0 -6
@@ -1,266 +0,0 @@
1
- 'use strict';
2
-
3
- const { kForOnEventAttribute, kListener } = require('./constants');
4
-
5
- const kCode = Symbol('kCode');
6
- const kData = Symbol('kData');
7
- const kError = Symbol('kError');
8
- const kMessage = Symbol('kMessage');
9
- const kReason = Symbol('kReason');
10
- const kTarget = Symbol('kTarget');
11
- const kType = Symbol('kType');
12
- const kWasClean = Symbol('kWasClean');
13
-
14
- /**
15
- * Class representing an event.
16
- */
17
- class Event {
18
- /**
19
- * Create a new `Event`.
20
- *
21
- * @param {String} type The name of the event
22
- * @throws {TypeError} If the `type` argument is not specified
23
- */
24
- constructor(type) {
25
- this[kTarget] = null;
26
- this[kType] = type;
27
- }
28
-
29
- /**
30
- * @type {*}
31
- */
32
- get target() {
33
- return this[kTarget];
34
- }
35
-
36
- /**
37
- * @type {String}
38
- */
39
- get type() {
40
- return this[kType];
41
- }
42
- }
43
-
44
- Object.defineProperty(Event.prototype, 'target', { enumerable: true });
45
- Object.defineProperty(Event.prototype, 'type', { enumerable: true });
46
-
47
- /**
48
- * Class representing a close event.
49
- *
50
- * @extends Event
51
- */
52
- class CloseEvent extends Event {
53
- /**
54
- * Create a new `CloseEvent`.
55
- *
56
- * @param {String} type The name of the event
57
- * @param {Object} [options] A dictionary object that allows for setting
58
- * attributes via object members of the same name
59
- * @param {Number} [options.code=0] The status code explaining why the
60
- * connection was closed
61
- * @param {String} [options.reason=''] A human-readable string explaining why
62
- * the connection was closed
63
- * @param {Boolean} [options.wasClean=false] Indicates whether or not the
64
- * connection was cleanly closed
65
- */
66
- constructor(type, options = {}) {
67
- super(type);
68
-
69
- this[kCode] = options.code === undefined ? 0 : options.code;
70
- this[kReason] = options.reason === undefined ? '' : options.reason;
71
- this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;
72
- }
73
-
74
- /**
75
- * @type {Number}
76
- */
77
- get code() {
78
- return this[kCode];
79
- }
80
-
81
- /**
82
- * @type {String}
83
- */
84
- get reason() {
85
- return this[kReason];
86
- }
87
-
88
- /**
89
- * @type {Boolean}
90
- */
91
- get wasClean() {
92
- return this[kWasClean];
93
- }
94
- }
95
-
96
- Object.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });
97
- Object.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });
98
- Object.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });
99
-
100
- /**
101
- * Class representing an error event.
102
- *
103
- * @extends Event
104
- */
105
- class ErrorEvent extends Event {
106
- /**
107
- * Create a new `ErrorEvent`.
108
- *
109
- * @param {String} type The name of the event
110
- * @param {Object} [options] A dictionary object that allows for setting
111
- * attributes via object members of the same name
112
- * @param {*} [options.error=null] The error that generated this event
113
- * @param {String} [options.message=''] The error message
114
- */
115
- constructor(type, options = {}) {
116
- super(type);
117
-
118
- this[kError] = options.error === undefined ? null : options.error;
119
- this[kMessage] = options.message === undefined ? '' : options.message;
120
- }
121
-
122
- /**
123
- * @type {*}
124
- */
125
- get error() {
126
- return this[kError];
127
- }
128
-
129
- /**
130
- * @type {String}
131
- */
132
- get message() {
133
- return this[kMessage];
134
- }
135
- }
136
-
137
- Object.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });
138
- Object.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });
139
-
140
- /**
141
- * Class representing a message event.
142
- *
143
- * @extends Event
144
- */
145
- class MessageEvent extends Event {
146
- /**
147
- * Create a new `MessageEvent`.
148
- *
149
- * @param {String} type The name of the event
150
- * @param {Object} [options] A dictionary object that allows for setting
151
- * attributes via object members of the same name
152
- * @param {*} [options.data=null] The message content
153
- */
154
- constructor(type, options = {}) {
155
- super(type);
156
-
157
- this[kData] = options.data === undefined ? null : options.data;
158
- }
159
-
160
- /**
161
- * @type {*}
162
- */
163
- get data() {
164
- return this[kData];
165
- }
166
- }
167
-
168
- Object.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });
169
-
170
- /**
171
- * This provides methods for emulating the `EventTarget` interface. It's not
172
- * meant to be used directly.
173
- *
174
- * @mixin
175
- */
176
- const EventTarget = {
177
- /**
178
- * Register an event listener.
179
- *
180
- * @param {String} type A string representing the event type to listen for
181
- * @param {Function} listener The listener to add
182
- * @param {Object} [options] An options object specifies characteristics about
183
- * the event listener
184
- * @param {Boolean} [options.once=false] A `Boolean` indicating that the
185
- * listener should be invoked at most once after being added. If `true`,
186
- * the listener would be automatically removed when invoked.
187
- * @public
188
- */
189
- addEventListener(type, listener, options = {}) {
190
- let wrapper;
191
-
192
- if (type === 'message') {
193
- wrapper = function onMessage(data, isBinary) {
194
- const event = new MessageEvent('message', {
195
- data: isBinary ? data : data.toString()
196
- });
197
-
198
- event[kTarget] = this;
199
- listener.call(this, event);
200
- };
201
- } else if (type === 'close') {
202
- wrapper = function onClose(code, message) {
203
- const event = new CloseEvent('close', {
204
- code,
205
- reason: message.toString(),
206
- wasClean: this._closeFrameReceived && this._closeFrameSent
207
- });
208
-
209
- event[kTarget] = this;
210
- listener.call(this, event);
211
- };
212
- } else if (type === 'error') {
213
- wrapper = function onError(error) {
214
- const event = new ErrorEvent('error', {
215
- error,
216
- message: error.message
217
- });
218
-
219
- event[kTarget] = this;
220
- listener.call(this, event);
221
- };
222
- } else if (type === 'open') {
223
- wrapper = function onOpen() {
224
- const event = new Event('open');
225
-
226
- event[kTarget] = this;
227
- listener.call(this, event);
228
- };
229
- } else {
230
- return;
231
- }
232
-
233
- wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];
234
- wrapper[kListener] = listener;
235
-
236
- if (options.once) {
237
- this.once(type, wrapper);
238
- } else {
239
- this.on(type, wrapper);
240
- }
241
- },
242
-
243
- /**
244
- * Remove an event listener.
245
- *
246
- * @param {String} type A string representing the event type to remove
247
- * @param {Function} handler The listener to remove
248
- * @public
249
- */
250
- removeEventListener(type, handler) {
251
- for (const listener of this.listeners(type)) {
252
- if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {
253
- this.removeListener(type, listener);
254
- break;
255
- }
256
- }
257
- }
258
- };
259
-
260
- module.exports = {
261
- CloseEvent,
262
- ErrorEvent,
263
- Event,
264
- EventTarget,
265
- MessageEvent
266
- };
@@ -1,203 +0,0 @@
1
- 'use strict';
2
-
3
- const { tokenChars } = require('./validation');
4
-
5
- /**
6
- * Adds an offer to the map of extension offers or a parameter to the map of
7
- * parameters.
8
- *
9
- * @param {Object} dest The map of extension offers or parameters
10
- * @param {String} name The extension or parameter name
11
- * @param {(Object|Boolean|String)} elem The extension parameters or the
12
- * parameter value
13
- * @private
14
- */
15
- function push(dest, name, elem) {
16
- if (dest[name] === undefined) dest[name] = [elem];
17
- else dest[name].push(elem);
18
- }
19
-
20
- /**
21
- * Parses the `Sec-WebSocket-Extensions` header into an object.
22
- *
23
- * @param {String} header The field value of the header
24
- * @return {Object} The parsed object
25
- * @public
26
- */
27
- function parse(header) {
28
- const offers = Object.create(null);
29
- let params = Object.create(null);
30
- let mustUnescape = false;
31
- let isEscaping = false;
32
- let inQuotes = false;
33
- let extensionName;
34
- let paramName;
35
- let start = -1;
36
- let code = -1;
37
- let end = -1;
38
- let i = 0;
39
-
40
- for (; i < header.length; i++) {
41
- code = header.charCodeAt(i);
42
-
43
- if (extensionName === undefined) {
44
- if (end === -1 && tokenChars[code] === 1) {
45
- if (start === -1) start = i;
46
- } else if (
47
- i !== 0 &&
48
- (code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */
49
- ) {
50
- if (end === -1 && start !== -1) end = i;
51
- } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {
52
- if (start === -1) {
53
- throw new SyntaxError(`Unexpected character at index ${i}`);
54
- }
55
-
56
- if (end === -1) end = i;
57
- const name = header.slice(start, end);
58
- if (code === 0x2c) {
59
- push(offers, name, params);
60
- params = Object.create(null);
61
- } else {
62
- extensionName = name;
63
- }
64
-
65
- start = end = -1;
66
- } else {
67
- throw new SyntaxError(`Unexpected character at index ${i}`);
68
- }
69
- } else if (paramName === undefined) {
70
- if (end === -1 && tokenChars[code] === 1) {
71
- if (start === -1) start = i;
72
- } else if (code === 0x20 || code === 0x09) {
73
- if (end === -1 && start !== -1) end = i;
74
- } else if (code === 0x3b || code === 0x2c) {
75
- if (start === -1) {
76
- throw new SyntaxError(`Unexpected character at index ${i}`);
77
- }
78
-
79
- if (end === -1) end = i;
80
- push(params, header.slice(start, end), true);
81
- if (code === 0x2c) {
82
- push(offers, extensionName, params);
83
- params = Object.create(null);
84
- extensionName = undefined;
85
- }
86
-
87
- start = end = -1;
88
- } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {
89
- paramName = header.slice(start, i);
90
- start = end = -1;
91
- } else {
92
- throw new SyntaxError(`Unexpected character at index ${i}`);
93
- }
94
- } else {
95
- //
96
- // The value of a quoted-string after unescaping must conform to the
97
- // token ABNF, so only token characters are valid.
98
- // Ref: https://tools.ietf.org/html/rfc6455#section-9.1
99
- //
100
- if (isEscaping) {
101
- if (tokenChars[code] !== 1) {
102
- throw new SyntaxError(`Unexpected character at index ${i}`);
103
- }
104
- if (start === -1) start = i;
105
- else if (!mustUnescape) mustUnescape = true;
106
- isEscaping = false;
107
- } else if (inQuotes) {
108
- if (tokenChars[code] === 1) {
109
- if (start === -1) start = i;
110
- } else if (code === 0x22 /* '"' */ && start !== -1) {
111
- inQuotes = false;
112
- end = i;
113
- } else if (code === 0x5c /* '\' */) {
114
- isEscaping = true;
115
- } else {
116
- throw new SyntaxError(`Unexpected character at index ${i}`);
117
- }
118
- } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {
119
- inQuotes = true;
120
- } else if (end === -1 && tokenChars[code] === 1) {
121
- if (start === -1) start = i;
122
- } else if (start !== -1 && (code === 0x20 || code === 0x09)) {
123
- if (end === -1) end = i;
124
- } else if (code === 0x3b || code === 0x2c) {
125
- if (start === -1) {
126
- throw new SyntaxError(`Unexpected character at index ${i}`);
127
- }
128
-
129
- if (end === -1) end = i;
130
- let value = header.slice(start, end);
131
- if (mustUnescape) {
132
- value = value.replace(/\\/g, '');
133
- mustUnescape = false;
134
- }
135
- push(params, paramName, value);
136
- if (code === 0x2c) {
137
- push(offers, extensionName, params);
138
- params = Object.create(null);
139
- extensionName = undefined;
140
- }
141
-
142
- paramName = undefined;
143
- start = end = -1;
144
- } else {
145
- throw new SyntaxError(`Unexpected character at index ${i}`);
146
- }
147
- }
148
- }
149
-
150
- if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {
151
- throw new SyntaxError('Unexpected end of input');
152
- }
153
-
154
- if (end === -1) end = i;
155
- const token = header.slice(start, end);
156
- if (extensionName === undefined) {
157
- push(offers, token, params);
158
- } else {
159
- if (paramName === undefined) {
160
- push(params, token, true);
161
- } else if (mustUnescape) {
162
- push(params, paramName, token.replace(/\\/g, ''));
163
- } else {
164
- push(params, paramName, token);
165
- }
166
- push(offers, extensionName, params);
167
- }
168
-
169
- return offers;
170
- }
171
-
172
- /**
173
- * Builds the `Sec-WebSocket-Extensions` header field value.
174
- *
175
- * @param {Object} extensions The map of extensions and parameters to format
176
- * @return {String} A string representing the given object
177
- * @public
178
- */
179
- function format(extensions) {
180
- return Object.keys(extensions)
181
- .map((extension) => {
182
- let configurations = extensions[extension];
183
- if (!Array.isArray(configurations)) configurations = [configurations];
184
- return configurations
185
- .map((params) => {
186
- return [extension]
187
- .concat(
188
- Object.keys(params).map((k) => {
189
- let values = params[k];
190
- if (!Array.isArray(values)) values = [values];
191
- return values
192
- .map((v) => (v === true ? k : `${k}=${v}`))
193
- .join('; ');
194
- })
195
- )
196
- .join('; ');
197
- })
198
- .join(', ');
199
- })
200
- .join(', ');
201
- }
202
-
203
- module.exports = { format, parse };
@@ -1,55 +0,0 @@
1
- 'use strict';
2
-
3
- const kDone = Symbol('kDone');
4
- const kRun = Symbol('kRun');
5
-
6
- /**
7
- * A very simple job queue with adjustable concurrency. Adapted from
8
- * https://github.com/STRML/async-limiter
9
- */
10
- class Limiter {
11
- /**
12
- * Creates a new `Limiter`.
13
- *
14
- * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
15
- * to run concurrently
16
- */
17
- constructor(concurrency) {
18
- this[kDone] = () => {
19
- this.pending--;
20
- this[kRun]();
21
- };
22
- this.concurrency = concurrency || Infinity;
23
- this.jobs = [];
24
- this.pending = 0;
25
- }
26
-
27
- /**
28
- * Adds a job to the queue.
29
- *
30
- * @param {Function} job The job to run
31
- * @public
32
- */
33
- add(job) {
34
- this.jobs.push(job);
35
- this[kRun]();
36
- }
37
-
38
- /**
39
- * Removes a job from the queue and runs it if possible.
40
- *
41
- * @private
42
- */
43
- [kRun]() {
44
- if (this.pending === this.concurrency) return;
45
-
46
- if (this.jobs.length) {
47
- const job = this.jobs.shift();
48
-
49
- this.pending++;
50
- job(this[kDone]);
51
- }
52
- }
53
- }
54
-
55
- module.exports = Limiter;