actioncable 6.1.3.1 → 7.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e0e852bb8fa5267eff346a9aef794e6de1a2e9d0e62957453e6afdcfcea48d9
4
- data.tar.gz: 406480de8ebdfe0532819a4a5a17bc93d896849c8ab0a47ea06077c69c3799fb
3
+ metadata.gz: ae20b4c4ec6fe995164eb0a9701a3f79c92b8859e71aa10d1a95e2fd243a25ad
4
+ data.tar.gz: 69426337d819a6f40f24a4b57b5b0bd75bb0cdd8066da0eff4c8967c68a7a240
5
5
  SHA512:
6
- metadata.gz: e76c5c926ec4c818018968ba2b7d6f9464a020c1306efe66e18565f599233230f3a4766587c4274744d6e123c5f031c82b1000e820d762467b7522cc11ef6201
7
- data.tar.gz: c0bb3bf3b2327a68c493d4f7b4369878770439c4bfdfd85499b7caa86dcafc480021ee44e96c82caf96c62ecfebec1b052ec4f88707bad30eeb1487be88b74e4
6
+ metadata.gz: b5f2b7b8028ef108170d53c6287fc652ecdf24e5c0d91bac0075003a56972462369fd0b2a4bcd071b1ee1b8800c4bede4b2b8d12e55f421915304ea8475002ad
7
+ data.tar.gz: 42a713b80aeafdb15c951f691d2a2f29fcbbcc3eb350439cc4d10614b534d6a959315cf990a681458267f06b8f12da8cd211035a0041fcb16b65cc55c0e1e88c
data/CHANGELOG.md CHANGED
@@ -1,65 +1,37 @@
1
- ## Rails 6.1.3.1 (March 26, 2021) ##
1
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
2
2
 
3
- * No changes.
3
+ * Compile ESM package that can be used directly in the browser as actioncable.esm.js.
4
4
 
5
+ *DHH*
5
6
 
6
- ## Rails 6.1.3 (February 17, 2021) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 6.1.2.1 (February 10, 2021) ##
12
-
13
- * No changes.
14
-
15
-
16
- ## Rails 6.1.2 (February 09, 2021) ##
17
-
18
- * No changes.
19
-
20
-
21
- ## Rails 6.1.1 (January 07, 2021) ##
22
-
23
- * No changes.
24
-
25
-
26
- ## Rails 6.1.0 (December 09, 2020) ##
27
-
28
- * `ActionCable::Connection::Base` now allows intercepting unhandled exceptions
29
- with `rescue_from` before they are logged, which is useful for error reporting
30
- tools and other integrations.
31
-
32
- *Justin Talbott*
7
+ * Move action_cable.js to actioncable.js to match naming convention used for other Rails frameworks, and use JS console to communicate the deprecation.
33
8
 
34
- * Add `ActionCable::Channel#stream_or_reject_for` to stream if record is present, otherwise reject the connection
9
+ *DHH*
35
10
 
36
- *Atul Bhosale*
11
+ * Stop transpiling the UMD package generated as actioncable.js and drop the IE11 testing that relied on that.
37
12
 
38
- * Add `ActionCable::Channel#stop_stream_from` and `#stop_stream_for` to unsubscribe from a specific stream.
13
+ *DHH*
39
14
 
40
- *Zhang Kang*
15
+ * Truncate broadcast logging messages.
41
16
 
42
- * Add PostgreSQL subscription connection identificator.
17
+ *J Smith*
43
18
 
44
- Now you can distinguish Action Cable PostgreSQL subscription connections among others.
45
- Also, you can set custom `id` in `cable.yml` configuration.
19
+ * OpenSSL constants are now used for Digest computations.
46
20
 
47
- ```sql
48
- SELECT application_name FROM pg_stat_activity;
49
- /*
50
- application_name
51
- ------------------------
52
- psql
53
- ActionCable-PID-42
54
- (2 rows)
55
- */
56
- ```
21
+ *Dirkjan Bussink*
57
22
 
