react-native-web-serial-api 0.0.3 → 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 (119) hide show
  1. package/README.md +23 -0
  2. package/TESTING.md +301 -0
  3. package/android/build.gradle +2 -2
  4. package/lib/commonjs/UsbSerial.js +58 -26
  5. package/lib/commonjs/UsbSerial.js.map +1 -1
  6. package/lib/commonjs/WebSerial.js +169 -57
  7. package/lib/commonjs/WebSerial.js.map +1 -1
  8. package/lib/commonjs/index.js +13 -1
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/lib/dom-exception.js +176 -0
  11. package/lib/commonjs/lib/dom-exception.js.map +1 -0
  12. package/lib/commonjs/lib/event-target.js +138 -0
  13. package/lib/commonjs/lib/event-target.js.map +1 -0
  14. package/lib/commonjs/lib/promise.js +23 -0
  15. package/lib/commonjs/lib/promise.js.map +1 -0
  16. package/lib/commonjs/testing/index.js +70 -0
  17. package/lib/commonjs/testing/index.js.map +1 -0
  18. package/lib/commonjs/testing/install.js +54 -0
  19. package/lib/commonjs/testing/install.js.map +1 -0
  20. package/lib/commonjs/testing/serial-device.js +164 -0
  21. package/lib/commonjs/testing/serial-device.js.map +1 -0
  22. package/lib/commonjs/testing/virtual-serial.js +615 -0
  23. package/lib/commonjs/testing/virtual-serial.js.map +1 -0
  24. package/lib/commonjs/transport.js +61 -0
  25. package/lib/commonjs/transport.js.map +1 -0
  26. package/lib/typescript/src/UsbSerial.d.ts +24 -67
  27. package/lib/typescript/src/UsbSerial.d.ts.map +1 -1
  28. package/lib/typescript/src/WebSerial.d.ts +11 -2
  29. package/lib/typescript/src/WebSerial.d.ts.map +1 -1
  30. package/lib/typescript/src/index.d.ts +2 -0
  31. package/lib/typescript/src/index.d.ts.map +1 -1
  32. package/lib/typescript/src/lib/dom-exception.d.ts +100 -0
  33. package/lib/typescript/src/lib/dom-exception.d.ts.map +1 -0
  34. package/lib/typescript/src/lib/event-target.d.ts +53 -0
  35. package/lib/typescript/src/lib/event-target.d.ts.map +1 -0
  36. package/lib/typescript/src/lib/promise.d.ts +11 -0
  37. package/lib/typescript/src/lib/promise.d.ts.map +1 -0
  38. package/lib/typescript/src/testing/index.d.ts +23 -0
  39. package/lib/typescript/src/testing/index.d.ts.map +1 -0
  40. package/lib/typescript/src/testing/install.d.ts +25 -0
  41. package/lib/typescript/src/testing/install.d.ts.map +1 -0
  42. package/lib/typescript/src/testing/serial-device.d.ts +127 -0
  43. package/lib/typescript/src/testing/serial-device.d.ts.map +1 -0
  44. package/lib/typescript/src/testing/virtual-serial.d.ts +205 -0
  45. package/lib/typescript/src/testing/virtual-serial.d.ts.map +1 -0
  46. package/lib/typescript/src/transport.d.ts +131 -0
  47. package/lib/typescript/src/transport.d.ts.map +1 -0
  48. package/package.json +38 -2
  49. package/src/UsbSerial.ts +65 -90
  50. package/src/WebSerial.ts +227 -88
  51. package/src/index.ts +2 -7
  52. package/src/lib/dom-exception.ts +129 -60
  53. package/src/lib/event-target.ts +46 -21
  54. package/src/lib/promise.ts +7 -7
  55. package/src/testing/index.ts +42 -0
  56. package/src/testing/install.ts +65 -0
  57. package/src/testing/serial-device.ts +193 -0
  58. package/src/testing/virtual-serial.ts +801 -0
  59. package/src/transport.ts +200 -0
  60. package/babel.config.js +0 -3
  61. package/biome.json +0 -35
  62. package/example/.watchmanconfig +0 -1
  63. package/example/App.tsx +0 -71
  64. package/example/__tests__/App.test.tsx +0 -16
  65. package/example/__tests__/connectEvents.test.tsx +0 -81
  66. package/example/__tests__/getPorts.test.tsx +0 -140
  67. package/example/android/app/build.gradle +0 -120
  68. package/example/android/app/debug.keystore +0 -0
  69. package/example/android/app/proguard-rules.pro +0 -10
  70. package/example/android/app/src/debug/AndroidManifest.xml +0 -9
  71. package/example/android/app/src/main/AndroidManifest.xml +0 -38
  72. package/example/android/app/src/main/java/dev/uzlopak/MainActivity.kt +0 -22
  73. package/example/android/app/src/main/java/dev/uzlopak/MainApplication.kt +0 -41
  74. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +0 -37
  75. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  76. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  77. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  78. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  79. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  80. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  81. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  82. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  83. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  84. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  85. package/example/android/app/src/main/res/values/strings.xml +0 -3
  86. package/example/android/app/src/main/res/values/styles.xml +0 -9
  87. package/example/android/build.gradle +0 -22
  88. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  89. package/example/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  90. package/example/android/gradle.properties +0 -47
  91. package/example/android/gradlew +0 -252
  92. package/example/android/gradlew.bat +0 -94
  93. package/example/android/settings.gradle +0 -6
  94. package/example/app.json +0 -4
  95. package/example/babel.config.js +0 -21
  96. package/example/biome.json +0 -47
  97. package/example/deploy.sh +0 -11
  98. package/example/index.html +0 -26
  99. package/example/index.js +0 -9
  100. package/example/index.web.js +0 -8
  101. package/example/jest.config.js +0 -12
  102. package/example/metro.config.js +0 -58
  103. package/example/package-lock.json +0 -14510
  104. package/example/package.json +0 -48
  105. package/example/react-native.config.js +0 -17
  106. package/example/src/components/AppBar.tsx +0 -73
  107. package/example/src/components/Menu.tsx +0 -90
  108. package/example/src/components/SingleChoiceDialog.tsx +0 -120
  109. package/example/src/screens/ConnectScreen.tsx +0 -195
  110. package/example/src/screens/DevicesScreen.tsx +0 -252
  111. package/example/src/screens/TerminalScreen.tsx +0 -572
  112. package/example/src/settings.ts +0 -43
  113. package/example/src/theme.ts +0 -19
  114. package/example/src/util/TextUtil.ts +0 -129
  115. package/example/tsconfig.json +0 -10
  116. package/example/vite.config.mjs +0 -55
  117. package/scripts/deploy-release.sh +0 -127
  118. package/tsconfig.build.json +0 -7
  119. package/tsconfig.json +0 -20
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DOM_EXCEPTION_NAMES = exports.DOM_EXCEPTION_CODES = exports.DOMExceptionPolyfill = exports.DOMExceptionImpl = exports.DOMException = void 0;
7
+ /**
8
+ * DOMException Polyfill
9
+ *
10
+ * Provides a spec-compliant DOMException implementation for environments
11
+ * where it is missing or incomplete (e.g. Node.js < 17, some older browsers).
12
+ *
13
+ * Spec: https://webidl.spec.whatwg.org/#idl-DOMException
14
+ */
15
+
16
+ const DOM_EXCEPTION_CODES = exports.DOM_EXCEPTION_CODES = {
17
+ IndexSizeError: 1,
18
+ HierarchyRequestError: 3,
19
+ WrongDocumentError: 4,
20
+ InvalidCharacterError: 5,
21
+ NoModificationAllowedError: 7,
22
+ NotFoundError: 8,
23
+ NotSupportedError: 9,
24
+ InUseAttributeError: 10,
25
+ InvalidStateError: 11,
26
+ SyntaxError: 12,
27
+ InvalidModificationError: 13,
28
+ NamespaceError: 14,
29
+ InvalidAccessError: 15,
30
+ TypeMismatchError: 17,
31
+ SecurityError: 18,
32
+ NetworkError: 19,
33
+ AbortError: 20,
34
+ URLMismatchError: 21,
35
+ QuotaExceededError: 22,
36
+ TimeoutError: 23,
37
+ InvalidNodeTypeError: 24,
38
+ DataCloneError: 25
39
+ };
40
+ const DOM_EXCEPTION_NAMES = exports.DOM_EXCEPTION_NAMES = Object.fromEntries(Object.entries(DOM_EXCEPTION_CODES).map(([name, code]) => [code, name]));
41
+ // ---------------------------------------------------------------------------
42
+ // Polyfill class
43
+ // ---------------------------------------------------------------------------
44
+
45
+ class DOMExceptionPolyfill extends Error {
46
+ // Instance numeric legacy code (0 when name has no legacy code)
47
+
48
+ // Error name (defaults to "Error" per spec)
49
+
50
+ // --- Static legacy-code constants ---
51
+ static INDEX_SIZE_ERR = 1;
52
+ static DOMSTRING_SIZE_ERR = 2;
53
+ static HIERARCHY_REQUEST_ERR = 3;
54
+ static WRONG_DOCUMENT_ERR = 4;
55
+ static INVALID_CHARACTER_ERR = 5;
56
+ static NO_DATA_ALLOWED_ERR = 6;
57
+ static NO_MODIFICATION_ALLOWED_ERR = 7;
58
+ static NOT_FOUND_ERR = 8;
59
+ static NOT_SUPPORTED_ERR = 9;
60
+ static INUSE_ATTRIBUTE_ERR = 10;
61
+ static INVALID_STATE_ERR = 11;
62
+ static SYNTAX_ERR = 12;
63
+ static INVALID_MODIFICATION_ERR = 13;
64
+ static NAMESPACE_ERR = 14;
65
+ static INVALID_ACCESS_ERR = 15;
66
+ static VALIDATION_ERR = 16;
67
+ static TYPE_MISMATCH_ERR = 17;
68
+ static SECURITY_ERR = 18;
69
+ static NETWORK_ERR = 19;
70
+ static ABORT_ERR = 20;
71
+ static URL_MISMATCH_ERR = 21;
72
+ static QUOTA_EXCEEDED_ERR = 22;
73
+ static TIMEOUT_ERR = 23;
74
+ static INVALID_NODE_TYPE_ERR = 24;
75
+ static DATA_CLONE_ERR = 25;
76
+ constructor(message = '', name = 'Error') {
77
+ super(message);
78
+
79
+ // Restore the correct prototype chain when transpiled to ES5
80
+ Object.setPrototypeOf(this, new.target.prototype);
81
+ this.name = name;
82
+ this.message = message;
83
+ this.code = DOM_EXCEPTION_CODES[name] ?? 0;
84
+
85
+ // Provide a useful stack trace in V8 / SpiderMonkey
86
+ const ErrorWithStack = Error;
87
+ if (typeof ErrorWithStack.captureStackTrace === 'function') {
88
+ ErrorWithStack.captureStackTrace(this, new.target);
89
+ }
90
+ }
91
+
92
+ /** Mirror static constants on the prototype (spec §3.1.2) */
93
+ get INDEX_SIZE_ERR() {
94
+ return 1;
95
+ }
96
+ get DOMSTRING_SIZE_ERR() {
97
+ return 2;
98
+ }
99
+ get HIERARCHY_REQUEST_ERR() {
100
+ return 3;
101
+ }
102
+ get WRONG_DOCUMENT_ERR() {
103
+ return 4;
104
+ }
105
+ get INVALID_CHARACTER_ERR() {
106
+ return 5;
107
+ }
108
+ get NO_DATA_ALLOWED_ERR() {
109
+ return 6;
110
+ }
111
+ get NO_MODIFICATION_ALLOWED_ERR() {
112
+ return 7;
113
+ }
114
+ get NOT_FOUND_ERR() {
115
+ return 8;
116
+ }
117
+ get NOT_SUPPORTED_ERR() {
118
+ return 9;
119
+ }
120
+ get INUSE_ATTRIBUTE_ERR() {
121
+ return 10;
122
+ }
123
+ get INVALID_STATE_ERR() {
124
+ return 11;
125
+ }
126
+ get SYNTAX_ERR() {
127
+ return 12;
128
+ }
129
+ get INVALID_MODIFICATION_ERR() {
130
+ return 13;
131
+ }
132
+ get NAMESPACE_ERR() {
133
+ return 14;
134
+ }
135
+ get INVALID_ACCESS_ERR() {
136
+ return 15;
137
+ }
138
+ get VALIDATION_ERR() {
139
+ return 16;
140
+ }
141
+ get TYPE_MISMATCH_ERR() {
142
+ return 17;
143
+ }
144
+ get SECURITY_ERR() {
145
+ return 18;
146
+ }
147
+ get NETWORK_ERR() {
148
+ return 19;
149
+ }
150
+ get ABORT_ERR() {
151
+ return 20;
152
+ }
153
+ get URL_MISMATCH_ERR() {
154
+ return 21;
155
+ }
156
+ get QUOTA_EXCEEDED_ERR() {
157
+ return 22;
158
+ }
159
+ get TIMEOUT_ERR() {
160
+ return 23;
161
+ }
162
+ get INVALID_NODE_TYPE_ERR() {
163
+ return 24;
164
+ }
165
+ get DATA_CLONE_ERR() {
166
+ return 25;
167
+ }
168
+
169
+ /** Canonical string representation */
170
+ toString() {
171
+ return `${this.name}: ${this.message}`;
172
+ }
173
+ }
174
+ exports.DOMExceptionPolyfill = DOMExceptionPolyfill;
175
+ const DOMExceptionImpl = exports.DOMException = exports.DOMExceptionImpl = globalThis.DOMException ? globalThis.DOMException : DOMExceptionPolyfill;
176
+ //# sourceMappingURL=dom-exception.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DOM_EXCEPTION_CODES","exports","IndexSizeError","HierarchyRequestError","WrongDocumentError","InvalidCharacterError","NoModificationAllowedError","NotFoundError","NotSupportedError","InUseAttributeError","InvalidStateError","SyntaxError","InvalidModificationError","NamespaceError","InvalidAccessError","TypeMismatchError","SecurityError","NetworkError","AbortError","URLMismatchError","QuotaExceededError","TimeoutError","InvalidNodeTypeError","DataCloneError","DOM_EXCEPTION_NAMES","Object","fromEntries","entries","map","name","code","DOMExceptionPolyfill","Error","INDEX_SIZE_ERR","DOMSTRING_SIZE_ERR","HIERARCHY_REQUEST_ERR","WRONG_DOCUMENT_ERR","INVALID_CHARACTER_ERR","NO_DATA_ALLOWED_ERR","NO_MODIFICATION_ALLOWED_ERR","NOT_FOUND_ERR","NOT_SUPPORTED_ERR","INUSE_ATTRIBUTE_ERR","INVALID_STATE_ERR","SYNTAX_ERR","INVALID_MODIFICATION_ERR","NAMESPACE_ERR","INVALID_ACCESS_ERR","VALIDATION_ERR","TYPE_MISMATCH_ERR","SECURITY_ERR","NETWORK_ERR","ABORT_ERR","URL_MISMATCH_ERR","QUOTA_EXCEEDED_ERR","TIMEOUT_ERR","INVALID_NODE_TYPE_ERR","DATA_CLONE_ERR","constructor","message","setPrototypeOf","new","target","prototype","ErrorWithStack","captureStackTrace","toString","DOMExceptionImpl","DOMException","globalThis"],"sourceRoot":"../../../src","sources":["lib/dom-exception.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EventTarget = exports.Event = void 0;
7
+ exports.setEventParent = setEventParent;
8
+ class Event {
9
+ target = null;
10
+ currentTarget = null;
11
+ defaultPrevented = false;
12
+ cancelBubble = false;
13
+ _stopImmediatePropagationFlag = false;
14
+ timeStamp = Date.now();
15
+ isTrusted = false;
16
+ static NONE = 0;
17
+ static CAPTURING_PHASE = 1;
18
+ static AT_TARGET = 2;
19
+ static BUBBLING_PHASE = 3;
20
+ NONE = 0;
21
+ CAPTURING_PHASE = 1;
22
+ AT_TARGET = 2;
23
+ BUBBLING_PHASE = 3;
24
+ eventPhase = Event.NONE;
25
+ constructor(type, options) {
26
+ this.type = type;
27
+ this.bubbles = options?.bubbles ?? false;
28
+ this.cancelable = options?.cancelable ?? false;
29
+ this.composed = options?.composed ?? false;
30
+ }
31
+ preventDefault() {
32
+ if (this.cancelable) {
33
+ this.defaultPrevented = true;
34
+ }
35
+ }
36
+ stopPropagation() {
37
+ this.cancelBubble = true;
38
+ }
39
+ stopImmediatePropagation() {
40
+ this.cancelBubble = true;
41
+ this._stopImmediatePropagationFlag = true;
42
+ }
43
+ composedPath() {
44
+ return this.currentTarget ? [this.currentTarget] : [];
45
+ }
46
+ initEvent(type, bubbles, cancelable) {
47
+ this.type = type;
48
+ this.bubbles = bubbles ?? false;
49
+ this.cancelable = cancelable ?? false;
50
+ }
51
+ }
52
+ exports.Event = Event;
53
+ const wm = new WeakMap();
54
+
55
+ // Optional event-propagation parents. An event dispatched on a child also runs
56
+ // its parent's listeners, while event.target stays the original child. This
57
+ // models the W3C "SerialPort's parent is the Serial" relationship, so a
58
+ // connect/disconnect observed on `serial` reports event.target === the
59
+ // SerialPort (per the Web Serial spec and WPT).
60
+ const eventParents = new WeakMap();
61
+
62
+ /** Make events dispatched on `child` also bubble to `parent`'s listeners. */
63
+ function setEventParent(child, parent) {
64
+ eventParents.set(child, parent);
65
+ }
66
+ function define(target, name, value) {
67
+ Object.defineProperty(target, name, {
68
+ configurable: true,
69
+ writable: true,
70
+ value
71
+ });
72
+ }
73
+ function dispatch(info) {
74
+ const options = info.options;
75
+ const once = typeof options === 'object' && options !== null ? options.once : false;
76
+ if (once) {
77
+ info.target.removeEventListener(this.type, info.listener);
78
+ }
79
+ if (typeof info.listener === 'function') {
80
+ info.listener.call(info.target, this);
81
+ } else {
82
+ info.listener.handleEvent(this);
83
+ }
84
+ return this._stopImmediatePropagationFlag;
85
+ }
86
+ class EventTarget {
87
+ constructor() {
88
+ wm.set(this, Object.create(null));
89
+ }
90
+ addEventListener(type, listener, options) {
91
+ const secret = wm.get(this);
92
+ let listeners = secret[type];
93
+ if (!listeners) {
94
+ listeners = [];
95
+ secret[type] = listeners;
96
+ }
97
+ for (let i = 0; i < listeners.length; i++) {
98
+ if (listeners[i].listener === listener) return;
99
+ }
100
+ listeners.push({
101
+ target: this,
102
+ listener,
103
+ options
104
+ });
105
+ }
106
+ dispatchEvent(event) {
107
+ // The event's target is the node it was dispatched on; it then bubbles up
108
+ // the eventParents chain (currentTarget changes, target does not).
109
+ define(event, 'target', this);
110
+ let node = this;
111
+ while (node) {
112
+ const listeners = wm.get(node)?.[event.type];
113
+ if (listeners?.length) {
114
+ define(event, 'currentTarget', node);
115
+ listeners.slice(0).some(dispatch, event);
116
+ }
117
+ if (event.cancelBubble) break;
118
+ node = eventParents.get(node) ?? null;
119
+ }
120
+ // Per the DOM, target persists after dispatch (a re-dispatch overwrites it
121
+ // at the top of this method); only currentTarget is cleared.
122
+ define(event, 'currentTarget', null);
123
+ return true;
124
+ }
125
+ removeEventListener(type, listener, _options) {
126
+ const secret = wm.get(this);
127
+ const listeners = secret[type];
128
+ if (!listeners) return;
129
+ for (let i = 0; i < listeners.length; i++) {
130
+ if (listeners[i].listener === listener) {
131
+ listeners.splice(i, 1);
132
+ return;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ exports.EventTarget = EventTarget;
138
+ //# sourceMappingURL=event-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Event","target","currentTarget","defaultPrevented","cancelBubble","_stopImmediatePropagationFlag","timeStamp","Date","now","isTrusted","NONE","CAPTURING_PHASE","AT_TARGET","BUBBLING_PHASE","eventPhase","constructor","type","options","bubbles","cancelable","composed","preventDefault","stopPropagation","stopImmediatePropagation","composedPath","initEvent","exports","wm","WeakMap","eventParents","setEventParent","child","parent","set","define","name","value","Object","defineProperty","configurable","writable","dispatch","info","once","removeEventListener","listener","call","handleEvent","EventTarget","create","addEventListener","secret","get","listeners","i","length","push","dispatchEvent","event","node","slice","some","_options","splice"],"sourceRoot":"../../../src","sources":["lib/event-target.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createDeferredPromise = createDeferredPromise;
7
+ /**
8
+ * @returns An object containing a promise and its resolve/reject methods.
9
+ */
10
+ function createDeferredPromise() {
11
+ let res;
12
+ let rej;
13
+ const promise = new Promise((resolve, reject) => {
14
+ res = resolve;
15
+ rej = reject;
16
+ });
17
+ return {
18
+ promise,
19
+ resolve: res,
20
+ reject: rej
21
+ };
22
+ }
23
+ //# sourceMappingURL=promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createDeferredPromise","res","rej","promise","Promise","resolve","reject"],"sourceRoot":"../../../src","sources":["lib/promise.ts"],"mappings":";;;;;;AAMA;AACA;AACA;AACO,SAASA,qBAAqBA,CAAA,EAA0B;EAC7D,IAAIC,GAAY;EAChB,IAAIC,GAAY;EAChB,MAAMC,OAAO,GAAG,IAAIC,OAAO,CAAI,CAACC,OAAO,EAAEC,MAAM,KAAK;IAClDL,GAAG,GAAGI,OAAO;IACbH,GAAG,GAAGI,MAAM;EACd,CAAC,CAAC;EAEF,OAAO;IAACH,OAAO;IAAEE,OAAO,EAAEJ,GAAG;IAAEK,MAAM,EAAEJ;EAAG,CAAC;AAC7C","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "EchoDevice", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _serialDevice.EchoDevice;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "LineDevice", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _serialDevice.LineDevice;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "SerialDevice", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _serialDevice.SerialDevice;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "SilentDevice", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _serialDevice.SilentDevice;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "VirtualDevice", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _virtualSerial.VirtualDevice;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "VirtualSerialTransport", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _virtualSerial.VirtualSerialTransport;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "getUsbSerial", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _UsbSerial.getUsbSerial;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "installSerialMock", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _install.installSerialMock;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "resetUsbSerial", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _UsbSerial.resetUsbSerial;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "setUsbSerial", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _UsbSerial.setUsbSerial;
64
+ }
65
+ });
66
+ var _UsbSerial = require("../UsbSerial");
67
+ var _install = require("./install");
68
+ var _serialDevice = require("./serial-device");
69
+ var _virtualSerial = require("./virtual-serial");
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_UsbSerial","require","_install","_serialDevice","_virtualSerial"],"sourceRoot":"../../../src","sources":["testing/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAAA,UAAA,GAAAC,OAAA;AAGA,IAAAC,QAAA,GAAAD,OAAA;AASA,IAAAE,aAAA,GAAAF,OAAA;AAWA,IAAAG,cAAA,GAAAH,OAAA","ignoreList":[]}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.installSerialMock = installSerialMock;
7
+ var _UsbSerial = require("../UsbSerial");
8
+ var _serialDevice = require("./serial-device");
9
+ var _virtualSerial = require("./virtual-serial");
10
+ /**
11
+ * installSerialMock — point the library at a virtual device set in one call.
12
+ *
13
+ * Built for E2E: call it once at app startup, behind your own env/build flag, to
14
+ * make `navigator.serial` / this library's `serial` talk to simulated
15
+ * {@link SerialDevice}s instead of real USB hardware while a test driver
16
+ * (Maestro, Detox, …) exercises the app on a device/emulator.
17
+ *
18
+ * @example
19
+ * // index.js (debug/E2E build only)
20
+ * import {installSerialMock, EchoDevice} from 'react-native-web-serial-api/testing';
21
+ * installSerialMock({
22
+ * enabled: process.env.RNWS_SERIAL_MOCK === '1',
23
+ * devices: [new EchoDevice(), new MyThermometer()],
24
+ * });
25
+ */
26
+
27
+ /** A device to register: a SerialDevice, optionally with transport options. */
28
+
29
+ /**
30
+ * Build a {@link VirtualSerialTransport} from `devices` and install it globally
31
+ * via {@link setUsbSerial}. SerialDevices default to granted USB permission (so
32
+ * they show up immediately); pass the `{device, options}` form to override.
33
+ * Returns the transport (handy for driving devices in-test), or `null` when
34
+ * disabled.
35
+ */
36
+ function installSerialMock(options) {
37
+ if (options.enabled === false) return null;
38
+ const transport = new _virtualSerial.VirtualSerialTransport(options.transport);
39
+ for (const entry of options.devices) {
40
+ if (entry instanceof _serialDevice.SerialDevice) {
41
+ transport.addDevice(entry, {
42
+ hasPermission: true
43
+ });
44
+ } else {
45
+ transport.addDevice(entry.device, {
46
+ hasPermission: true,
47
+ ...entry.options
48
+ });
49
+ }
50
+ }
51
+ (0, _UsbSerial.setUsbSerial)(transport);
52
+ return transport;
53
+ }
54
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_UsbSerial","require","_serialDevice","_virtualSerial","installSerialMock","options","enabled","transport","VirtualSerialTransport","entry","devices","SerialDevice","addDevice","hasPermission","device","setUsbSerial"],"sourceRoot":"../../../src","sources":["testing/install.ts"],"mappings":";;;;;;AAgBA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAKA,IAAAE,cAAA,GAAAF,OAAA;AAtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,iBAAiBA,CAC/BC,OAAiC,EACF;EAC/B,IAAIA,OAAO,CAACC,OAAO,KAAK,KAAK,EAAE,OAAO,IAAI;EAE1C,MAAMC,SAAS,GAAG,IAAIC,qCAAsB,CAACH,OAAO,CAACE,SAAS,CAAC;EAC/D,KAAK,MAAME,KAAK,IAAIJ,OAAO,CAACK,OAAO,EAAE;IACnC,IAAID,KAAK,YAAYE,0BAAY,EAAE;MACjCJ,SAAS,CAACK,SAAS,CAACH,KAAK,EAAE;QAACI,aAAa,EAAE;MAAI,CAAC,CAAC;IACnD,CAAC,MAAM;MACLN,SAAS,CAACK,SAAS,CAACH,KAAK,CAACK,MAAM,EAAE;QAChCD,aAAa,EAAE,IAAI;QACnB,GAAGJ,KAAK,CAACJ;MACX,CAAC,CAAC;IACJ;EACF;EAEA,IAAAU,uBAAY,EAACR,SAAS,CAAC;EACvB,OAAOA,SAAS;AAClB","ignoreList":[]}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SilentDevice = exports.SerialDevice = exports.LineDevice = exports.EchoDevice = void 0;
7
+ exports.toBytes = toBytes;
8
+ /**
9
+ * SerialDevice — author a complete simulated serial peripheral.
10
+ *
11
+ * Extend the class and override the lifecycle hooks to model a real device's
12
+ * whole behaviour (firmware/protocol): react to `open()`, to bytes the host
13
+ * writes, to control-signal changes, and stream data back over time. It is
14
+ * hosted by a {@link VirtualSerialTransport} ({@link ./virtual-serial}) and is
15
+ * free of any `react-native` dependency, so the same device runs under Jest,
16
+ * in a browser, and inside a React Native app on a device/emulator (for E2E).
17
+ *
18
+ * @example
19
+ * class Thermometer extends SerialDevice {
20
+ * usbVendorId = 0x0403;
21
+ * usbProductId = 0x6001;
22
+ * #timer?: ReturnType<typeof setInterval>;
23
+ * onOpen() {
24
+ * this.#timer = setInterval(() => this.send(`${20 + Math.random()}C\r\n`), 1000);
25
+ * }
26
+ * onData(bytes) { // host wrote a command
27
+ * if (String.fromCharCode(...bytes).trim() === 'ID?') this.send('ACME-TEMP\r\n');
28
+ * }
29
+ * onClose() { clearInterval(this.#timer); }
30
+ * }
31
+ * transport.addDevice(new Thermometer(), {hasPermission: true});
32
+ */
33
+
34
+ /** The negotiated connection parameters (native parity code: 0 none/1 odd/2 even). */
35
+
36
+ /** Device-asserted input signals — what the host reads via getSignals(). */
37
+
38
+ /** Host-asserted output signals (DTR/RTS/break) the device observes. */
39
+
40
+ /**
41
+ * The handle a {@link SerialDevice} uses to talk back to the host. Provided by
42
+ * the transport; you normally use the `protected` helpers on `SerialDevice`
43
+ * rather than this directly.
44
+ */
45
+
46
+ /** Coerce a payload into a byte array (string → char codes, & 0xff). */
47
+ function toBytes(data) {
48
+ if (typeof data === 'string') {
49
+ return Array.from(data, c => c.charCodeAt(0) & 0xff);
50
+ }
51
+ if (data instanceof Uint8Array) return Array.from(data);
52
+ return data.map(n => n & 0xff);
53
+ }
54
+
55
+ /**
56
+ * Base class for a simulated serial peripheral. Override the `on*` hooks you
57
+ * care about (all default to no-ops and may be async) and use the `protected`
58
+ * helpers to drive the host.
59
+ */
60
+ class SerialDevice {
61
+ /** USB Vendor ID this device reports for enumeration. */
62
+
63
+ /** USB Product ID this device reports for enumeration. */
64
+
65
+ /** Optional USB serial number. */
66
+
67
+ #host = null;
68
+
69
+ /** @internal Bind the transport host (called by VirtualSerialTransport). */
70
+ _bind(host) {
71
+ this.#host = host;
72
+ }
73
+
74
+ /** Send bytes to the host (they appear on `port.readable`). */
75
+ send(data) {
76
+ this.#host?.send(toBytes(data));
77
+ }
78
+
79
+ /**
80
+ * Raise a typed read error on the host's readable stream. `name` is the W3C
81
+ * error type, e.g. "BreakError", "BufferOverrunError", "FramingError",
82
+ * "ParityError" (defaults to "NetworkError").
83
+ */
84
+ raiseError(message, name) {
85
+ this.#host?.raiseError(message, name);
86
+ }
87
+
88
+ /** Set device-asserted input signals (DCD/CTS/RI/DSR) the host can read. */
89
+ setSignals(signals) {
90
+ this.#host?.setSignals(signals);
91
+ }
92
+
93
+ /** The parameters the host opened the port with, or null when closed. */
94
+ get openOptions() {
95
+ return this.#host?.openOptions ?? null;
96
+ }
97
+ get deviceId() {
98
+ return this.#host?.deviceId ?? -1;
99
+ }
100
+ get portNumber() {
101
+ return this.#host?.portNumber ?? 0;
102
+ }
103
+
104
+ /** The host opened the port. */
105
+ onOpen(_options) {}
106
+ /** The host wrote bytes to the device. */
107
+ onData(_data) {}
108
+ /** The host changed DTR/RTS/break. */
109
+ onHostSignals(_signals) {}
110
+ /** The host closed the port. */
111
+ onClose() {}
112
+ }
113
+
114
+ /** Optional USB identity for the built-in devices. */
115
+ exports.SerialDevice = SerialDevice;
116
+ /** A loopback device: every byte written is echoed straight back. */
117
+ class EchoDevice extends SerialDevice {
118
+ constructor(identity = {}) {
119
+ super();
120
+ this.usbVendorId = identity.usbVendorId ?? 0x0403;
121
+ this.usbProductId = identity.usbProductId ?? 0x6001;
122
+ this.serialNumber = identity.serialNumber;
123
+ }
124
+ onData(data) {
125
+ this.send(data);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Base for a line-oriented command/response device: buffers incoming bytes and
131
+ * calls {@link onLine} for each `\n`-terminated line (trailing CR/LF stripped).
132
+ */
133
+ exports.EchoDevice = EchoDevice;
134
+ class LineDevice extends SerialDevice {
135
+ #buffer = '';
136
+
137
+ /** Handle one line received from the host. */
138
+
139
+ onData(data) {
140
+ for (let i = 0; i < data.length; i++) {
141
+ this.#buffer += String.fromCharCode(data[i]);
142
+ }
143
+ let nl = this.#buffer.indexOf('\n');
144
+ while (nl >= 0) {
145
+ const line = this.#buffer.slice(0, nl).replace(/\r$/, '');
146
+ this.#buffer = this.#buffer.slice(nl + 1);
147
+ void this.onLine(line);
148
+ nl = this.#buffer.indexOf('\n');
149
+ }
150
+ }
151
+ }
152
+
153
+ /** A device that accepts writes but never sends anything back. */
154
+ exports.LineDevice = LineDevice;
155
+ class SilentDevice extends SerialDevice {
156
+ constructor(identity = {}) {
157
+ super();
158
+ this.usbVendorId = identity.usbVendorId ?? 0x0403;
159
+ this.usbProductId = identity.usbProductId ?? 0x6001;
160
+ this.serialNumber = identity.serialNumber;
161
+ }
162
+ }
163
+ exports.SilentDevice = SilentDevice;
164
+ //# sourceMappingURL=serial-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["toBytes","data","Array","from","c","charCodeAt","Uint8Array","map","n","SerialDevice","host","_bind","send","raiseError","message","name","setSignals","signals","openOptions","deviceId","portNumber","onOpen","_options","onData","_data","onHostSignals","_signals","onClose","exports","EchoDevice","constructor","identity","usbVendorId","usbProductId","serialNumber","LineDevice","buffer","i","length","String","fromCharCode","nl","indexOf","line","slice","replace","onLine","SilentDevice"],"sourceRoot":"../../../src","sources":["testing/serial-device.ts"],"mappings":"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","ignoreList":[]}