dualsense-ts 6.4.0 → 6.5.0
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 +8 -0
- package/SECURITY.md +24 -0
- package/dist/input.d.ts +6 -0
- package/dist/input.d.ts.map +1 -1
- package/dist/input.js +24 -0
- package/dist/input.js.map +1 -1
- package/nodehid_example/single.ts +29 -23
- package/package.json +1 -1
- package/src/input.ts +25 -0
- package/webhid_example/build/asset-manifest.json +3 -3
- package/webhid_example/build/index.html +1 -1
- package/webhid_example/build/static/js/main.2ba4cfae.js +3 -0
- package/webhid_example/build/static/js/main.2ba4cfae.js.map +1 -0
- package/webhid_example/build/static/js/main.1c1a2c23.js +0 -3
- package/webhid_example/build/static/js/main.1c1a2c23.js.map +0 -1
- /package/webhid_example/build/static/js/{main.1c1a2c23.js.LICENSE.txt → main.2ba4cfae.js.LICENSE.txt} +0 -0
package/README.md
CHANGED
|
@@ -110,6 +110,14 @@ controller.dpad.on("press", (dpad, input) =>
|
|
|
110
110
|
// Your Dualsense may provide over 250 `input` events per second, so use this sparingly
|
|
111
111
|
// These events are not available for nested inputs, like the example above
|
|
112
112
|
controller.left.analog.x.on("input", console.log)
|
|
113
|
+
|
|
114
|
+
// Remove a specific listener
|
|
115
|
+
const handler = ({ active }) => console.log(active);
|
|
116
|
+
controller.cross.on("press", handler);
|
|
117
|
+
controller.cross.off("press", handler);
|
|
118
|
+
|
|
119
|
+
// Remove all listeners for an event
|
|
120
|
+
controller.cross.removeAllListeners("press");
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
- _Promises_: Wait for one-off inputs using `await`:
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Only the latest published version of `dualsense-ts` receives security updates.
|
|
6
|
+
|
|
7
|
+
## Reporting a Vulnerability
|
|
8
|
+
|
|
9
|
+
If you discover a security vulnerability, please report it privately via [GitHub Security Advisories](https://github.com/nsfm/dualsense-ts/security/advisories/new).
|
|
10
|
+
|
|
11
|
+
Do not open a public issue for security vulnerabilities.
|
|
12
|
+
|
|
13
|
+
## Dependencies
|
|
14
|
+
|
|
15
|
+
`dualsense-ts` is committed to remaining a zero-dependency package, minimizing risk surface area. The peer dependency on `node-hid` is the only exception - please review their security standards before implementing `dualsense-ts` in node.js.
|
|
16
|
+
|
|
17
|
+
## Scope
|
|
18
|
+
|
|
19
|
+
`dualsense-ts` communicates with HID devices via WebHID (browser) and `node-hid` (Node.js). It does not make network requests, store credentials, or process untrusted input beyond raw HID reports from physically connected controllers.
|
|
20
|
+
|
|
21
|
+
Security concerns most likely to be relevant:
|
|
22
|
+
|
|
23
|
+
- Malformed HID report parsing leading to unexpected behavior
|
|
24
|
+
- Dependency vulnerabilities in `node-hid` or dev tooling
|
package/dist/input.d.ts
CHANGED
|
@@ -56,6 +56,12 @@ export declare abstract class Input<Type> implements AsyncIterator<Input<Type>>
|
|
|
56
56
|
abstract get active(): boolean;
|
|
57
57
|
/** Register a callback to recieve state updates from this Input */
|
|
58
58
|
on(event: InputEventType, listener: InputCallback<this>): this;
|
|
59
|
+
/** Remove a specific callback registered with `on` */
|
|
60
|
+
off(event: InputEventType, listener: InputCallback<this>): this;
|
|
61
|
+
/** Alias for `off` */
|
|
62
|
+
removeListener(event: InputEventType, listener: InputCallback<this>): this;
|
|
63
|
+
/** Remove all listeners for a given event, or all events if none specified */
|
|
64
|
+
removeAllListeners(event?: InputEventType): this;
|
|
59
65
|
/** Register a callback to recieve the next specified update */
|
|
60
66
|
once(event: InputChangeType, listener: InputCallback<this>): this;
|
|
61
67
|
/** Notify listeners and parents of a state change */
|
package/dist/input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
package/dist/input.js
CHANGED
|
@@ -73,6 +73,30 @@ class Input {
|
|
|
73
73
|
listeners.push(listener);
|
|
74
74
|
return this;
|
|
75
75
|
}
|
|
76
|
+
/** Remove a specific callback registered with `on` */
|
|
77
|
+
off(event, listener) {
|
|
78
|
+
const listeners = this[InputOns].get(event);
|
|
79
|
+
if (listeners) {
|
|
80
|
+
const idx = listeners.indexOf(listener);
|
|
81
|
+
if (idx !== -1)
|
|
82
|
+
listeners.splice(idx, 1);
|
|
83
|
+
}
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
/** Alias for `off` */
|
|
87
|
+
removeListener(event, listener) {
|
|
88
|
+
return this.off(event, listener);
|
|
89
|
+
}
|
|
90
|
+
/** Remove all listeners for a given event, or all events if none specified */
|
|
91
|
+
removeAllListeners(event) {
|
|
92
|
+
if (event) {
|
|
93
|
+
this[InputOns].set(event, []);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this[InputOns] = new Map();
|
|
97
|
+
}
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
76
100
|
/** Register a callback to recieve the next specified update */
|
|
77
101
|
once(event, listener) {
|
|
78
102
|
const listeners = this[InputOnces].get(event);
|
package/dist/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":";;;;AACA,+CAIuB;AA2BvB,kEAAkE;AACrD,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC/D,yDAAyD;AAC5C,QAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3C,gDAAgD;AACnC,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7C,iDAAiD;AACpC,QAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAE7C,iEAAiE;AACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,uEAAuE;AACvE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,yDAAyD;AACzD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,oDAAoD;AACpD,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAC5C,oEAAoE;AACpE,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAsB,KAAK;IAkBzB,YAAY,SAAsB,EAAE;QAjBpB,OAAE,mCAA4B;QAE9C,2EAA2E;QACpE,cAAS,GAAW,CAAC,CAAC;QAE7B,mEAAmE;QAC5D,aAAQ,GAAW,CAAC,CAAC;QAK5B,6BAA6B;QACrB,QAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;QAEtE,mDAAmD;QAC3C,QAAY,GAAG,IAAI,GAAG,EAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,24 +20,14 @@ function main() {
|
|
|
20
20
|
}`,
|
|
21
21
|
);
|
|
22
22
|
if (state) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
const fi = controller.factoryInfo;
|
|
33
|
-
if (fi) {
|
|
34
|
-
console.log(
|
|
35
|
-
`Factory: ${fi.colorName ?? fi.colorCode} | ${fi.boardRevision ?? "unknown board"} | Serial: ${fi.serialNumber}`,
|
|
36
|
-
);
|
|
37
|
-
} else {
|
|
38
|
-
console.log("Failed to query device factory info");
|
|
39
|
-
}
|
|
40
|
-
}, 2000);
|
|
23
|
+
const fw = controller.firmwareInfo;
|
|
24
|
+
console.log(
|
|
25
|
+
`Firmware: v${formatFirmwareVersion(fw.mainFirmwareVersion)} | HW: ${fw.hardwareInfo} | DSP: ${fw.dspFirmwareVersion} | Built: ${fw.buildDate} ${fw.buildTime}`,
|
|
26
|
+
);
|
|
27
|
+
const fi = controller.factoryInfo;
|
|
28
|
+
console.log(
|
|
29
|
+
`Factory: ${fi.colorName} | ${fi.boardRevision} | Serial: ${fi.serialNumber}`,
|
|
30
|
+
);
|
|
41
31
|
}
|
|
42
32
|
});
|
|
43
33
|
|
|
@@ -208,17 +198,33 @@ function main() {
|
|
|
208
198
|
console.log(`Headphone: ${state ? "connected" : "disconnected"}`);
|
|
209
199
|
});
|
|
210
200
|
|
|
211
|
-
//
|
|
212
|
-
controller.left.analog
|
|
201
|
+
// Demonstrate listener removal: PS button toggles stick logging
|
|
202
|
+
const leftStickHandler = (analog: typeof controller.left.analog) => {
|
|
213
203
|
console.log(
|
|
214
204
|
`Left — x: ${analog.x.state.toFixed(2)}, y: ${analog.y.state.toFixed(2)}`,
|
|
215
205
|
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
controller.right.analog.on("change", (analog) => {
|
|
206
|
+
};
|
|
207
|
+
const rightStickHandler = (analog: typeof controller.right.analog) => {
|
|
219
208
|
console.log(
|
|
220
209
|
`Right — x: ${analog.x.state.toFixed(2)}, y: ${analog.y.state.toFixed(2)}`,
|
|
221
210
|
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
let stickLogging = true;
|
|
214
|
+
controller.left.analog.on("change", leftStickHandler);
|
|
215
|
+
controller.right.analog.on("change", rightStickHandler);
|
|
216
|
+
|
|
217
|
+
controller.ps.on("press", () => {
|
|
218
|
+
stickLogging = !stickLogging;
|
|
219
|
+
if (stickLogging) {
|
|
220
|
+
controller.left.analog.on("change", leftStickHandler);
|
|
221
|
+
controller.right.analog.on("change", rightStickHandler);
|
|
222
|
+
console.log("Stick logging: on");
|
|
223
|
+
} else {
|
|
224
|
+
controller.left.analog.off("change", leftStickHandler);
|
|
225
|
+
controller.right.analog.off("change", rightStickHandler);
|
|
226
|
+
console.log("Stick logging: off");
|
|
227
|
+
}
|
|
222
228
|
});
|
|
223
229
|
}
|
|
224
230
|
|
package/package.json
CHANGED
package/src/input.ts
CHANGED
|
@@ -103,6 +103,31 @@ export abstract class Input<Type> implements AsyncIterator<Input<Type>> {
|
|
|
103
103
|
return this;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
/** Remove a specific callback registered with `on` */
|
|
107
|
+
public off(event: InputEventType, listener: InputCallback<this>): this {
|
|
108
|
+
const listeners = this[InputOns].get(event);
|
|
109
|
+
if (listeners) {
|
|
110
|
+
const idx = listeners.indexOf(listener);
|
|
111
|
+
if (idx !== -1) listeners.splice(idx, 1);
|
|
112
|
+
}
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Alias for `off` */
|
|
117
|
+
public removeListener(event: InputEventType, listener: InputCallback<this>): this {
|
|
118
|
+
return this.off(event, listener);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Remove all listeners for a given event, or all events if none specified */
|
|
122
|
+
public removeAllListeners(event?: InputEventType): this {
|
|
123
|
+
if (event) {
|
|
124
|
+
this[InputOns].set(event, []);
|
|
125
|
+
} else {
|
|
126
|
+
this[InputOns] = new Map();
|
|
127
|
+
}
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
|
|
106
131
|
/** Register a callback to recieve the next specified update */
|
|
107
132
|
public once(event: InputChangeType, listener: InputCallback<this>): this {
|
|
108
133
|
const listeners = this[InputOnces].get(event);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "/dualsense-ts/static/css/main.9393bbb9.css",
|
|
4
|
-
"main.js": "/dualsense-ts/static/js/main.
|
|
4
|
+
"main.js": "/dualsense-ts/static/js/main.2ba4cfae.js",
|
|
5
5
|
"blueprint-icons-all-paths-loader.js": "/dualsense-ts/static/js/blueprint-icons-all-paths-loader.53883a20.chunk.js",
|
|
6
6
|
"blueprint-icons-split-paths-by-size-loader.js": "/dualsense-ts/static/js/blueprint-icons-split-paths-by-size-loader.6d8a31ce.chunk.js",
|
|
7
7
|
"static/js/787.b12b0301.chunk.js": "/dualsense-ts/static/js/787.b12b0301.chunk.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"static/media/blueprint-icons-16.woff2?": "/dualsense-ts/static/media/blueprint-icons-16.582f87288ff1d1f0dfae.woff2",
|
|
19
19
|
"index.html": "/dualsense-ts/index.html",
|
|
20
20
|
"main.9393bbb9.css.map": "/dualsense-ts/static/css/main.9393bbb9.css.map",
|
|
21
|
-
"main.
|
|
21
|
+
"main.2ba4cfae.js.map": "/dualsense-ts/static/js/main.2ba4cfae.js.map",
|
|
22
22
|
"blueprint-icons-all-paths-loader.53883a20.chunk.js.map": "/dualsense-ts/static/js/blueprint-icons-all-paths-loader.53883a20.chunk.js.map",
|
|
23
23
|
"blueprint-icons-split-paths-by-size-loader.6d8a31ce.chunk.js.map": "/dualsense-ts/static/js/blueprint-icons-split-paths-by-size-loader.6d8a31ce.chunk.js.map",
|
|
24
24
|
"787.b12b0301.chunk.js.map": "/dualsense-ts/static/js/787.b12b0301.chunk.js.map",
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
},
|
|
29
29
|
"entrypoints": [
|
|
30
30
|
"static/css/main.9393bbb9.css",
|
|
31
|
-
"static/js/main.
|
|
31
|
+
"static/js/main.2ba4cfae.js"
|
|
32
32
|
]
|
|
33
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/dualsense-ts/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#1a1a2e"/><title>dualsense-ts — PS5 DualSense Controller for TypeScript</title><meta name="description" content="Interactive WebHID demo for dualsense-ts. Connect a PS5 DualSense controller to your browser and control rumble, trigger effects, lightbar, player LEDs, and more."/><meta name="keywords" content="dualsense, ps5, controller, webhid, typescript, gamepad, haptics, trigger effects, lightbar, rumble"/><meta name="author" content="nsfm"/><meta name="robots" content="index, follow"/><meta property="og:type" content="website"/><meta property="og:title" content="dualsense-ts — PS5 DualSense Controller for TypeScript"/><meta property="og:description" content="Connect a PS5 DualSense controller to your browser. Control rumble, adaptive triggers, lightbar, player LEDs, and read every input in real time."/><meta property="og:url" content="https://nsfm.github.io/dualsense-ts/"/><meta property="og:site_name" content="dualsense-ts"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="dualsense-ts — PS5 DualSense Controller for TypeScript"/><meta name="twitter:description" content="Interactive WebHID demo. Connect a DualSense controller to your browser and control every feature in real time."/><link rel="canonical" href="https://nsfm.github.io/dualsense-ts/"/><link rel="manifest" href="/dualsense-ts/manifest.json"/><script type="text/javascript">!function(n){if("/"===n.search[1]){var a=n.search.slice(1).split("&").map((function(n){return n.replace(/~and~/g,"&")})).join("?");window.history.replaceState(null,null,n.pathname.slice(0,-1)+a+n.hash)}}(window.location)</script><script defer="defer" src="/dualsense-ts/static/js/main.
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/dualsense-ts/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#1a1a2e"/><title>dualsense-ts — PS5 DualSense Controller for TypeScript</title><meta name="description" content="Interactive WebHID demo for dualsense-ts. Connect a PS5 DualSense controller to your browser and control rumble, trigger effects, lightbar, player LEDs, and more."/><meta name="keywords" content="dualsense, ps5, controller, webhid, typescript, gamepad, haptics, trigger effects, lightbar, rumble"/><meta name="author" content="nsfm"/><meta name="robots" content="index, follow"/><meta property="og:type" content="website"/><meta property="og:title" content="dualsense-ts — PS5 DualSense Controller for TypeScript"/><meta property="og:description" content="Connect a PS5 DualSense controller to your browser. Control rumble, adaptive triggers, lightbar, player LEDs, and read every input in real time."/><meta property="og:url" content="https://nsfm.github.io/dualsense-ts/"/><meta property="og:site_name" content="dualsense-ts"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="dualsense-ts — PS5 DualSense Controller for TypeScript"/><meta name="twitter:description" content="Interactive WebHID demo. Connect a DualSense controller to your browser and control every feature in real time."/><link rel="canonical" href="https://nsfm.github.io/dualsense-ts/"/><link rel="manifest" href="/dualsense-ts/manifest.json"/><script type="text/javascript">!function(n){if("/"===n.search[1]){var a=n.search.slice(1).split("&").map((function(n){return n.replace(/~and~/g,"&")})).join("?");window.history.replaceState(null,null,n.pathname.slice(0,-1)+a+n.hash)}}(window.location)</script><script defer="defer" src="/dualsense-ts/static/js/main.2ba4cfae.js"></script><link href="/dualsense-ts/static/css/main.9393bbb9.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|