@openmouse/protocol 0.1.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 (547) hide show
  1. package/CONTRIBUTING.md +167 -0
  2. package/README.md +89 -0
  3. package/dist/asus/index.d.ts +52 -0
  4. package/dist/asus/index.d.ts.map +1 -0
  5. package/dist/asus/index.js +248 -0
  6. package/dist/asus/index.js.map +1 -0
  7. package/dist/atk/index.d.ts +200 -0
  8. package/dist/atk/index.d.ts.map +1 -0
  9. package/dist/atk/index.js +480 -0
  10. package/dist/atk/index.js.map +1 -0
  11. package/dist/bitmouse/index.d.ts +284 -0
  12. package/dist/bitmouse/index.d.ts.map +1 -0
  13. package/dist/bitmouse/index.js +396 -0
  14. package/dist/bitmouse/index.js.map +1 -0
  15. package/dist/compx/codec.d.ts +31 -0
  16. package/dist/compx/codec.d.ts.map +1 -0
  17. package/dist/compx/codec.js +50 -0
  18. package/dist/compx/codec.js.map +1 -0
  19. package/dist/corsair/index.d.ts +147 -0
  20. package/dist/corsair/index.d.ts.map +1 -0
  21. package/dist/corsair/index.js +223 -0
  22. package/dist/corsair/index.js.map +1 -0
  23. package/dist/dareu/index.d.ts +136 -0
  24. package/dist/dareu/index.d.ts.map +1 -0
  25. package/dist/dareu/index.js +344 -0
  26. package/dist/dareu/index.js.map +1 -0
  27. package/dist/drivers/asus/hid.d.ts +29 -0
  28. package/dist/drivers/asus/hid.d.ts.map +1 -0
  29. package/dist/drivers/asus/hid.js +419 -0
  30. package/dist/drivers/asus/hid.js.map +1 -0
  31. package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
  32. package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
  33. package/dist/drivers/atk/bitmouse-hid.js +501 -0
  34. package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
  35. package/dist/drivers/atk/hid.d.ts +163 -0
  36. package/dist/drivers/atk/hid.d.ts.map +1 -0
  37. package/dist/drivers/atk/hid.js +1368 -0
  38. package/dist/drivers/atk/hid.js.map +1 -0
  39. package/dist/drivers/atk/products.d.ts +13 -0
  40. package/dist/drivers/atk/products.d.ts.map +1 -0
  41. package/dist/drivers/atk/products.js +13 -0
  42. package/dist/drivers/atk/products.js.map +1 -0
  43. package/dist/drivers/attackshark/dpi.d.ts +41 -0
  44. package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
  45. package/dist/drivers/attackshark/dpi.js +215 -0
  46. package/dist/drivers/attackshark/dpi.js.map +1 -0
  47. package/dist/drivers/attackshark/hid.d.ts +124 -0
  48. package/dist/drivers/attackshark/hid.d.ts.map +1 -0
  49. package/dist/drivers/attackshark/hid.js +728 -0
  50. package/dist/drivers/attackshark/hid.js.map +1 -0
  51. package/dist/drivers/corsair/hid.d.ts +70 -0
  52. package/dist/drivers/corsair/hid.d.ts.map +1 -0
  53. package/dist/drivers/corsair/hid.js +414 -0
  54. package/dist/drivers/corsair/hid.js.map +1 -0
  55. package/dist/drivers/dareu/hid.d.ts +59 -0
  56. package/dist/drivers/dareu/hid.d.ts.map +1 -0
  57. package/dist/drivers/dareu/hid.js +478 -0
  58. package/dist/drivers/dareu/hid.js.map +1 -0
  59. package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
  60. package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
  61. package/dist/drivers/endgame/egg-op1-hid.js +605 -0
  62. package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
  63. package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
  64. package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
  65. package/dist/drivers/endgame/egg-we-control.js +87 -0
  66. package/dist/drivers/endgame/egg-we-control.js.map +1 -0
  67. package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
  68. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
  69. package/dist/drivers/endgame/egg-we-hid.js +514 -0
  70. package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
  71. package/dist/drivers/fantech/hid.d.ts +106 -0
  72. package/dist/drivers/fantech/hid.d.ts.map +1 -0
  73. package/dist/drivers/fantech/hid.js +295 -0
  74. package/dist/drivers/fantech/hid.js.map +1 -0
  75. package/dist/drivers/finalmouse/hid.d.ts +31 -0
  76. package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
  77. package/dist/drivers/finalmouse/hid.js +181 -0
  78. package/dist/drivers/finalmouse/hid.js.map +1 -0
  79. package/dist/drivers/gearhub/hid.d.ts +191 -0
  80. package/dist/drivers/gearhub/hid.d.ts.map +1 -0
  81. package/dist/drivers/gearhub/hid.js +542 -0
  82. package/dist/drivers/gearhub/hid.js.map +1 -0
  83. package/dist/drivers/glorious/classic-hid.d.ts +62 -0
  84. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
  85. package/dist/drivers/glorious/classic-hid.js +326 -0
  86. package/dist/drivers/glorious/classic-hid.js.map +1 -0
  87. package/dist/drivers/glorious/hid.d.ts +39 -0
  88. package/dist/drivers/glorious/hid.d.ts.map +1 -0
  89. package/dist/drivers/glorious/hid.js +203 -0
  90. package/dist/drivers/glorious/hid.js.map +1 -0
  91. package/dist/drivers/gwolves/hid.d.ts +27 -0
  92. package/dist/drivers/gwolves/hid.d.ts.map +1 -0
  93. package/dist/drivers/gwolves/hid.js +225 -0
  94. package/dist/drivers/gwolves/hid.js.map +1 -0
  95. package/dist/drivers/gwolves/products.d.ts +17 -0
  96. package/dist/drivers/gwolves/products.d.ts.map +1 -0
  97. package/dist/drivers/gwolves/products.js +58 -0
  98. package/dist/drivers/gwolves/products.js.map +1 -0
  99. package/dist/drivers/hyperx/hid.d.ts +59 -0
  100. package/dist/drivers/hyperx/hid.d.ts.map +1 -0
  101. package/dist/drivers/hyperx/hid.js +229 -0
  102. package/dist/drivers/hyperx/hid.js.map +1 -0
  103. package/dist/drivers/incott/hid.d.ts +513 -0
  104. package/dist/drivers/incott/hid.d.ts.map +1 -0
  105. package/dist/drivers/incott/hid.js +1173 -0
  106. package/dist/drivers/incott/hid.js.map +1 -0
  107. package/dist/drivers/index.d.ts +5 -0
  108. package/dist/drivers/index.d.ts.map +1 -0
  109. package/dist/drivers/index.js +5 -0
  110. package/dist/drivers/index.js.map +1 -0
  111. package/dist/drivers/keychron/m6-hid.d.ts +81 -0
  112. package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
  113. package/dist/drivers/keychron/m6-hid.js +486 -0
  114. package/dist/drivers/keychron/m6-hid.js.map +1 -0
  115. package/dist/drivers/keychron/nape-hid.d.ts +60 -0
  116. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
  117. package/dist/drivers/keychron/nape-hid.js +432 -0
  118. package/dist/drivers/keychron/nape-hid.js.map +1 -0
  119. package/dist/drivers/ksnake/hid.d.ts +74 -0
  120. package/dist/drivers/ksnake/hid.d.ts.map +1 -0
  121. package/dist/drivers/ksnake/hid.js +368 -0
  122. package/dist/drivers/ksnake/hid.js.map +1 -0
  123. package/dist/drivers/lamzu/hid.d.ts +58 -0
  124. package/dist/drivers/lamzu/hid.d.ts.map +1 -0
  125. package/dist/drivers/lamzu/hid.js +414 -0
  126. package/dist/drivers/lamzu/hid.js.map +1 -0
  127. package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
  128. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
  129. package/dist/drivers/lamzu-atlantis/hid.js +587 -0
  130. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
  131. package/dist/drivers/logitech/bolt.d.ts +41 -0
  132. package/dist/drivers/logitech/bolt.d.ts.map +1 -0
  133. package/dist/drivers/logitech/bolt.js +105 -0
  134. package/dist/drivers/logitech/bolt.js.map +1 -0
  135. package/dist/drivers/logitech/hidpp.d.ts +525 -0
  136. package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
  137. package/dist/drivers/logitech/hidpp.js +2774 -0
  138. package/dist/drivers/logitech/hidpp.js.map +1 -0
  139. package/dist/drivers/logitech/mode-status.d.ts +53 -0
  140. package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
  141. package/dist/drivers/logitech/mode-status.js +52 -0
  142. package/dist/drivers/logitech/mode-status.js.map +1 -0
  143. package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
  144. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
  145. package/dist/drivers/logitech/onboard-profiles.js +965 -0
  146. package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
  147. package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
  148. package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
  149. package/dist/drivers/logitech/rgb-effects.js +93 -0
  150. package/dist/drivers/logitech/rgb-effects.js.map +1 -0
  151. package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
  152. package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
  153. package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
  154. package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
  155. package/dist/drivers/mchose/dock-hid.d.ts +26 -0
  156. package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
  157. package/dist/drivers/mchose/dock-hid.js +176 -0
  158. package/dist/drivers/mchose/dock-hid.js.map +1 -0
  159. package/dist/drivers/mchose/hid.d.ts +118 -0
  160. package/dist/drivers/mchose/hid.d.ts.map +1 -0
  161. package/dist/drivers/mchose/hid.js +550 -0
  162. package/dist/drivers/mchose/hid.js.map +1 -0
  163. package/dist/drivers/mchose/v3-hid.d.ts +109 -0
  164. package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
  165. package/dist/drivers/mchose/v3-hid.js +572 -0
  166. package/dist/drivers/mchose/v3-hid.js.map +1 -0
  167. package/dist/drivers/microsoft/hid.d.ts +25 -0
  168. package/dist/drivers/microsoft/hid.d.ts.map +1 -0
  169. package/dist/drivers/microsoft/hid.js +247 -0
  170. package/dist/drivers/microsoft/hid.js.map +1 -0
  171. package/dist/drivers/moddo/hid.d.ts +31 -0
  172. package/dist/drivers/moddo/hid.d.ts.map +1 -0
  173. package/dist/drivers/moddo/hid.js +154 -0
  174. package/dist/drivers/moddo/hid.js.map +1 -0
  175. package/dist/drivers/mouse-types.d.ts +388 -0
  176. package/dist/drivers/mouse-types.d.ts.map +1 -0
  177. package/dist/drivers/mouse-types.js +2 -0
  178. package/dist/drivers/mouse-types.js.map +1 -0
  179. package/dist/drivers/ninjutso/hid.d.ts +62 -0
  180. package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
  181. package/dist/drivers/ninjutso/hid.js +680 -0
  182. package/dist/drivers/ninjutso/hid.js.map +1 -0
  183. package/dist/drivers/orbital/hid.d.ts +24 -0
  184. package/dist/drivers/orbital/hid.d.ts.map +1 -0
  185. package/dist/drivers/orbital/hid.js +85 -0
  186. package/dist/drivers/orbital/hid.js.map +1 -0
  187. package/dist/drivers/orbital/host-protocol.d.ts +59 -0
  188. package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
  189. package/dist/drivers/orbital/host-protocol.js +884 -0
  190. package/dist/drivers/orbital/host-protocol.js.map +1 -0
  191. package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
  192. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
  193. package/dist/drivers/pulsar/pulsar-hid.js +381 -0
  194. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
  195. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
  196. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
  197. package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
  198. package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
  199. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
  200. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
  201. package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
  202. package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
  203. package/dist/drivers/rawm/hid.d.ts +29 -0
  204. package/dist/drivers/rawm/hid.d.ts.map +1 -0
  205. package/dist/drivers/rawm/hid.js +210 -0
  206. package/dist/drivers/rawm/hid.js.map +1 -0
  207. package/dist/drivers/razer/cobra-hid.d.ts +63 -0
  208. package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
  209. package/dist/drivers/razer/cobra-hid.js +282 -0
  210. package/dist/drivers/razer/cobra-hid.js.map +1 -0
  211. package/dist/drivers/razer/hid-open.d.ts +13 -0
  212. package/dist/drivers/razer/hid-open.d.ts.map +1 -0
  213. package/dist/drivers/razer/hid-open.js +29 -0
  214. package/dist/drivers/razer/hid-open.js.map +1 -0
  215. package/dist/drivers/razer/hid.d.ts +231 -0
  216. package/dist/drivers/razer/hid.d.ts.map +1 -0
  217. package/dist/drivers/razer/hid.js +772 -0
  218. package/dist/drivers/razer/hid.js.map +1 -0
  219. package/dist/drivers/razer/viper-hid.d.ts +33 -0
  220. package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
  221. package/dist/drivers/razer/viper-hid.js +177 -0
  222. package/dist/drivers/razer/viper-hid.js.map +1 -0
  223. package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
  224. package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
  225. package/dist/drivers/razer/viper-mini-hid.js +273 -0
  226. package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
  227. package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
  228. package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
  229. package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
  230. package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
  231. package/dist/drivers/registry.d.ts +70 -0
  232. package/dist/drivers/registry.d.ts.map +1 -0
  233. package/dist/drivers/registry.js +146 -0
  234. package/dist/drivers/registry.js.map +1 -0
  235. package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
  236. package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
  237. package/dist/drivers/steelseries/aerox3-hid.js +172 -0
  238. package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
  239. package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
  240. package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
  241. package/dist/drivers/steelseries/aerox5-hid.js +173 -0
  242. package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
  243. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
  244. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
  245. package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
  246. package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
  247. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
  248. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
  249. package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
  250. package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
  251. package/dist/drivers/steelseries/hid.d.ts +48 -0
  252. package/dist/drivers/steelseries/hid.d.ts.map +1 -0
  253. package/dist/drivers/steelseries/hid.js +157 -0
  254. package/dist/drivers/steelseries/hid.js.map +1 -0
  255. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
  256. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
  257. package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
  258. package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
  259. package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
  260. package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
  261. package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
  262. package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
  263. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
  264. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
  265. package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
  266. package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
  267. package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
  268. package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
  269. package/dist/drivers/steelseries/rival310-hid.js +182 -0
  270. package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
  271. package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
  272. package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
  273. package/dist/drivers/steelseries/rival650-hid.js +209 -0
  274. package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
  275. package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
  276. package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
  277. package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
  278. package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
  279. package/dist/drivers/teevolution/hid.d.ts +82 -0
  280. package/dist/drivers/teevolution/hid.d.ts.map +1 -0
  281. package/dist/drivers/teevolution/hid.js +607 -0
  282. package/dist/drivers/teevolution/hid.js.map +1 -0
  283. package/dist/drivers/vendors.d.ts +254 -0
  284. package/dist/drivers/vendors.d.ts.map +1 -0
  285. package/dist/drivers/vendors.js +587 -0
  286. package/dist/drivers/vendors.js.map +1 -0
  287. package/dist/drivers/vgn/hid.d.ts +33 -0
  288. package/dist/drivers/vgn/hid.d.ts.map +1 -0
  289. package/dist/drivers/vgn/hid.js +213 -0
  290. package/dist/drivers/vgn/hid.js.map +1 -0
  291. package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
  292. package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
  293. package/dist/drivers/wallhack/keyboard-hid.js +80 -0
  294. package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
  295. package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
  296. package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
  297. package/dist/drivers/wallhack/mouse-hid.js +288 -0
  298. package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
  299. package/dist/drivers/webhid.d.ts +59 -0
  300. package/dist/drivers/webhid.d.ts.map +1 -0
  301. package/dist/drivers/webhid.js +2 -0
  302. package/dist/drivers/webhid.js.map +1 -0
  303. package/dist/drivers/wlmouse/hid.d.ts +81 -0
  304. package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
  305. package/dist/drivers/wlmouse/hid.js +576 -0
  306. package/dist/drivers/wlmouse/hid.js.map +1 -0
  307. package/dist/drivers/wooting/hid.d.ts +86 -0
  308. package/dist/drivers/wooting/hid.d.ts.map +1 -0
  309. package/dist/drivers/wooting/hid.js +320 -0
  310. package/dist/drivers/wooting/hid.js.map +1 -0
  311. package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
  312. package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
  313. package/dist/drivers/zaunkoenig/hid.js +162 -0
  314. package/dist/drivers/zaunkoenig/hid.js.map +1 -0
  315. package/dist/endgame-gear/op1.d.ts +165 -0
  316. package/dist/endgame-gear/op1.d.ts.map +1 -0
  317. package/dist/endgame-gear/op1.js +384 -0
  318. package/dist/endgame-gear/op1.js.map +1 -0
  319. package/dist/endgame-gear/wireless.d.ts +93 -0
  320. package/dist/endgame-gear/wireless.d.ts.map +1 -0
  321. package/dist/endgame-gear/wireless.js +242 -0
  322. package/dist/endgame-gear/wireless.js.map +1 -0
  323. package/dist/fantech/index.d.ts +9 -0
  324. package/dist/fantech/index.d.ts.map +1 -0
  325. package/dist/fantech/index.js +11 -0
  326. package/dist/fantech/index.js.map +1 -0
  327. package/dist/finalmouse/index.d.ts +41 -0
  328. package/dist/finalmouse/index.d.ts.map +1 -0
  329. package/dist/finalmouse/index.js +106 -0
  330. package/dist/finalmouse/index.js.map +1 -0
  331. package/dist/gearhub/index.d.ts +210 -0
  332. package/dist/gearhub/index.d.ts.map +1 -0
  333. package/dist/gearhub/index.js +282 -0
  334. package/dist/gearhub/index.js.map +1 -0
  335. package/dist/glorious/index.d.ts +89 -0
  336. package/dist/glorious/index.d.ts.map +1 -0
  337. package/dist/glorious/index.js +236 -0
  338. package/dist/glorious/index.js.map +1 -0
  339. package/dist/glorious-classic/index.d.ts +103 -0
  340. package/dist/glorious-classic/index.d.ts.map +1 -0
  341. package/dist/glorious-classic/index.js +304 -0
  342. package/dist/glorious-classic/index.js.map +1 -0
  343. package/dist/gwolves/index.d.ts +82 -0
  344. package/dist/gwolves/index.d.ts.map +1 -0
  345. package/dist/gwolves/index.js +197 -0
  346. package/dist/gwolves/index.js.map +1 -0
  347. package/dist/hyperx/index.d.ts +181 -0
  348. package/dist/hyperx/index.d.ts.map +1 -0
  349. package/dist/hyperx/index.js +303 -0
  350. package/dist/hyperx/index.js.map +1 -0
  351. package/dist/incott/index.d.ts +1067 -0
  352. package/dist/incott/index.d.ts.map +1 -0
  353. package/dist/incott/index.js +1482 -0
  354. package/dist/incott/index.js.map +1 -0
  355. package/dist/index.d.ts +30 -0
  356. package/dist/index.d.ts.map +1 -0
  357. package/dist/index.js +30 -0
  358. package/dist/index.js.map +1 -0
  359. package/dist/keychron/index.d.ts +194 -0
  360. package/dist/keychron/index.d.ts.map +1 -0
  361. package/dist/keychron/index.js +341 -0
  362. package/dist/keychron/index.js.map +1 -0
  363. package/dist/ksnake/index.d.ts +157 -0
  364. package/dist/ksnake/index.d.ts.map +1 -0
  365. package/dist/ksnake/index.js +314 -0
  366. package/dist/ksnake/index.js.map +1 -0
  367. package/dist/lamzu/atlantis.d.ts +237 -0
  368. package/dist/lamzu/atlantis.d.ts.map +1 -0
  369. package/dist/lamzu/atlantis.js +263 -0
  370. package/dist/lamzu/atlantis.js.map +1 -0
  371. package/dist/lamzu/index.d.ts +60 -0
  372. package/dist/lamzu/index.d.ts.map +1 -0
  373. package/dist/lamzu/index.js +86 -0
  374. package/dist/lamzu/index.js.map +1 -0
  375. package/dist/logitech/controls.d.ts +138 -0
  376. package/dist/logitech/controls.d.ts.map +1 -0
  377. package/dist/logitech/controls.js +184 -0
  378. package/dist/logitech/controls.js.map +1 -0
  379. package/dist/logitech/friendly-name.d.ts +50 -0
  380. package/dist/logitech/friendly-name.d.ts.map +1 -0
  381. package/dist/logitech/friendly-name.js +74 -0
  382. package/dist/logitech/friendly-name.js.map +1 -0
  383. package/dist/logitech/haptics.d.ts +97 -0
  384. package/dist/logitech/haptics.d.ts.map +1 -0
  385. package/dist/logitech/haptics.js +116 -0
  386. package/dist/logitech/haptics.js.map +1 -0
  387. package/dist/logitech/hosts.d.ts +55 -0
  388. package/dist/logitech/hosts.d.ts.map +1 -0
  389. package/dist/logitech/hosts.js +80 -0
  390. package/dist/logitech/hosts.js.map +1 -0
  391. package/dist/logitech/index.d.ts +127 -0
  392. package/dist/logitech/index.d.ts.map +1 -0
  393. package/dist/logitech/index.js +233 -0
  394. package/dist/logitech/index.js.map +1 -0
  395. package/dist/logitech/wheel.d.ts +117 -0
  396. package/dist/logitech/wheel.d.ts.map +1 -0
  397. package/dist/logitech/wheel.js +133 -0
  398. package/dist/logitech/wheel.js.map +1 -0
  399. package/dist/mchose/a5-gen1.d.ts +38 -0
  400. package/dist/mchose/a5-gen1.d.ts.map +1 -0
  401. package/dist/mchose/a5-gen1.js +60 -0
  402. package/dist/mchose/a5-gen1.js.map +1 -0
  403. package/dist/mchose/buttons.d.ts +66 -0
  404. package/dist/mchose/buttons.d.ts.map +1 -0
  405. package/dist/mchose/buttons.js +184 -0
  406. package/dist/mchose/buttons.js.map +1 -0
  407. package/dist/mchose/dock.d.ts +77 -0
  408. package/dist/mchose/dock.d.ts.map +1 -0
  409. package/dist/mchose/dock.js +133 -0
  410. package/dist/mchose/dock.js.map +1 -0
  411. package/dist/mchose/index.d.ts +299 -0
  412. package/dist/mchose/index.d.ts.map +1 -0
  413. package/dist/mchose/index.js +429 -0
  414. package/dist/mchose/index.js.map +1 -0
  415. package/dist/mchose/v3-buttons.d.ts +64 -0
  416. package/dist/mchose/v3-buttons.d.ts.map +1 -0
  417. package/dist/mchose/v3-buttons.js +258 -0
  418. package/dist/mchose/v3-buttons.js.map +1 -0
  419. package/dist/mchose/v3.d.ts +380 -0
  420. package/dist/mchose/v3.d.ts.map +1 -0
  421. package/dist/mchose/v3.js +608 -0
  422. package/dist/mchose/v3.js.map +1 -0
  423. package/dist/microsoft/index.d.ts +19 -0
  424. package/dist/microsoft/index.d.ts.map +1 -0
  425. package/dist/microsoft/index.js +22 -0
  426. package/dist/microsoft/index.js.map +1 -0
  427. package/dist/moddo/index.d.ts +72 -0
  428. package/dist/moddo/index.d.ts.map +1 -0
  429. package/dist/moddo/index.js +147 -0
  430. package/dist/moddo/index.js.map +1 -0
  431. package/dist/ninjutso/index.d.ts +74 -0
  432. package/dist/ninjutso/index.d.ts.map +1 -0
  433. package/dist/ninjutso/index.js +133 -0
  434. package/dist/ninjutso/index.js.map +1 -0
  435. package/dist/orbital/index.d.ts +14 -0
  436. package/dist/orbital/index.d.ts.map +1 -0
  437. package/dist/orbital/index.js +19 -0
  438. package/dist/orbital/index.js.map +1 -0
  439. package/dist/pulsar/index.d.ts +81 -0
  440. package/dist/pulsar/index.d.ts.map +1 -0
  441. package/dist/pulsar/index.js +185 -0
  442. package/dist/pulsar/index.js.map +1 -0
  443. package/dist/rawm/index.d.ts +55 -0
  444. package/dist/rawm/index.d.ts.map +1 -0
  445. package/dist/rawm/index.js +229 -0
  446. package/dist/rawm/index.js.map +1 -0
  447. package/dist/razer/codec.d.ts +504 -0
  448. package/dist/razer/codec.d.ts.map +1 -0
  449. package/dist/razer/codec.js +648 -0
  450. package/dist/razer/codec.js.map +1 -0
  451. package/dist/razer/devices.d.ts +156 -0
  452. package/dist/razer/devices.d.ts.map +1 -0
  453. package/dist/razer/devices.js +540 -0
  454. package/dist/razer/devices.js.map +1 -0
  455. package/dist/razer/index.d.ts +2 -0
  456. package/dist/razer/index.d.ts.map +1 -0
  457. package/dist/razer/index.js +2 -0
  458. package/dist/razer/index.js.map +1 -0
  459. package/dist/razer/v4.d.ts +19 -0
  460. package/dist/razer/v4.d.ts.map +1 -0
  461. package/dist/razer/v4.js +51 -0
  462. package/dist/razer/v4.js.map +1 -0
  463. package/dist/steelseries/aerox3.d.ts +236 -0
  464. package/dist/steelseries/aerox3.d.ts.map +1 -0
  465. package/dist/steelseries/aerox3.js +311 -0
  466. package/dist/steelseries/aerox3.js.map +1 -0
  467. package/dist/steelseries/aerox5-wireless.d.ts +300 -0
  468. package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
  469. package/dist/steelseries/aerox5-wireless.js +389 -0
  470. package/dist/steelseries/aerox5-wireless.js.map +1 -0
  471. package/dist/steelseries/aerox5.d.ts +228 -0
  472. package/dist/steelseries/aerox5.d.ts.map +1 -0
  473. package/dist/steelseries/aerox5.js +294 -0
  474. package/dist/steelseries/aerox5.js.map +1 -0
  475. package/dist/steelseries/aerox9-wireless.d.ts +213 -0
  476. package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
  477. package/dist/steelseries/aerox9-wireless.js +305 -0
  478. package/dist/steelseries/aerox9-wireless.js.map +1 -0
  479. package/dist/steelseries/devices.d.ts +82 -0
  480. package/dist/steelseries/devices.d.ts.map +1 -0
  481. package/dist/steelseries/devices.js +310 -0
  482. package/dist/steelseries/devices.js.map +1 -0
  483. package/dist/steelseries/index.d.ts +13 -0
  484. package/dist/steelseries/index.d.ts.map +1 -0
  485. package/dist/steelseries/index.js +13 -0
  486. package/dist/steelseries/index.js.map +1 -0
  487. package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
  488. package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
  489. package/dist/steelseries/prime-mini-wireless.js +351 -0
  490. package/dist/steelseries/prime-mini-wireless.js.map +1 -0
  491. package/dist/steelseries/prime-plus.d.ts +179 -0
  492. package/dist/steelseries/prime-plus.d.ts.map +1 -0
  493. package/dist/steelseries/prime-plus.js +275 -0
  494. package/dist/steelseries/prime-plus.js.map +1 -0
  495. package/dist/steelseries/rival3-wireless.d.ts +222 -0
  496. package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
  497. package/dist/steelseries/rival3-wireless.js +308 -0
  498. package/dist/steelseries/rival3-wireless.js.map +1 -0
  499. package/dist/steelseries/rival3.d.ts +99 -0
  500. package/dist/steelseries/rival3.d.ts.map +1 -0
  501. package/dist/steelseries/rival3.js +147 -0
  502. package/dist/steelseries/rival3.js.map +1 -0
  503. package/dist/steelseries/rival310.d.ts +230 -0
  504. package/dist/steelseries/rival310.d.ts.map +1 -0
  505. package/dist/steelseries/rival310.js +322 -0
  506. package/dist/steelseries/rival310.js.map +1 -0
  507. package/dist/steelseries/rival650.d.ts +215 -0
  508. package/dist/steelseries/rival650.d.ts.map +1 -0
  509. package/dist/steelseries/rival650.js +284 -0
  510. package/dist/steelseries/rival650.js.map +1 -0
  511. package/dist/steelseries/sensei-ten.d.ts +283 -0
  512. package/dist/steelseries/sensei-ten.d.ts.map +1 -0
  513. package/dist/steelseries/sensei-ten.js +389 -0
  514. package/dist/steelseries/sensei-ten.js.map +1 -0
  515. package/dist/teevolution/index.d.ts +211 -0
  516. package/dist/teevolution/index.d.ts.map +1 -0
  517. package/dist/teevolution/index.js +458 -0
  518. package/dist/teevolution/index.js.map +1 -0
  519. package/dist/valkyrie/index.d.ts +19 -0
  520. package/dist/valkyrie/index.d.ts.map +1 -0
  521. package/dist/valkyrie/index.js +43 -0
  522. package/dist/valkyrie/index.js.map +1 -0
  523. package/dist/valkyrie/settings.d.ts +28 -0
  524. package/dist/valkyrie/settings.d.ts.map +1 -0
  525. package/dist/valkyrie/settings.js +84 -0
  526. package/dist/valkyrie/settings.js.map +1 -0
  527. package/dist/vgn/index.d.ts +59 -0
  528. package/dist/vgn/index.d.ts.map +1 -0
  529. package/dist/vgn/index.js +165 -0
  530. package/dist/vgn/index.js.map +1 -0
  531. package/dist/wallhack/index.d.ts +165 -0
  532. package/dist/wallhack/index.d.ts.map +1 -0
  533. package/dist/wallhack/index.js +226 -0
  534. package/dist/wallhack/index.js.map +1 -0
  535. package/dist/wlmouse/index.d.ts +4 -0
  536. package/dist/wlmouse/index.d.ts.map +1 -0
  537. package/dist/wlmouse/index.js +7 -0
  538. package/dist/wlmouse/index.js.map +1 -0
  539. package/dist/wooting/index.d.ts +225 -0
  540. package/dist/wooting/index.d.ts.map +1 -0
  541. package/dist/wooting/index.js +296 -0
  542. package/dist/wooting/index.js.map +1 -0
  543. package/dist/zaunkoenig/index.d.ts +49 -0
  544. package/dist/zaunkoenig/index.d.ts.map +1 -0
  545. package/dist/zaunkoenig/index.js +127 -0
  546. package/dist/zaunkoenig/index.js.map +1 -0
  547. package/package.json +193 -0
