dualsense-ts 5.1.8 → 5.2.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.
Files changed (62) hide show
  1. package/README.md +15 -9
  2. package/dist/hid/web_hid_provider.d.ts.map +1 -1
  3. package/dist/hid/web_hid_provider.js +2 -1
  4. package/dist/hid/web_hid_provider.js.map +1 -1
  5. package/nodehid_example/debug.ts +66 -0
  6. package/nodehid_example/node-hid.js +1 -0
  7. package/package.json +4 -4
  8. package/src/hid/web_hid_provider.ts +2 -1
  9. package/webhid_example/README.md +8 -0
  10. package/webhid_example/build/404.html +39 -0
  11. package/webhid_example/build/README.md +6 -0
  12. package/webhid_example/build/asset-manifest.json +23 -0
  13. package/webhid_example/build/favicon-16x16.png +0 -0
  14. package/webhid_example/build/favicon-32x32.png +0 -0
  15. package/webhid_example/build/favicon.ico +0 -0
  16. package/webhid_example/build/index.html +1 -0
  17. package/webhid_example/build/logo192.png +0 -0
  18. package/webhid_example/build/logo512.png +0 -0
  19. package/webhid_example/build/manifest.json +25 -0
  20. package/webhid_example/build/robots.txt +3 -0
  21. package/webhid_example/build/site.webmanifest +1 -0
  22. package/webhid_example/build/static/css/main.6dc04a6e.css +2 -0
  23. package/webhid_example/build/static/css/main.6dc04a6e.css.map +1 -0
  24. package/webhid_example/build/static/js/787.b12b0301.chunk.js +2 -0
  25. package/webhid_example/build/static/js/787.b12b0301.chunk.js.map +1 -0
  26. package/webhid_example/build/static/js/main.5428c4b5.js +3 -0
  27. package/webhid_example/build/static/js/main.5428c4b5.js.LICENSE.txt +95 -0
  28. package/webhid_example/build/static/js/main.5428c4b5.js.map +1 -0
  29. package/webhid_example/build/static/media/blueprint-icons-16.14e70b6793c6b84b0760.eot +0 -0
  30. package/webhid_example/build/static/media/blueprint-icons-16.4fdbe723235ba0fc46fb.ttf +0 -0
  31. package/webhid_example/build/static/media/blueprint-icons-16.582f87288ff1d1f0dfae.woff2 +0 -0
  32. package/webhid_example/build/static/media/blueprint-icons-16.f5b1a9d55dd59fe717ab.woff +0 -0
  33. package/webhid_example/build/static/media/blueprint-icons-20.5e8bcc2fa7b81492f163.ttf +0 -0
  34. package/webhid_example/build/static/media/blueprint-icons-20.7f441e84a24ef32d88d9.woff +0 -0
  35. package/webhid_example/build/static/media/blueprint-icons-20.f356a02cac03708c9328.woff2 +0 -0
  36. package/webhid_example/build/static/media/blueprint-icons-20.f7d18295d5c386a1a9b5.eot +0 -0
  37. package/webhid_example/package.json +93 -0
  38. package/webhid_example/public/404.html +39 -0
  39. package/webhid_example/public/README.md +6 -0
  40. package/webhid_example/public/favicon-16x16.png +0 -0
  41. package/webhid_example/public/favicon-32x32.png +0 -0
  42. package/webhid_example/public/favicon.ico +0 -0
  43. package/webhid_example/public/index.html +39 -0
  44. package/webhid_example/public/logo192.png +0 -0
  45. package/webhid_example/public/logo512.png +0 -0
  46. package/webhid_example/public/manifest.json +25 -0
  47. package/webhid_example/public/robots.txt +3 -0
  48. package/webhid_example/public/site.webmanifest +1 -0
  49. package/webhid_example/src/App.tsx +26 -0
  50. package/webhid_example/src/Controller.tsx +32 -0
  51. package/webhid_example/src/hud/ControllerConnection.tsx +91 -0
  52. package/webhid_example/src/hud/RenderedElement.tsx +13 -0
  53. package/webhid_example/src/hud/Reticle.tsx +76 -0
  54. package/webhid_example/src/hud/Spinner.tsx +53 -0
  55. package/webhid_example/src/hud/index.tsx +8 -0
  56. package/webhid_example/src/hud/react-zdog.d.ts +37 -0
  57. package/webhid_example/src/index.css +6 -0
  58. package/webhid_example/src/index.tsx +24 -0
  59. package/webhid_example/src/react-app-env.d.ts +1 -0
  60. package/webhid_example/src/reportWebVitals.ts +15 -0
  61. package/webhid_example/src/setupTests.ts +1 -0
  62. package/webhid_example/tsconfig.json +26 -0
