buttplug 3.2.0 → 3.2.2
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/.yarnrc.yml +4 -0
- package/CHANGELOG.md +13 -0
- package/README.md +1 -1
- package/dist/main/src/client/ButtplugClientDevice.js +4 -3
- package/dist/main/src/client/ButtplugClientDevice.js.map +1 -1
- package/dist/main/src/client/Client.js +5 -4
- package/dist/main/src/client/Client.js.map +1 -1
- package/dist/main/src/core/MessageUtils.d.ts +1 -0
- package/dist/main/src/core/MessageUtils.js +7 -1
- package/dist/main/src/core/MessageUtils.js.map +1 -1
- package/dist/web/buttplug.js +6 -6
- package/dist/web/buttplug.mjs +398 -394
- package/dist/web/core/MessageUtils.d.ts +1 -0
- package/package.json +21 -21
- package/src/client/ButtplugClientDevice.ts +4 -3
- package/src/client/Client.ts +5 -4
- package/src/core/MessageUtils.ts +8 -0
- package/src/utils/ButtplugBrowserWebsocketConnector.ts +25 -28
- package/util/convert_device_config.js +0 -6
|
@@ -6,4 +6,5 @@
|
|
|
6
6
|
* @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.
|
|
7
7
|
*/
|
|
8
8
|
import * as Messages from './Messages';
|
|
9
|
+
export declare function getMessageClassFromMessage(msg: Messages.ButtplugMessage): (new (...args: unknown[]) => Messages.ButtplugMessage) | null;
|
|
9
10
|
export declare function fromJSON(str: any): Messages.ButtplugMessage[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "buttplug",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.2",
|
|
4
4
|
"description": "Buttplug Client Implementation for Typescript/Javascript",
|
|
5
5
|
"homepage": "https://github.com/buttplugio/buttplug-js/",
|
|
6
6
|
"repository": {
|
|
@@ -32,38 +32,38 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"class-transformer": "^0.5.1",
|
|
34
34
|
"eventemitter3": "^5.0.1",
|
|
35
|
-
"reflect-metadata": "^0.1
|
|
36
|
-
"ws": "^8.
|
|
35
|
+
"reflect-metadata": "^0.2.1",
|
|
36
|
+
"ws": "^8.16.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/commander": "^2.12.2",
|
|
40
|
-
"@types/expect-puppeteer": "^5.0.
|
|
41
|
-
"@types/jest": "^29.5.
|
|
42
|
-
"@types/jest-environment-puppeteer": "^5.0.
|
|
43
|
-
"@types/node": "^20.
|
|
44
|
-
"@types/uuid-parse": "^1.0.
|
|
45
|
-
"@types/ws": "^8.5.
|
|
46
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
47
|
-
"@typescript-eslint/parser": "^
|
|
40
|
+
"@types/expect-puppeteer": "^5.0.6",
|
|
41
|
+
"@types/jest": "^29.5.12",
|
|
42
|
+
"@types/jest-environment-puppeteer": "^5.0.6",
|
|
43
|
+
"@types/node": "^20.11.24",
|
|
44
|
+
"@types/uuid-parse": "^1.0.2",
|
|
45
|
+
"@types/ws": "^8.5.10",
|
|
46
|
+
"@typescript-eslint/eslint-plugin": "^7.1.0",
|
|
47
|
+
"@typescript-eslint/parser": "^7.1.0",
|
|
48
48
|
"copyfiles": "^2.4.1",
|
|
49
49
|
"cross-env": "^7.0.3",
|
|
50
|
-
"eslint": "^8.
|
|
50
|
+
"eslint": "^8.57.0",
|
|
51
51
|
"eslint-plugin-node": "^11.1.0",
|
|
52
|
-
"gts": "^5.0
|
|
52
|
+
"gts": "^5.2.0",
|
|
53
53
|
"jest": "^29.7.0",
|
|
54
54
|
"mock-socket": "^9.3.1",
|
|
55
55
|
"pkg": "^5.8.1",
|
|
56
|
-
"tmp": "^0.2.
|
|
56
|
+
"tmp": "^0.2.3",
|
|
57
57
|
"trash": "^8.1.1",
|
|
58
58
|
"trash-cli": "^5.0.0",
|
|
59
|
-
"ts-jest": "^29.1.
|
|
60
|
-
"ts-node": "^10.9.
|
|
59
|
+
"ts-jest": "^29.1.2",
|
|
60
|
+
"ts-node": "^10.9.2",
|
|
61
61
|
"tslib": "^2.6.2",
|
|
62
|
-
"typedoc": "^0.25.
|
|
63
|
-
"typescript": "^5.
|
|
64
|
-
"vite": "^
|
|
65
|
-
"vite-plugin-dts": "^3.
|
|
66
|
-
"yarn": "^1.22.
|
|
62
|
+
"typedoc": "^0.25.9",
|
|
63
|
+
"typescript": "^5.3.3",
|
|
64
|
+
"vite": "^5.1.4",
|
|
65
|
+
"vite-plugin-dts": "^3.7.3",
|
|
66
|
+
"yarn": "^1.22.21"
|
|
67
67
|
},
|
|
68
68
|
"jest": {
|
|
69
69
|
"moduleFileExtensions": [
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
ButtplugMessageError,
|
|
15
15
|
} from '../core/Exceptions';
|
|
16
16
|
import { EventEmitter } from 'eventemitter3';
|
|
17
|
+
import { getMessageClassFromMessage } from '../core/MessageUtils';
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Represents an abstract device, capable of taking certain kinds of messages.
|
|
@@ -98,7 +99,7 @@ export class ButtplugClientDevice extends EventEmitter {
|
|
|
98
99
|
msg: Messages.ButtplugDeviceMessage
|
|
99
100
|
): Promise<void> {
|
|
100
101
|
const response = await this.send(msg);
|
|
101
|
-
switch (response
|
|
102
|
+
switch (getMessageClassFromMessage(response)) {
|
|
102
103
|
case Messages.Ok:
|
|
103
104
|
return;
|
|
104
105
|
case Messages.Error:
|
|
@@ -245,7 +246,7 @@ export class ButtplugClientDevice extends EventEmitter {
|
|
|
245
246
|
const response = await this.send(
|
|
246
247
|
new Messages.SensorReadCmd(this.index, sensorIndex, sensorType)
|
|
247
248
|
);
|
|
248
|
-
switch (response
|
|
249
|
+
switch (getMessageClassFromMessage(response)) {
|
|
249
250
|
case Messages.SensorReading:
|
|
250
251
|
return (response as Messages.SensorReading).Data;
|
|
251
252
|
case Messages.Error:
|
|
@@ -323,7 +324,7 @@ export class ButtplugClientDevice extends EventEmitter {
|
|
|
323
324
|
const response = await this.send(
|
|
324
325
|
new Messages.RawReadCmd(this.index, endpoint, expectedLength, timeout)
|
|
325
326
|
);
|
|
326
|
-
switch (response
|
|
327
|
+
switch (getMessageClassFromMessage(response)) {
|
|
327
328
|
case Messages.RawReading:
|
|
328
329
|
return new Uint8Array((response as Messages.RawReading).Data);
|
|
329
330
|
case Messages.Error:
|
package/src/client/Client.ts
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
ButtplugMessageError,
|
|
23
23
|
} from '../core/Exceptions';
|
|
24
24
|
import { ButtplugClientConnectorException } from './ButtplugClientConnectorException';
|
|
25
|
+
import { getMessageClassFromMessage } from '../core/MessageUtils';
|
|
25
26
|
|
|
26
27
|
export class ButtplugClient extends EventEmitter {
|
|
27
28
|
protected _pingTimer: NodeJS.Timeout | null = null;
|
|
@@ -117,7 +118,7 @@ export class ButtplugClient extends EventEmitter {
|
|
|
117
118
|
protected parseMessages = (msgs: Messages.ButtplugMessage[]) => {
|
|
118
119
|
const leftoverMsgs = this._sorter.ParseIncomingMessages(msgs);
|
|
119
120
|
for (const x of leftoverMsgs) {
|
|
120
|
-
switch (x
|
|
121
|
+
switch (getMessageClassFromMessage(x)) {
|
|
121
122
|
case Messages.DeviceAdded: {
|
|
122
123
|
const addedMsg = x as Messages.DeviceAdded;
|
|
123
124
|
const addedDevice = ButtplugClientDevice.fromMsg(
|
|
@@ -154,7 +155,7 @@ export class ButtplugClient extends EventEmitter {
|
|
|
154
155
|
Messages.MESSAGE_SPEC_VERSION
|
|
155
156
|
)
|
|
156
157
|
);
|
|
157
|
-
switch (msg
|
|
158
|
+
switch (getMessageClassFromMessage(msg)) {
|
|
158
159
|
case Messages.ServerInfo: {
|
|
159
160
|
const serverinfo = msg as Messages.ServerInfo;
|
|
160
161
|
this._logger.Info(
|
|
@@ -252,7 +253,7 @@ export class ButtplugClient extends EventEmitter {
|
|
|
252
253
|
msg: Messages.ButtplugMessage
|
|
253
254
|
): Promise<void> => {
|
|
254
255
|
const response = await this.sendMessage(msg);
|
|
255
|
-
switch (response
|
|
256
|
+
switch (getMessageClassFromMessage(response)) {
|
|
256
257
|
case Messages.Ok:
|
|
257
258
|
return;
|
|
258
259
|
case Messages.Error:
|
|
@@ -261,7 +262,7 @@ export class ButtplugClient extends EventEmitter {
|
|
|
261
262
|
throw ButtplugError.LogAndError(
|
|
262
263
|
ButtplugMessageError,
|
|
263
264
|
this._logger,
|
|
264
|
-
`Message type ${response
|
|
265
|
+
`Message type ${getMessageClassFromMessage(response)!.constructor} not handled by SendMsgExpectOk`
|
|
265
266
|
);
|
|
266
267
|
}
|
|
267
268
|
};
|
package/src/core/MessageUtils.ts
CHANGED
|
@@ -21,6 +21,14 @@ function getMessageClass(
|
|
|
21
21
|
return null;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
export function getMessageClassFromMessage(
|
|
25
|
+
msg: Messages.ButtplugMessage
|
|
26
|
+
): (new (...args: unknown[]) => Messages.ButtplugMessage) | null {
|
|
27
|
+
// Making the bold assumption all message classes have the Name static. Should define a
|
|
28
|
+
// requirement for this in the abstract class.
|
|
29
|
+
return getMessageClass(Object.getPrototypeOf(msg).constructor.Name);
|
|
30
|
+
}
|
|
31
|
+
|
|
24
32
|
export function fromJSON(str): Messages.ButtplugMessage[] {
|
|
25
33
|
const msgarray: object[] = JSON.parse(str);
|
|
26
34
|
const msgs: Messages.ButtplugMessage[] = [];
|
|
@@ -25,35 +25,32 @@ export class ButtplugBrowserWebsocketConnector extends EventEmitter {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
public connect = async (): Promise<void> => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
28
|
+
return new Promise<void>((resolve, reject) => {
|
|
29
|
+
const ws = new (this._websocketConstructor ?? WebSocket)(this._url);
|
|
30
|
+
const onErrorCallback = (event: Event) => {reject(event)}
|
|
31
|
+
const onCloseCallback = (event: CloseEvent) => reject(event.reason)
|
|
32
|
+
ws.addEventListener('open', async () => {
|
|
33
|
+
this._ws = ws;
|
|
34
|
+
try {
|
|
35
|
+
await this.initialize();
|
|
36
|
+
this._ws.addEventListener('message', (msg) => {
|
|
37
|
+
this.parseIncomingMessage(msg);
|
|
38
|
+
});
|
|
39
|
+
this._ws.removeEventListener('close', onCloseCallback);
|
|
40
|
+
this._ws.removeEventListener('error', onErrorCallback);
|
|
41
|
+
this._ws.addEventListener('close', this.disconnect);
|
|
42
|
+
resolve();
|
|
43
|
+
} catch (e) {
|
|
44
|
+
reject(e);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// In websockets, our error rarely tells us much, as for security reasons
|
|
48
|
+
// browsers usually only throw Error Code 1006. It's up to those using this
|
|
49
|
+
// library to state what the problem might be.
|
|
50
|
+
|
|
51
|
+
ws.addEventListener('error', onErrorCallback)
|
|
52
|
+
ws.addEventListener('close', onCloseCallback);
|
|
54
53
|
});
|
|
55
|
-
ws.addEventListener('close', conErrorCallback);
|
|
56
|
-
return p;
|
|
57
54
|
};
|
|
58
55
|
|
|
59
56
|
public disconnect = async (): Promise<void> => {
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
var inputfile = './dependencies/buttplug-device-config/buttplug-device-config.yml',
|
|
2
|
-
outputfile = './dependencies/buttplug-device-config/buttplug-device-config.json',
|
|
3
|
-
yaml = require('js-yaml'),
|
|
4
|
-
fs = require('fs'),
|
|
5
|
-
obj = yaml.load(fs.readFileSync(inputfile, {encoding: 'utf-8'}));
|
|
6
|
-
fs.writeFileSync(outputfile, JSON.stringify(obj, null, 2));
|