@rails/actioncable 7.0.8 → 7.1.0-beta1
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 +4 -4
- package/app/assets/javascripts/action_cable.js +25 -4
- package/app/assets/javascripts/actioncable.esm.js +25 -4
- package/app/assets/javascripts/actioncable.js +25 -4
- package/package.json +1 -1
- package/src/connection.js +16 -3
- package/src/consumer.js +5 -0
- package/src/internal.js +2 -1
package/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
# Action Cable – Integrated WebSockets for Rails
|
1
|
+
# Action Cable – Integrated WebSockets for \Rails
|
2
2
|
|
3
|
-
Action Cable seamlessly integrates WebSockets with the rest of your Rails application.
|
3
|
+
Action Cable seamlessly integrates WebSockets with the rest of your \Rails application.
|
4
4
|
It allows for real-time features to be written in Ruby in the same style
|
5
|
-
and form as the rest of your Rails application, while still being performant
|
5
|
+
and form as the rest of your \Rails application, while still being performant
|
6
6
|
and scalable. It's a full-stack offering that provides both a client-side
|
7
7
|
JavaScript framework and a server-side Ruby framework. You have access to your full
|
8
8
|
domain model written with Active Record or your ORM of choice.
|
9
9
|
|
10
|
-
You can read more about Action Cable in the [Action Cable Overview](https://
|
10
|
+
You can read more about Action Cable in the [Action Cable Overview](https://guides.rubyonrails.org/action_cable_overview.html) guide.
|
11
11
|
|
12
12
|
## Support
|
13
13
|
|
@@ -121,7 +121,8 @@
|
|
121
121
|
disconnect_reasons: {
|
122
122
|
unauthorized: "unauthorized",
|
123
123
|
invalid_request: "invalid_request",
|
124
|
-
server_restart: "server_restart"
|
124
|
+
server_restart: "server_restart",
|
125
|
+
remote: "remote"
|
125
126
|
},
|
126
127
|
default_mount_path: "/cable",
|
127
128
|
protocols: [ "actioncable-v1-json", "actioncable-unsupported" ]
|
@@ -150,11 +151,12 @@
|
|
150
151
|
logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);
|
151
152
|
return false;
|
152
153
|
} else {
|
153
|
-
|
154
|
+
const socketProtocols = [ ...protocols, ...this.consumer.subprotocols || [] ];
|
155
|
+
logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`);
|
154
156
|
if (this.webSocket) {
|
155
157
|
this.uninstallEventHandlers();
|
156
158
|
}
|
157
|
-
this.webSocket = new adapters.WebSocket(this.consumer.url,
|
159
|
+
this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols);
|
158
160
|
this.installEventHandlers();
|
159
161
|
this.monitor.start();
|
160
162
|
return true;
|
@@ -196,6 +198,9 @@
|
|
196
198
|
isActive() {
|
197
199
|
return this.isState("open", "connecting");
|
198
200
|
}
|
201
|
+
triedToReconnect() {
|
202
|
+
return this.monitor.reconnectAttempts > 0;
|
203
|
+
}
|
199
204
|
isProtocolSupported() {
|
200
205
|
return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;
|
201
206
|
}
|
@@ -233,6 +238,9 @@
|
|
233
238
|
const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);
|
234
239
|
switch (type) {
|
235
240
|
case message_types.welcome:
|
241
|
+
if (this.triedToReconnect()) {
|
242
|
+
this.reconnectAttempted = true;
|
243
|
+
}
|
236
244
|
this.monitor.recordConnect();
|
237
245
|
return this.subscriptions.reload();
|
238
246
|
|
@@ -247,7 +255,16 @@
|
|
247
255
|
|
248
256
|
case message_types.confirmation:
|
249
257
|
this.subscriptions.confirmSubscription(identifier);
|
250
|
-
|
258
|
+
if (this.reconnectAttempted) {
|
259
|
+
this.reconnectAttempted = false;
|
260
|
+
return this.subscriptions.notify(identifier, "connected", {
|
261
|
+
reconnected: true
|
262
|
+
});
|
263
|
+
} else {
|
264
|
+
return this.subscriptions.notify(identifier, "connected", {
|
265
|
+
reconnected: false
|
266
|
+
});
|
267
|
+
}
|
251
268
|
|
252
269
|
case message_types.rejection:
|
253
270
|
return this.subscriptions.reject(identifier);
|
@@ -427,6 +444,7 @@
|
|
427
444
|
this._url = url;
|
428
445
|
this.subscriptions = new Subscriptions(this);
|
429
446
|
this.connection = new Connection(this);
|
447
|
+
this.subprotocols = [];
|
430
448
|
}
|
431
449
|
get url() {
|
432
450
|
return createWebSocketURL(this._url);
|
@@ -447,6 +465,9 @@
|
|
447
465
|
return this.connection.open();
|
448
466
|
}
|
449
467
|
}
|
468
|
+
addSubProtocol(subprotocol) {
|
469
|
+
this.subprotocols = [ ...this.subprotocols, subprotocol ];
|
470
|
+
}
|
450
471
|
}
|
451
472
|
function createWebSocketURL(url) {
|
452
473
|
if (typeof url === "function") {
|
@@ -123,7 +123,8 @@ var INTERNAL = {
|
|
123
123
|
disconnect_reasons: {
|
124
124
|
unauthorized: "unauthorized",
|
125
125
|
invalid_request: "invalid_request",
|
126
|
-
server_restart: "server_restart"
|
126
|
+
server_restart: "server_restart",
|
127
|
+
remote: "remote"
|
127
128
|
},
|
128
129
|
default_mount_path: "/cable",
|
129
130
|
protocols: [ "actioncable-v1-json", "actioncable-unsupported" ]
|
@@ -156,11 +157,12 @@ class Connection {
|
|
156
157
|
logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);
|
157
158
|
return false;
|
158
159
|
} else {
|
159
|
-
|
160
|
+
const socketProtocols = [ ...protocols, ...this.consumer.subprotocols || [] ];
|
161
|
+
logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`);
|
160
162
|
if (this.webSocket) {
|
161
163
|
this.uninstallEventHandlers();
|
162
164
|
}
|
163
|
-
this.webSocket = new adapters.WebSocket(this.consumer.url,
|
165
|
+
this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols);
|
164
166
|
this.installEventHandlers();
|
165
167
|
this.monitor.start();
|
166
168
|
return true;
|
@@ -202,6 +204,9 @@ class Connection {
|
|
202
204
|
isActive() {
|
203
205
|
return this.isState("open", "connecting");
|
204
206
|
}
|
207
|
+
triedToReconnect() {
|
208
|
+
return this.monitor.reconnectAttempts > 0;
|
209
|
+
}
|
205
210
|
isProtocolSupported() {
|
206
211
|
return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;
|
207
212
|
}
|
@@ -241,6 +246,9 @@ Connection.prototype.events = {
|
|
241
246
|
const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);
|
242
247
|
switch (type) {
|
243
248
|
case message_types.welcome:
|
249
|
+
if (this.triedToReconnect()) {
|
250
|
+
this.reconnectAttempted = true;
|
251
|
+
}
|
244
252
|
this.monitor.recordConnect();
|
245
253
|
return this.subscriptions.reload();
|
246
254
|
|
@@ -255,7 +263,16 @@ Connection.prototype.events = {
|
|
255
263
|
|
256
264
|
case message_types.confirmation:
|
257
265
|
this.subscriptions.confirmSubscription(identifier);
|
258
|
-
|
266
|
+
if (this.reconnectAttempted) {
|
267
|
+
this.reconnectAttempted = false;
|
268
|
+
return this.subscriptions.notify(identifier, "connected", {
|
269
|
+
reconnected: true
|
270
|
+
});
|
271
|
+
} else {
|
272
|
+
return this.subscriptions.notify(identifier, "connected", {
|
273
|
+
reconnected: false
|
274
|
+
});
|
275
|
+
}
|
259
276
|
|
260
277
|
case message_types.rejection:
|
261
278
|
return this.subscriptions.reject(identifier);
|
@@ -440,6 +457,7 @@ class Consumer {
|
|
440
457
|
this._url = url;
|
441
458
|
this.subscriptions = new Subscriptions(this);
|
442
459
|
this.connection = new Connection(this);
|
460
|
+
this.subprotocols = [];
|
443
461
|
}
|
444
462
|
get url() {
|
445
463
|
return createWebSocketURL(this._url);
|
@@ -460,6 +478,9 @@ class Consumer {
|
|
460
478
|
return this.connection.open();
|
461
479
|
}
|
462
480
|
}
|
481
|
+
addSubProtocol(subprotocol) {
|
482
|
+
this.subprotocols = [ ...this.subprotocols, subprotocol ];
|
483
|
+
}
|
463
484
|
}
|
464
485
|
|
465
486
|
function createWebSocketURL(url) {
|
@@ -121,7 +121,8 @@
|
|
121
121
|
disconnect_reasons: {
|
122
122
|
unauthorized: "unauthorized",
|
123
123
|
invalid_request: "invalid_request",
|
124
|
-
server_restart: "server_restart"
|
124
|
+
server_restart: "server_restart",
|
125
|
+
remote: "remote"
|
125
126
|
},
|
126
127
|
default_mount_path: "/cable",
|
127
128
|
protocols: [ "actioncable-v1-json", "actioncable-unsupported" ]
|
@@ -150,11 +151,12 @@
|
|
150
151
|
logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);
|
151
152
|
return false;
|
152
153
|
} else {
|
153
|
-
|
154
|
+
const socketProtocols = [ ...protocols, ...this.consumer.subprotocols || [] ];
|
155
|
+
logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`);
|
154
156
|
if (this.webSocket) {
|
155
157
|
this.uninstallEventHandlers();
|
156
158
|
}
|
157
|
-
this.webSocket = new adapters.WebSocket(this.consumer.url,
|
159
|
+
this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols);
|
158
160
|
this.installEventHandlers();
|
159
161
|
this.monitor.start();
|
160
162
|
return true;
|
@@ -196,6 +198,9 @@
|
|
196
198
|
isActive() {
|
197
199
|
return this.isState("open", "connecting");
|
198
200
|
}
|
201
|
+
triedToReconnect() {
|
202
|
+
return this.monitor.reconnectAttempts > 0;
|
203
|
+
}
|
199
204
|
isProtocolSupported() {
|
200
205
|
return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;
|
201
206
|
}
|
@@ -233,6 +238,9 @@
|
|
233
238
|
const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);
|
234
239
|
switch (type) {
|
235
240
|
case message_types.welcome:
|
241
|
+
if (this.triedToReconnect()) {
|
242
|
+
this.reconnectAttempted = true;
|
243
|
+
}
|
236
244
|
this.monitor.recordConnect();
|
237
245
|
return this.subscriptions.reload();
|
238
246
|
|
@@ -247,7 +255,16 @@
|
|
247
255
|
|
248
256
|
case message_types.confirmation:
|
249
257
|
this.subscriptions.confirmSubscription(identifier);
|
250
|
-
|
258
|
+
if (this.reconnectAttempted) {
|
259
|
+
this.reconnectAttempted = false;
|
260
|
+
return this.subscriptions.notify(identifier, "connected", {
|
261
|
+
reconnected: true
|
262
|
+
});
|
263
|
+
} else {
|
264
|
+
return this.subscriptions.notify(identifier, "connected", {
|
265
|
+
reconnected: false
|
266
|
+
});
|
267
|
+
}
|
251
268
|
|
252
269
|
case message_types.rejection:
|
253
270
|
return this.subscriptions.reject(identifier);
|
@@ -427,6 +444,7 @@
|
|
427
444
|
this._url = url;
|
428
445
|
this.subscriptions = new Subscriptions(this);
|
429
446
|
this.connection = new Connection(this);
|
447
|
+
this.subprotocols = [];
|
430
448
|
}
|
431
449
|
get url() {
|
432
450
|
return createWebSocketURL(this._url);
|
@@ -447,6 +465,9 @@
|
|
447
465
|
return this.connection.open();
|
448
466
|
}
|
449
467
|
}
|
468
|
+
addSubProtocol(subprotocol) {
|
469
|
+
this.subprotocols = [ ...this.subprotocols, subprotocol ];
|
470
|
+
}
|
450
471
|
}
|
451
472
|
function createWebSocketURL(url) {
|
452
473
|
if (typeof url === "function") {
|
package/package.json
CHANGED
package/src/connection.js
CHANGED
@@ -33,9 +33,10 @@ class Connection {
|
|
33
33
|
logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)
|
34
34
|
return false
|
35
35
|
} else {
|
36
|
-
|
36
|
+
const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]
|
37
|
+
logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)
|
37
38
|
if (this.webSocket) { this.uninstallEventHandlers() }
|
38
|
-
this.webSocket = new adapters.WebSocket(this.consumer.url,
|
39
|
+
this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)
|
39
40
|
this.installEventHandlers()
|
40
41
|
this.monitor.start()
|
41
42
|
return true
|
@@ -81,6 +82,10 @@ class Connection {
|
|
81
82
|
return this.isState("open", "connecting")
|
82
83
|
}
|
83
84
|
|
85
|
+
triedToReconnect() {
|
86
|
+
return this.monitor.reconnectAttempts > 0
|
87
|
+
}
|
88
|
+
|
84
89
|
// Private
|
85
90
|
|
86
91
|
isProtocolSupported() {
|
@@ -125,6 +130,9 @@ Connection.prototype.events = {
|
|
125
130
|
const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)
|
126
131
|
switch (type) {
|
127
132
|
case message_types.welcome:
|
133
|
+
if (this.triedToReconnect()) {
|
134
|
+
this.reconnectAttempted = true
|
135
|
+
}
|
128
136
|
this.monitor.recordConnect()
|
129
137
|
return this.subscriptions.reload()
|
130
138
|
case message_types.disconnect:
|
@@ -134,7 +142,12 @@ Connection.prototype.events = {
|
|
134
142
|
return this.monitor.recordPing()
|
135
143
|
case message_types.confirmation:
|
136
144
|
this.subscriptions.confirmSubscription(identifier)
|
137
|
-
|
145
|
+
if (this.reconnectAttempted) {
|
146
|
+
this.reconnectAttempted = false
|
147
|
+
return this.subscriptions.notify(identifier, "connected", {reconnected: true})
|
148
|
+
} else {
|
149
|
+
return this.subscriptions.notify(identifier, "connected", {reconnected: false})
|
150
|
+
}
|
138
151
|
case message_types.rejection:
|
139
152
|
return this.subscriptions.reject(identifier)
|
140
153
|
default:
|
package/src/consumer.js
CHANGED
@@ -32,6 +32,7 @@ export default class Consumer {
|
|
32
32
|
this._url = url
|
33
33
|
this.subscriptions = new Subscriptions(this)
|
34
34
|
this.connection = new Connection(this)
|
35
|
+
this.subprotocols = []
|
35
36
|
}
|
36
37
|
|
37
38
|
get url() {
|
@@ -55,6 +56,10 @@ export default class Consumer {
|
|
55
56
|
return this.connection.open()
|
56
57
|
}
|
57
58
|
}
|
59
|
+
|
60
|
+
addSubProtocol(subprotocol) {
|
61
|
+
this.subprotocols = [...this.subprotocols, subprotocol]
|
62
|
+
}
|
58
63
|
}
|
59
64
|
|
60
65
|
export function createWebSocketURL(url) {
|
package/src/internal.js
CHANGED
@@ -9,7 +9,8 @@ export default {
|
|
9
9
|
"disconnect_reasons": {
|
10
10
|
"unauthorized": "unauthorized",
|
11
11
|
"invalid_request": "invalid_request",
|
12
|
-
"server_restart": "server_restart"
|
12
|
+
"server_restart": "server_restart",
|
13
|
+
"remote": "remote"
|
13
14
|
},
|
14
15
|
"default_mount_path": "/cable",
|
15
16
|
"protocols": [
|