package/README.md CHANGED
@@ -27,7 +27,7 @@ import { Dualsense } from "dualsense-ts";
27
27
  const controller = new Dualsense();
28
28
  ```
29
29
 
30
- If the device becomes disconnected, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection status with `controller.connection` using any of the Input APIs listed in the next section.
30
+ If the device disconnects, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection status with `controller.connection` using any of the Input APIs listed in the next section.
31
31
 
32
32
  ```typescript
33
33
  const connected = controller.connection.active
@@ -37,12 +37,6 @@ controller.connection.on("change", ({ active }) = > {
37
37
  });
38
38
  ```
39
39
 
40
- ### Wired vs Bluetooth
41
-
42
- In node.js, wired and wireless bluetooth connections are supported.
43
-
44
- In the browser, only wireless connections are supported.
45
-
46
40
  ### Input APIs
47
41
 
48
42
  `dualsense-ts` provides several interfaces for reading input:
@@ -69,7 +63,7 @@ controller.touchpad.right.contact.state; // false
69
63
  +controller.touchpad.right.x; // -0.44, -1 to 1
70
64
  ```
71
65
 
72
- - _Callbacks_: Each input is an EventEmitter, or EventTarget that provides `input`, `press`, `release`, and `change` events
66
+ - _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events
73
67
 
74
68
  ```typescript
75
69
  // Change events are triggered only when an input's value changes
@@ -138,7 +132,7 @@ controller.right.trigger.on("change", (trigger) => {
138
132
 
139
133
  ### With React
140
134
 
141
- Creating a controller interface with `new Dualsense()` is too expensive to be done at render time. You can create a [Context](https://reactjs.org/docs/context.html) to share the controller state with your components:
135
+ Check out [the example app](./webhid_example/) for more details.
142
136
 
143
137
  ```typescript
144
138
  // DualsenseContext.tsx
@@ -148,6 +142,18 @@ import { Dualsense } from "dualsense-ts";
148
142
  const controller = new Dualsense();
149
143
  export const DualsenseContext = createContext(controller);
150
144
  DualsenseContext.displayName = "DualsenseContext";
