@dg-kit/transport-webbluetooth 1.2.1 → 1.3.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/dist/client.d.ts CHANGED
@@ -1,10 +1,28 @@
1
1
  import type { DeviceClient } from '@dg-kit/core';
2
2
  import type { DeviceCommand, DeviceCommandResult, DeviceState } from '@dg-kit/core';
3
3
  import { type NavigatorBluetoothLike, type RequestDeviceOptionsLike, type WebBluetoothProtocolAdapter } from '@dg-kit/protocol';
4
+ export type ReconnectState = 'reconnecting' | 'reconnected' | 'failed';
4
5
  export interface WebBluetoothDeviceClientOptions {
5
6
  protocol: WebBluetoothProtocolAdapter;
6
7
  navigatorRef?: NavigatorBluetoothLike;
7
8
  requestDeviceOptions?: RequestDeviceOptionsLike;
9
+ /**
10
+ * When true, a passive `gattserverdisconnected` event triggers a silent
11
+ * reconnect attempt using the cached `BluetoothDevice` reference (which
12
+ * survives without re-prompting the user). The user-initiated
13
+ * `disconnect()` path always cancels any in-flight reconnect.
14
+ */
15
+ autoReconnect?: boolean;
16
+ /** Maximum reconnect attempts before giving up. Defaults to 3. */
17
+ reconnectAttempts?: number;
18
+ /**
19
+ * Delay (ms) before each reconnect attempt. Index N is used for the
20
+ * (N+1)-th attempt. If fewer entries than attempts, the last entry is
21
+ * reused. Defaults to [500, 1500, 4000].
22
+ */
23
+ reconnectBackoffMs?: number[];
24
+ /** Notified when entering/leaving the reconnecting state. */
25
+ onReconnectStateChange?: (state: ReconnectState) => void;
8
26
  }