58
- *Sergey Ponomarev*
23
+ * The Action Cable client now includes safeguards to prevent a "thundering
24
+ herd" of client reconnects after server connectivity loss:
59
25
 
60
- * Subscription confirmations and rejections are now logged at the `DEBUG` level instead of `INFO`.
26
+ * The client will wait a random amount between 1x and 3x of the stale
27
+ threshold after the server's last ping before making the first
28
+ reconnection attempt.
29
+ * Subsequent reconnection attempts now use exponential backoff instead of
30
+ logarithmic backoff. To allow the delay between reconnection attempts to
31
+ increase slowly at first, the default exponentiation base is < 2.
32
+ * Random jitter is applied to each delay between reconnection attempts.
61
33
 
62
- *DHH*
34
+ *Jonathan Hefner*
63
35
 
64
36
 
65
- Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/actioncable/CHANGELOG.md) for previous changes.
37
+ Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/actioncable/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015-2020 Basecamp, LLC
1
+ Copyright (c) 2015-2021 Basecamp, LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,154 +1,115 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define([ "exports" ], factory) : factory(global.ActionCable = {});
3
- })(this, function(exports) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define([ "exports" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self,
3
+ factory(global.ActionCable = {}));
4
+ })(this, (function(exports) {
4
5
  "use strict";
5
6
  var adapters = {
6
7
  logger: self.console,
7
8
  WebSocket: self.WebSocket
8
9
  };
9
10
  var logger = {
10
- log: function log() {
11
+ log(...messages) {
11
12
  if (this.enabled) {
12
- var _adapters$logger;
13
- for (var _len = arguments.length, messages = Array(_len), _key = 0; _key < _len; _key++) {
14
- messages[_key] = arguments[_key];
15
- }
16
13
  messages.push(Date.now());
17
- (_adapters$logger = adapters.logger).log.apply(_adapters$logger, [ "[ActionCable]" ].concat(messages));
18
- }
19
- }
20
- };
21
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
22
- return typeof obj;
23
- } : function(obj) {
24
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
25
- };
26
- var classCallCheck = function(instance, Constructor) {
27
- if (!(instance instanceof Constructor)) {
28
- throw new TypeError("Cannot call a class as a function");
29
- }
30
- };
31
- var createClass = function() {
32
- function defineProperties(target, props) {
33
- for (var i = 0; i < props.length; i++) {
34
- var descriptor = props[i];
35
- descriptor.enumerable = descriptor.enumerable || false;
36
- descriptor.configurable = true;
37
- if ("value" in descriptor) descriptor.writable = true;
38
- Object.defineProperty(target, descriptor.key, descriptor);
14
+ adapters.logger.log("[ActionCable]", ...messages);
39
15
  }
40
16
  }
41
- return function(Constructor, protoProps, staticProps) {
42
- if (protoProps) defineProperties(Constructor.prototype, protoProps);
43
- if (staticProps) defineProperties(Constructor, staticProps);
44
- return Constructor;
45
- };
46
- }();
47
- var now = function now() {
48
- return new Date().getTime();
49
- };
50
- var secondsSince = function secondsSince(time) {
51
- return (now() - time) / 1e3;
52
17
  };
53
- var clamp = function clamp(number, min, max) {
54
- return Math.max(min, Math.min(max, number));
55
- };
56
- var ConnectionMonitor = function() {
57
- function ConnectionMonitor(connection) {
58
- classCallCheck(this, ConnectionMonitor);
18
+ const now = () => (new Date).getTime();
19
+ const secondsSince = time => (now() - time) / 1e3;
20
+ class ConnectionMonitor {
21
+ constructor(connection) {
59
22
  this.visibilityDidChange = this.visibilityDidChange.bind(this);
60
23
  this.connection = connection;
61
24
  this.reconnectAttempts = 0;
62
25
  }
63
- ConnectionMonitor.prototype.start = function start() {
26
+ start() {
64
27
  if (!this.isRunning()) {
65
28
  this.startedAt = now();
66
29
  delete this.stoppedAt;
67
30
  this.startPolling();
68
31
  addEventListener("visibilitychange", this.visibilityDidChange);
69
- logger.log("ConnectionMonitor started. pollInterval = " + this.getPollInterval() + " ms");
32
+ logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);
70
33
  }
71
- };
72
- ConnectionMonitor.prototype.stop = function stop() {
34
+ }
35
+ stop() {
73
36
  if (this.isRunning()) {
74
37
  this.stoppedAt = now();
75
38
  this.stopPolling();
76
39
  removeEventListener("visibilitychange", this.visibilityDidChange);
77
40
  logger.log("ConnectionMonitor stopped");
78
41
  }
79
- };
80
- ConnectionMonitor.prototype.isRunning = function isRunning() {
42
+ }
43
+ isRunning() {
81
44
  return this.startedAt && !this.stoppedAt;
82
- };
83
- ConnectionMonitor.prototype.recordPing = function recordPing() {
45
+ }
46
+ recordPing() {
84
47
  this.pingedAt = now();
85
- };
86
- ConnectionMonitor.prototype.recordConnect = function recordConnect() {
48
+ }
49
+ recordConnect() {
87
50
  this.reconnectAttempts = 0;
88
51
  this.recordPing();
89
52
  delete this.disconnectedAt;
90
53
  logger.log("ConnectionMonitor recorded connect");
91
- };
92
- ConnectionMonitor.prototype.recordDisconnect = function recordDisconnect() {
54
+ }
55
+ recordDisconnect() {
93
56
  this.disconnectedAt = now();
94
57
  logger.log("ConnectionMonitor recorded disconnect");
95
- };
96
- ConnectionMonitor.prototype.startPolling = function startPolling() {
58
+ }
59
+ startPolling() {
97
60
  this.stopPolling();
98
61
  this.poll();
99
- };
100
- ConnectionMonitor.prototype.stopPolling = function stopPolling() {
62
+ }
63
+ stopPolling() {
101
64
  clearTimeout(this.pollTimeout);
102
- };
103
- ConnectionMonitor.prototype.poll = function poll() {
104
- var _this = this;
105
- this.pollTimeout = setTimeout(function() {
106
- _this.reconnectIfStale();
107
- _this.poll();
108
- }, this.getPollInterval());
109
- };
110
- ConnectionMonitor.prototype.getPollInterval = function getPollInterval() {
111
- var _constructor$pollInte = this.constructor.pollInterval, min = _constructor$pollInte.min, max = _constructor$pollInte.max, multiplier = _constructor$pollInte.multiplier;
112
- var interval = multiplier * Math.log(this.reconnectAttempts + 1);
113
- return Math.round(clamp(interval, min, max) * 1e3);
114
- };
115
- ConnectionMonitor.prototype.reconnectIfStale = function reconnectIfStale() {
65
+ }
66
+ poll() {
67
+ this.pollTimeout = setTimeout((() => {
68
+ this.reconnectIfStale();
69
+ this.poll();
70
+ }), this.getPollInterval());
71
+ }
72
+ getPollInterval() {
73
+ const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;
74
+ const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));
75
+ const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;
76
+ const jitter = jitterMax * Math.random();
77
+ return staleThreshold * 1e3 * backoff * (1 + jitter);
78
+ }
79
+ reconnectIfStale() {
116
80
  if (this.connectionIsStale()) {
117
- logger.log("ConnectionMonitor detected stale connection. reconnectAttempts = " + this.reconnectAttempts + ", pollInterval = " + this.getPollInterval() + " ms, time disconnected = " + secondsSince(this.disconnectedAt) + " s, stale threshold = " + this.constructor.staleThreshold + " s");
81
+ logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);
118
82
  this.reconnectAttempts++;
119
83
  if (this.disconnectedRecently()) {
120
- logger.log("ConnectionMonitor skipping reopening recent disconnect");
84
+ logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);
121
85
  } else {
122
86
  logger.log("ConnectionMonitor reopening");
123
87
  this.connection.reopen();
124
88
  }
125
89
  }
126
- };
127
- ConnectionMonitor.prototype.connectionIsStale = function connectionIsStale() {
128
- return secondsSince(this.pingedAt ? this.pingedAt : this.startedAt) > this.constructor.staleThreshold;
129
- };
130
- ConnectionMonitor.prototype.disconnectedRecently = function disconnectedRecently() {
90
+ }
91
+ get refreshedAt() {
92
+ return this.pingedAt ? this.pingedAt : this.startedAt;
93
+ }
94
+ connectionIsStale() {
95
+ return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;
96
+ }
97
+ disconnectedRecently() {
131
98
  return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;
132
- };
133
- ConnectionMonitor.prototype.visibilityDidChange = function visibilityDidChange() {
134
- var _this2 = this;
99
+ }
100
+ visibilityDidChange() {
135
101
  if (document.visibilityState === "visible") {
136
- setTimeout(function() {
137
- if (_this2.connectionIsStale() || !_this2.connection.isOpen()) {
138
- logger.log("ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = " + document.visibilityState);
139
- _this2.connection.reopen();
102
+ setTimeout((() => {
103
+ if (this.connectionIsStale() || !this.connection.isOpen()) {
104
+ logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);
105
+ this.connection.reopen();
140
106
  }
141
- }, 200);
107
+ }), 200);
142
108
  }
143
- };
144
- return ConnectionMonitor;
145
- }();
146
- ConnectionMonitor.pollInterval = {
147
- min: 3,
148
- max: 30,
149
- multiplier: 5
150
- };
109
+ }
110
+ }
151
111
  ConnectionMonitor.staleThreshold = 6;