145
+
146
+ controller.connection.on("change", ({ state }) => {
147
+ console.group("dualsense-ts");
148
+ console.log(`Controller ${state ? "" : "dis"}connected`);
149
+ console.groupEnd();
150
+ });
151
+
152
+ controller.hid.on("error", (err) => {
153
+ console.group("dualsense-ts");
154
+ console.log(err);
155
+ console.groupEnd();
156
+ });
151
157
  ```
152
158
 
153
159
  The user will need to grant permission before we can access new devices using the WebHID API. The `Dualsense` class provides a callback that can be used as a handler for `onClick` or [other user-triggered events](https://developer.mozilla.org/en-US/docs/Web/Security/User_activation):
@@ -1 +1 @@
1
- {"version":3,"file":"web_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAY;IACpB,QAAQ,EAAE,OAAO,CAAQ;;IAehC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAc/B;;;;OAIG;IACH,UAAU,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC;IAsBpC,OAAO,IAAI,IAAI;IAIf,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASZ,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,iBAAiB;CA2D7C"}
1
+ {"version":3,"file":"web_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAY;IACpB,QAAQ,EAAE,OAAO,CAAQ;;IAehC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAc/B;;;;OAIG;IACH,UAAU,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC;IAsBpC,OAAO,IAAI,IAAI;IAIf,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASZ,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,iBAAiB;CA4D7C"}
@@ -77,7 +77,8 @@ class WebHIDProvider extends hid_provider_1.HIDProvider {
77
77
  }
78
78
  process(buffer) {
79
79
  // Bluetooth buffer starts with an extra byte
80
- const report = new DataView(buffer.buffer, this.wireless ? 2 : 1);
80
+ this.wireless = buffer.byteLength > 70;
81
+ const report = new DataView(buffer.buffer, this.wireless ? 1 : 0);
81
82
  const mainButtons = report.getUint8(7);
82
83
  const miscButtons = report.getUint8(8);
83
84
  const lastButtons = report.getUint8(9);
@@ -1 +1 @@
1
- {"version":3,"file":"web_hid_provider.js","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web_hid_provider.js","sourceRoot":"","sources":["../../src/hid/web_hid_provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Dualsense } from "../src/dualsense";
2
+ import { TriggerMode } from "../src/hid";
3
+
4
+ function main() {
5
+ try {
6
+ const controller = new Dualsense();
7
+ console.log(`Connected: ${controller.toString()}`);
8
+
9
+ controller.left.trigger.on("change", (trigger) => {
10
+ controller.left.rumble(trigger.magnitude);
11
+ });
12
+
13
+ controller.right.trigger.on("change", (trigger) => {
14
+ controller.right.rumble(trigger.magnitude);
15
+ });
16
+
17
+ controller.triangle.on("press", () => {
18
+ controller.rumble(0.5);
19
+ });
20
+
21
+ controller.triangle.on("release", () => {
22
+ controller.rumble(0);
23
+ });
24
+
25
+ controller.left.analog.on("change", (analog) => {
26
+ const { x, y } = analog;
27
+ const state = {
28
+ Analog: {
29
+ Magnitude: analog.magnitude,
30
+ Direction: analog.direction,
31
+ Force: analog.force,
32
+ Threshold: analog.threshold,
33
+ Deadzone: analog.deadzone,
34
+ X: {
35
+ State: x.state,
36
+ Magnitude: x.magnitude,
37
+ Force: x.force,
38
+ Threshold: x.threshold,
39
+ Deadzone: x.deadzone,
40
+ },
41
+ Y: {
42
+ State: y.state,
43
+ Magnitude: y.magnitude,
44
+ Force: y.force,
45
+ Threshold: y.threshold,
46
+ Deadzone: y.deadzone,
47
+ },
48
+ },
49
+ };
50
+ console.log(state);
51
+ });
52
+
53
+ controller.cross.on("change", (input) => {
54
+ controller.hid.setRightTriggerFeedback(TriggerMode.Pulse, [
55
+ controller.left.analog.direction * 40.5,
56
+ 128,
57
+ controller.right.analog.direction * 40.5,
58
+ ]);
59
+ });
60
+ } catch (err) {
61
+ console.log(err);
62
+ setTimeout(main, 100);
63
+ }
64
+ }
65
+
66
+ main();
@@ -0,0 +1 @@
1
+ module.exports = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dualsense-ts",
3
- "version": "5.1.8",
3
+ "version": "5.2.0",
4
4
  "description": "A natural interface for your DualSense controller, with Typescript",
5
5
  "keywords": [
6
6
  "dualsense",
@@ -45,7 +45,7 @@
45
45
  "coverage": "jest src --coverage --verbose --forceExit",
46
46
  "coverage:watch": "jest src --coverage --verbose --watch",
47
47
  "barrels": "barrelsby -d src -D -l replace -e 'spec.ts$'",
48
- "debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./util/debug.ts"
48
+ "debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./nodehid_example/debug.ts"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "node-hid": "^2.1.1"
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/jest": "^27.5.0",
60
- "@types/node": "^18.0.0",
60
+ "@types/node": "^20.1.4",
61
61
  "@types/node-hid": "^1.3.1",
62
62
  "@types/w3c-web-hid": "^1.0.3",
63
63
  "@typescript-eslint/eslint-plugin": "^5.23.0",
@@ -69,7 +69,7 @@
69
69
  "html-webpack-plugin": "^5.5.0",
70
70
  "jest": "^27.5.1",
71
71
  "node-hid": "^2.1.1",
72
- "prettier": "^2.3.2",
72
+ "prettier": "^3.0.0",
73
73
  "ts-jest": "^27.1.3",
74
74
  "ts-loader": "^9.3.1",
75
75
  "ts-node": "^10.7.0",
@@ -88,7 +88,8 @@ export class WebHIDProvider extends HIDProvider {
88
88
 
89
89
  process(buffer: DataView): DualsenseHIDState {
90
90
  // Bluetooth buffer starts with an extra byte
91
- const report = new DataView(buffer.buffer, this.wireless ? 2 : 1);
91
+ this.wireless = buffer.byteLength > 70;
92
+ const report = new DataView(buffer.buffer, this.wireless ? 1 : 0);
92
93
 
93
94
  const mainButtons = report.getUint8(7);
94
95
  const miscButtons = report.getUint8(8);
@@ -0,0 +1,8 @@
1
+ ## `dualsense-ts` React Example
2
+
3
+ This is a simple example app that uses `dualsense-ts` to build interactive components with React.
4
+
5
+ - [Controller.tsx](./src/Controller.tsx) sets up a context for the controller
6
+ - [App.tsx](./src/App.tsx) provides the controller context to the components
7
+ - [ControllerConnection.tsx](./src/hud/ControllerConnection.tsx) requests permission to use the controller
8
+ - [Reticle.tsx](./src/hud/Reticle.tsx) utilizes inputs from the controller
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>noskop</title>
6
+ <script type="text/javascript">
7
+ // Single Page Apps for GitHub Pages
8
+ // MIT License
9
+ // https://github.com/rafgraph/spa-github-pages
10
+ // This script takes the current url and converts the path and query
11
+ // string into just a query string, and then redirects the browser
12
+ // to the new url with only a query string and hash fragment,
13
+ // e.g. https://www.foo.tld/one/two?a=b&c=d#qwe, becomes
14
+ // https://www.foo.tld/?/one/two&a=b~and~c=d#qwe
15
+ // Note: this 404.html file must be at least 512 bytes for it to work
16
+ // with Internet Explorer (it is currently > 512 bytes)
17
+
18
+ // If you're creating a Project Pages site and NOT using a custom domain,
19
+ // then set pathSegmentsToKeep to 1 (enterprise users may need to set it to > 1).
20
+ // This way the code will only replace the route part of the path, and not
21
+ // the real directory in which the app resides, for example:
22
+ // https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes
23
+ // https://username.github.io/repo-name/?/one/two&a=b~and~c=d#qwe
24
+ // Otherwise, leave pathSegmentsToKeep as 0.
25
+ var pathSegmentsToKeep = 0;
26
+
27
+ var l = window.location;
28
+ l.replace(
29
+ l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
30
+ l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') + '/?/' +
31
+ l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
32
+ (l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
33
+ l.hash
34
+ );
35
+ </script>
36
+ </head>
37
+ <body>
38
+ </body>
39
+ </html>
@@ -0,0 +1,6 @@
1
+ The favicon was generated using the following graphics from Twitter Twemoji:
2
+
3
+ - Graphics Title: 1f52c.svg
4
+ - Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji)
5
+ - Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f52c.svg
6
+ - Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)
@@ -0,0 +1,23 @@
1
+ {
2
+ "files": {
3
+ "main.css": "/static/css/main.6dc04a6e.css",
4
+ "main.js": "/static/js/main.5428c4b5.js",
5
+ "static/js/787.b12b0301.chunk.js": "/static/js/787.b12b0301.chunk.js",
6
+ "static/media/blueprint-icons-20.eot?": "/static/media/blueprint-icons-20.f7d18295d5c386a1a9b5.eot",
7
+ "static/media/blueprint-icons-20.ttf?": "/static/media/blueprint-icons-20.5e8bcc2fa7b81492f163.ttf",
8
+ "static/media/blueprint-icons-16.eot?": "/static/media/blueprint-icons-16.14e70b6793c6b84b0760.eot",
9
+ "static/media/blueprint-icons-16.ttf?": "/static/media/blueprint-icons-16.4fdbe723235ba0fc46fb.ttf",
10
+ "static/media/blueprint-icons-20.woff?": "/static/media/blueprint-icons-20.7f441e84a24ef32d88d9.woff",
11
+ "static/media/blueprint-icons-16.woff?": "/static/media/blueprint-icons-16.f5b1a9d55dd59fe717ab.woff",
12
+ "static/media/blueprint-icons-20.woff2?": "/static/media/blueprint-icons-20.f356a02cac03708c9328.woff2",
13
+ "static/media/blueprint-icons-16.woff2?": "/static/media/blueprint-icons-16.582f87288ff1d1f0dfae.woff2",
14
+ "index.html": "/index.html",
15
+ "main.6dc04a6e.css.map": "/static/css/main.6dc04a6e.css.map",
16
+ "main.5428c4b5.js.map": "/static/js/main.5428c4b5.js.map",
17
+ "787.b12b0301.chunk.js.map": "/static/js/787.b12b0301.chunk.js.map"
18
+ },
19
+ "entrypoints": [
20
+ "static/css/main.6dc04a6e.css",
21
+ "static/js/main.5428c4b5.js"
22
+ ]
23
+ }
Binary file
@@ -0,0 +1 @@
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/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><title>dualsense-ts</title><script defer="defer" src="/static/js/main.5428c4b5.js"></script><link href="/static/css/main.6dc04a6e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
Binary file
Binary file
@@ -0,0 +1,25 @@
1
+ {
2
+ "short_name": "dualsense-ts",
3
+ "name": "dualsense-ts example app",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ },
10
+ {
11
+ "src": "logo192.png",
12
+ "type": "image/png",
13
+ "sizes": "192x192"
14
+ },
15
+ {
16
+ "src": "logo512.png",
17
+ "type": "image/png",
18
+ "sizes": "512x512"
19
+ }
20
+ ],
21
+ "start_url": ".",
22
+ "display": "standalone",
23
+ "theme_color": "#000000",
24
+ "background_color": "#ffffff"
25
+ }
@@ -0,0 +1,3 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
@@ -0,0 +1 @@
1
+ {"name":"noskop","short_name":"noskop","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}