actioncable 6.1.3.1 → 7.0.0.alpha1

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.
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
+ }));