9
27
  export declare class WebBluetoothDeviceClient implements DeviceClient {
10
28
  private readonly options;
@@ -12,6 +30,8 @@ export declare class WebBluetoothDeviceClient implements DeviceClient {
12
30
  private readonly nav;
13
31
  private device;
14
32
  private disconnecting;
33
+ private reconnectTimer;
34
+ private reconnecting;
15
35
  constructor(options: WebBluetoothDeviceClientOptions);
16
36
  connect(): Promise<void>;
17
37
  disconnect(): Promise<void>;
@@ -20,6 +40,9 @@ export declare class WebBluetoothDeviceClient implements DeviceClient {
20
40
  emergencyStop(): Promise<void>;
21
41
  onStateChanged(listener: (state: DeviceState) => void): () => void;
22
42
  private readonly onDisconnected;
43
+ private scheduleReconnect;
44
+ private tryReconnect;
45
+ private cancelReconnect;
23
46
  private emit;
24
47
  }
25
48
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EACjC,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,qBAAa,wBAAyB,YAAW,YAAY;IAM/C,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,aAAa,CAAS;gBAED,OAAO,EAAE,+BAA+B;IAY/D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAIhC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI7D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO7B;IAEF,OAAO,CAAC,IAAI;CAKb"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EACjC,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,CAAC;AAKvE,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;IAChD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,6DAA6D;IAC7D,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CAC1D;AAED,qBAAa,wBAAyB,YAAW,YAAY;IAQ/C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,YAAY,CAAS;gBAEA,OAAO,EAAE,+BAA+B;IAY/D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAIhC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI7D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAsB7B;IAEF,OAAO,CAAC,iBAAiB;YAuBX,YAAY;IAuC1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,IAAI;CAKb"}
package/dist/client.js CHANGED
@@ -1,11 +1,15 @@
1
1
  import { COYOTE_REQUEST_DEVICE_OPTIONS, } from '@dg-kit/protocol';
2
2
  import { getWebBluetoothAvailability } from './availability.js';
3
+ const DEFAULT_RECONNECT_ATTEMPTS = 3;
4
+ const DEFAULT_RECONNECT_BACKOFF_MS = [500, 1500, 4000];
3
5
  export class WebBluetoothDeviceClient {
4
6
  options;
5
7
  listeners = new Set();
6
8
  nav;
7
9
  device = null;
8
10
  disconnecting = false;
11
+ reconnectTimer = null;
12
+ reconnecting = false;
9
13
  constructor(options) {
10
14
  this.options = options;
11
15
  this.nav =
@@ -18,6 +22,7 @@ export class WebBluetoothDeviceClient {
18
22
  });
19
23
  }
20
24
  async connect() {
25
+ this.cancelReconnect();
21
26
  const availability = getWebBluetoothAvailability(this.nav);
22
27
  if (!availability.supported) {
23
28
  throw new Error(availability.reason);
@@ -57,6 +62,7 @@ export class WebBluetoothDeviceClient {
57
62
  }
58
63
  async disconnect() {
59
64
  this.disconnecting = true;
65
+ this.cancelReconnect();
60
66
  try {
61
67
  await this.options.protocol.emergencyStop();
62
68
  const device = this.device;
@@ -66,6 +72,10 @@ export class WebBluetoothDeviceClient {
66
72
  await this.options.protocol.onDisconnected();
67
73
  }
68
74
  finally {
75
+ // A `gattserverdisconnected` event that landed mid-disconnect may have
76
+ // scheduled a reconnect while we were awaiting; clear it again so the
77
+ // timer can't fire after we've returned.
78
+ this.cancelReconnect();
69
79
  if (this.device) {
70
80
  this.device.removeEventListener('gattserverdisconnected', this.onDisconnected);
71
81
  }
@@ -91,12 +101,88 @@ export class WebBluetoothDeviceClient {
91
101
  onDisconnected = async () => {
92
102
  if (this.disconnecting)
93
103
  return;
104
+ if (this.reconnecting)
105
+ return;
106
+ // Tell the protocol we're disconnected so UI / queue stop accepting
107
+ // writes; if the reconnect succeeds the protocol's onConnected will
108
+ // flip it back. Holding the device reference is what lets the
109
+ // reconnect skip the chooser prompt — drop it only after we give up.
94
110
  await this.options.protocol.onDisconnected();
111
+ // A user-initiated disconnect may have run while we awaited.
112
+ if (this.disconnecting)
113
+ return;
114
+ if (this.options.autoReconnect && this.device) {
115
+ this.scheduleReconnect(1);
116
+ return;
117
+ }
95
118
  if (this.device) {
96
119
  this.device.removeEventListener('gattserverdisconnected', this.onDisconnected);
97
120
  }
98
121
  this.device = null;
99
122
  };
123
+ scheduleReconnect(attempt) {
124
+ const maxAttempts = this.options.reconnectAttempts ?? DEFAULT_RECONNECT_ATTEMPTS;
125
+ if (attempt > maxAttempts) {
126
+ this.options.onReconnectStateChange?.('failed');
127
+ if (this.device) {
128
+ this.device.removeEventListener('gattserverdisconnected', this.onDisconnected);
129
+ }
130
+ this.device = null;
131
+ return;
132
+ }
133
+ this.reconnecting = true;
134
+ this.options.onReconnectStateChange?.('reconnecting');
135
+ const backoff = this.options.reconnectBackoffMs ?? DEFAULT_RECONNECT_BACKOFF_MS;
136
+ // Reuse the last entry when attempts outrun the backoff schedule.
137
+ const delay = backoff[Math.min(attempt - 1, backoff.length - 1)] ?? 0;
138
+ this.reconnectTimer = setTimeout(() => {
139
+ void this.tryReconnect(attempt);
140
+ }, delay);
141
+ }
142
+ async tryReconnect(attempt) {
143
+ this.reconnectTimer = null;
144
+ if (this.disconnecting) {
145
+ this.reconnecting = false;
146
+ return;
147
+ }
148
+ const device = this.device;
149
+ const gatt = device?.gatt;
150
+ if (!device || !gatt) {
151
+ this.reconnecting = false;
152
+ this.options.onReconnectStateChange?.('failed');
153
+ this.device = null;
154
+ return;
155
+ }
156
+ try {
157
+ // gatt.connect() is idempotent per the Web Bluetooth spec — calling it
158
+ // when already connected returns the existing server. So we always go
159
+ // through it instead of branching on `gatt.connected`.
160
+ const server = await gatt.connect();
161
+ // User may have hit disconnect while we waited for the GATT server.
162
+ if (this.disconnecting || this.device !== device) {
163
+ this.reconnecting = false;
164
+ return;
165
+ }
166
+ await this.options.protocol.onConnected({ device, server });
167
+ this.reconnecting = false;
168
+ this.options.onReconnectStateChange?.('reconnected');
169
+ }
170
+ catch {
171
+ if (this.disconnecting) {
172
+ this.reconnecting = false;
173
+ return;
174
+ }
175
+ this.reconnecting = false;
176
+ this.scheduleReconnect(attempt + 1);
177
+ }
178
+ }
179
+ cancelReconnect() {
180
+ if (this.reconnectTimer !== null) {
181
+ clearTimeout(this.reconnectTimer);
182
+ this.reconnectTimer = null;
183
+ }
184
+ this.reconnecting = false;
185
+ }
100
186
  emit(state) {
101
187
  for (const listener of this.listeners) {
102
188
  listener(state);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,6BAA6B,GAK9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAQhE,MAAM,OAAO,wBAAwB;IAMN;IALZ,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IACpD,GAAG,CAAqC;IACjD,MAAM,GAAuB,IAAI,CAAC;IAClC,aAAa,GAAG,KAAK,CAAC;IAE9B,YAA6B,OAAwC;QAAxC,YAAO,GAAP,OAAO,CAAiC;QACnE,IAAI,CAAC,GAAG;YACN,OAAO,CAAC,YAAY;gBACpB,CAAC,OAAO,SAAS,KAAK,WAAW;oBAC/B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAE,SAA+C,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,YAAY,GAAG,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAC9C,IAAI,CAAC,OAAO,CAAC,oBAAoB,IAAI,6BAA6B,CACnE,CAAC;QACF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAoC,CAAC;QACjE,MAAM,qBAAqB,GAAG,CAAC,CAAC,cAAc,IAAI,cAAc,KAAK,UAAU,CAAC;QAEhF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,cAAc,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,qBAAqB,IAAI,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7D,cAAc,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,UAAU,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAsE,CAAC;YAC3F,IAAI,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,CAAC;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAsB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC;IAED,cAAc,CAAC,QAAsC;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAEgB,cAAc,GAAG,KAAK,IAAmB,EAAE;QAC1D,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC;IAEM,IAAI,CAAC,KAAkB;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AAED,SAAS,eAAe,CAAC,MAAkC;IACzD,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkC;IAC1D,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,SAAS;QAAE,OAAO;IAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { getWebBluetoothAvailability } from './availability.js';
2
- export { WebBluetoothDeviceClient, type WebBluetoothDeviceClientOptions } from './client.js';
2
+ export { WebBluetoothDeviceClient, type WebBluetoothDeviceClientOptions, type ReconnectState, } from './client.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,KAAK,+BAA+B,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { getWebBluetoothAvailability } from './availability.js';
2
- export { WebBluetoothDeviceClient } from './client.js';
2
+ export { WebBluetoothDeviceClient, } from './client.js';
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAwC,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EACL,wBAAwB,GAGzB,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dg-kit/transport-webbluetooth",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Web Bluetooth DeviceClient for DG-Lab Coyote (browser-only)",
5
5
  "license": "MIT",
6
6
  "author": "0xNullAI",
@@ -27,8 +27,8 @@
27
27
  "access": "public"
28
28
  },
29
29
  "dependencies": {
30
- "@dg-kit/core": "1.2.1",
31
- "@dg-kit/protocol": "1.2.1"
30
+ "@dg-kit/core": "1.3.0",
31
+ "@dg-kit/protocol": "1.3.0"
32
32
  },
33
33
  "scripts": {
34
34
  "build": "tsc -p tsconfig.json",