ableton-js 3.1.2 → 3.1.4

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/CHANGELOG.md CHANGED
@@ -4,8 +4,23 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ #### [v3.1.4](https://github.com/leolabs/ableton.js/compare/v3.1.3...v3.1.4)
8
+
9
+ - :loud_sound: Log the version of AbletonJS when it's loaded [`fae9799`](https://github.com/leolabs/ableton.js/commit/fae9799dc4650286ed0b9ebdce9a18b607643271)
10
+ - :wrench: Bind server to 127.0.0.1 only [`bb73239`](https://github.com/leolabs/ableton.js/commit/bb73239c70ddcb881d6fd9b909bc7f74a49b81fb)
11
+
12
+ #### [v3.1.3](https://github.com/leolabs/ableton.js/compare/v3.1.2...v3.1.3)
13
+
14
+ > 26 February 2023
15
+
16
+ - :bug: Fix opening a project file from within Finder closing all socket and file handles [`6cf2440`](https://github.com/leolabs/ableton.js/commit/6cf244057797dd45a7f5007af907947754449d5d)
17
+ - :loud_sound: Log data that couldn't be sent [`e39c6c6`](https://github.com/leolabs/ableton.js/commit/e39c6c6b0b68823268ca715c486dbc1ab6ce7dec)
18
+ - :loud_sound: Improve logging for event handlers [`a1fa33b`](https://github.com/leolabs/ableton.js/commit/a1fa33bb9c1c6b05352ea845c24b4637c7f80094)
19
+
7
20
  #### [v3.1.2](https://github.com/leolabs/ableton.js/compare/v3.1.1...v3.1.2)
8
21
 
22
+ > 26 February 2023
23
+
9
24
  - :sparkles: Keep a handle to the client port file open for faster read performance [`2a0295d`](https://github.com/leolabs/ableton.js/commit/2a0295dff3022e3812c2a0f6077ffb7bdcd00bf0)
10
25
  - :sparkles: Try re-using the previous port for a quicker reconnect [`5c77760`](https://github.com/leolabs/ableton.js/commit/5c777606ce97295429dcac1a5685a34c8aa5abe3)
11
26
  - :bug: Fix double disconnect/connect event [`2f960be`](https://github.com/leolabs/ableton.js/commit/2f960be4c6d18b2668d15258914cd3b763be0f4a)
@@ -2,11 +2,11 @@ const fs = require("fs");
2
2
  const path = require("path");
3
3
  const package = require("../package.json");
4
4
 
5
- const internalPath = path.join(__dirname, "..", "midi-script", "Internal.py");
5
+ const internalPath = path.join(__dirname, "..", "midi-script", "version.py");
6
6
  const file = fs.readFileSync(internalPath);
7
7
 
8
8
  const replaced = file
9
9
  .toString()
10
- .replace(/return "(.+\..+\..+?)"$/m, `return "${package.version}"`);
10
+ .replace(/version = "(.+\..+\..+?)"$/m, `version = "${package.version}"`);
11
11
 
12
12
  fs.writeFileSync(internalPath, replaced);
package/index.js CHANGED
@@ -384,7 +384,7 @@ var Ableton = /** @class */ (function (_super) {
384
384
  }
385
385
  };
386
386
  Ableton.prototype.handleUncompressedMessage = function (msg) {
387
- var _a, _b;
387
+ var _a, _b, _c, _d;
388
388
  this.emit("raw_message", msg);
389
389
  var data = JSON.parse(msg);
390
390
  var functionCallback = this.msgMap.get(data.uuid);
@@ -404,8 +404,8 @@ var Ableton = /** @class */ (function (_super) {
404
404
  // If some heartbeat ping from the old connection is still pending,
405
405
  // cancel it to prevent a double disconnect/connect event.
406
406
  this.cancelDisconnectEvent = true;
407
- if (data.data.port && data.data.port !== this.serverPort) {
408
- (_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Got new server port via connect:", {
407
+ if (((_a = data.data) === null || _a === void 0 ? void 0 : _a.port) && ((_b = data.data) === null || _b === void 0 ? void 0 : _b.port) !== this.serverPort) {
408
+ (_c = this.logger) === null || _c === void 0 ? void 0 : _c.info("Got new server port via connect:", {
409
409
  port: data.data.port,
410
410
  });
411
411
  this.serverPort = data.data.port;
@@ -418,7 +418,7 @@ var Ableton = /** @class */ (function (_super) {
418
418
  }
419
419
  if (data.uuid) {
420
420
  this.emit("error", "Message could not be assigned to any request: " + msg);
421
- (_b = this.logger) === null || _b === void 0 ? void 0 : _b.warn("Message could not be assigned to any request:", {
421
+ (_d = this.logger) === null || _d === void 0 ? void 0 : _d.warn("Message could not be assigned to any request:", {
422
422
  msg: msg,
423
423
  });
424
424
  }
@@ -1,5 +1,6 @@
1
1
  from __future__ import absolute_import
2
2
 
3
+ from .version import version
3
4
  from .Socket import Socket
4
5
  from .Interface import Interface
5
6
  from .Application import Application
@@ -24,6 +25,8 @@ import Live
24
25
  class AbletonJS(ControlSurface):
25
26
  def __init__(self, c_instance):
26
27
  super(AbletonJS, self).__init__(c_instance)
28
+ self.log_message("Starting AbletonJS " + version + "...")
29
+
27
30
  self.tracked_midi = set()
28
31
 
29
32
  Socket.set_log(self.log_message)
@@ -90,7 +90,8 @@ class Interface(object):
90
90
  value = self.get_prop(ns, prop)
91
91
  return self.socket.send(eventId, value)
92
92
 
93
- self.log_message("Attaching listener")
93
+ self.log_message("Attaching listener: " +
94
+ key + ", event ID: " + eventId)
94
95
  add_fn(fn)
95
96
  self.listeners[key] = {"id": eventId, "fn": fn}
96
97
  return eventId
@@ -1,5 +1,6 @@
1
1
  from __future__ import absolute_import
2
2
  from .Interface import Interface
3
+ from .version import version
3
4
 
4
5
 
5
6
  class Internal(Interface):
@@ -13,4 +14,4 @@ class Internal(Interface):
13
14
  return True
14
15
 
15
16
  def get_version(self, ns):
16
- return "3.1.2"
17
+ return version
@@ -35,11 +35,16 @@ class Socket(object):
35
35
 
36
36
  def __init__(self, handler):
37
37
  self.input_handler = handler
38
- self._server_addr = ('127.0.0.1', 0)
39
- self._client_addr = ('127.0.0.1', 39031)
40
- self.remote_port_file = None
38
+ self._server_addr = ("127.0.0.1", 0)
39
+ self._client_addr = ("127.0.0.1", 39031)
40
+ self._socket = None
41
+
41
42
  self.read_remote_port()
42
- self.init_socket()
43
+ self.init_socket(True)
44
+
45
+ self.file_timer = Live.Base.Timer(callback=self.read_remote_port,
46
+ interval=1000, repeat=True)
47
+ self.file_timer.start()
43
48
 
44
49
  def read_last_server_port(self):
45
50
  try:
@@ -56,39 +61,30 @@ class Socket(object):
56
61
  def read_remote_port(self):
57
62
  '''Reads the port our client is listening on'''
58
63
  try:
59
- if self.remote_port_file == None or self.remote_port_file.closed:
60
- self.log_message("Opening remote port file...")
61
- self.remote_port_file = open(client_port_path)
64
+ old_port = self._client_addr[1]
62
65
 
63
- self.remote_port_file.seek(0)
64
- port = int(self.remote_port_file.read())
66
+ with open(client_port_path) as file:
67
+ port = int(file.read())
65
68
 
66
- if port != self._client_addr[1]:
67
- self.log_message("Client port changed: " + str(port))
68
- self._client_addr = ('127.0.0.1', port)
69
+ if port != old_port:
70
+ self.log_message("[" + str(id(self)) + "] Client port changed from " +
71
+ str(old_port) + " to " + str(port))
72
+ self._client_addr = ("127.0.0.1", port)
69
73
 
70
- if hasattr(self, "_socket"):
71
- self.send("connect", {"port": self._server_addr[1]})
74
+ if self._socket:
75
+ self.send("connect", {"port": self._server_addr[1]})
72
76
  except Exception as e:
73
- self.log_message("Couldn't read remote port:", str(e.args))
74
- if self.remote_port_file:
75
- self.remote_port_file.close()
76
-
77
- Timer(1, self.read_remote_port).start()
78
-
79
- def init_socket(self):
80
- self._socket = socket.socket(
81
- socket.AF_INET, socket.SOCK_DGRAM)
82
- self._socket.setblocking(0)
83
-
84
- self.bind(True)
77
+ self.log_message("Couldn't read file: " + str(e.args))
85
78
 
86
79
  def shutdown(self):
80
+ self.log_message("Shutting down...")
81
+ self.file_timer.stop()
87
82
  self._socket.close()
88
- if self.remote_port_file:
89
- self.remote_port_file.close()
90
83
 
91
- def bind(self, try_stored=False):
84
+ def init_socket(self, try_stored=False):
85
+ self.log_message(
86
+ "Initializing socket, from stored: " + str(try_stored))
87
+
92
88
  try:
93
89
  stored_port = self.read_last_server_port()
94
90
 
@@ -98,27 +94,40 @@ class Socket(object):
98
94
  else:
99
95
  self._server_addr = ("127.0.0.1", 0)
100
96
 
97
+ self._socket = socket.socket(
98
+ socket.AF_INET, socket.SOCK_DGRAM)
99
+ self._socket.setblocking(0)
101
100
  self._socket.bind(self._server_addr)
102
101
  port = self._socket.getsockname()[1]
103
102
 
104
103
  # Write the chosen port to a file
105
- if stored_port != port:
106
- with open(server_port_path, "w") as file:
107
- file.write(str(port))
104
+ try:
105
+ if stored_port != port:
106
+ with open(server_port_path, "w") as file:
107
+ file.write(str(port))
108
+ except Exception as e:
109
+ self.log_message("Couldn't save port in file: " + str(e.args))
110
+ raise e
111
+
112
+ try:
113
+ self.send("connect", {"port": self._server_addr[1]})
114
+ except Exception as e:
115
+ self.log_message("Couldn't send connect to " +
116
+ str(self._client_addr) + ": " + str(e.args))
108
117
 
109
- self.send("connect", {"port": port})
110
118
  self.show_message("Started server on port " + str(port))
111
119
 
112
- self.log_message('Started on: ' + str(self._socket.getsockname()) +
113
- ', remote addr: ' + str(self._client_addr))
120
+ self.log_message('Started server on: ' + str(self._socket.getsockname()) +
121
+ ', client addr: ' + str(self._client_addr))
114
122
  except Exception as e:
115
123
  msg = 'ERROR: Cannot bind to ' + \
116
124
  str(self._server_addr) + ': ' + \
117
125
  str(e.args) + ', trying again. ' + \
118
126
  'If this keeps happening, try restarting your computer.'
119
- self.show_message(msg)
120
127
  self.log_message(msg)
121
- t = Timer(5, self.bind)
128
+ self.log_message("Client address: " + str(self._client_addr))
129
+ self.show_message(msg)
130
+ t = Timer(5, self.init_socket)
122
131
  t.start()
123
132
 
124
133
  def _sendto(self, msg):
@@ -143,16 +152,16 @@ class Socket(object):
143
152
  return list(o)
144
153
  return str(o)
145
154
 
155
+ data = None
156
+
146
157
  try:
147
- self._sendto(json.dumps(
148
- {"event": name, "data": obj, "uuid": uuid}, default=jsonReplace, ensure_ascii=False))
158
+ data = json.dumps(
159
+ {"event": name, "data": obj, "uuid": uuid}, default=jsonReplace, ensure_ascii=False)
160
+ self._sendto(data)
149
161
  except socket.error as e:
150
- self.log_message("Socket error: " + str(e.args))
151
- self.log_message("Server: " + str(self._server_addr) +
152
- ", client: " + str(self._client_addr))
153
- self.log_message("Restarting socket...")
154
- self._socket.close()
155
- self.init_socket()
162
+ self.log_message("Socket error: " + str(e.args) + ", server: " + str(self._server_addr) +
163
+ ", client: " + str(self._client_addr) + ", socket: " + str(self._socket))
164
+ self.log_message("Data:" + data)
156
165
  except Exception as e:
157
166
  error = str(type(e).__name__) + ': ' + str(e.args)
158
167
  self.log_message("Error " + name + "(" + str(uuid) + "): " + error)
@@ -175,6 +184,8 @@ class Socket(object):
175
184
  buffer = bytes()
176
185
  num_messages = 0
177
186
  except socket.error as e:
187
+ if (e.errno != 35):
188
+ self.log_message("Socket error: " + str(e.args))
178
189
  return
179
190
  except Exception as e:
180
191
  self.log_message("Error while processing: " + str(e.args))
@@ -0,0 +1 @@
1
+ version = "3.1.4"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ableton-js",
3
- "version": "3.1.2",
3
+ "version": "3.1.4",
4
4
  "description": "Control Ableton Live from Node",
5
5
  "main": "index.js",
6
6
  "author": "Leo Bernard <admin@leolabs.org>",
@@ -20,14 +20,14 @@
20
20
  "ableton10:launch": "set -- /Applications/Ableton*10* && open \"$1\"",
21
21
  "ableton11:copy-script": "set -- /Applications/Ableton*11*/Contents/App-Resources/MIDI\\ Remote\\ Scripts && rm -rf \"$1/AbletonJS\" && cp -r \"$(pwd)/midi-script\" \"$1/AbletonJS\" && rm -rf \"$1/AbletonJS/_Framework\"",
22
22
  "ableton11:launch": "set -- /Applications/Ableton*11* && open \"$1\"",
23
- "ableton:logs": "tail -f ~/Library/Preferences/Ableton/*/Log.txt | grep -i -e RemoteScriptError -e RemoteScriptMessage",
23
+ "ableton:logs": "tail -n 50 -f ~/Library/Preferences/Ableton/*/Log.txt | grep -i -e RemoteScriptError -e RemoteScriptMessage",
24
24
  "ableton:kill": "pkill -KILL -f \"Ableton Live\"",
25
25
  "ableton10:start": "yarn ableton:kill; yarn ableton:clean && yarn ableton10:copy-script && yarn ableton10:launch && yarn ableton:logs",
26
26
  "ableton11:start": "yarn ableton:kill; yarn ableton:clean && yarn ableton11:copy-script && yarn ableton11:launch && yarn ableton:logs",
27
27
  "prepublishOnly": "yarn build",
28
28
  "postinstall": "node hooks/postinstall.js",
29
29
  "build:doc": "jsdoc2md --files src/**/*.ts --configure ./jsdoc2md.json > ./API.md",
30
- "version": "node hooks/prepublish.js && git add midi-script/Internal.py && auto-changelog -p -l 100 && git add CHANGELOG.md",
30
+ "version": "node hooks/prepublish.js && git add midi-script/version.py && auto-changelog -p -l 100 && git add CHANGELOG.md",
31
31
  "build": "tsc",
32
32
  "test": "jest --runInBand"
33
33
  },