ngx-web-serial 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
package/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
[![Publish to GitHub Packages](https://github.com/mattfors/ngx-web-serial/actions/workflows/build.yml/badge.svg)](https://github.com/mattfors/ngx-web-serial/actions/workflows/build.yml)
|
2
2
|
|
3
|
-
#
|
3
|
+
# NgxWebSerial
|
4
4
|
|
5
|
-
|
5
|
+
NgxWebSerial is an angular library for connecting to serial devices with the Web Serial API and RxJS.
|
6
|
+
|
7
|
+
Connecting, transmitting and receiving data are abstracted to RxJS observables which will be familiar to anyone using Angular.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
@@ -11,10 +13,10 @@ npm i ngx-web-serial
|
|
11
13
|
```
|
12
14
|
|
13
15
|
## Usage
|
14
|
-
Below
|
16
|
+
Below demonstrates the basic usage. A pipe is used to accumulate the raw data from the serial port.
|
15
17
|
```typescript
|
16
18
|
import { Component } from '@angular/core';
|
17
|
-
import {
|
19
|
+
import { NgxWebSerial, provideNgxWebSerial } from 'ngx-web-serial';
|
18
20
|
import { Observable, scan } from 'rxjs';
|
19
21
|
import { AsyncPipe } from '@angular/common';
|
20
22
|
|
@@ -22,7 +24,7 @@ import { AsyncPipe } from '@angular/common';
|
|
22
24
|
selector: 'app-root',
|
23
25
|
standalone: true,
|
24
26
|
imports: [AsyncPipe],
|
25
|
-
providers: [
|
27
|
+
providers: [provideNgxWebSerial()],
|
26
28
|
template: `
|
27
29
|
<button (click)="open()">Open</button>
|
28
30
|
<input #inputField
|
@@ -38,7 +40,7 @@ export class AppComponent {
|
|
38
40
|
|
39
41
|
data$: Observable<string>;
|
40
42
|
|
41
|
-
constructor(private serial:
|
43
|
+
constructor(private serial: NgxWebSerial) {
|
42
44
|
this.data$ = this.serial.read().pipe(
|
43
45
|
scan((acc, value) => acc + value, '')
|
44
46
|
);
|
@@ -49,7 +51,7 @@ export class AppComponent {
|
|
49
51
|
}
|
50
52
|
|
51
53
|
write(value: string): void {
|
52
|
-
this.serial.write(value
|
54
|
+
this.serial.write(value).subscribe();
|
53
55
|
}
|
54
56
|
|
55
57
|
}
|
@@ -59,5 +61,5 @@ export class AppComponent {
|
|
59
61
|
## Mock serial device
|
60
62
|
The module can be used with a mock serial device for testing or if you do not have a real serial device. Provide a function which takes and returns a string. In this example, the text transmitted to the serial device will be echoed back with 'Hello'.
|
61
63
|
```typescript
|
62
|
-
providers: [
|
64
|
+
providers: [provideNgxWebSerialTest(i => `Hello ${i}!\n`)]
|
63
65
|
```
|
@@ -3,7 +3,7 @@ import { BehaviorSubject, catchError, filter, firstValueFrom, from, interval, ma
|
|
3
3
|
import { DOCUMENT } from '@angular/common';
|
4
4
|
import { MockSerial } from './mock-serial';
|
5
5
|
import * as i0 from "@angular/core";
|
6
|
-
export class
|
6
|
+
export class NgxWebSerial {
|
7
7
|
constructor(serial, ngZone) {
|
8
8
|
this.serial = serial;
|
9
9
|
this.ngZone = ngZone;
|
@@ -92,18 +92,18 @@ export class NgxWebSerialService {
|
|
92
92
|
this.abortController.abort();
|
93
93
|
}
|
94
94
|
}
|
95
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
96
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
95
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial, deps: [{ token: 'Serial' }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
96
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial }); }
|
97
97
|
}
|
98
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
98
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial, decorators: [{
|
99
99
|
type: Injectable
|
100
100
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
101
101
|
type: Inject,
|
102
102
|
args: ['Serial']
|
103
103
|
}] }, { type: i0.NgZone }] });
|
104
|
-
export function
|
104
|
+
export function provideNgxWebSerial() {
|
105
105
|
return [
|
106
|
-
|
106
|
+
NgxWebSerial,
|
107
107
|
{
|
108
108
|
provide: 'Serial',
|
109
109
|
useFactory: (document) => document.defaultView?.navigator?.serial,
|
@@ -111,9 +111,9 @@ export function provideAngularSerial() {
|
|
111
111
|
}
|
112
112
|
];
|
113
113
|
}
|
114
|
-
export function
|
114
|
+
export function provideNgxWebSerialTest(responseFunction) {
|
115
115
|
return [
|
116
|
-
|
116
|
+
NgxWebSerial,
|
117
117
|
{
|
118
118
|
provide: 'Serial',
|
119
119
|
useFactory: () => new MockSerial(responseFunction || ((input) => input)),
|
@@ -121,4 +121,4 @@ export function provideAngularSerialTest(responseFunction) {
|
|
121
121
|
}
|
122
122
|
];
|
123
123
|
}
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXdlYi1zZXJpYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC13ZWItc2VyaWFsL3NyYy9saWIvbmd4LXdlYi1zZXJpYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLE1BQU0sRUFBRSxVQUFVLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsSUFBSSxFQUNKLFFBQVEsRUFDUixHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sRUFFUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQyxNQUFNLE9BQU8sbUJBQW1CO0lBaUI5QixZQUM2QixNQUEwQixFQUM3QyxNQUFjO1FBREssV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDN0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWpCaEIsU0FBSSxHQUFzQixJQUFJLENBQUM7UUFDL0Isb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQy9DLGVBQVUsR0FBMEIsSUFBSSxDQUFDO1FBQ3pDLGdCQUFXLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDckQsV0FBTSxHQUFtRCxJQUFJLENBQUM7UUFDOUQscUJBQWdCLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXhFLFNBQUksR0FBb0I7WUFDdkMsS0FBSyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FB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QUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQzsrR0F4R1UsbUJBQW1CLGtCQWtCcEIsUUFBUTttSEFsQlAsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFtQk4sTUFBTTsyQkFBQyxRQUFROztBQXlGcEIsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPO1FBQ0wsbUJBQW1CO1FBQ25CO1lBQ0UsT0FBTyxFQUFFLFFBQVE7WUFDakIsVUFBVSxFQUFFLENBQUMsUUFBa0IsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTTtZQUMzRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDakI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxnQkFBNEM7SUFDbkYsT0FBTztRQUNMLG1CQUFtQjtRQUNuQjtZQUNFLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixJQUFJLEVBQUUsRUFBRTtTQUNVO0tBQ3JCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFjdG9yeVByb3ZpZGVyLCBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgZmlsdGVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgaW50ZXJ2YWwsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaWJlcixcbiAgdGFrZVVudGlsLFxuICB0aHJvd0Vycm9yLFxuICB0aW1lclxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1vY2tTZXJpYWwgfSBmcm9tICcuL21vY2stc2VyaWFsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5neFdlYlNlcmlhbFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcG9ydDogU2VyaWFsUG9ydCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGF0YVN0cmVhbTogV3JpdGFibGVTdHJlYW0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkYXRhU3ViamVjdDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyPFVpbnQ4QXJyYXk+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzaW5rOiBVbmRlcmx5aW5nU2luayA9ICB7XG4gICAgd3JpdGU6IChjaHVuazogYW55KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQoY2h1bmspO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnU2VyaWFsJykgcmVhZG9ubHkgc2VyaWFsOiBTZXJpYWwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gYSBzZXJpYWwgcG9ydCB1c2luZyB0aGUgV2ViIFNlcmlhbCBBUEkuXG4gICAqL1xuICBvcGVuKHNlcmlhbE9wdGlvbnM6IFNlcmlhbE9wdGlvbnMgPSB7IGJhdWRSYXRlOiA5NjAwIH0sIG9wdGlvbnM/OiBTZXJpYWxQb3J0UmVxdWVzdE9wdGlvbnMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4oKG9ic2VydmVyOiBTdWJzY3JpYmVyPHZvaWQ+KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2VyaWFsKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKCdXZWIgc2VyaWFsIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VyaWFsLnJlcXVlc3RQb3J0KG9wdGlvbnMpXG4gICAgICAgIC50aGVuKChwb3J0OiBTZXJpYWxQb3J0KSA9PiB7XG4gICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wb3J0Lm9wZW4oc2VyaWFsT3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucG9ydD8ucmVhZGFibGUgfHwgIXRoaXMucG9ydD8ud3JpdGFibGUpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdQb3J0IGlzIG5vdCByZWFkYWJsZSBvciB3cml0YWJsZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb25uZWN0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgdGhpcy5kYXRhU3RyZWFtID0gbmV3IFdyaXRhYmxlU3RyZWFtKHRoaXMuc2luayk7XG4gICAgICAgICAgdGhpcy53cml0ZXIgPSB0aGlzLnBvcnQ/LndyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wb3J0LnJlYWRhYmxlXG4gICAgICAgICAgICAucGlwZVRocm91Z2gobmV3IFRleHREZWNvZGVyU3RyZWFtKCkpXG4gICAgICAgICAgICAucGlwZVRvKHRoaXMuZGF0YVN0cmVhbSwge3NpZ25hbDogdGhpcy5hYm9ydENvbnRyb2xsZXIuc2lnbmFsfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLmNsb3NlUG9ydCgpLmNhdGNoKChlcnIpID0+IG9ic2VydmVyLmVycm9yKGVycikpKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IG9ic2VydmVyLmVycm9yKGVycikpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IG9ic2VydmVyLmNvbXBsZXRlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNDb25uZWN0ZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHJlYWQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHdyaXRlKGRhdGE6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICh0aGlzLndyaXRlcikge1xuICAgICAgcmV0dXJuIGZyb20odGhpcy53cml0ZXIud3JpdGUobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpKSk7XG5cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdObyB3cml0ZXIgYXZhaWxhYmxlLicpKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSB3YWl0Rm9yUmVhZGFibGVVbmxvY2socGVyaW9kOiBudW1iZXIgPSA1MCwgdGltZW91dDogbnVtYmVyID0gNTAwMCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShpbnRlcnZhbChwZXJpb2QpLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucG9ydD8ucmVhZGFibGU/LmxvY2tlZCksXG4gICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgIHRha2VVbnRpbCh0aW1lcih0aW1lb3V0KSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdUaW1lb3V0IHdhaXRpbmcgZm9yIHJlYWRhYmxlIHN0cmVhbSB0byB1bmxvY2snKSkpXG4gICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlUG9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG51bGw7XG4gICAgaWYgKHRoaXMud3JpdGVyKSB7XG4gICAgICB0aGlzLndyaXRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgdGhpcy53cml0ZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICByZXR1cm4gdGhpcy53YWl0Rm9yUmVhZGFibGVVbmxvY2soKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnBvcnQhLmNsb3NlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnBvcnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY29ubmVjdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gIH1cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUFuZ3VsYXJTZXJpYWwoKTogUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAgTmd4V2ViU2VyaWFsU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiAnU2VyaWFsJyxcbiAgICAgIHVzZUZhY3Rvcnk6IChkb2N1bWVudDogRG9jdW1lbnQpID0+IGRvY3VtZW50LmRlZmF1bHRWaWV3Py5uYXZpZ2F0b3I/LnNlcmlhbCxcbiAgICAgIGRlcHM6IFtET0NVTUVOVF1cbiAgICB9XG4gIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQW5ndWxhclNlcmlhbFRlc3QocmVzcG9uc2VGdW5jdGlvbj86IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmcpOiBQcm92aWRlcltdIHtcbiAgcmV0dXJuIFtcbiAgICBOZ3hXZWJTZXJpYWxTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6ICdTZXJpYWwnLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gbmV3IE1vY2tTZXJpYWwocmVzcG9uc2VGdW5jdGlvbiB8fCAoKGlucHV0OiBzdHJpbmcpID0+IGlucHV0KSksXG4gICAgICBkZXBzOiBbXVxuICAgIH0gYXMgRmFjdG9yeVByb3ZpZGVyXG4gIF07XG59XG4iXX0=
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXdlYi1zZXJpYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC13ZWItc2VyaWFsL3NyYy9saWIvbmd4LXdlYi1zZXJpYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLE1BQU0sRUFBRSxVQUFVLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsSUFBSSxFQUNKLFFBQVEsRUFDUixHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sRUFFUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQyxNQUFNLE9BQU8sWUFBWTtJQWlCdkIsWUFDNkIsTUFBMEIsRUFDN0MsTUFBYztRQURLLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFqQmhCLFNBQUksR0FBc0IsSUFBSSxDQUFDO1FBQy9CLG9CQUFlLEdBQTJCLElBQUksQ0FBQztRQUMvQyxlQUFVLEdBQTBCLElBQUksQ0FBQztRQUN6QyxnQkFBVyxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3JELFdBQU0sR0FBbUQsSUFBSSxDQUFDO1FBQzlELHFCQUFnQixHQUE2QixJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV4RSxTQUFJLEdBQW9CO1lBQ3ZDLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUss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SztRQUNILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7K0dBeEdVLFlBQVksa0JBa0JiLFFBQVE7bUhBbEJQLFlBQVk7OzRGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQW1CTixNQUFNOzJCQUFDLFFBQVE7O0FBeUZwQixNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU87UUFDTCxZQUFZO1FBQ1o7WUFDRSxPQUFPLEVBQUUsUUFBUTtZQUNqQixVQUFVLEVBQUUsQ0FBQyxRQUFrQixFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNO1lBQzNFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUNqQjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGdCQUE0QztJQUNsRixPQUFPO1FBQ0wsWUFBWTtRQUNaO1lBQ0UsT0FBTyxFQUFFLFFBQVE7WUFDakIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLElBQUksRUFBRSxFQUFFO1NBQ1U7S0FDckIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYWN0b3J5UHJvdmlkZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBmaWx0ZXIsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmcm9tLFxuICBpbnRlcnZhbCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpYmVyLFxuICB0YWtlVW50aWwsXG4gIHRocm93RXJyb3IsXG4gIHRpbWVyXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTW9ja1NlcmlhbCB9IGZyb20gJy4vbW9jay1zZXJpYWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd4V2ViU2VyaWFsIHtcblxuICBwcml2YXRlIHBvcnQ6IFNlcmlhbFBvcnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRhdGFTdHJlYW06IFdyaXRhYmxlU3RyZWFtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGF0YVN1YmplY3Q6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB3cml0ZXI6IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlcjxVaW50OEFycmF5PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbm5lY3RlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2luazogVW5kZXJseWluZ1NpbmsgPSAge1xuICAgIHdyaXRlOiAoY2h1bms6IGFueSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGNodW5rKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ1NlcmlhbCcpIHJlYWRvbmx5IHNlcmlhbDogU2VyaWFsIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIGEgc2VyaWFsIHBvcnQgdXNpbmcgdGhlIFdlYiBTZXJpYWwgQVBJLlxuICAgKi9cbiAgb3BlbihzZXJpYWxPcHRpb25zOiBTZXJpYWxPcHRpb25zID0geyBiYXVkUmF0ZTogOTYwMCB9LCBvcHRpb25zPzogU2VyaWFsUG9ydFJlcXVlc3RPcHRpb25zKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChvYnNlcnZlcjogU3Vic2NyaWJlcjx2b2lkPikgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNlcmlhbCkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcignV2ViIHNlcmlhbCBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlcmlhbC5yZXF1ZXN0UG9ydChvcHRpb25zKVxuICAgICAgICAudGhlbigocG9ydDogU2VyaWFsUG9ydCkgPT4ge1xuICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucG9ydC5vcGVuKHNlcmlhbE9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLnBvcnQ/LnJlYWRhYmxlIHx8ICF0aGlzLnBvcnQ/LndyaXRhYmxlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUG9ydCBpcyBub3QgcmVhZGFibGUgb3Igd3JpdGFibGUuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29ubmVjdGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgIHRoaXMuZGF0YVN0cmVhbSA9IG5ldyBXcml0YWJsZVN0cmVhbSh0aGlzLnNpbmspO1xuICAgICAgICAgIHRoaXMud3JpdGVyID0gdGhpcy5wb3J0Py53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucG9ydC5yZWFkYWJsZVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKG5ldyBUZXh0RGVjb2RlclN0cmVhbSgpKVxuICAgICAgICAgICAgLnBpcGVUbyh0aGlzLmRhdGFTdHJlYW0sIHtzaWduYWw6IHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbH0pXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gdGhpcy5jbG9zZVBvcnQoKS5jYXRjaCgoZXJyKSA9PiBvYnNlcnZlci5lcnJvcihlcnIpKSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBvYnNlcnZlci5lcnJvcihlcnIpKVxuICAgICAgICAuZmluYWxseSgoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICByZWFkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB3cml0ZShkYXRhOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53cml0ZXIpIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMud3JpdGVyLndyaXRlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKSkpO1xuXG4gICAgfVxuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTm8gd3JpdGVyIGF2YWlsYWJsZS4nKSk7XG4gIH1cblxuXG4gIHByaXZhdGUgd2FpdEZvclJlYWRhYmxlVW5sb2NrKHBlcmlvZDogbnVtYmVyID0gNTAsIHRpbWVvdXQ6IG51bWJlciA9IDUwMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oaW50ZXJ2YWwocGVyaW9kKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLnBvcnQ/LnJlYWRhYmxlPy5sb2NrZWQpLFxuICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICB0YWtlVW50aWwodGltZXIodGltZW91dCkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignVGltZW91dCB3YWl0aW5nIGZvciByZWFkYWJsZSBzdHJlYW0gdG8gdW5sb2NrJykpKVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVBvcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLndyaXRlcikge1xuICAgICAgdGhpcy53cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIHRoaXMud3JpdGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucG9ydCkge1xuICAgICAgcmV0dXJuIHRoaXMud2FpdEZvclJlYWRhYmxlVW5sb2NrKClcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wb3J0IS5jbG9zZSgpKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNvbm5lY3RlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICB9XG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFib3J0Q29udHJvbGxlcikge1xuICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVOZ3hXZWJTZXJpYWwoKTogUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAgTmd4V2ViU2VyaWFsLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6ICdTZXJpYWwnLFxuICAgICAgdXNlRmFjdG9yeTogKGRvY3VtZW50OiBEb2N1bWVudCkgPT4gZG9jdW1lbnQuZGVmYXVsdFZpZXc/Lm5hdmlnYXRvcj8uc2VyaWFsLFxuICAgICAgZGVwczogW0RPQ1VNRU5UXVxuICAgIH1cbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVOZ3hXZWJTZXJpYWxUZXN0KHJlc3BvbnNlRnVuY3Rpb24/OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nKTogUHJvdmlkZXJbXSB7XG4gIHJldHVybiBbXG4gICAgTmd4V2ViU2VyaWFsLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6ICdTZXJpYWwnLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gbmV3IE1vY2tTZXJpYWwocmVzcG9uc2VGdW5jdGlvbiB8fCAoKGlucHV0OiBzdHJpbmcpID0+IGlucHV0KSksXG4gICAgICBkZXBzOiBbXVxuICAgIH0gYXMgRmFjdG9yeVByb3ZpZGVyXG4gIF07XG59XG4iXX0=
|
@@ -34,7 +34,7 @@ class MockSerial {
|
|
34
34
|
}
|
35
35
|
}
|
36
36
|
|
37
|
-
class
|
37
|
+
class NgxWebSerial {
|
38
38
|
constructor(serial, ngZone) {
|
39
39
|
this.serial = serial;
|
40
40
|
this.ngZone = ngZone;
|
@@ -123,18 +123,18 @@ class NgxWebSerialService {
|
|
123
123
|
this.abortController.abort();
|
124
124
|
}
|
125
125
|
}
|
126
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
127
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
126
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial, deps: [{ token: 'Serial' }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
127
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial }); }
|
128
128
|
}
|
129
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type:
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxWebSerial, decorators: [{
|
130
130
|
type: Injectable
|
131
131
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
132
132
|
type: Inject,
|
133
133
|
args: ['Serial']
|
134
134
|
}] }, { type: i0.NgZone }] });
|
135
|
-
function
|
135
|
+
function provideNgxWebSerial() {
|
136
136
|
return [
|
137
|
-
|
137
|
+
NgxWebSerial,
|
138
138
|
{
|
139
139
|
provide: 'Serial',
|
140
140
|
useFactory: (document) => document.defaultView?.navigator?.serial,
|
@@ -142,9 +142,9 @@ function provideAngularSerial() {
|
|
142
142
|
}
|
143
143
|
];
|
144
144
|
}
|
145
|
-
function
|
145
|
+
function provideNgxWebSerialTest(responseFunction) {
|
146
146
|
return [
|
147
|
-
|
147
|
+
NgxWebSerial,
|
148
148
|
{
|
149
149
|
provide: 'Serial',
|
150
150
|
useFactory: () => new MockSerial(responseFunction || ((input) => input)),
|
@@ -161,5 +161,5 @@ function provideAngularSerialTest(responseFunction) {
|
|
161
161
|
* Generated bundle index. Do not edit.
|
162
162
|
*/
|
163
163
|
|
164
|
-
export {
|
164
|
+
export { NgxWebSerial, provideNgxWebSerial, provideNgxWebSerialTest };
|
165
165
|
//# sourceMappingURL=ngx-web-serial.mjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ngx-web-serial.mjs","sources":["../../../projects/ngx-web-serial/src/lib/mock-serial.ts","../../../projects/ngx-web-serial/src/lib/ngx-web-serial.service.ts","../../../projects/ngx-web-serial/src/public-api.ts","../../../projects/ngx-web-serial/src/ngx-web-serial.ts"],"sourcesContent":["export class MockSerial {\n private readableController: ReadableStreamDefaultController<Uint8Array> | null = null;\n readonly responseFunction: (input: string) => string;\n readonly readableStream: ReadableStream<Uint8Array>;\n constructor(responseFunction: (input: string) => string) {\n this.responseFunction = responseFunction;\n this.readableStream = new ReadableStream({\n start: (controller) => {\n this.readableController = controller;\n },\n cancel: () => {\n this.readableController = null;\n }\n });\n }\n\n requestPort(options?: SerialPortRequestOptions): Promise<SerialPort> {\n return Promise.resolve({\n open: () => Promise.resolve(),\n close: () => this.readableStream.cancel(),\n readable: this.readableStream,\n writable: new WritableStream({\n write: (chunk) => {\n const input = new TextDecoder().decode(chunk);\n const response = this.responseFunction(input);\n if (this.readableController) {\n this.readableController.enqueue(new TextEncoder().encode(response));\n }\n }\n })\n } as any as SerialPort);\n }\n}\n","import { FactoryProvider, Inject, Injectable, NgZone, Provider } from '@angular/core';\nimport {\n BehaviorSubject,\n catchError,\n filter,\n firstValueFrom,\n from,\n interval,\n map,\n Observable,\n Subject,\n Subscriber,\n takeUntil,\n throwError,\n timer\n} from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\nimport { MockSerial } from './mock-serial';\n\n@Injectable()\nexport class NgxWebSerialService {\n\n private port: SerialPort | null = null;\n private abortController: AbortController | null = null;\n private dataStream: WritableStream | null = null;\n private dataSubject: Subject<string> = new Subject<string>();\n private writer: WritableStreamDefaultWriter<Uint8Array> | null = null;\n private connectedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n\n private readonly sink: UnderlyingSink = {\n write: (chunk: any) => {\n this.ngZone.run(() => {\n this.dataSubject.next(chunk);\n });\n }\n }\n\n constructor(\n @Inject('Serial') readonly serial: Serial | undefined,\n private ngZone: NgZone\n ) {\n }\n\n /**\n * Establishes a connection to a serial port using the Web Serial API.\n */\n open(serialOptions: SerialOptions = { baudRate: 9600 }, options?: SerialPortRequestOptions): Observable<void> {\n return new Observable<void>((observer: Subscriber<void>) => {\n if (!this.serial) {\n observer.error('Web serial not supported.');\n return;\n }\n this.serial.requestPort(options)\n .then((port: SerialPort) => {\n this.port = port;\n return this.port.open(serialOptions);\n })\n .then(() => {\n if (!this.port?.readable || !this.port?.writable) {\n observer.error('Port is not readable or writable.');\n return;\n }\n this.connectedSubject.next(true);\n this.abortController = new AbortController();\n this.dataStream = new WritableStream(this.sink);\n this.writer = this.port?.writable.getWriter();\n observer.next();\n return this.port.readable\n .pipeThrough(new TextDecoderStream())\n .pipeTo(this.dataStream, {signal: this.abortController.signal})\n .catch(() => this.closePort().catch((err) => observer.error(err)));\n })\n .catch((err) => observer.error(err))\n .finally(() => observer.complete());\n });\n }\n\n isConnected(): Observable<boolean> {\n return this.connectedSubject.asObservable();\n }\n\n read(): Observable<string> {\n return this.dataSubject.asObservable();\n }\n\n write(data: string): Observable<void> {\n if (this.writer) {\n return from(this.writer.write(new TextEncoder().encode(data)));\n\n }\n return throwError(() => new Error('No writer available.'));\n }\n\n\n private waitForReadableUnlock(period: number = 50, timeout: number = 5000): Promise<void> {\n return firstValueFrom(interval(period).pipe(\n filter(() => !this.port?.readable?.locked),\n map(() => undefined),\n takeUntil(timer(timeout)),\n catchError(() => throwError(() => new Error('Timeout waiting for readable stream to unlock')))\n ));\n }\n\n private closePort(): Promise<void> {\n this.abortController = null;\n if (this.writer) {\n this.writer.releaseLock();\n this.writer = null;\n }\n if (this.port) {\n return this.waitForReadableUnlock()\n .then(() => this.port!.close())\n .then(() => {\n this.port = null;\n this.connectedSubject.next(false);\n });\n } else {\n return Promise.resolve();\n }\n }\n close(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n}\n\nexport function provideAngularSerial(): Provider[] {\n return [\n NgxWebSerialService,\n {\n provide: 'Serial',\n useFactory: (document: Document) => document.defaultView?.navigator?.serial,\n deps: [DOCUMENT]\n }\n ];\n}\n\nexport function provideAngularSerialTest(responseFunction?: (input: string) => string): Provider[] {\n return [\n NgxWebSerialService,\n {\n provide: 'Serial',\n useFactory: () => new MockSerial(responseFunction || ((input: string) => input)),\n deps: []\n } as FactoryProvider\n ];\n}\n","/*\n * Public API Surface of ngx-web-serial\n */\n\nexport * from './lib/ngx-web-serial.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ngx-web-serial.mjs","sources":["../../../projects/ngx-web-serial/src/lib/mock-serial.ts","../../../projects/ngx-web-serial/src/lib/ngx-web-serial.service.ts","../../../projects/ngx-web-serial/src/public-api.ts","../../../projects/ngx-web-serial/src/ngx-web-serial.ts"],"sourcesContent":["export class MockSerial {\n private readableController: ReadableStreamDefaultController<Uint8Array> | null = null;\n readonly responseFunction: (input: string) => string;\n readonly readableStream: ReadableStream<Uint8Array>;\n constructor(responseFunction: (input: string) => string) {\n this.responseFunction = responseFunction;\n this.readableStream = new ReadableStream({\n start: (controller) => {\n this.readableController = controller;\n },\n cancel: () => {\n this.readableController = null;\n }\n });\n }\n\n requestPort(options?: SerialPortRequestOptions): Promise<SerialPort> {\n return Promise.resolve({\n open: () => Promise.resolve(),\n close: () => this.readableStream.cancel(),\n readable: this.readableStream,\n writable: new WritableStream({\n write: (chunk) => {\n const input = new TextDecoder().decode(chunk);\n const response = this.responseFunction(input);\n if (this.readableController) {\n this.readableController.enqueue(new TextEncoder().encode(response));\n }\n }\n })\n } as any as SerialPort);\n }\n}\n","import { FactoryProvider, Inject, Injectable, NgZone, Provider } from '@angular/core';\nimport {\n BehaviorSubject,\n catchError,\n filter,\n firstValueFrom,\n from,\n interval,\n map,\n Observable,\n Subject,\n Subscriber,\n takeUntil,\n throwError,\n timer\n} from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\nimport { MockSerial } from './mock-serial';\n\n@Injectable()\nexport class NgxWebSerial {\n\n private port: SerialPort | null = null;\n private abortController: AbortController | null = null;\n private dataStream: WritableStream | null = null;\n private dataSubject: Subject<string> = new Subject<string>();\n private writer: WritableStreamDefaultWriter<Uint8Array> | null = null;\n private connectedSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\n\n private readonly sink: UnderlyingSink = {\n write: (chunk: any) => {\n this.ngZone.run(() => {\n this.dataSubject.next(chunk);\n });\n }\n }\n\n constructor(\n @Inject('Serial') readonly serial: Serial | undefined,\n private ngZone: NgZone\n ) {\n }\n\n /**\n * Establishes a connection to a serial port using the Web Serial API.\n */\n open(serialOptions: SerialOptions = { baudRate: 9600 }, options?: SerialPortRequestOptions): Observable<void> {\n return new Observable<void>((observer: Subscriber<void>) => {\n if (!this.serial) {\n observer.error('Web serial not supported.');\n return;\n }\n this.serial.requestPort(options)\n .then((port: SerialPort) => {\n this.port = port;\n return this.port.open(serialOptions);\n })\n .then(() => {\n if (!this.port?.readable || !this.port?.writable) {\n observer.error('Port is not readable or writable.');\n return;\n }\n this.connectedSubject.next(true);\n this.abortController = new AbortController();\n this.dataStream = new WritableStream(this.sink);\n this.writer = this.port?.writable.getWriter();\n observer.next();\n return this.port.readable\n .pipeThrough(new TextDecoderStream())\n .pipeTo(this.dataStream, {signal: this.abortController.signal})\n .catch(() => this.closePort().catch((err) => observer.error(err)));\n })\n .catch((err) => observer.error(err))\n .finally(() => observer.complete());\n });\n }\n\n isConnected(): Observable<boolean> {\n return this.connectedSubject.asObservable();\n }\n\n read(): Observable<string> {\n return this.dataSubject.asObservable();\n }\n\n write(data: string): Observable<void> {\n if (this.writer) {\n return from(this.writer.write(new TextEncoder().encode(data)));\n\n }\n return throwError(() => new Error('No writer available.'));\n }\n\n\n private waitForReadableUnlock(period: number = 50, timeout: number = 5000): Promise<void> {\n return firstValueFrom(interval(period).pipe(\n filter(() => !this.port?.readable?.locked),\n map(() => undefined),\n takeUntil(timer(timeout)),\n catchError(() => throwError(() => new Error('Timeout waiting for readable stream to unlock')))\n ));\n }\n\n private closePort(): Promise<void> {\n this.abortController = null;\n if (this.writer) {\n this.writer.releaseLock();\n this.writer = null;\n }\n if (this.port) {\n return this.waitForReadableUnlock()\n .then(() => this.port!.close())\n .then(() => {\n this.port = null;\n this.connectedSubject.next(false);\n });\n } else {\n return Promise.resolve();\n }\n }\n close(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n}\n\nexport function provideNgxWebSerial(): Provider[] {\n return [\n NgxWebSerial,\n {\n provide: 'Serial',\n useFactory: (document: Document) => document.defaultView?.navigator?.serial,\n deps: [DOCUMENT]\n }\n ];\n}\n\nexport function provideNgxWebSerialTest(responseFunction?: (input: string) => string): Provider[] {\n return [\n NgxWebSerial,\n {\n provide: 'Serial',\n useFactory: () => new MockSerial(responseFunction || ((input: string) => input)),\n deps: []\n } as FactoryProvider\n ];\n}\n","/*\n * Public API Surface of ngx-web-serial\n */\n\nexport * from './lib/ngx-web-serial.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
import { NgZone, Provider } from '@angular/core';
|
3
3
|
import { Observable } from 'rxjs';
|
4
4
|
import * as i0 from "@angular/core";
|
5
|
-
export declare class
|
5
|
+
export declare class NgxWebSerial {
|
6
6
|
readonly serial: Serial | undefined;
|
7
7
|
private ngZone;
|
8
8
|
private port;
|
@@ -23,8 +23,8 @@ export declare class NgxWebSerialService {
|
|
23
23
|
private waitForReadableUnlock;
|
24
24
|
private closePort;
|
25
25
|
close(): void;
|
26
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
27
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxWebSerial, never>;
|
27
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NgxWebSerial>;
|
28
28
|
}
|
29
|
-
export declare function
|
30
|
-
export declare function
|
29
|
+
export declare function provideNgxWebSerial(): Provider[];
|
30
|
+
export declare function provideNgxWebSerialTest(responseFunction?: (input: string) => string): Provider[];
|
package/package.json
CHANGED
@@ -1,6 +1,23 @@
|
|
1
1
|
{
|
2
2
|
"name": "ngx-web-serial",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.3",
|
4
|
+
"description": "Angular library for Web Serial API with RxJS",
|
5
|
+
"repository": {
|
6
|
+
"type": "git",
|
7
|
+
"url": "https://github.com/mattfors/ngx-web-serial"
|
8
|
+
},
|
9
|
+
"author": "Matthew Fors",
|
10
|
+
"license": "MIT",
|
11
|
+
"publishConfig": {
|
12
|
+
"registry": "https://registry.npmjs.org"
|
13
|
+
},
|
14
|
+
"keywords": [
|
15
|
+
"serial",
|
16
|
+
"rs232",
|
17
|
+
"angular",
|
18
|
+
"arduino",
|
19
|
+
"RxJS"
|
20
|
+
],
|
4
21
|
"peerDependencies": {
|
5
22
|
"@angular/common": "^17.3.0",
|
6
23
|
"@angular/core": "^17.3.0"
|