@@ -0,0 +1,282 @@
1
+ import { VENDOR_ID } from "../vendors.js";
2
+ import { openRazerDevice } from "./hid-open.js";
3
+ import { RAZER_READ, RAZER_REPORT_ID, RAZER_STATUS, RAZER_TRANSACTION_ID_1F, RAZER_TRANSACTION_ID_FF, RazerProtocolError, decodeDpi, decodeFirmwareVersion, decodeLegacyPollingRate, decodeRazerResponse, decodeSerial, encodeRazerRequest, razerSetDpiCommand, razerSetExtendedEffectCommand, razerSetLegacyPollingCommand, } from "@openmouse/protocol/razer";
4
+ export const COBRA_PRODUCT_ID = 0x00a3;
5
+ /**
6
+ * Transaction id this mouse answers reads on — the Chroma-era group's original
7
+ * one, shared with the Viper Mini and the DeathAdder Essential family.
8
+ */
9
+ export const COBRA_TRANSACTION_ID = RAZER_TRANSACTION_ID_FF;
10
+ // Openrazer reads DPI with the no-store byte and writes with the storage byte.
11
+ export const COBRA_DPI_READ = {
12
+ commandClass: 0x04,
13
+ commandId: 0x85,
14
+ dataSize: 0x07,
15
+ args: [0x00],
16
+ };
17
+ // Wired-only, so the legacy polling command (a divisor of 1000) covers every rate.
18
+ const RATES_WIRED = [125, 500, 1000];
19
+ const DPI_MIN = 100;
20
+ const DPI_MAX = 8500;
21
+ const RESPONSE_DELAY_MS = 100;
22
+ const RESPONSE_ATTEMPTS = 6;
23
+ const COBRA_LIGHTING_ZONE = "Logo";
24
+ const COBRA_EFFECT_MODES = [
25
+ "Off",
26
+ "Spectrum",
27
+ "Static",
28
+ "Reactive",
29
+ "Breathing random",
30
+ "Breathing single",
31
+ "Breathing dual",
32
+ ];
33
+ const COBRA_COLOR_MODES = ["Static", "Reactive", "Breathing single", "Breathing dual"];
34
+ const COBRA_DUAL_COLOR_MODES = ["Breathing dual"];
35
+ const COBRA_REACTIVE_MODES = ["Reactive"];
36
+ const COBRA_REACTIVE_SPEEDS = [1, 2, 3, 4];
37
+ /**
38
+ * Lighting writes answer on the extended-matrix `0x1f` transaction id, unlike
39
+ * this mouse's DPI and polling reads, which use `0xff`. A mismatch is silent:
40
+ * the mouse never replies and the write times out.
41
+ *
42
+ * OpenRazer's `matrix_effect_breath` lists the Cobra on `0x3f`, but that sits
43
+ * in a block of classic-matrix mice whose other effects also use `0x3f`; this
44
+ * mouse's spectrum, static, reactive and none all answer on `0x1f`, so `0x1f`
45
+ * is kept for breathing too — a single id for a single firmware generation.
46
+ */
47
+ export const COBRA_EFFECT_TRANSACTION_ID = RAZER_TRANSACTION_ID_1F;
48
+ /**
49
+ * Razer exposes its control channel on the interface whose only collection is
50
+ * Generic Desktop Mouse, or on a vendor-defined interface on older revisions.
51
+ * The picker offers every interface of this model, so any collection layout
52
+ * the generic driver already connected is accepted here too.
53
+ */
54
+ function isControlInterface(device) {
55
+ const [collection, ...rest] = device.collections;
56
+ if (rest.length === 0 && collection?.usagePage === 0x01 && collection?.usage === 0x02)
57
+ return true;
58
+ return device.collections.some((entry) => (entry.usagePage ?? 0) >= 0xff00)
59
+ || device.collections.some((entry) => entry.usagePage === 0x01 && entry.usage === 0x02);
60
+ }
61
+ /**
62
+ * Razer's extended effect list is a superset of Synapse's modes; only the
63
+ * single-colour breathing mode maps to a different id (a colour tuple of zeroes
64
+ * instead of its own id).
65
+ */
66
+ export function cobraLightingEffect(lighting) {
67
+ switch (lighting.mode) {
68
+ case "Off":
69
+ return "off";
70
+ case "Spectrum":
71
+ return "spectrum";
72
+ case "Static":
73
+ return "static";
74
+ case "Reactive":
75
+ return "reactive";
76
+ case "Breathing random":
77
+ return "breathing-random";
78
+ case "Breathing single":
79
+ return "breathing-single";
80
+ case "Breathing dual":
81
+ return "breathing-dual";
82
+ default:
83
+ return null;
84
+ }
85
+ }
86
+ export class RazerCobraHidClient {
87
+ queue = Promise.resolve();
88
+ staticReads = new Map();
89
+ /**
90
+ * Razer exposes no way to read the current effect back, so the driver keeps
91
+ * the last value it wrote here, mirroring how Synapse's settings window
92
+ * starts from whatever it last applied rather than from the device.
93
+ */
94
+ lighting = null;
95
+ device;
96
+ constructor(device) {
97
+ this.device = device;
98
+ }
99
+ static isSupported(device) {
100
+ return device.vendorId === VENDOR_ID.razer
101
+ && device.productId === COBRA_PRODUCT_ID
102
+ && isControlInterface(device);
103
+ }
104
+ async open() {
105
+ // On Linux "Failed to open the device" means the hidraw node for 1532:00a3
106
+ // is root-owned or the razermouse kernel driver claimed the interface.
107
+ // Fix: udev rule granting plugdev access to that vendor/product, then
108
+ // `sudo rmmod razermouse`. On macOS the same message means the browser
109
+ // lacks Input Monitoring permission — see `openRazerDevice`.
110
+ await openRazerDevice(this.device);
111
+ }
112
+ async close() {
113
+ this.staticReads.clear();
114
+ if (this.device.opened)
115
+ await this.device.close();
116
+ }
117
+ displayName() {
118
+ return this.device.productName || "Razer Cobra";
119
+ }
120
+ isWireless() {
121
+ return false;
122
+ }
123
+ maxDpi() {
124
+ return DPI_MAX;
125
+ }
126
+ getSupportedPollingRates() {
127
+ return [...RATES_WIRED];
128
+ }
129
+ /** Every whole value, because the control validates entries against this list. */
130
+ getDpiOptions() {
131
+ const options = [];
132
+ for (let dpi = DPI_MIN; dpi <= this.maxDpi(); dpi += 1)
133
+ options.push(dpi);
134
+ return options;
135
+ }
136
+ async readStatus() {
137
+ await this.open();
138
+ const firmware = await this.once("firmware", () => this.request(RAZER_READ.firmware));
139
+ if (!firmware)
140
+ throw new Error("The mouse did not report a firmware version.");
141
+ const serial = await this.once("serial", () => this.request(RAZER_READ.serial).catch(() => null));
142
+ const dpi = decodeDpi(await this.request(COBRA_DPI_READ));
143
+ const pollingRateHz = decodeLegacyPollingRate(await this.request(RAZER_READ.pollingRate));
144
+ return {
145
+ brand: "Razer",
146
+ name: this.displayName(),
147
+ ui: {
148
+ family: "razer",
149
+ settingsReady: true,
150
+ valuesVerified: true,
151
+ hideUnsupportedPollingRates: true,
152
+ // No lift-off or sensor-processing command is confirmed, so neither
153
+ // control is offered rather than offered and left inert.
154
+ hideProcessingCard: true,
155
+ defaultDisplayName: "Cobra",
156
+ },
157
+ // Wired-only model: openrazer exposes no battery attribute, so neither
158
+ // the level nor the charging query is sent.
159
+ batteryPercent: null,
160
+ batteryState: "Unknown",
161
+ dpi: dpi.x,
162
+ dpiY: dpi.y,
163
+ supportsSeparateDpiAxes: true,
164
+ pollingRateHz,
165
+ supportedPollingRates: this.getSupportedPollingRates(),
166
+ activeProfile: null,
167
+ connectionType: "Wired",
168
+ connectionDetail: "Wired USB",
169
+ unitId: serial ? decodeSerial(serial) : null,
170
+ liftOffDistance: null,
171
+ supportedLiftOffDistances: [],
172
+ lighting: this.lightingFromCache(),
173
+ firmware: [`Mouse ${decodeFirmwareVersion(firmware)}`],
174
+ };
175
+ }
176
+ async setDpi(dpi, dpiY = dpi) {
177
+ const ceiling = this.maxDpi();
178
+ for (const value of [dpi, dpiY]) {
179
+ if (!Number.isInteger(value) || value < DPI_MIN || value > ceiling) {
180
+ throw new Error(`DPI must be a whole number between ${DPI_MIN} and ${ceiling.toLocaleString()}.`);
181
+ }
182
+ }
183
+ await this.request(razerSetDpiCommand(dpi, dpiY));
184
+ const confirmed = decodeDpi(await this.request(COBRA_DPI_READ));
185
+ if (confirmed.x !== dpi || confirmed.y !== dpiY) {
186
+ throw new Error(`The mouse kept ${confirmed.x.toLocaleString()} DPI instead of ${dpi.toLocaleString()}.`);
187
+ }
188
+ return confirmed.x;
189
+ }
190
+ async setPollingRate(pollingRateHz) {
191
+ if (!this.getSupportedPollingRates().includes(pollingRateHz)) {
192
+ throw new Error(`This mouse does not support ${pollingRateHz.toLocaleString()} Hz on this connection.`);
193
+ }
194
+ await this.request(razerSetLegacyPollingCommand(pollingRateHz));
195
+ const confirmed = decodeLegacyPollingRate(await this.request(RAZER_READ.pollingRate));
196
+ if (confirmed !== pollingRateHz) {
197
+ throw new Error(`The mouse kept ${confirmed.toLocaleString()} Hz instead of ${pollingRateHz.toLocaleString()} Hz.`);
198
+ }
199
+ return confirmed;
200
+ }
201
+ /**
202
+ * Writes a lighting zone. The effect commands have no read back, so unlike
203
+ * DPI and polling there is nothing to confirm against; the value written is
204
+ * cached and returned as the current state.
205
+ */
206
+ async setLighting(lighting) {
207
+ await this.open();
208
+ if (lighting.zone !== COBRA_LIGHTING_ZONE) {
209
+ throw new Error(`This mouse has no "${lighting.zone}" lighting zone.`);
210
+ }
211
+ const effect = cobraLightingEffect(lighting);
212
+ if (!effect)
213
+ throw new Error("Pick an effect first.");
214
+ if (lighting.speed !== null && !COBRA_REACTIVE_SPEEDS.some((speed) => speed === lighting.speed)) {
215
+ throw new Error(`Unknown reactive speed ${lighting.speed}.`);
216
+ }
217
+ const options = {};
218
+ if (lighting.color !== null)
219
+ options.color = lighting.color;
220
+ if (lighting.color2 !== null)
221
+ options.color2 = lighting.color2;
222
+ if (lighting.speed !== null)
223
+ options.speed = lighting.speed;
224
+ await this.request(razerSetExtendedEffectCommand(effect, options), COBRA_EFFECT_TRANSACTION_ID);
225
+ this.lighting = { ...lighting };
226
+ return this.lighting;
227
+ }
228
+ lightingFromCache() {
229
+ this.lighting ??= {
230
+ zone: COBRA_LIGHTING_ZONE,
231
+ modes: COBRA_EFFECT_MODES,
232
+ mode: null,
233
+ color: null,
234
+ color2: null,
235
+ colorModes: COBRA_COLOR_MODES,
236
+ dualColorModes: COBRA_DUAL_COLOR_MODES,
237
+ reactiveModes: COBRA_REACTIVE_MODES,
238
+ speeds: COBRA_REACTIVE_SPEEDS,
239
+ speed: null,
240
+ writeOnly: true,
241
+ };
242
+ return this.lighting;
243
+ }
244
+ once(key, read) {
245
+ const pending = this.staticReads.get(key);
246
+ if (pending)
247
+ return pending;
248
+ const started = read();
249
+ this.staticReads.set(key, started);
250
+ started.catch(() => this.staticReads.delete(key));
251
+ return started;
252
+ }
253
+ async request(command, transactionId = COBRA_TRANSACTION_ID) {
254
+ const run = this.queue.then(() => this.exchange(command, transactionId), () => this.exchange(command, transactionId));
255
+ this.queue = run.catch(() => undefined);
256
+ return await run;
257
+ }
258
+ async exchange(command, transactionId) {
259
+ await this.open();
260
+ await this.device.sendFeatureReport(RAZER_REPORT_ID, encodeRazerRequest(command, transactionId));
261
+ for (let attempt = 0; attempt < RESPONSE_ATTEMPTS; attempt += 1) {
262
+ await this.delay(RESPONSE_DELAY_MS);
263
+ const reply = this.copyDataView(await this.device.receiveFeatureReport(RAZER_REPORT_ID));
264
+ try {
265
+ return decodeRazerResponse(reply, command);
266
+ }
267
+ catch (error) {
268
+ if (error instanceof RazerProtocolError && error.status === RAZER_STATUS.busy)
269
+ continue;
270
+ throw error;
271
+ }
272
+ }
273
+ throw new Error("The mouse stayed busy — it may be asleep or out of range.");
274
+ }
275
+ copyDataView(view) {
276
+ return new Uint8Array(view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength));
277
+ }
278
+ delay(milliseconds) {
279
+ return new Promise((resolve) => window.setTimeout(resolve, milliseconds));
280
+ }
281
+ }
282
+ //# sourceMappingURL=cobra-hid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cobra-hid.js","sourceRoot":"","sources":["../../../src/drivers/razer/cobra-hid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Opens a Razer control interface, and turns the browser's bare "Failed to open
3
+ * the device." on macOS into an actionable message.
4
+ *
5
+ * Razer's configuration channel lives on a Generic Desktop Mouse collection,
6
+ * which macOS reserves for its own input stack: without the Input Monitoring
7
+ * TCC permission the browser's `IOHIDDeviceOpen` call fails with
8
+ * `kIOReturnNotPermitted`, which WebHID surfaces as a generic NotAllowedError.
9
+ * Nothing in the app can grant that — it is a system permission on the browser
10
+ * itself — so the hint is the whole fix.
11
+ */
12
+ export declare function openRazerDevice(device: HIDDevice): Promise<void>;
13
+ //# sourceMappingURL=hid-open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid-open.d.ts","sourceRoot":"","sources":["../../../src/drivers/razer/hid-open.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
@@ -0,0 +1,29 @@
1
+ const IS_MAC = typeof navigator !== "undefined" && /Mac/i.test(navigator.userAgent);
2
+ const MACOS_INPUT_MONITORING_HINT = "On macOS the browser is refused access to mouse-class HID interfaces unless it"
3
+ + " has Input Monitoring permission. Enable it in System Settings → Privacy &"
4
+ + " Security → Input Monitoring, then quit and reopen the browser.";
5
+ /**
6
+ * Opens a Razer control interface, and turns the browser's bare "Failed to open
7
+ * the device." on macOS into an actionable message.
8
+ *
9
+ * Razer's configuration channel lives on a Generic Desktop Mouse collection,
10
+ * which macOS reserves for its own input stack: without the Input Monitoring
11
+ * TCC permission the browser's `IOHIDDeviceOpen` call fails with
12
+ * `kIOReturnNotPermitted`, which WebHID surfaces as a generic NotAllowedError.
13
+ * Nothing in the app can grant that — it is a system permission on the browser
14
+ * itself — so the hint is the whole fix.
15
+ */
16
+ export async function openRazerDevice(device) {
17
+ if (device.opened)
18
+ return;
19
+ try {
20
+ await device.open();
21
+ }
22
+ catch (error) {
23
+ if (IS_MAC && error instanceof Error) {
24
+ throw new Error(`${error.message} ${MACOS_INPUT_MONITORING_HINT}`);
25
+ }
26
+ throw error;
27
+ }
28
+ }
29
+ //# sourceMappingURL=hid-open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid-open.js","sourceRoot":"","sources":["../../../src/drivers/razer/hid-open.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAEpF,MAAM,2BAA2B,GAC/B,gFAAgF;MAC9E,4EAA4E;MAC5E,iEAAiE,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB;IACrD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,2BAA2B,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,231 @@
1
+ import type { MouseStatus } from "../mouse-types.ts";
2
+ import { type RazerButtonControl, type RazerButtonMapping, type RazerLiftOff, type RazerToggleControl, type RazerTrackingDistance } from "@openmouse/protocol/razer";
3
+ export declare class RazerHidClient {
4
+ private queue;
5
+ private readonly staticReads;
6
+ private asymmetric;
7
+ private asymmetricKnown;
8
+ private buttonMappings;
9
+ private buttonMappingsKnown;
10
+ /** Filled for dock passthrough after the first polling probe. */
11
+ private discoveredPollingRates;
12
+ /** Which polling command the paired mouse answers; null until probed. */
13
+ private discoveredHighRatePolling;
14
+ readonly device: HIDDevice;
15
+ constructor(device: HIDDevice);
16
+ static isSupported(device: HIDDevice): boolean;
17
+ private profile;
18
+ /**
19
+ * Whether polling uses the extended command (a divisor of 8000) rather than
20
+ * the legacy one (a divisor of 1000).
21
+ *
22
+ * Asked of the product rather than of the connection: the Viper 8KHz is wired
23
+ * and needs the extended command, while the pre-HyperPolling receivers are
24
+ * wireless and answer only the legacy one. For every model verified so far
25
+ * this is exactly `isWireless()`, which is what it used to read.
26
+ */
27
+ private usesHighRatePolling;
28
+ /** DPI store byte; most models store, the V2 generation does not. */
29
+ private dpiStorageByte;
30
+ open(): Promise<void>;
31
+ close(): Promise<void>;
32
+ /**
33
+ * Whether this collection actually answers the Razer protocol, tried by
34
+ * sending the firmware-version read rather than inferred from the
35
+ * collection's declared shape. `isSupported()`'s shape check (single
36
+ * collection, Generic Desktop Mouse) is right for every model verified so
37
+ * far, but WebHID does not validate report ids against the descriptor (see
38
+ * the note atop codec.ts), so a collection that fails the shape check can
39
+ * still genuinely answer report 0 — used as a fallback in
40
+ * `razerProbeControlInterface` for exactly that case, not as the normal
41
+ * detection path.
42
+ */
43
+ probeReachable(): Promise<boolean>;
44
+ displayName(): string;
45
+ isWireless(): boolean;
46
+ /**
47
+ * Says so when the model has never been connected by this project.
48
+ *
49
+ * The commands are the ones already confirmed elsewhere, but which of them a
50
+ * given model answers is transcribed rather than measured, so the panel
51
+ * should not present it as the same thing as a tested mouse.
52
+ */
53
+ private connectionDetail;
54
+ maxDpi(): number;
55
+ getSupportedPollingRates(): number[];
56
+ /** Seconds, matching what the panel labels and what `setSleepTimeout` takes. */
57
+ getSleepOptions(): number[];
58
+ /** Whole percentages, matching the vendor slider. */
59
+ getLowPowerOptions(): number[];
60
+ /** The rate above which the vendor software refuses to arm low power mode. */
61
+ getLowPowerPollingCeiling(): number;
62
+ /** Every whole value, because the control validates entries against this list. */
63
+ getDpiOptions(): number[];
64
+ readStatus(): Promise<MouseStatus>;
65
+ /**
66
+ * Every shipped control's current state, keyed by control name — the four
67
+ * cross-assignable `RazerButtonControl`s and the three two-state
68
+ * `RazerToggleControl`s share one dict, since the view layer reads each
69
+ * family by iterating its own fixed control list (`RAZER_BUTTON_CONTROLS` /
70
+ * `RAZER_TOGGLE_CONTROLS`), and the two lists share no control names. Null
71
+ * on a model that has not been confirmed to support this write at all. A
72
+ * control whose reply this driver cannot decode is omitted rather than
73
+ * guessed at.
74
+ */
75
+ readButtonMappings(): Promise<Record<string, string> | null>;
76
+ /** Probes once, then trusts what setButtonMapping leaves behind. */
77
+ private currentButtonMappings;
78
+ /**
79
+ * Sets one control's mapping and confirms it by reading the same control
80
+ * back — not a formality here: this write silently no-ops under the driver's
81
+ * default transaction id, so a status-only check would have shipped a
82
+ * control that looked correct and did nothing. See
83
+ * `RAZER_BUTTON_TRANSACTION_ID`.
84
+ */
85
+ setButtonMapping(control: RazerButtonControl, mapping: RazerButtonMapping): Promise<RazerButtonMapping>;
86
+ /**
87
+ * Sets a two-state control (Scroll Up/Down, the bottom sensitivity button)
88
+ * and confirms it the same way `setButtonMapping` does — read-back after
89
+ * write, not status alone. `label` must be the control's own enabled label
90
+ * or "Disabled"; `razerSetToggleControlCommand` throws otherwise.
91
+ */
92
+ setToggleControl(control: RazerToggleControl, label: string): Promise<string>;
93
+ setDpi(dpi: number, dpiY?: number): Promise<number>;
94
+ setSleepTimeout(seconds: number): Promise<number>;
95
+ setLowPowerThreshold(percent: number): Promise<number>;
96
+ setPollingRate(pollingRateHz: number): Promise<number>;
97
+ /**
98
+ * Battery level, and the charging state when the mouse reports one.
99
+ *
100
+ * The two are separate commands and a mouse may answer the first without the
101
+ * second — the Basilisk X HyperSpeed reports a good level and refuses
102
+ * `0x07`/`0x84` as unsupported. Letting that take the level down with it threw
103
+ * away the reading the panel actually wanted; an unknown charging state is
104
+ * only a missing word in the battery caption.
105
+ */
106
+ private readBattery;
107
+ /**
108
+ * Reads the tracking level and the asymmetric lift-off/landing pair.
109
+ *
110
+ * Returns null when the mouse does not answer. Class `0x0b` has only ever
111
+ * been exercised on the receiver, so the cable may reject it, and a status
112
+ * read that throws takes the whole panel down rather than one control. The
113
+ * caller degrades instead.
114
+ */
115
+ readLiftOff(): Promise<RazerLiftOff | null>;
116
+ /**
117
+ * Reports whether the mouse is currently in asymmetric mode, or null when it
118
+ * cannot be established.
119
+ *
120
+ * Nothing readable carries the mode — two 47-command captures differing only
121
+ * by it were byte-identical, and a full sweep found nothing. What does report
122
+ * it is the pair write's own status: refused `0x03` in symmetric mode,
123
+ * accepted `0x02` in asymmetric.
124
+ *
125
+ * That makes this a probe rather than a read, so it is written to disturb
126
+ * nothing. Re-sending the values the mirror already holds is value-preserving
127
+ * either way, and mode-preserving too: a refusal cannot switch the mode, and
128
+ * an acceptance re-selects the mode the mouse was already in.
129
+ *
130
+ * Call it once per connection, not on every refresh — it is still a write.
131
+ */
132
+ probeAsymmetric(current: RazerLiftOff): Promise<boolean | null>;
133
+ /**
134
+ * Whether this model stores a separate lift-off/landing pair at all.
135
+ *
136
+ * Establishing the mode costs a *write*, so it is only attempted where the
137
+ * pair commands have been confirmed on hardware. A model that has not been
138
+ * connected keeps the plain three-stop tracking control instead, which costs
139
+ * reads only.
140
+ */
141
+ private hasAsymmetricLiftOff;
142
+ /** Probes once, then trusts what the setters leave behind. */
143
+ private asymmetricMode;
144
+ /**
145
+ * Selects the symmetric tracking distance, which also takes the mouse out of
146
+ * asymmetric mode — it honours whichever store was written last, and there is
147
+ * no mode flag to clear.
148
+ *
149
+ * Named for the shell's driver contract rather than the vendor's wording; the
150
+ * vendor calls this the tracking distance.
151
+ */
152
+ setLiftOffDistance(distance: RazerTrackingDistance): Promise<RazerTrackingDistance>;
153
+ /**
154
+ * Writes the asymmetric pair, and switches the mouse into asymmetric mode to
155
+ * do it. The tracking level shares the same reply but not the same write, so
156
+ * it is left as the mouse holds it.
157
+ *
158
+ * Landing is capped just below lift-off rather than rejected, because
159
+ * lowering lift-off past an already-set landing is ordinary use of a pair of
160
+ * controls and the vendor software caps its own slider the same way. The
161
+ * returned values are what the mouse ended up holding, not what was asked
162
+ * for, so a caller can render the cap rather than guess at it.
163
+ */
164
+ setLiftOff(liftOff: number, landing: number): Promise<RazerLiftOff>;
165
+ /**
166
+ * Sends one arm sequence (setting writes) followed by the pair write, and
167
+ * returns on the first success. A refused arm is safe to burn — the units
168
+ * that refuse it read the stored pair back unchanged, and the pair write
169
+ * that follows restores any pair a refusal may have disturbed. When every
170
+ * arm fails, the last refusal propagates so the caller sees the refused
171
+ * command rather than a guessed substitution.
172
+ */
173
+ private writePairArmed;
174
+ /**
175
+ * Wired answers only the legacy command and the receiver only the extended
176
+ * one, so ask for the expected one first and keep the other as a fallback.
177
+ * Asking in the wrong order costs a failed exchange on every refresh.
178
+ *
179
+ * Mouse Dock Pro omits a fixed rate list (`probePollingRates`): if extended
180
+ * polling answers, the paired mouse can use the HyperPolling ladder;
181
+ * otherwise stay on the 1 kHz ladder (e.g. Naga V2 Pro).
182
+ */
183
+ private readPollingRateHz;
184
+ private once;
185
+ private request;
186
+ private exchange;
187
+ /**
188
+ * Sends one protocol request as a feature report. Chrome reports a refused
189
+ * write as a bare `NotAllowedError` whose message is only "Failed to write
190
+ * feature report." with no hint about why, so the throw is wrapped with the
191
+ * troubleshooting paths that actually explain it: the control interface is
192
+ * held by another program (Razer Synapse), the interface granted on the
193
+ * wireless receiver is the pointer collection rather than the control one,
194
+ * macOS has denied the browser Input Monitoring access, or the OS/browser
195
+ * refuses writes to mouse-class collections outright.
196
+ */
197
+ private write;
198
+ /**
199
+ * Reads up to the response budget for one send. Returns the decoded reply, or
200
+ * null when the reply was corrupt or the budget ran out on busy replies — the
201
+ * caller re-sends on null, since a corrupt reply is a lost exchange rather
202
+ * than a status the mouse owns.
203
+ */
204
+ private awaitReply;
205
+ private copyDataView;
206
+ private delay;
207
+ }
208
+ /**
209
+ * Last-resort device selection for when none of the granted collections
210
+ * matched `RazerHidClient.isSupported()`'s shape check. Rather than guess a
211
+ * new shape, this tries the protocol itself against every Razer-vendor
212
+ * collection Chrome granted and returns the client for whichever one
213
+ * actually answers.
214
+ *
215
+ * This exists because the shape check assumes every model's control channel
216
+ * is a single Generic Desktop Mouse collection (verified true so far for
217
+ * every model this driver has been confirmed against) — a real assumption a
218
+ * given browser/OS combination could break for a specific model without any
219
+ * code here changing, since what collections get exposed to WebHID at all is
220
+ * decided below this driver, by the platform. Kept off the normal detection
221
+ * path (`registry.ts`'s `DEVICE_DRIVERS` entry still uses `isSupported()`
222
+ * alone) because sending real protocol traffic to every candidate is real
223
+ * device I/O, not a cheap shape check, and only worth it once the cheap
224
+ * check has already failed to find anything.
225
+ *
226
+ * `sendFeatureReport`/`receiveFeatureReport` reject immediately for a
227
+ * collection with no feature-report capability at all, so a wrong candidate
228
+ * costs one failed call, not a hang — see `write()`'s try/catch above.
229
+ */
230
+ export declare function razerProbeControlInterface(devices: readonly HIDDevice[]): Promise<RazerHidClient | null>;
231
+ //# sourceMappingURL=hid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hid.d.ts","sourceRoot":"","sources":["../../../src/drivers/razer/hid.ts"],"names":[],"mappings":"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"}