dualsense-ts 4.0.0 → 5.0.1

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.
@@ -0,0 +1,21 @@
1
+ # Migration Guide
2
+
3
+ ### v4 to v5
4
+
5
+ `node-hid` is now an optional peer dependency, simplifying the use of this library in the browser.
6
+
7
+ Node.js users will need to add `node-hid` as a dependency.
8
+
9
+ ### v3 to v4
10
+
11
+ The constructor no longer throws when a Dualsense controller is unavailable. It will keep attempting to connect in the background. A new input is provided for monitoring the connection state.
12
+
13
+ ### v2 to v3
14
+
15
+ In v2, inputs were EventEmitters. In v3 a new, similar class is used, but the API differs slightly.
16
+
17
+ If you are using unavailable EventEmitter features or relying on `instanceof EventEmitter`, you will need to refactor accordingly.
18
+
19
+ ### v1 to v2
20
+
21
+ Version 2 adds an abstraction over the `node-hid` interface; if you were accessing it directly, you'll need to refactor accordingly.
package/README.md CHANGED
@@ -6,40 +6,40 @@ This module provides a natural interface for your DualSense controller.
6
6
 
7
7
  ### Installation
8
8
 
9
- This package is distributed via npm: [dualsense-ts](https://npmjs.org/package.dualsense-ts)
10
-
11
- Install it using your preferred package manager:
9
+ [This package is distributed via npm](https://npmjs.org/package.dualsense-ts). Install it the usual way:
12
10
 
13
11
  - `yarn add dualsense-ts`
14
12
  - `npm add dualsense-ts`
15
13
 
16
- ### Platforms
14
+ In the browser, `dualsense-ts` has zero dependencies and relies on the native WebHID interface.
17
15
 
18
- `dualsense-ts` is a cross-platform, low dependency library that works in Node.js or natively in your browser.
16
+ In Node.js, `dualsense-ts` relies on `node-hid`, so you'll need to add that as well:
19
17
 
20
- - In Node.js, the only dependency is `node-hid`
21
- - In the browser, tree-shaking reduces this to a zero-dependency package relying on WebHID
18
+ - `yarn add node-hid`
19
+ - `npm add node-hid`
22
20
 
23
21
  ### Connecting
24
22
 
25
- When you construct a controller, `dualsense-ts` will start to manage a device connection in the background.
23
+ When you construct a `new Dualsense()`, the connection to your controller will be managed in the background.
26
24
 
27
25
  ```typescript
28
26
  import { Dualsense } from "dualsense-ts";
29
27
 
30
28
  // Grab a controller connected via USB or Bluetooth
31
29
  const controller = new Dualsense();
30
+ ```
31
+
32
+ If your device becomes disconnected, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection state using the same APIs as any other input:
32
33
 
33
- // Monitor the connection state
34
+ ```typescript
34
35
  const connected = controller.connection.active
36
+
35
37
  controller.connection.on("change", ({ active }) = > {
36
38
  console.log(`controller ${active ? '' : 'dis'}connected`)
37
39
  });
38
40
  ```
39
41
 
40
- When controller is disconnected, `dualsense-ts` will quietly wait for a new one. The API is totally connection-agnostic, keeping your code clean by making type safety easy.
41
-
42
- ### Input
42
+ ### Input APIs
43
43
 
44
44
  `dualsense-ts` provides several interfaces for reading input:
45
45
 
@@ -112,9 +112,43 @@ for await (const { pressure } of controller.left.trigger) {
112
112
  }
113
113
  ```
114
114
 
115
- ## Other features
115
+ ### React
116
+
117
+ Set up a context for your controller:
118
+
119
+ ```typescript
120
+ // Controller.tsx
121
+ import React from "react";
122
+ import { Dualsense } from "dualsense-ts";
123
+
124
+ export const ControllerContext = React.createContext<Dualsense>(
125
+ new Dualsense()
126
+ );
127
+ ```
128
+
129
+ Use the context to set up your component:
130
+
131
+ ```typescript
132
+ // MyButton.tsx
133
+ import React from "react";
134
+ import { ControllerContext } from "./Controller.tsx";
135
+
136
+ // A button that's only active while the user is holding triangle on the controller
137
+ export const MyButton = () => {
138
+ const { state: controller } = React.useContext(ControllerContext);
139
+ const [triangle, setTriangle] = React.useState(controller.triangle);
140
+ React.useCallback(
141
+ () => triangle.on("change", (new) => setTriangle(new)),
142
+ [triangle]
143
+ );
144
+
145
+ return <button active={triangle.active}>
146
+ }
147
+ ```
148
+
149
+ ## Migration Guide
116
150
 
117
- Check out the [roadmap](./ROADMAP.md) for more info about upcoming features.
151
+ `dualsense-ts` uses semantic versioning. For more info on breaking changes, [check out the migration guide](MIGRATION_GUIDE.md).
118
152
 
119
153
  ## Credits
120
154
 
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAGb,MAAM,OAAO,CAAC;AAEf,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD;;OAEG;IACH,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAE1B,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC7C,SAAgB,KAAK,EAAE,SAAS,CAAQ;IAExC,SAAgB,EAAE,EAAE,SAAS,CAAC;IAC9B,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAElC,SAAgB,QAAQ,EAAE,SAAS,CAAC;IACpC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,SAAgB,KAAK,EAAE,SAAS,CAAC;IACjC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAElC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAC/B,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAEhC,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAEnC;;OAEG;IACH,SAAgB,GAAG,EAAE,YAAY,CAAC;IAElC;;OAEG;IACH,SAAgB,UAAU,EAAE,SAAS,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAI3B;gBAEW,MAAM,GAAE,eAAoB;IAiGxC;;OAEG;IACH,OAAO,CAAC,UAAU;CAwCnB"}
1
+ {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAGb,MAAM,OAAO,CAAC;AAEf,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD;;OAEG;IACH,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAE1B,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC7C,SAAgB,KAAK,EAAE,SAAS,CAAQ;IAExC,SAAgB,EAAE,EAAE,SAAS,CAAC;IAC9B,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAElC,SAAgB,QAAQ,EAAE,SAAS,CAAC;IACpC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,SAAgB,KAAK,EAAE,SAAS,CAAC;IACjC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAElC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAC/B,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAEhC,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAEnC;;OAEG;IACH,SAAgB,GAAG,EAAE,YAAY,CAAC;IAElC;;OAEG;IACH,SAAgB,UAAU,EAAE,SAAS,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAI3B;gBAEW,MAAM,GAAE,eAAoB;IAyFxC;;OAEG;IACH,OAAO,CAAC,UAAU;CAwCnB"}
package/dist/dualsense.js CHANGED
@@ -86,17 +86,10 @@ class Dualsense extends input_1.Input {
86
86
  if (this.hid) {
87
87
  const { provider: { connected }, } = hid;
88
88
  this.connection[input_1.InputSet](connected);
89
- if (!connected) {
90
- try {
91
- this.hid.provider.connect();
92
- this.connection[input_1.InputSet](true);
93
- }
94
- catch {
95
- this.connection[input_1.InputSet](false);
96
- }
97
- }
89
+ if (!connected)
90
+ this.hid.provider.connect();
98
91
  }
99
- }, 100);
92
+ }, 200);
100
93
  }
101
94
  get active() {
102
95
  return Object.values(this).some((input) => input !== this && input instanceof input_1.Input && input.active);
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { HIDProvider, DualsenseHIDState } from "./hid_provider";
2
2
  export declare type HIDCallback = (state: DualsenseHIDState) => void;
3
+ export declare type ErrorCallback = (error: Error) => void;
3
4
  /**
4
5
  * Coordinates a HIDProvider and tracks the latest HID state.
5
6
  */
6
7
  export declare class DualsenseHID {
7
8
  readonly provider: HIDProvider;
8
9
  private readonly subscribers;
10
+ private readonly errorSubscribers;
9
11
  state: DualsenseHIDState;
10
12
  constructor(provider: HIDProvider);
11
13
  /**
@@ -16,6 +18,7 @@ export declare class DualsenseHID {
16
18
  * Cancel a previously registered handler.
17
19
  */
18
20
  unregister(callback: (state: DualsenseHIDState) => void): void;
21
+ on(type: "data" | "error", callback: ErrorCallback): void;
19
22
  private set;
20
23
  private handleError;
21
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense_hid.d.ts","sourceRoot":"","sources":["../../src/hid/dualsense_hid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAW,MAAM,gBAAgB,CAAC;AAEzE,oBAAY,WAAW,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAE7D;;GAEG;AACH,qBAAa,YAAY;IA+CX,QAAQ,CAAC,QAAQ,EAAE,WAAW;IA9C1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IAE/C,KAAK,EAAE,iBAAiB,CA0C7B;gBAEmB,QAAQ,EAAE,WAAW;IAK1C;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAInE;;OAEG;IACI,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAIrE,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,WAAW;CAOpB"}
1
+ {"version":3,"file":"dualsense_hid.d.ts","sourceRoot":"","sources":["../../src/hid/dualsense_hid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAW,MAAM,gBAAgB,CAAC;AAEzE,oBAAY,WAAW,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAC7D,oBAAY,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAEnD;;GAEG;AACH,qBAAa,YAAY;IAgDX,QAAQ,CAAC,QAAQ,EAAE,WAAW;IA/C1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4B;IAEtD,KAAK,EAAE,iBAAiB,CA0C7B;gBAEmB,QAAQ,EAAE,WAAW;IAK1C;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAInE;;OAEG;IACI,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAI9D,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIhE,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,WAAW;CAOpB"}
@@ -8,6 +8,7 @@ class DualsenseHID {
8
8
  constructor(provider) {
9
9
  this.provider = provider;
10
10
  this.subscribers = new Set();
11
+ this.errorSubscribers = new Set();
11
12
  this.state = {
12
13
  ["LX" /* InputId.LeftAnalogX */]: 0,
13
14
  ["LY" /* InputId.LeftAnalogY */]: 0,
@@ -66,12 +67,16 @@ class DualsenseHID {
66
67
  unregister(callback) {
67
68
  this.subscribers.delete(callback);
68
69
  }
70
+ on(type, callback) {
71
+ if (type === "error")
72
+ this.errorSubscribers.add(callback);
73
+ }
69
74
  set(state) {
70
75
  this.state = state;
71
76
  this.subscribers.forEach((callback) => callback(state));
72
77
  }
73
78
  handleError(error) {
74
- console.error(error);
79
+ this.errorSubscribers.forEach((callback) => callback(error));
75
80
  setTimeout(() => {
76
81
  this.provider.disconnect();
77
82
  this.provider.connect();
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense_hid.js","sourceRoot":"","sources":["../../src/hid/dualsense_hid.ts"],"names":[],"mappings":";;;AAIA;;GAEG;AACH,MAAa,YAAY;IA+CvB,YAAqB,QAAqB;QAArB,aAAQ,GAAR,QAAQ,CAAa;QA9CzB,gBAAW,GAAG,IAAI,GAAG,EAAe,CAAC;QAE/C,UAAK,GAAsB;YAChC,gCAAqB,EAAE,CAAC;YACxB,gCAAqB,EAAE,CAAC;YACxB,iCAAsB,EAAE,CAAC;YACzB,iCAAsB,EAAE,CAAC;YACzB,gCAAqB,EAAE,CAAC;YACxB,iCAAsB,EAAE,CAAC;YACzB,mCAAkB,EAAE,KAAK;YACzB,+BAAgB,EAAE,KAAK;YACvB,6BAAe,EAAE,KAAK;YACtB,+BAAgB,EAAE,KAAK;YACvB,2BAAc,EAAE,CAAC;YACjB,uBAAY,EAAE,KAAK;YACnB,2BAAc,EAAE,KAAK;YACrB,2BAAc,EAAE,KAAK;YACrB,6BAAe,EAAE,KAAK;YACtB,sCAA2B,EAAE,KAAK;YAClC,qCAA0B,EAAE,KAAK;YACjC,iCAAiB,EAAE,KAAK;YACxB,+BAAgB,EAAE,KAAK;YACvB,6CAA4B,EAAE,KAAK;YACnC,4CAA2B,EAAE,KAAK;YAClC,gCAAqB,EAAE,KAAK;YAC5B,+BAAoB,EAAE,KAAK;YAC3B,yCAAqB,EAAE,KAAK;YAC5B,yCAAqB,EAAE,KAAK;YAC5B,2BAAc,EAAE,KAAK;YACrB,+BAAgB,EAAE,KAAK;YACvB,iCAAiB,EAAE,CAAC;YACpB,iCAAiB,EAAE,CAAC;YACpB,6CAAuB,EAAE,KAAK;YAC9B,mCAAkB,EAAE,CAAC;YACrB,iCAAiB,EAAE,CAAC;YACpB,iCAAiB,EAAE,CAAC;YACpB,6CAAuB,EAAE,KAAK;YAC9B,mCAAkB,EAAE,CAAC;YACrB,6BAAe,EAAE,CAAC;YAClB,6BAAe,EAAE,CAAC;YAClB,6BAAe,EAAE,CAAC;YAClB,+BAAgB,EAAE,CAAC;YACnB,+BAAgB,EAAE,CAAC;YACnB,+BAAgB,EAAE,CAAC;SACpB,CAAC;QAGA,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,QAA4C;QAC1D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,QAA4C;QAC5D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEO,GAAG,CAAC,KAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF;AA9ED,oCA8EC"}
1
+ {"version":3,"file":"dualsense_hid.js","sourceRoot":"","sources":["../../src/hid/dualsense_hid.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { HIDProvider, DualsenseHIDState } from "./hid_provider";
3
3
  export declare class NodeHIDProvider extends HIDProvider {
4
4
  private device?;
5
5
  wireless: boolean;
6
- connect(): void;
6
+ connect(): Promise<void>;
7
7
  get connected(): boolean;
8
8
  disconnect(): void;
9
9
  process(buffer: Buffer): DualsenseHIDState;
@@ -1 +1 @@
1
- {"version":3,"file":"node_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/node_hid_provider.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAM;IACd,QAAQ,EAAE,OAAO,CAAS;IAEjC,OAAO,IAAI,IAAI;IAqBf,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASlB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB;CA2D3C"}
1
+ {"version":3,"file":"node_hid_provider.d.ts","sourceRoot":"","sources":["../../src/hid/node_hid_provider.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAIlB,MAAM,gBAAgB,CAAC;AAOxB,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAU;IAClB,QAAQ,EAAE,OAAO,CAAS;IAE3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C9B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,UAAU,IAAI,IAAI;IASlB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB;CA2D3C"}
@@ -1,27 +1,59 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.NodeHIDProvider = void 0;
4
- const node_hid_1 = require("node-hid");
5
27
  const hid_provider_1 = require("./hid_provider");
6
28
  class NodeHIDProvider extends hid_provider_1.HIDProvider {
7
29
  constructor() {
8
30
  super(...arguments);
9
31
  this.wireless = false;
10
32
  }
11
- connect() {
12
- this.disconnect();
13
- const controllers = (0, node_hid_1.devices)(hid_provider_1.HIDProvider.vendorId, hid_provider_1.HIDProvider.productId);
14
- if (controllers.length === 0 || !controllers[0].path) {
15
- return this.onError(new Error(`No controllers (${(0, node_hid_1.devices)().length} other devices)`));
16
- }
17
- if (controllers[0].interface === -1)
18
- this.wireless = true;
19
- this.device = new node_hid_1.HID(controllers[0].path);
20
- this.device.on("data", (arg) => {
21
- this.onData(this.process(arg));
22
- });
23
- this.device.on("error", (err) => {
24
- this.onError(err);
33
+ async connect() {
34
+ if (typeof window !== undefined)
35
+ return this.onError(new Error("Attempted to use node-hid in browser environment"));
36
+ return Promise.resolve().then(() => __importStar(require("node-hid"))).then(({ HID, devices }) => {
37
+ if (!HID)
38
+ return this.onError(new Error("Failed import of 'node-hid'"));
39
+ this.disconnect();
40
+ const controllers = devices(hid_provider_1.HIDProvider.vendorId, hid_provider_1.HIDProvider.productId);
41
+ if (controllers.length === 0 || !controllers[0].path) {
42
+ return this.onError(new Error(`No controllers (${devices().length} other devices)`));
43
+ }
44
+ if (controllers[0].interface === -1)
45
+ this.wireless = true;
46
+ const device = new HID(controllers[0].path);
47
+ device.on("data", (arg) => {
48
+ this.onData(this.process(arg));
49
+ });
50
+ device.on("error", (err) => {
51
+ this.onError(err);
52
+ });
53
+ this.device = device;
54
+ })
55
+ .catch((err) => {
56
+ this.onError(new Error(`Could not import 'node-hid'. Did you add it?\nError: ${err instanceof Error ? err.message : "???"}`));
25
57
  });
26
58
  }
27
59
  get connected() {
@@ -1 +1 @@
1
- {"version":3,"file":"node_hid_provider.js","sourceRoot":"","sources":["../../src/hid/node_hid_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node_hid_provider.js","sourceRoot":"","sources":["../../src/hid/node_hid_provider.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dualsense-ts",
3
- "version": "4.0.0",
3
+ "version": "5.0.1",
4
4
  "description": "A natural interface for your DualSense controller, with Typescript",
5
5
  "keywords": [
6
6
  "dualsense",
@@ -29,9 +29,11 @@
29
29
  "license": "GPL-3.0",
30
30
  "private": false,
31
31
  "main": "dist/index.js",
32
- "browser": "dist/main.js",
33
32
  "types": "dist/index.d.ts",
34
33
  "sideEffects": false,
34
+ "browser": {
35
+ "node-hid": false
36
+ },
35
37
  "scripts": {
36
38
  "prebuild": "yarn barrels",
37
39
  "build": "tsc --project tsconfig.build.json",
@@ -46,9 +48,14 @@
46
48
  "docs": "typedoc src/index.ts",
47
49
  "debug": "node --inspect --enable-source-maps --experimental-specifier-resolution=node --loader ts-node/esm ./util/debug.ts"
48
50
  },
49
- "dependencies": {
51
+ "peerDependencies": {
50
52
  "node-hid": "^2.1.1"
51
53
  },
54
+ "peerDependenciesMeta": {
55
+ "node-hid": {
56
+ "optional": true
57
+ }
58
+ },
52
59
  "devDependencies": {
53
60
  "@types/jest": "^27.5.0",
54
61
  "@types/node": "^18.0.0",
@@ -62,6 +69,7 @@
62
69
  "eslint-plugin-import": "^2.26.0",
63
70
  "html-webpack-plugin": "^5.5.0",
64
71
  "jest": "^27.5.1",
72
+ "node-hid": "^2.1.1",
65
73
  "prettier": "^2.3.2",
66
74
  "ts-jest": "^27.1.3",
67
75
  "ts-loader": "^9.3.1",
package/src/dualsense.ts CHANGED
@@ -159,17 +159,9 @@ export class Dualsense extends Input<Dualsense> {
159
159
  } = hid;
160
160
 
161
161
  this.connection[InputSet](connected);
162
-
163
- if (!connected) {
164
- try {
165
- this.hid.provider.connect();
166
- this.connection[InputSet](true);
167
- } catch {
168
- this.connection[InputSet](false);
169
- }
170
- }
162
+ if (!connected) this.hid.provider.connect();
171
163
  }
172
- }, 100);
164
+ }, 200);
173
165
  }
174
166
 
175
167
  /**
@@ -1,12 +1,14 @@
1
1
  import { HIDProvider, DualsenseHIDState, InputId } from "./hid_provider";
2
2
 
3
3
  export type HIDCallback = (state: DualsenseHIDState) => void;
4
+ export type ErrorCallback = (error: Error) => void;
4
5
 
5
6
  /**
6
7
  * Coordinates a HIDProvider and tracks the latest HID state.
7
8
  */
8
9
  export class DualsenseHID {
9
10
  private readonly subscribers = new Set<HIDCallback>();
11
+ private readonly errorSubscribers = new Set<ErrorCallback>();
10
12
 
11
13
  public state: DualsenseHIDState = {
12
14
  [InputId.LeftAnalogX]: 0,
@@ -71,13 +73,17 @@ export class DualsenseHID {
71
73
  this.subscribers.delete(callback);
72
74
  }
73
75
 
76
+ public on(type: "data" | "error", callback: ErrorCallback): void {
77
+ if (type === "error") this.errorSubscribers.add(callback);
78
+ }
79
+
74
80
  private set(state: DualsenseHIDState): void {
75
81
  this.state = state;
76
82
  this.subscribers.forEach((callback) => callback(state));
77
83
  }
78
84
 
79
- private handleError(error: unknown): void {
80
- console.error(error);
85
+ private handleError(error: Error): void {
86
+ this.errorSubscribers.forEach((callback) => callback(error));
81
87
  setTimeout(() => {
82
88
  this.provider.disconnect();
83
89
  this.provider.connect();
@@ -1,5 +1,3 @@
1
- import { HID, devices } from "node-hid";
2
-
3
1
  import {
4
2
  HIDProvider,
5
3
  DualsenseHIDState,
@@ -8,29 +6,57 @@ import {
8
6
  mapTrigger,
9
7
  } from "./hid_provider";
10
8
 
9
+ interface HIDable {
10
+ close: () => void;
11
+ removeAllListeners: () => void;
12
+ }
13
+
11
14
  export class NodeHIDProvider extends HIDProvider {
12
- private device?: HID;
15
+ private device?: HIDable;
13
16
  public wireless: boolean = false;
14
17
 
15
- connect(): void {
16
- this.disconnect();
17
-
18
- const controllers = devices(HIDProvider.vendorId, HIDProvider.productId);
19
- if (controllers.length === 0 || !controllers[0].path) {
18
+ async connect(): Promise<void> {
19
+ if (typeof window !== undefined)
20
20
  return this.onError(
21
- new Error(`No controllers (${devices().length} other devices)`)
21
+ new Error("Attempted to use node-hid in browser environment")
22
22
  );
23
- }
24
23
 
25
- if (controllers[0].interface === -1) this.wireless = true;
24
+ return import("node-hid")
25
+ .then(({ HID, devices }) => {
26
+ if (!HID) return this.onError(new Error("Failed import of 'node-hid'"));
27
+ this.disconnect();
28
+
29
+ const controllers = devices(
30
+ HIDProvider.vendorId,
31
+ HIDProvider.productId
32
+ );
33
+ if (controllers.length === 0 || !controllers[0].path) {
34
+ return this.onError(
35
+ new Error(`No controllers (${devices().length} other devices)`)
36
+ );
37
+ }
38
+
39
+ if (controllers[0].interface === -1) this.wireless = true;
40
+
41
+ const device = new HID(controllers[0].path);
42
+ device.on("data", (arg: Buffer) => {
43
+ this.onData(this.process(arg));
44
+ });
45
+ device.on("error", (err: Error) => {
46
+ this.onError(err);
47
+ });
26
48
 
27
- this.device = new HID(controllers[0].path);
28
- this.device.on("data", (arg: Buffer) => {
29
- this.onData(this.process(arg));
30
- });
31
- this.device.on("error", (err: Error) => {
32
- this.onError(err);
33
- });
49
+ this.device = device;
50
+ })
51
+ .catch((err) => {
52
+ this.onError(
53
+ new Error(
54
+ `Could not import 'node-hid'. Did you add it?\nError: ${
55
+ err instanceof Error ? err.message : "???"
56
+ }`
57
+ )
58
+ );
59
+ });
34
60
  }
35
61
 
36
62
  get connected(): boolean {