112
+ ConnectionMonitor.reconnectionBackoffRate = .15;
152
113
  var INTERNAL = {
153
114
  message_types: {
154
115
  welcome: "welcome",
@@ -165,32 +126,31 @@
165
126
  default_mount_path: "/cable",
166
127
  protocols: [ "actioncable-v1-json", "actioncable-unsupported" ]
167
128
  };
168
- var message_types = INTERNAL.message_types, protocols = INTERNAL.protocols;
169
- var supportedProtocols = protocols.slice(0, protocols.length - 1);
170
- var indexOf = [].indexOf;
171
- var Connection = function() {
172
- function Connection(consumer) {
173
- classCallCheck(this, Connection);
129
+ const {message_types: message_types, protocols: protocols} = INTERNAL;
130
+ const supportedProtocols = protocols.slice(0, protocols.length - 1);
131
+ const indexOf = [].indexOf;
132
+ class Connection {
133
+ constructor(consumer) {
174
134
  this.open = this.open.bind(this);
175
135
  this.consumer = consumer;
176
136
  this.subscriptions = this.consumer.subscriptions;
177
137
  this.monitor = new ConnectionMonitor(this);
178
138
  this.disconnected = true;
179
139
  }
180
- Connection.prototype.send = function send(data) {
140
+ send(data) {
181
141
  if (this.isOpen()) {
182
142
  this.webSocket.send(JSON.stringify(data));
183
143
  return true;
184
144
  } else {
185
145
  return false;
186
146
  }
187
- };
188
- Connection.prototype.open = function open() {
147
+ }
148
+ open() {
189
149
  if (this.isActive()) {
190
- logger.log("Attempted to open WebSocket, but existing socket is " + this.getState());
150
+ logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);
191
151
  return false;
192
152
  } else {
193
- logger.log("Opening WebSocket, current state is " + this.getState() + ", subprotocols: " + protocols);
153
+ logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);
194
154
  if (this.webSocket) {
195
155
  this.uninstallEventHandlers();
196
156
  }
@@ -199,90 +159,85 @@
199
159
  this.monitor.start();
200
160
  return true;
201
161
  }
202
- };
203
- Connection.prototype.close = function close() {
204
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
205
- allowReconnect: true
206
- }, allowReconnect = _ref.allowReconnect;
162
+ }
163
+ close({allowReconnect: allowReconnect} = {
164
+ allowReconnect: true
165
+ }) {
207
166
  if (!allowReconnect) {
208
167
  this.monitor.stop();
209
168
  }
210
169
  if (this.isActive()) {
211
170
  return this.webSocket.close();
212
171
  }
213
- };
214
- Connection.prototype.reopen = function reopen() {
215
- logger.log("Reopening WebSocket, current state is " + this.getState());
172
+ }
173
+ reopen() {
174
+ logger.log(`Reopening WebSocket, current state is ${this.getState()}`);
216
175
  if (this.isActive()) {
217
176
  try {
218
177
  return this.close();
219
178
  } catch (error) {
220
179
  logger.log("Failed to reopen WebSocket", error);
221
180
  } finally {
222
- logger.log("Reopening WebSocket in " + this.constructor.reopenDelay + "ms");
181
+ logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);
223
182
  setTimeout(this.open, this.constructor.reopenDelay);
224
183
  }
225
184
  } else {
226
185
  return this.open();
227
186
  }
228
- };
229
- Connection.prototype.getProtocol = function getProtocol() {
187
+ }
188
+ getProtocol() {
230
189
  if (this.webSocket) {
231
190
  return this.webSocket.protocol;
232
191
  }
233
- };
234
- Connection.prototype.isOpen = function isOpen() {
192
+ }
193
+ isOpen() {
235
194
  return this.isState("open");
236
- };
237
- Connection.prototype.isActive = function isActive() {
195
+ }
196
+ isActive() {
238
197
  return this.isState("open", "connecting");
239
- };
240
- Connection.prototype.isProtocolSupported = function isProtocolSupported() {
198
+ }
199
+ isProtocolSupported() {
241
200
  return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;
242
- };
243
- Connection.prototype.isState = function isState() {
244
- for (var _len = arguments.length, states = Array(_len), _key = 0; _key < _len; _key++) {
245
- states[_key] = arguments[_key];
246
- }
201
+ }
202
+ isState(...states) {
247
203
  return indexOf.call(states, this.getState()) >= 0;
248
- };
249
- Connection.prototype.getState = function getState() {
204
+ }
205
+ getState() {
250
206
  if (this.webSocket) {
251
- for (var state in adapters.WebSocket) {
207
+ for (let state in adapters.WebSocket) {
252
208
  if (adapters.WebSocket[state] === this.webSocket.readyState) {
253
209
  return state.toLowerCase();
254
210
  }
255
211
  }
256
212
  }
257
213
  return null;
258
- };
259
- Connection.prototype.installEventHandlers = function installEventHandlers() {
260
- for (var eventName in this.events) {
261
- var handler = this.events[eventName].bind(this);
262
- this.webSocket["on" + eventName] = handler;
214
+ }
215
+ installEventHandlers() {
216
+ for (let eventName in this.events) {
217
+ const handler = this.events[eventName].bind(this);
218
+ this.webSocket[`on${eventName}`] = handler;
263
219
  }
264
- };
265
- Connection.prototype.uninstallEventHandlers = function uninstallEventHandlers() {
266
- for (var eventName in this.events) {
267
- this.webSocket["on" + eventName] = function() {};
220
+ }
221
+ uninstallEventHandlers() {
222
+ for (let eventName in this.events) {
223
+ this.webSocket[`on${eventName}`] = function() {};
268
224
  }
269
- };
270
- return Connection;
271
- }();
225
+ }
226
+ }
272
227
  Connection.reopenDelay = 500;
273
228
  Connection.prototype.events = {
274
- message: function message(event) {
229
+ message(event) {
275
230
  if (!this.isProtocolSupported()) {
276
231
  return;
277
232
  }
278
- var _JSON$parse = JSON.parse(event.data), identifier = _JSON$parse.identifier, message = _JSON$parse.message, reason = _JSON$parse.reason, reconnect = _JSON$parse.reconnect, type = _JSON$parse.type;
233
+ const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);
279
234
  switch (type) {
280
235
  case message_types.welcome:
281
236
  this.monitor.recordConnect();
282
237
  return this.subscriptions.reload();
283
238
 
284
239
  case message_types.disconnect:
285
- logger.log("Disconnecting. Reason: " + reason);
240
+ logger.log(`Disconnecting. Reason: ${reason}`);
286
241
  return this.close({
287
242
  allowReconnect: reconnect
288
243
  });
@@ -300,8 +255,8 @@
300
255
  return this.subscriptions.notify(identifier, "received", message);
301
256
  }
302
257
  },
303
- open: function open() {
304
- logger.log("WebSocket onopen event, using '" + this.getProtocol() + "' subprotocol");
258
+ open() {
259
+ logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);
305
260
  this.disconnected = false;
306
261
  if (!this.isProtocolSupported()) {
307
262
  logger.log("Protocol is unsupported. Stopping monitor and disconnecting.");
@@ -310,7 +265,7 @@
310
265
  });
311
266
  }
312
267
  },
