busybar-kit 1.1.0 → 2.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.
- package/dist/config-spec.d.ts +63 -19
- package/dist/config-spec.d.ts.map +1 -1
- package/dist/config-spec.js +64 -41
- package/dist/config-spec.js.map +1 -1
- package/dist/image/index.d.ts +5 -2
- package/dist/image/index.d.ts.map +1 -1
- package/dist/image/index.js +5 -2
- package/dist/image/index.js.map +1 -1
- package/dist/image/png.d.ts +9 -0
- package/dist/image/png.d.ts.map +1 -0
- package/dist/image/png.js +165 -0
- package/dist/image/png.js.map +1 -0
- package/dist/image/resize.d.ts +12 -0
- package/dist/image/resize.d.ts.map +1 -0
- package/dist/image/resize.js +83 -0
- package/dist/image/resize.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts +3 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +3 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/input.d.ts +54 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +222 -0
- package/dist/input/input.js.map +1 -0
- package/dist/input/protobuf.d.ts +28 -0
- package/dist/input/protobuf.d.ts.map +1 -0
- package/dist/input/protobuf.js +81 -0
- package/dist/input/protobuf.js.map +1 -0
- package/dist/preview/png.d.ts.map +1 -1
- package/dist/preview/png.js +20 -4
- package/dist/preview/png.js.map +1 -1
- package/dist/preview/raster.d.ts +8 -0
- package/dist/preview/raster.d.ts.map +1 -1
- package/dist/preview/raster.js +55 -7
- package/dist/preview/raster.js.map +1 -1
- package/dist/rules.d.ts +7 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +71 -0
- package/dist/rules.js.map +1 -0
- package/dist/summary.d.ts +18 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +63 -0
- package/dist/summary.js.map +1 -0
- package/package.json +6 -2
- package/scripts/emit-config-spec.mjs +31 -0
- package/scripts/fix-esm-extensions.mjs +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
export * from './colors.js';
|
|
2
2
|
export * from './config/index.js';
|
|
3
3
|
export * from './config-spec.js';
|
|
4
|
+
export * from './rules.js';
|
|
5
|
+
export * from './summary.js';
|
|
4
6
|
export * from './device.js';
|
|
5
7
|
export * from './elements.js';
|
|
6
8
|
export * from './errors.js';
|
|
7
9
|
export * from './format.js';
|
|
8
10
|
export * from './image/index.js';
|
|
11
|
+
export * from './input/index.js';
|
|
9
12
|
export * from './preview/index.js';
|
|
10
13
|
export * from './profile.js';
|
|
11
14
|
export * from './ticker/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
export * from './colors.js';
|
|
2
2
|
export * from './config/index.js';
|
|
3
3
|
export * from './config-spec.js';
|
|
4
|
+
export * from './rules.js';
|
|
5
|
+
export * from './summary.js';
|
|
4
6
|
export * from './device.js';
|
|
5
7
|
export * from './elements.js';
|
|
6
8
|
export * from './errors.js';
|
|
7
9
|
export * from './format.js';
|
|
8
10
|
export * from './image/index.js';
|
|
11
|
+
export * from './input/index.js';
|
|
9
12
|
export * from './preview/index.js';
|
|
10
13
|
export * from './profile.js';
|
|
11
14
|
export * from './ticker/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Bar's physical controls, over its status socket.
|
|
3
|
+
*
|
|
4
|
+
* `ws://<bar>/api/status/ws` streams `BSB_State.State` frames; input events are
|
|
5
|
+
* one of the fifteen things a `StateUpdate` can carry. busy-lib's own reader for
|
|
6
|
+
* this runs in a browser Worker, so this opens the socket itself — Node has had
|
|
7
|
+
* a WebSocket since 22, and the walk to the events is short enough to hand-roll.
|
|
8
|
+
*
|
|
9
|
+
* Every app that wants the Bar's buttons needs exactly this, so it lives here
|
|
10
|
+
* rather than once per app.
|
|
11
|
+
*/
|
|
12
|
+
export declare const WS_PATH = "/api/status/ws";
|
|
13
|
+
declare const BUTTONS: readonly ["ok", "back", "start"];
|
|
14
|
+
declare const ACTIONS: readonly ["press", "release"];
|
|
15
|
+
declare const SWITCH_POSITIONS: readonly ["busy", "custom", "off", "apps", "settings"];
|
|
16
|
+
export type BarButton = (typeof BUTTONS)[number];
|
|
17
|
+
export type ButtonAction = (typeof ACTIONS)[number];
|
|
18
|
+
export type SwitchPosition = (typeof SWITCH_POSITIONS)[number];
|
|
19
|
+
export type InputEvent = {
|
|
20
|
+
kind: 'button';
|
|
21
|
+
button: BarButton;
|
|
22
|
+
action: ButtonAction;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'encoder';
|
|
25
|
+
delta: number;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'switch';
|
|
28
|
+
position: SwitchPosition;
|
|
29
|
+
};
|
|
30
|
+
export type BarInputOptions = {
|
|
31
|
+
addr: string;
|
|
32
|
+
/** HTTP Access password (Wi-Fi) or cloud token; both travel the same way. */
|
|
33
|
+
credential?: string;
|
|
34
|
+
isCloud?: boolean;
|
|
35
|
+
onEvent: (event: InputEvent) => void;
|
|
36
|
+
onWarning?: (message: string) => void;
|
|
37
|
+
};
|
|
38
|
+
export declare class BarInput {
|
|
39
|
+
private readonly options;
|
|
40
|
+
private socket;
|
|
41
|
+
private timer;
|
|
42
|
+
private running;
|
|
43
|
+
constructor(options: BarInputOptions);
|
|
44
|
+
start(): void;
|
|
45
|
+
stop(): void;
|
|
46
|
+
private connect;
|
|
47
|
+
private handle;
|
|
48
|
+
private retry;
|
|
49
|
+
private url;
|
|
50
|
+
}
|
|
51
|
+
/** Every input event in one `BSB_State.State` frame. */
|
|
52
|
+
export declare function decodeInputEvents(frame: Uint8Array): InputEvent[];
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/input/input.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,mBAAmB,CAAC;AAaxC,QAAA,MAAM,OAAO,kCAAmC,CAAC;AACjD,QAAA,MAAM,OAAO,+BAAgC,CAAC;AAC9C,QAAA,MAAM,gBAAgB,wDAAyD,CAAC;AAEhF,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAIF,qBAAa,QAAQ;IAKP,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAS;gBAEK,OAAO,EAAE,eAAe;IAErD,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;YA+CD,MAAM;IAWpB,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,GAAG;CAeZ;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAyBjE"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { eachField } from './protobuf.js';
|
|
2
|
+
/**
|
|
3
|
+
* The Bar's physical controls, over its status socket.
|
|
4
|
+
*
|
|
5
|
+
* `ws://<bar>/api/status/ws` streams `BSB_State.State` frames; input events are
|
|
6
|
+
* one of the fifteen things a `StateUpdate` can carry. busy-lib's own reader for
|
|
7
|
+
* this runs in a browser Worker, so this opens the socket itself — Node has had
|
|
8
|
+
* a WebSocket since 22, and the walk to the events is short enough to hand-roll.
|
|
9
|
+
*
|
|
10
|
+
* Every app that wants the Bar's buttons needs exactly this, so it lives here
|
|
11
|
+
* rather than once per app.
|
|
12
|
+
*/
|
|
13
|
+
export const WS_PATH = '/api/status/ws';
|
|
14
|
+
/** Field numbers, from the schema busy-lib ships. */
|
|
15
|
+
const STATE_UPDATES = 2;
|
|
16
|
+
const UPDATE_INPUT = 11;
|
|
17
|
+
const INPUT_BUTTON = 1;
|
|
18
|
+
const INPUT_SWITCH = 2;
|
|
19
|
+
const INPUT_ENCODER = 3;
|
|
20
|
+
const BUTTON_WHICH = 1;
|
|
21
|
+
const BUTTON_ACTION = 2;
|
|
22
|
+
const ENCODER_DELTA = 1;
|
|
23
|
+
const SWITCH_POSITION = 1;
|
|
24
|
+
const BUTTONS = ['ok', 'back', 'start'];
|
|
25
|
+
const ACTIONS = ['press', 'release'];
|
|
26
|
+
const SWITCH_POSITIONS = ['busy', 'custom', 'off', 'apps', 'settings'];
|
|
27
|
+
const RECONNECT_MS = 2000;
|
|
28
|
+
export class BarInput {
|
|
29
|
+
options;
|
|
30
|
+
socket = null;
|
|
31
|
+
timer = null;
|
|
32
|
+
running = false;
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
start() {
|
|
37
|
+
this.running = true;
|
|
38
|
+
this.connect();
|
|
39
|
+
}
|
|
40
|
+
stop() {
|
|
41
|
+
this.running = false;
|
|
42
|
+
if (this.timer) {
|
|
43
|
+
clearTimeout(this.timer);
|
|
44
|
+
this.timer = null;
|
|
45
|
+
}
|
|
46
|
+
this.socket?.close();
|
|
47
|
+
this.socket = null;
|
|
48
|
+
}
|
|
49
|
+
connect() {
|
|
50
|
+
if (!this.running) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let socket;
|
|
54
|
+
try {
|
|
55
|
+
socket = new WebSocket(this.url());
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.retry(`input socket: ${message(error)}`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.socket = socket;
|
|
62
|
+
socket.binaryType = 'arraybuffer';
|
|
63
|
+
socket.onopen = () => {
|
|
64
|
+
// The device stays silent until streaming is switched on; the credential
|
|
65
|
+
// goes in the URL as well, but a cloud socket wants it as a message too.
|
|
66
|
+
socket.send(JSON.stringify({ enable: true }));
|
|
67
|
+
if (this.options.credential) {
|
|
68
|
+
socket.send(JSON.stringify({ token: this.options.credential }));
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
socket.onmessage = (event) => {
|
|
72
|
+
void this.handle(event.data).catch((error) => {
|
|
73
|
+
this.options.onWarning?.(`input frame: ${message(error)}`);
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
socket.onerror = () => {
|
|
77
|
+
// `onclose` always follows, and carries the reason worth reporting.
|
|
78
|
+
};
|
|
79
|
+
socket.onclose = (event) => {
|
|
80
|
+
if (this.socket === socket) {
|
|
81
|
+
this.socket = null;
|
|
82
|
+
this.retry(event.reason
|
|
83
|
+
? `input socket closed: ${event.reason}`
|
|
84
|
+
: 'input socket closed, reconnecting');
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async handle(data) {
|
|
89
|
+
const bytes = await toBytes(data);
|
|
90
|
+
if (!bytes) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const event of decodeInputEvents(bytes)) {
|
|
94
|
+
this.options.onEvent(event);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
retry(warning) {
|
|
98
|
+
if (!this.running || this.timer) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.options.onWarning?.(warning);
|
|
102
|
+
this.timer = setTimeout(() => {
|
|
103
|
+
this.timer = null;
|
|
104
|
+
this.connect();
|
|
105
|
+
}, RECONNECT_MS);
|
|
106
|
+
}
|
|
107
|
+
url() {
|
|
108
|
+
const base = /^[a-z]+:\/\//i.test(this.options.addr)
|
|
109
|
+
? this.options.addr
|
|
110
|
+
: `http://${this.options.addr}`;
|
|
111
|
+
const url = new URL(base);
|
|
112
|
+
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
113
|
+
if (url.pathname === '/' || !url.pathname) {
|
|
114
|
+
url.pathname = WS_PATH;
|
|
115
|
+
}
|
|
116
|
+
if (this.options.credential) {
|
|
117
|
+
url.searchParams.set('x-api-token', this.options.credential);
|
|
118
|
+
}
|
|
119
|
+
return url.toString();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Every input event in one `BSB_State.State` frame. */
|
|
123
|
+
export function decodeInputEvents(frame) {
|
|
124
|
+
const events = [];
|
|
125
|
+
eachField(frame, (field, wire, reader) => {
|
|
126
|
+
if (field !== STATE_UPDATES || wire !== 2) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const update = reader.bytes_();
|
|
130
|
+
eachField(update, (updateField, updateWire, updateReader) => {
|
|
131
|
+
if (updateField !== UPDATE_INPUT || updateWire !== 2) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const event = decodeInputEvent(updateReader.bytes_());
|
|
135
|
+
if (event) {
|
|
136
|
+
events.push(event);
|
|
137
|
+
}
|
|
138
|
+
return true;
|
|
139
|
+
});
|
|
140
|
+
return true;
|
|
141
|
+
});
|
|
142
|
+
return events;
|
|
143
|
+
}
|
|
144
|
+
function decodeInputEvent(bytes) {
|
|
145
|
+
let event = null;
|
|
146
|
+
eachField(bytes, (field, wire, reader) => {
|
|
147
|
+
if (wire !== 2) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (field === INPUT_BUTTON) {
|
|
151
|
+
event = decodeButton(reader.bytes_());
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
if (field === INPUT_ENCODER) {
|
|
155
|
+
event = decodeEncoder(reader.bytes_());
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
if (field === INPUT_SWITCH) {
|
|
159
|
+
event = decodeSwitch(reader.bytes_());
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
return event;
|
|
164
|
+
}
|
|
165
|
+
function decodeButton(bytes) {
|
|
166
|
+
// Proto3 leaves a zero-valued field off the wire entirely, so the defaults
|
|
167
|
+
// here are the enums' zeroes: OK, and PRESS.
|
|
168
|
+
let button = 'ok';
|
|
169
|
+
let action = 'press';
|
|
170
|
+
eachField(bytes, (field, wire, reader) => {
|
|
171
|
+
if (wire !== 0) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (field === BUTTON_WHICH) {
|
|
175
|
+
button = BUTTONS[reader.varint()] ?? button;
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
if (field === BUTTON_ACTION) {
|
|
179
|
+
action = ACTIONS[reader.varint()] ?? action;
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return { kind: 'button', button, action };
|
|
184
|
+
}
|
|
185
|
+
function decodeEncoder(bytes) {
|
|
186
|
+
let delta = 0;
|
|
187
|
+
eachField(bytes, (field, wire, reader) => {
|
|
188
|
+
if (field === ENCODER_DELTA && wire === 0) {
|
|
189
|
+
// sint32: signed, so zigzagged rather than two's complement.
|
|
190
|
+
delta = reader.zigzag();
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return delta === 0 ? null : { kind: 'encoder', delta };
|
|
195
|
+
}
|
|
196
|
+
function decodeSwitch(bytes) {
|
|
197
|
+
let position = 'busy';
|
|
198
|
+
eachField(bytes, (field, wire, reader) => {
|
|
199
|
+
if (field === SWITCH_POSITION && wire === 0) {
|
|
200
|
+
position = SWITCH_POSITIONS[reader.varint()] ?? position;
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
return { kind: 'switch', position };
|
|
205
|
+
}
|
|
206
|
+
async function toBytes(data) {
|
|
207
|
+
if (data instanceof ArrayBuffer) {
|
|
208
|
+
return new Uint8Array(data);
|
|
209
|
+
}
|
|
210
|
+
if (ArrayBuffer.isView(data)) {
|
|
211
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
212
|
+
}
|
|
213
|
+
if (typeof Blob !== 'undefined' && data instanceof Blob) {
|
|
214
|
+
return new Uint8Array(await data.arrayBuffer());
|
|
215
|
+
}
|
|
216
|
+
// Text frames are the device's own JSON acknowledgements, not state.
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
function message(error) {
|
|
220
|
+
return error instanceof Error ? error.message : String(error);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/input/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC;AAExC,qDAAqD;AACrD,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AACjD,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC;AAC9C,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAoBhF,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,OAAO,QAAQ;IAKU;IAJrB,MAAM,GAAqB,IAAI,CAAC;IAChC,KAAK,GAA0B,IAAI,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEzD,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,MAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAE9C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC;QAElC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACnB,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;YACzC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACpD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,gBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YACpB,oEAAoE;QACtE,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,KAAK,CACR,KAAK,CAAC,MAAM;oBACV,CAAC,CAAC,wBAAwB,KAAK,CAAC,MAAM,EAAE;oBACxC,CAAC,CAAC,mCAAmC,CACxC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAa;QAChC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC;IAEO,GAAG;QACT,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAClD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YACnB,CAAC,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1D,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC1C,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,KAAK,KAAK,aAAa,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAE/B,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE;YAC1D,IAAI,WAAW,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiB;IACzC,IAAI,KAAK,GAAsB,IAAI,CAAC;IAEpC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAEtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC5B,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAEtC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACrC,2EAA2E;IAC3E,6CAA6C;IAC7C,IAAI,MAAM,GAAc,IAAI,CAAC;IAC7B,IAAI,MAAM,GAAiB,OAAO,CAAC;IAEnC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC;YAE5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC5B,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC;YAE5C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,KAAK,KAAK,aAAa,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1C,6DAA6D;YAC7D,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAExB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACrC,IAAI,QAAQ,GAAmB,MAAM,CAAC;IAEtC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACvC,IAAI,KAAK,KAAK,eAAe,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5C,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,CAAC;YAEzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAa;IAClC,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACxD,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,qEAAqE;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Just enough protobuf to read one message off the Bar's status socket.
|
|
3
|
+
*
|
|
4
|
+
* The device streams `BSB_State.State` frames, and busy-lib decodes them with a
|
|
5
|
+
* bundled protobufjs — inside a browser Worker, which is why none of it runs
|
|
6
|
+
* here. All anyone wants out of a frame is the input events, so it walks the
|
|
7
|
+
* three fields on the way to them and skips everything else.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Reader {
|
|
10
|
+
private readonly bytes;
|
|
11
|
+
private offset;
|
|
12
|
+
constructor(bytes: Uint8Array);
|
|
13
|
+
get done(): boolean;
|
|
14
|
+
/** Field number and wire type of the next field. */
|
|
15
|
+
tag(): {
|
|
16
|
+
field: number;
|
|
17
|
+
wire: number;
|
|
18
|
+
};
|
|
19
|
+
varint(): number;
|
|
20
|
+
/** Signed varint, as protobuf's `sint32` writes it. */
|
|
21
|
+
zigzag(): number;
|
|
22
|
+
bytes_(): Uint8Array;
|
|
23
|
+
/** Steps over a field this app does not care about. */
|
|
24
|
+
skip(wire: number): void;
|
|
25
|
+
}
|
|
26
|
+
/** Runs `visit` over every field of a message. */
|
|
27
|
+
export declare function eachField(bytes: Uint8Array, visit: (field: number, wire: number, reader: Reader) => boolean | void): void;
|
|
28
|
+
//# sourceMappingURL=protobuf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protobuf.d.ts","sourceRoot":"","sources":["../../src/input/protobuf.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,MAAM;IAGL,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,MAAM,CAAK;gBAEU,KAAK,EAAE,UAAU;IAE9C,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,oDAAoD;IACpD,GAAG,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAMtC,MAAM,IAAI,MAAM;IAkBhB,uDAAuD;IACvD,MAAM,IAAI,MAAM;IAMhB,MAAM,IAAI,UAAU;IAQpB,uDAAuD;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAezB;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,GACrE,IAAI,CAQN"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Just enough protobuf to read one message off the Bar's status socket.
|
|
3
|
+
*
|
|
4
|
+
* The device streams `BSB_State.State` frames, and busy-lib decodes them with a
|
|
5
|
+
* bundled protobufjs — inside a browser Worker, which is why none of it runs
|
|
6
|
+
* here. All anyone wants out of a frame is the input events, so it walks the
|
|
7
|
+
* three fields on the way to them and skips everything else.
|
|
8
|
+
*/
|
|
9
|
+
export class Reader {
|
|
10
|
+
bytes;
|
|
11
|
+
offset = 0;
|
|
12
|
+
constructor(bytes) {
|
|
13
|
+
this.bytes = bytes;
|
|
14
|
+
}
|
|
15
|
+
get done() {
|
|
16
|
+
return this.offset >= this.bytes.length;
|
|
17
|
+
}
|
|
18
|
+
/** Field number and wire type of the next field. */
|
|
19
|
+
tag() {
|
|
20
|
+
const key = this.varint();
|
|
21
|
+
return { field: key >>> 3, wire: key & 7 };
|
|
22
|
+
}
|
|
23
|
+
varint() {
|
|
24
|
+
let result = 0;
|
|
25
|
+
let shift = 0;
|
|
26
|
+
while (this.offset < this.bytes.length) {
|
|
27
|
+
const byte = this.bytes[this.offset] ?? 0;
|
|
28
|
+
this.offset += 1;
|
|
29
|
+
// Numbers stay safe integers here: these are enums, small deltas and
|
|
30
|
+
// lengths, never the 64-bit timestamp, which is skipped as fixed64.
|
|
31
|
+
result += shift < 28 ? (byte & 0x7f) << shift : (byte & 0x7f) * 2 ** shift;
|
|
32
|
+
if ((byte & 0x80) === 0) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
shift += 7;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/** Signed varint, as protobuf's `sint32` writes it. */
|
|
40
|
+
zigzag() {
|
|
41
|
+
const value = this.varint();
|
|
42
|
+
return (value >>> 1) ^ -(value & 1);
|
|
43
|
+
}
|
|
44
|
+
bytes_() {
|
|
45
|
+
const length = this.varint();
|
|
46
|
+
const start = this.offset;
|
|
47
|
+
this.offset = Math.min(this.bytes.length, start + length);
|
|
48
|
+
return this.bytes.subarray(start, this.offset);
|
|
49
|
+
}
|
|
50
|
+
/** Steps over a field this app does not care about. */
|
|
51
|
+
skip(wire) {
|
|
52
|
+
if (wire === 0) {
|
|
53
|
+
this.varint();
|
|
54
|
+
}
|
|
55
|
+
else if (wire === 1) {
|
|
56
|
+
this.offset += 8;
|
|
57
|
+
}
|
|
58
|
+
else if (wire === 2) {
|
|
59
|
+
this.bytes_();
|
|
60
|
+
}
|
|
61
|
+
else if (wire === 5) {
|
|
62
|
+
this.offset += 4;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Groups (3, 4) are not in this schema; treating one as the end of the
|
|
66
|
+
// message beats looping forever on a byte we cannot measure.
|
|
67
|
+
this.offset = this.bytes.length;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Runs `visit` over every field of a message. */
|
|
72
|
+
export function eachField(bytes, visit) {
|
|
73
|
+
const reader = new Reader(bytes);
|
|
74
|
+
while (!reader.done) {
|
|
75
|
+
const { field, wire } = reader.tag();
|
|
76
|
+
if (visit(field, wire, reader) !== true) {
|
|
77
|
+
reader.skip(wire);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=protobuf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protobuf.js","sourceRoot":"","sources":["../../src/input/protobuf.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/preview/png.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,qBAAa,MAAM;IAIf,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBAGf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACvB,UAAU,GAAE,IAAmC;IAMjD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/preview/png.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,qBAAa,MAAM;IAIf,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAJzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBAGf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACvB,UAAU,GAAE,IAAmC;IAMjD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;IAmCrC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;IAQzE,+EAA+E;IAC/E,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM;IAOxE;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAiB5D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAiB7B,KAAK,IAAI,MAAM;CAGhB;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAa9C"}
|
package/dist/preview/png.js
CHANGED
|
@@ -22,12 +22,25 @@ export class Bitmap {
|
|
|
22
22
|
this.data[offset + 3] = 255;
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// Source-over, including the alpha channel. Onto an opaque pixel this is
|
|
26
|
+
// the plain blend it always was, since the result is opaque either way.
|
|
27
|
+
// Onto a transparent one it is not: forcing the result opaque there turns
|
|
28
|
+
// a soft edge into a hard dark fringe, which is what a mask's edge is.
|
|
29
|
+
const source = color.a / 255;
|
|
30
|
+
const destination = (this.data[offset + 3] ?? 0) / 255;
|
|
31
|
+
const out = source + destination * (1 - source);
|
|
32
|
+
if (out <= 0) {
|
|
33
|
+
this.data[offset] = 0;
|
|
34
|
+
this.data[offset + 1] = 0;
|
|
35
|
+
this.data[offset + 2] = 0;
|
|
36
|
+
this.data[offset + 3] = 0;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const blend = (channel, value) => Math.round((value * source + channel * destination * (1 - source)) / out);
|
|
27
40
|
this.data[offset] = blend(this.data[offset] ?? 0, color.r);
|
|
28
41
|
this.data[offset + 1] = blend(this.data[offset + 1] ?? 0, color.g);
|
|
29
42
|
this.data[offset + 2] = blend(this.data[offset + 2] ?? 0, color.b);
|
|
30
|
-
this.data[offset + 3] = 255;
|
|
43
|
+
this.data[offset + 3] = Math.round(out * 255);
|
|
31
44
|
}
|
|
32
45
|
fillRect(x, y, width, height, color) {
|
|
33
46
|
for (let row = 0; row < height; row += 1) {
|
|
@@ -55,7 +68,10 @@ export class Bitmap {
|
|
|
55
68
|
r: source.data[offset] ?? 0,
|
|
56
69
|
g: source.data[offset + 1] ?? 0,
|
|
57
70
|
b: source.data[offset + 2] ?? 0,
|
|
58
|
-
|
|
71
|
+
// Carried through rather than forced opaque: a masked source — a
|
|
72
|
+
// circle cut out of a square, say — has to leave what is behind it
|
|
73
|
+
// showing, and `set` already blends.
|
|
74
|
+
a: source.data[offset + 3] ?? 255,
|
|
59
75
|
});
|
|
60
76
|
}
|
|
61
77
|
}
|
package/dist/preview/png.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/preview/png.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAIhF,MAAM,OAAO,MAAM;IAIN;IACA;IAJF,IAAI,CAAa;IAE1B,YACW,KAAa,EACb,MAAc,EACvB,aAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;QAFtC,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,KAAW;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/preview/png.ts"],"names":[],"mappings":"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"}
|
package/dist/preview/raster.d.ts
CHANGED
|
@@ -3,4 +3,12 @@ import { Bitmap } from './png.js';
|
|
|
3
3
|
export type { AnyElement };
|
|
4
4
|
export declare function renderFront(elements: AnyElement[]): Bitmap;
|
|
5
5
|
export declare function renderBack(elements: AnyElement[]): Bitmap;
|
|
6
|
+
/**
|
|
7
|
+
* Draws onto a panel that already has something on it.
|
|
8
|
+
*
|
|
9
|
+
* The device layers elements in the order they arrive, and an app that puts a
|
|
10
|
+
* picture under an outline needs the preview to agree. `renderFront` cannot,
|
|
11
|
+
* having made the bitmap itself; this can.
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderOnto(bitmap: Bitmap, elements: AnyElement[], display: 'front' | 'back'): Bitmap;
|
|
6
14
|
//# sourceMappingURL=raster.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raster.d.ts","sourceRoot":"","sources":["../../src/preview/raster.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAyB,MAAM,OAAO,CAAC;AAEtD,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,wBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAE1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAEzD"}
|
|
1
|
+
{"version":3,"file":"raster.d.ts","sourceRoot":"","sources":["../../src/preview/raster.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAyB,MAAM,OAAO,CAAC;AAEtD,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,wBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAE1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,EAAE,OAAO,GAAG,MAAM,GACxB,MAAM,CAER"}
|