spice-html5-react 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 (64) hide show
  1. package/README.md +262 -0
  2. package/dist/components/SpiceDisplay.d.ts +109 -0
  3. package/dist/components/SpiceDisplay.d.ts.map +1 -0
  4. package/dist/hooks/useSpice.d.ts +107 -0
  5. package/dist/hooks/useSpice.d.ts.map +1 -0
  6. package/dist/index.cjs +14 -0
  7. package/dist/index.cjs.map +1 -0
  8. package/dist/index.d.ts +8 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.mjs +6745 -0
  11. package/dist/index.mjs.map +1 -0
  12. package/dist/protocol/bitmap.d.ts +20 -0
  13. package/dist/protocol/bitmap.d.ts.map +1 -0
  14. package/dist/protocol/cursor.d.ts +16 -0
  15. package/dist/protocol/cursor.d.ts.map +1 -0
  16. package/dist/protocol/display.d.ts +311 -0
  17. package/dist/protocol/display.d.ts.map +1 -0
  18. package/dist/protocol/enums.d.ts +677 -0
  19. package/dist/protocol/enums.d.ts.map +1 -0
  20. package/dist/protocol/filexfer.d.ts +61 -0
  21. package/dist/protocol/filexfer.d.ts.map +1 -0
  22. package/dist/protocol/index.d.ts +34 -0
  23. package/dist/protocol/index.d.ts.map +1 -0
  24. package/dist/protocol/inputs.d.ts +95 -0
  25. package/dist/protocol/inputs.d.ts.map +1 -0
  26. package/dist/protocol/lz.d.ts +24 -0
  27. package/dist/protocol/lz.d.ts.map +1 -0
  28. package/dist/protocol/main.d.ts +205 -0
  29. package/dist/protocol/main.d.ts.map +1 -0
  30. package/dist/protocol/playback.d.ts +51 -0
  31. package/dist/protocol/playback.d.ts.map +1 -0
  32. package/dist/protocol/png.d.ts +14 -0
  33. package/dist/protocol/png.d.ts.map +1 -0
  34. package/dist/protocol/port.d.ts +46 -0
  35. package/dist/protocol/port.d.ts.map +1 -0
  36. package/dist/protocol/quic.d.ts +105 -0
  37. package/dist/protocol/quic.d.ts.map +1 -0
  38. package/dist/protocol/resize.d.ts +61 -0
  39. package/dist/protocol/resize.d.ts.map +1 -0
  40. package/dist/protocol/simulatecursor.d.ts +49 -0
  41. package/dist/protocol/simulatecursor.d.ts.map +1 -0
  42. package/dist/protocol/spicearraybuffer.d.ts +44 -0
  43. package/dist/protocol/spicearraybuffer.d.ts.map +1 -0
  44. package/dist/protocol/spiceconn.d.ts +118 -0
  45. package/dist/protocol/spiceconn.d.ts.map +1 -0
  46. package/dist/protocol/spicedataview.d.ts +144 -0
  47. package/dist/protocol/spicedataview.d.ts.map +1 -0
  48. package/dist/protocol/spicemsg.d.ts +435 -0
  49. package/dist/protocol/spicemsg.d.ts.map +1 -0
  50. package/dist/protocol/spicetype.d.ts +166 -0
  51. package/dist/protocol/spicetype.d.ts.map +1 -0
  52. package/dist/protocol/ticket.d.ts +14 -0
  53. package/dist/protocol/ticket.d.ts.map +1 -0
  54. package/dist/protocol/webm.d.ts +118 -0
  55. package/dist/protocol/webm.d.ts.map +1 -0
  56. package/dist/protocol/wire.d.ts +81 -0
  57. package/dist/protocol/wire.d.ts.map +1 -0
  58. package/dist/utils/atKeynames.d.ts +96 -0
  59. package/dist/utils/atKeynames.d.ts.map +1 -0
  60. package/dist/utils/codeToScancode.d.ts +2 -0
  61. package/dist/utils/codeToScancode.d.ts.map +1 -0
  62. package/dist/utils/debug.d.ts +84 -0
  63. package/dist/utils/debug.d.ts.map +1 -0
  64. package/package.json +60 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Interface for WebM/EBML elements that can be serialized to an ArrayBuffer.