313
- close: function close(event) {
268
+ close(event) {
314
269
  logger.log("WebSocket onclose event");
315
270
  if (this.disconnected) {
316
271
  return;
@@ -321,167 +276,136 @@
321
276
  willAttemptReconnect: this.monitor.isRunning()
322
277
  });
323
278
  },
324
- error: function error() {
279
+ error() {
325
280
  logger.log("WebSocket onerror event");
326
281
  }
327
282
  };
328
- var extend = function extend(object, properties) {
283
+ const extend = function(object, properties) {
329
284
  if (properties != null) {
330
- for (var key in properties) {
331
- var value = properties[key];
285
+ for (let key in properties) {
286
+ const value = properties[key];
332
287
  object[key] = value;
333
288
  }
334
289
  }
335
290
  return object;
336
291
  };
337
- var Subscription = function() {
338
- function Subscription(consumer) {
339
- var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
340
- var mixin = arguments[2];
341
- classCallCheck(this, Subscription);
292
+ class Subscription {
293
+ constructor(consumer, params = {}, mixin) {
342
294
  this.consumer = consumer;
343
295
  this.identifier = JSON.stringify(params);
344
296
  extend(this, mixin);
345
297
  }
346
- Subscription.prototype.perform = function perform(action) {
347
- var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
298
+ perform(action, data = {}) {
348
299
  data.action = action;
349
300
  return this.send(data);
350
- };
351
- Subscription.prototype.send = function send(data) {
301
+ }
302
+ send(data) {
352
303
  return this.consumer.send({
353
304
  command: "message",
354
305
  identifier: this.identifier,
355
306
  data: JSON.stringify(data)
356
307
  });
357
- };
358
- Subscription.prototype.unsubscribe = function unsubscribe() {
308
+ }
309
+ unsubscribe() {
359
310
  return this.consumer.subscriptions.remove(this);
360
- };
361
- return Subscription;
362
- }();
363
- var Subscriptions = function() {
364
- function Subscriptions(consumer) {
365
- classCallCheck(this, Subscriptions);
311
+ }
312
+ }
313
+ class Subscriptions {
314
+ constructor(consumer) {
366
315
  this.consumer = consumer;
367
316
  this.subscriptions = [];
368
317
  }
369
- Subscriptions.prototype.create = function create(channelName, mixin) {
370
- var channel = channelName;
371
- var params = (typeof channel === "undefined" ? "undefined" : _typeof(channel)) === "object" ? channel : {
318
+ create(channelName, mixin) {
319
+ const channel = channelName;
320
+ const params = typeof channel === "object" ? channel : {
372
321
  channel: channel
373
322
  };
374
- var subscription = new Subscription(this.consumer, params, mixin);
323
+ const subscription = new Subscription(this.consumer, params, mixin);
375
324
  return this.add(subscription);
376
- };
377
- Subscriptions.prototype.add = function add(subscription) {
325
+ }
326
+ add(subscription) {
378
327
  this.subscriptions.push(subscription);
379
328
  this.consumer.ensureActiveConnection();
380
329
  this.notify(subscription, "initialized");
381
330
  this.sendCommand(subscription, "subscribe");
382
331
  return subscription;
383
- };
384
- Subscriptions.prototype.remove = function remove(subscription) {
332
+ }
333
+ remove(subscription) {
385
334
  this.forget(subscription);
386
335
  if (!this.findAll(subscription.identifier).length) {
387
336
  this.sendCommand(subscription, "unsubscribe");
388
337
  }
389
338
  return subscription;
390
- };
391
- Subscriptions.prototype.reject = function reject(identifier) {
392
- var _this = this;
393
- return this.findAll(identifier).map(function(subscription) {
394
- _this.forget(subscription);
395
- _this.notify(subscription, "rejected");
339
+ }
340
+ reject(identifier) {
341
+ return this.findAll(identifier).map((subscription => {
342
+ this.forget(subscription);
343
+ this.notify(subscription, "rejected");
396
344
  return subscription;
397
- });
398
- };
399
- Subscriptions.prototype.forget = function forget(subscription) {
400
- this.subscriptions = this.subscriptions.filter(function(s) {
401
- return s !== subscription;
402
- });
345
+ }));
346
+ }
347
+ forget(subscription) {
348
+ this.subscriptions = this.subscriptions.filter((s => s !== subscription));
403
349
  return subscription;
404
- };
405
- Subscriptions.prototype.findAll = function findAll(identifier) {
406
- return this.subscriptions.filter(function(s) {
407
- return s.identifier === identifier;
408
- });
409
- };
410
- Subscriptions.prototype.reload = function reload() {
411
- var _this2 = this;
412
- return this.subscriptions.map(function(subscription) {
413
- return _this2.sendCommand(subscription, "subscribe");
414
- });
415
- };
416
- Subscriptions.prototype.notifyAll = function notifyAll(callbackName) {
417
- var _this3 = this;
418
- for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
419
- args[_key - 1] = arguments[_key];
420
- }
421
- return this.subscriptions.map(function(subscription) {
422
- return _this3.notify.apply(_this3, [ subscription, callbackName ].concat(args));
423
- });
424
- };
425
- Subscriptions.prototype.notify = function notify(subscription, callbackName) {
426
- for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
427
- args[_key2 - 2] = arguments[_key2];
428
- }
429
- var subscriptions = void 0;
350
+ }
351
+ findAll(identifier) {
352
+ return this.subscriptions.filter((s => s.identifier === identifier));
353
+ }
354
+ reload() {
355
+ return this.subscriptions.map((subscription => this.sendCommand(subscription, "subscribe")));
356
+ }
357
+ notifyAll(callbackName, ...args) {
358
+ return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));
359
+ }
360
+ notify(subscription, callbackName, ...args) {
361
+ let subscriptions;
430
362
  if (typeof subscription === "string") {
431
363
  subscriptions = this.findAll(subscription);
432
364
  } else {
433
365
  subscriptions = [ subscription ];
434
366
  }
435
- return subscriptions.map(function(subscription) {
436
- return typeof subscription[callbackName] === "function" ? subscription[callbackName].apply(subscription, args) : undefined;
437
- });
438
- };
439
- Subscriptions.prototype.sendCommand = function sendCommand(subscription, command) {
440
- var identifier = subscription.identifier;
367
+ return subscriptions.map((subscription => typeof subscription[callbackName] === "function" ? subscription[callbackName](...args) : undefined));
368
+ }
369
+ sendCommand(subscription, command) {
370
+ const {identifier: identifier} = subscription;
441
371
  return this.consumer.send({
442
372
  command: command,
443
373
  identifier: identifier
444
374
  });
445
- };
446
- return Subscriptions;
447
- }();
448
- var Consumer = function() {
449
- function Consumer(url) {
450
- classCallCheck(this, Consumer);
375
+ }
376
+ }
377
+ class Consumer {
378
+ constructor(url) {
451
379
  this._url = url;
452
380
  this.subscriptions = new Subscriptions(this);
453
381
  this.connection = new Connection(this);
454
382
  }
455
- Consumer.prototype.send = function send(data) {
383
+ get url() {
384
+ return createWebSocketURL(this._url);
385
+ }
386
+ send(data) {
456
387
  return this.connection.send(data);
457
- };
458
- Consumer.prototype.connect = function connect() {
388
+ }
389
+ connect() {
459
390
  return this.connection.open();
460
- };
461
- Consumer.prototype.disconnect = function disconnect() {
391
+ }
392
+ disconnect() {
462
393
  return this.connection.close({
463
394
  allowReconnect: false
464
395
  });
465
- };
466
- Consumer.prototype.ensureActiveConnection = function ensureActiveConnection() {
396
+ }
397
+ ensureActiveConnection() {
467
398
  if (!this.connection.isActive()) {
468
399
  return this.connection.open();
469
400
  }
470
- };
471
- createClass(Consumer, [ {
472
- key: "url",
473
- get: function get$$1() {
474
- return createWebSocketURL(this._url);
475
- }
476
- } ]);
477
- return Consumer;
478
- }();
401
+ }
402
+ }
479
403
  function createWebSocketURL(url) {
480
404
  if (typeof url === "function") {
481
405
  url = url();
482
406
  }
483
407
  if (url && !/^wss?:/i.test(url)) {
484
- var a = document.createElement("a");
408
+ const a = document.createElement("a");
485
409
  a.href = url;
486
410
  a.href = a.href;
487
411
  a.protocol = a.protocol.replace("http", "ws");
@@ -490,16 +414,16 @@
490
414
  return url;
491
415
  }
492
416
  }
493
- function createConsumer() {
494
- var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getConfig("url") || INTERNAL.default_mount_path;
417
+ function createConsumer(url = getConfig("url") || INTERNAL.default_mount_path) {
495
418
  return new Consumer(url);
496
419
  }
497
420
  function getConfig(name) {
498
- var element = document.head.querySelector("meta[name='action-cable-" + name + "']");
421
+ const element = document.head.querySelector(`meta[name='action-cable-${name}']`);
499
422
  if (element) {
500
423
  return element.getAttribute("content");
501
424
  }
502
425
  }
426
+ console.log("DEPRECATION: action_cable.js has been renamed to actioncable.js – please update your reference before Rails 8");
503
427
  exports.Connection = Connection;
504
428
  exports.ConnectionMonitor = ConnectionMonitor;
505
429
  exports.Consumer = Consumer;
@@ -507,11 +431,11 @@
507
431
  exports.Subscription = Subscription;
508
432
  exports.Subscriptions = Subscriptions;
509
433
  exports.adapters = adapters;
510
- exports.createWebSocketURL = createWebSocketURL;
511
- exports.logger = logger;
512
434
  exports.createConsumer = createConsumer;
435
+ exports.createWebSocketURL = createWebSocketURL;
513
436
  exports.getConfig = getConfig;
437
+ exports.logger = logger;
514
438
  Object.defineProperty(exports, "__esModule", {
515
439
  value: true
516
440
  });
517
- });
441
+ }));