3
+ * Unlike the protocol Serializable interface, toBuffer returns the new write
4
+ * offset so elements can be composed sequentially.
5
+ */
6
+ interface WebmElement {
7
+ toBuffer(a: ArrayBuffer, at: number): number;
8
+ bufferSize(): number;
9
+ }
10
+ export declare const WebmConstants: {
11
+ readonly CLUSTER_SIMPLEBLOCK_FLAG_KEYFRAME: number;
12
+ readonly OPUS_FREQUENCY: 48000;
13
+ readonly OPUS_CHANNELS: 2;
14
+ readonly SPICE_PLAYBACK_CODEC: "audio/webm; codecs=\"opus\"";
15
+ readonly MAX_CLUSTER_TIME: 1000;
16
+ readonly EXPECTED_PACKET_DURATION: 10;
17
+ readonly GAP_DETECTION_THRESHOLD: 50;
18
+ readonly SPICE_VP8_CODEC: "video/webm; codecs=\"vp8\"";
19
+ };
20
+ export declare const Constants: {
21
+ readonly CLUSTER_SIMPLEBLOCK_FLAG_KEYFRAME: number;
22
+ readonly OPUS_FREQUENCY: 48000;
23
+ readonly OPUS_CHANNELS: 2;
24
+ readonly SPICE_PLAYBACK_CODEC: "audio/webm; codecs=\"opus\"";
25
+ readonly MAX_CLUSTER_TIME: 1000;
26
+ readonly EXPECTED_PACKET_DURATION: 10;
27
+ readonly GAP_DETECTION_THRESHOLD: 50;
28
+ readonly SPICE_VP8_CODEC: "video/webm; codecs=\"vp8\"";
29
+ };
30
+ export declare class WebmAudio implements WebmElement {
31
+ private readonly id;
32
+ private readonly samplingFrequency;
33
+ private readonly channels;
34
+ constructor(frequency: number);
35
+ toBuffer(a: ArrayBuffer, at?: number): number;
36
+ bufferSize(): number;
37
+ }
38
+ export declare class WebmVideo implements WebmElement {
39
+ private readonly id;
40
+ private readonly flagInterlaced;
41
+ readonly width: number;
42
+ readonly height: number;
43
+ constructor(width: number, height: number);
44
+ toBuffer(a: ArrayBuffer, at?: number): number;
45
+ bufferSize(): number;
46
+ }
47
+ export declare class WebmAudioTrackEntry implements WebmElement {
48
+ private readonly id;
49
+ private readonly number;
50
+ private readonly uid;
51
+ private readonly type;
52
+ private readonly flagEnabled;
53
+ private readonly flagDefault;
54
+ private readonly flagForced;
55
+ private readonly flagLacing;
56
+ private readonly minCache;
57
+ private readonly maxBlockAdditionId;
58
+ private readonly codecDecodeAll;
59
+ private readonly seekPreRoll;
60
+ private readonly codecDelay;
61
+ private readonly codecId;
62
+ private readonly audio;
63
+ private readonly codecPrivate;
64
+ constructor();
65
+ toBuffer(a: ArrayBuffer, at?: number): number;
66
+ bufferSize(): number;
67
+ }
68
+ export declare class WebmVideoTrackEntry implements WebmElement {
69
+ private readonly id;
70
+ private readonly number;
71
+ private readonly uid;
72
+ private readonly type;
73
+ private readonly flagEnabled;
74
+ private readonly flagDefault;
75
+ private readonly flagForced;
76
+ private readonly flagLacing;
77
+ private readonly minCache;
78
+ private readonly maxBlockAdditionId;
79
+ private readonly codecId;
80
+ private readonly codecDecodeAll;
81
+ private readonly seekPreRoll;
82
+ readonly video: WebmVideo;
83
+ constructor(width: number, height: number);
84
+ toBuffer(a: ArrayBuffer, at?: number): number;
85
+ bufferSize(): number;
86
+ }
87
+ export declare class WebmTracks implements WebmElement {
88
+ private readonly id;
89
+ private readonly trackEntry;
90
+ constructor(entry: WebmAudioTrackEntry | WebmVideoTrackEntry);
91
+ toBuffer(a: ArrayBuffer, at?: number): number;
92
+ bufferSize(): number;
93
+ }
94
+ export declare class WebmCluster implements WebmElement {
95
+ readonly timecode: number;
96
+ constructor(timecode: number);
97
+ toBuffer(a: ArrayBuffer, at?: number): number;
98
+ bufferSize(): number;
99
+ }
100
+ export declare class WebmSimpleBlock implements WebmElement {
101
+ readonly timecode: number;
102
+ readonly data: ArrayBuffer;
103
+ readonly keyframe: boolean;
104
+ constructor(timecode: number, data: ArrayBuffer, keyframe: boolean);
105
+ toBuffer(a: ArrayBuffer, at?: number): number;
106
+ bufferSize(): number;
107
+ }
108
+ export declare class WebmHeader implements WebmElement {
109
+ private readonly ebml;
110
+ private readonly segment;
111
+ private readonly seekHead;
112
+ private readonly info;
113
+ constructor();
114
+ toBuffer(a: ArrayBuffer, at?: number): number;
115
+ bufferSize(): number;
116
+ }
117
+ export { WebmAudio as Audio, WebmVideo as Video, WebmAudioTrackEntry as AudioTrackEntry, WebmVideoTrackEntry as VideoTrackEntry, WebmTracks as Tracks, WebmCluster as Cluster, WebmSimpleBlock as SimpleBlock, WebmHeader as Header, };
118
+ //# sourceMappingURL=webm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webm.d.ts","sourceRoot":"","sources":["../../src/protocol/webm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { SpiceMiniData } from './spicemsg';
2
+
3
+ /**
4
+ * Callback invoked when a complete frame has been reassembled.
5
+ * The first argument is the frame data; the second is the optional
6
+ * saved SpiceMiniData header.
7
+ */
8
+ export type WireCallback = (data: ArrayBuffer, header: SpiceMiniData | undefined) => void;
9
+ /**
10
+ * Minimal interface for the "connection" object that owns the WebSocket.
11
+ * SpiceConn will satisfy this once it is implemented (US-014).
12
+ * Using an interface here avoids a circular dependency.
13
+ */
14
+ export interface WireOwner {
15
+ ws: WebSocket;
16
+ connectionId: number;
17
+ type: number;
18
+ }
19
+ /**
20
+ * Receives binary data from a WebSocket and reassembles it into complete
21
+ * protocol frames of the requested size, invoking a callback for each
22
+ * completed frame.
23
+ *
24
+ * Usage pattern:
25
+ * 1. Construct with a WireOwner and callback.
26
+ * 2. Call `request(n)` to indicate that n bytes are expected.
27
+ * 3. Incoming WebSocket messages are buffered and, once `n` bytes are
28
+ * available, the callback is invoked with a contiguous ArrayBuffer
29
+ * of exactly `n` bytes.
30
+ * 4. Optionally call `saveHeader(h)` before `request()` to attach a
31
+ * SpiceMiniData header that will be passed to the callback.
32
+ */
33
+ export declare class SpiceWireReader {
34
+ /** The connection that owns the WebSocket. */
35
+ private readonly owner;
36
+ /** Callback invoked when a complete frame is ready. */
37
+ private readonly callback;
38
+ /** Number of bytes needed to complete the current frame (0 = just buffer). */
39
+ private needed;
40
+ /** Total bytes currently buffered across all entries in `buffers`. */
41
+ private size;
42
+ /** Queue of ArrayBuffer chunks received from the WebSocket. */
43
+ private buffers;
44
+ /** Optional saved SpiceMiniData header to relay with the next frame. */
45
+ private savedMsgHeader;
46
+ /** Bound message handler so we can remove the listener on cleanup. */
47
+ private readonly boundOnMessage;
48
+ constructor(owner: WireOwner, callback: WireCallback);
49
+ /**
50
+ * Request a frame of exactly `n` bytes. When enough data has been
51
+ * buffered, the callback will be invoked.
52
+ */
53
+ request(n: number): void;
54
+ /**
55
+ * Save a SpiceMiniData header to be passed along with the next frame.
56
+ */
57
+ saveHeader(h: SpiceMiniData): void;
58
+ /**
59
+ * Clear the saved header.
60
+ */
61
+ clearHeader(): void;
62
+ /**
63
+ * Detach the WebSocket message listener. Call this on connection
64
+ * teardown to avoid processing messages after the connection is closed.
65
+ */
66
+ cleanup(): void;
67
+ /**
68
+ * WebSocket "message" event handler.
69
+ */
70
+ private onMessage;
71
+ /**
72
+ * Process an incoming ArrayBuffer chunk from the WebSocket.
73
+ *
74
+ * If no bytes are currently needed (`needed === 0`), the chunk is simply
75
+ * buffered. Otherwise the method attempts to assemble complete frames
76
+ * and deliver them via the callback.
77
+ */
78
+ private inbound;
79
+ }
80
+ export { SpiceWireReader as default };
81
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM3C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACvB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,GAAG,SAAS,KAChC,IAAI,CAAC;AAEV;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IACxB,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAElC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAa;IAE3B,sEAAsE;IACtE,OAAO,CAAC,IAAI,CAAa;IAEzB,+DAA+D;IAC/D,OAAO,CAAC,OAAO,CAAqB;IAEpC,wEAAwE;IACxE,OAAO,CAAC,cAAc,CAAwC;IAE9D,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyC;gBAE5D,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY;IAcpD;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKxB;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAKlC;;OAEG;IACH,WAAW,IAAI,IAAI;IAKnB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAaf;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;CAmElB;AAED,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,CAAC"}
@@ -0,0 +1,96 @@
1
+ export declare const KeyNames: {
2
+ readonly KEY_Escape: 1;
3
+ readonly KEY_1: 2;
4
+ readonly KEY_2: 3;
5
+ readonly KEY_3: 4;
6
+ readonly KEY_4: 5;
7
+ readonly KEY_5: 6;
8
+ readonly KEY_6: 7;
9
+ readonly KEY_7: 8;
10
+ readonly KEY_8: 9;
11
+ readonly KEY_9: 10;
12
+ readonly KEY_0: 11;
13
+ readonly KEY_Minus: 12;
14
+ readonly KEY_Equal: 13;
15
+ readonly KEY_BackSpace: 14;
16
+ readonly KEY_Tab: 15;
17
+ readonly KEY_Q: 16;
18
+ readonly KEY_W: 17;
19
+ readonly KEY_E: 18;
20
+ readonly KEY_R: 19;
21
+ readonly KEY_T: 20;
22
+ readonly KEY_Y: 21;
23
+ readonly KEY_U: 22;
24
+ readonly KEY_I: 23;
25
+ readonly KEY_O: 24;
26
+ readonly KEY_P: 25;
27
+ readonly KEY_LBrace: 26;
28
+ readonly KEY_RBrace: 27;
29
+ readonly KEY_Enter: 28;
30
+ readonly KEY_LCtrl: 29;
31
+ readonly KEY_A: 30;
32
+ readonly KEY_S: 31;
33
+ readonly KEY_D: 32;
34
+ readonly KEY_F: 33;
35
+ readonly KEY_G: 34;
36
+ readonly KEY_H: 35;
37
+ readonly KEY_J: 36;
38
+ readonly KEY_K: 37;
39
+ readonly KEY_L: 38;
40
+ readonly KEY_SemiColon: 39;
41
+ readonly KEY_Quote: 40;
42
+ readonly KEY_Tilde: 41;
43
+ readonly KEY_ShiftL: 42;
44
+ readonly KEY_BSlash: 43;
45
+ readonly KEY_Z: 44;
46
+ readonly KEY_X: 45;
47
+ readonly KEY_C: 46;
48
+ readonly KEY_V: 47;
49
+ readonly KEY_B: 48;
50
+ readonly KEY_N: 49;
51
+ readonly KEY_M: 50;
52
+ readonly KEY_Comma: 51;
53
+ readonly KEY_Period: 52;
54
+ readonly KEY_Slash: 53;
55
+ readonly KEY_ShiftR: 54;
56
+ readonly KEY_KP_Multiply: 55;
57
+ readonly KEY_Alt: 56;
58
+ readonly KEY_Space: 57;
59
+ readonly KEY_CapsLock: 58;
60
+ readonly KEY_F1: 59;
61
+ readonly KEY_F2: 60;
62
+ readonly KEY_F3: 61;
63
+ readonly KEY_F4: 62;
64
+ readonly KEY_F5: 63;
65
+ readonly KEY_F6: 64;
66
+ readonly KEY_F7: 65;
67
+ readonly KEY_F8: 66;
68
+ readonly KEY_F9: 67;
69
+ readonly KEY_F10: 68;
70
+ readonly KEY_NumLock: 69;
71
+ readonly KEY_ScrollLock: 70;
72
+ readonly KEY_KP_7: 71;
73
+ readonly KEY_KP_8: 72;
74
+ readonly KEY_KP_9: 73;
75
+ readonly KEY_KP_Minus: 74;
76
+ readonly KEY_KP_4: 75;
77
+ readonly KEY_KP_5: 76;
78
+ readonly KEY_KP_6: 77;
79
+ readonly KEY_KP_Plus: 78;
80
+ readonly KEY_KP_1: 79;
81
+ readonly KEY_KP_2: 80;
82
+ readonly KEY_KP_3: 81;
83
+ readonly KEY_KP_0: 82;
84
+ readonly KEY_KP_Decimal: 83;
85
+ readonly KEY_SysReqest: 84;
86
+ readonly KEY_Less: 86;
87
+ readonly KEY_F11: 87;
88
+ readonly KEY_F12: 88;
89
+ readonly KEY_Prefix0: 96;
90
+ readonly KEY_Prefix1: 97;
91
+ };
92
+ /** Type for any valid key name from the KeyNames mapping */
93
+ export type KeyName = keyof typeof KeyNames;
94
+ /** Type for any valid scancode value from the KeyNames mapping */
95
+ export type Scancode = (typeof KeyNames)[KeyName];
96
+ //# sourceMappingURL=atKeynames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atKeynames.d.ts","sourceRoot":"","sources":["../../src/utils/atKeynames.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmGX,CAAC;AAEX,4DAA4D;AAC5D,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE5C,kEAAkE;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const codeToScancode: Readonly<Record<string, number>>;
2
+ //# sourceMappingURL=codeToScancode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeToScancode.d.ts","sourceRoot":"","sources":["../../src/utils/codeToScancode.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2K3D,CAAC"}
@@ -0,0 +1,84 @@
1
+ /** Master debug verbosity level (0 = off, higher = more verbose) */
2
+ export declare let DEBUG: number;
3
+ /** Audio playback debug flag (0 = off) */
4
+ export declare let PLAYBACK_DEBUG: number;
5
+ /** Video stream debug flag (0 = off) */
6
+ export declare let STREAM_DEBUG: number;
7
+ /** When true, render draw commands to debug canvases */
8
+ export declare let DUMP_DRAWS: boolean;
9
+ /** When true, dump canvas contents for debugging */
10
+ export declare let DUMP_CANVASES: boolean;
11
+ /** Set the master debug verbosity level */
12
+ export declare function setDebug(level: number): void;
13
+ /** Set the playback debug flag */
14
+ export declare function setPlaybackDebug(level: number): void;
15
+ /** Set the stream debug flag */
16
+ export declare function setStreamDebug(level: number): void;
17
+ /** Set the dump draws flag */
18
+ export declare function setDumpDraws(enabled: boolean): void;
19
+ /** Set the dump canvases flag */
20
+ export declare function setDumpCanvases(enabled: boolean): void;
21
+ /**
22
+ * We use an Image temporarily, and the image/src does not get garbage
23
+ * collected as quickly as we might like. This blank image helps with that.
24
+ */
25
+ export declare const EMPTY_GIF_IMAGE: string;
26
+ /**
27
+ * Combine two ArrayBuffers into a new one.
28
+ * FIXME - this can't be optimal. See wire.ts about eliminating the need.
29
+ */
30
+ export declare function combineArrayBuffers(a1: ArrayBuffer, a2: ArrayBuffer): ArrayBuffer;
31
+ /**
32
+ * Hex dump an ArrayBuffer to the console for debugging.
33
+ * Collapses repeated all-zero lines with a "." indicator.
34
+ */
35
+ export declare function hexdumpBuffer(a: ArrayBuffer): void;
36
+ /**
37
+ * Convert an ArrayBuffer to a string (treating contents as UTF-16 code units).
38
+ */
39
+ export declare function arraybufferToStr(buf: ArrayBuffer): string;
40
+ /**
41
+ * Look up the AT scancode for a given browser keyCode and DOM code string.
42
+ * Prefers the DOM `code` property (KeyboardEvent.code) when available,
43
+ * falling back to the legacy `keyCode` property with browser-specific maps.
44
+ *
45
+ * @param keyCode - The legacy `KeyboardEvent.keyCode` value
46
+ * @param code - The DOM `KeyboardEvent.code` string (e.g. "KeyA", "ArrowUp")
47
+ * @returns The AT scancode, or undefined if no mapping exists
48
+ */
49
+ export declare function getScancode(keyCode: number, code: string): number | undefined;
50
+ /**
51
+ * Convert a browser keyCode/code to an AT make (press) scancode.
52
+ * Logs an alert if no mapping is found.
53
+ *
54
+ * @param keyCode - The legacy `KeyboardEvent.keyCode` value
55
+ * @param code - The DOM `KeyboardEvent.code` string
56
+ * @returns The AT make scancode, or 0 if unmapped
57
+ */
58
+ export declare function keycodeToStartScan(keyCode: number, code: string): number;
59
+ /**
60
+ * Convert a browser keyCode/code to an AT break (release) scancode.
61
+ * The break code has bit 7 set (single-byte) or bit 15 set (extended).
62
+ *
63
+ * @param keyCode - The legacy `KeyboardEvent.keyCode` value
64
+ * @param code - The DOM `KeyboardEvent.code` string
65
+ * @returns The AT break scancode, or 0 if unmapped
66
+ */
67
+ export declare function keycodeToEndScan(keyCode: number, code: string): number;
68
+ /**
69
+ * Dump the state of an HTMLMediaElement for debugging.
70
+ */
71
+ export declare function dumpMediaElement(m: HTMLMediaElement): string;
72
+ /**
73
+ * Dump the state of a MediaSource for debugging.
74
+ */
75
+ export declare function dumpMediaSource(ms: MediaSource): string;
76
+ /**
77
+ * Dump the state of a SourceBuffer for debugging.
78
+ */
79
+ export declare function dumpSourceBuffer(sb: SourceBuffer): string;
80
+ /**
81
+ * Dump a TimeRanges object for debugging.
82
+ */
83
+ export declare function dumpTimeRange(tr: TimeRanges | null): string;
84
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,eAAO,IAAI,KAAK,QAAI,CAAC;AAErB,0CAA0C;AAC1C,eAAO,IAAI,cAAc,QAAI,CAAC;AAE9B,wCAAwC;AACxC,eAAO,IAAI,YAAY,QAAI,CAAC;AAE5B,wDAAwD;AACxD,eAAO,IAAI,UAAU,SAAQ,CAAC;AAE9B,oDAAoD;AACpD,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,2CAA2C;AAC3C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,kCAAkC;AAClC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGnD;AAED,iCAAiC;AACjC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGtD;AAMD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MACkC,CAAC;AAMjE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,GAAG,WAAW,CASjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CA6DlD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CASzD;AA6JD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuB7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYxE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBtE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAW5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAIvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAiB3D"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "spice-html5-react",
3
+ "version": "0.1.0",
4
+ "description": "React + TypeScript SPICE protocol client component library",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.cjs"
17
+ }
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "dev": "vite",
25
+ "build": "tsc --noEmit && vite build",
26
+ "typecheck": "tsc --noEmit",
27
+ "test": "vitest run"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://gitlab.freedesktop.org/spice/spice-html5.git"
32
+ },
33
+ "keywords": [
34
+ "spice",
35
+ "html5",
36
+ "react",
37
+ "typescript",
38
+ "remote-desktop",
39
+ "websockify"
40
+ ],
41
+ "homepage": "https://www.spice-space.org",
42
+ "author": "SPICE Project <spice-devel@lists.freedesktop.org> (https://www.spice-space.org)",
43
+
44
+ "peerDependencies": {
45
+ "react": ">=18.0.0",
46
+ "react-dom": ">=18.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/react": "^18.2.0",
50
+ "@types/react-dom": "^18.2.0",
51
+ "@vitejs/plugin-react": "^4.2.0",
52
+ "jsdom": "^28.1.0",
53
+ "react": "^18.2.0",
54
+ "react-dom": "^18.2.0",
55
+ "typescript": "^5.3.0",
56
+ "vite": "^5.1.0",
57
+ "vite-plugin-dts": "^3.7.0",
58
+ "vitest": "^1.3.0"
59
+ }
60
+ }