appium-ios-remotexpc 0.0.3 → 0.0.5

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 (213) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/src/base-plist-service.d.ts +51 -0
  3. package/build/src/base-plist-service.d.ts.map +1 -0
  4. package/build/src/base-plist-service.js +61 -0
  5. package/build/src/base-socket-service.d.ts +15 -0
  6. package/build/src/base-socket-service.d.ts.map +1 -0
  7. package/build/src/base-socket-service.js +46 -0
  8. package/build/src/index.d.ts +9 -0
  9. package/build/src/index.d.ts.map +1 -0
  10. package/build/src/index.js +7 -0
  11. package/build/src/lib/apple-tv/constants.d.ts +77 -0
  12. package/build/src/lib/apple-tv/constants.d.ts.map +1 -0
  13. package/build/src/lib/apple-tv/constants.js +106 -0
  14. package/build/src/lib/apple-tv/encryption/chacha20-poly1305.d.ts +22 -0
  15. package/build/src/lib/apple-tv/encryption/chacha20-poly1305.d.ts.map +1 -0
  16. package/build/src/lib/apple-tv/encryption/chacha20-poly1305.js +97 -0
  17. package/build/src/lib/apple-tv/encryption/ed25519.d.ts +16 -0
  18. package/build/src/lib/apple-tv/encryption/ed25519.d.ts.map +1 -0
  19. package/build/src/lib/apple-tv/encryption/ed25519.js +93 -0
  20. package/build/src/lib/apple-tv/encryption/hkdf.d.ts +18 -0
  21. package/build/src/lib/apple-tv/encryption/hkdf.d.ts.map +1 -0
  22. package/build/src/lib/apple-tv/encryption/hkdf.js +73 -0
  23. package/build/src/lib/apple-tv/encryption/index.d.ts +5 -0
  24. package/build/src/lib/apple-tv/encryption/index.d.ts.map +1 -0
  25. package/build/src/lib/apple-tv/encryption/index.js +4 -0
  26. package/build/src/lib/apple-tv/encryption/opack2.d.ts +57 -0
  27. package/build/src/lib/apple-tv/encryption/opack2.d.ts.map +1 -0
  28. package/build/src/lib/apple-tv/encryption/opack2.js +203 -0
  29. package/build/src/lib/apple-tv/errors.d.ts +17 -0
  30. package/build/src/lib/apple-tv/errors.d.ts.map +1 -0
  31. package/build/src/lib/apple-tv/errors.js +30 -0
  32. package/build/src/lib/apple-tv/tlv/decoder.d.ts +19 -0
  33. package/build/src/lib/apple-tv/tlv/decoder.d.ts.map +1 -0
  34. package/build/src/lib/apple-tv/tlv/decoder.js +49 -0
  35. package/build/src/lib/apple-tv/tlv/encoder.d.ts +10 -0
  36. package/build/src/lib/apple-tv/tlv/encoder.d.ts.map +1 -0
  37. package/build/src/lib/apple-tv/tlv/encoder.js +20 -0
  38. package/build/src/lib/apple-tv/tlv/index.d.ts +4 -0
  39. package/build/src/lib/apple-tv/tlv/index.d.ts.map +1 -0
  40. package/build/src/lib/apple-tv/tlv/index.js +3 -0
  41. package/build/src/lib/apple-tv/tlv/pairing-tlv.d.ts +14 -0
  42. package/build/src/lib/apple-tv/tlv/pairing-tlv.d.ts.map +1 -0
  43. package/build/src/lib/apple-tv/tlv/pairing-tlv.js +27 -0
  44. package/build/src/lib/apple-tv/types.d.ts +36 -0
  45. package/build/src/lib/apple-tv/types.d.ts.map +1 -0
  46. package/build/src/lib/apple-tv/types.js +1 -0
  47. package/build/src/lib/apple-tv/utils/buffer-utils.d.ts +40 -0
  48. package/build/src/lib/apple-tv/utils/buffer-utils.d.ts.map +1 -0
  49. package/build/src/lib/apple-tv/utils/buffer-utils.js +76 -0
  50. package/build/src/lib/apple-tv/utils/index.d.ts +3 -0
  51. package/build/src/lib/apple-tv/utils/index.d.ts.map +1 -0
  52. package/build/src/lib/apple-tv/utils/index.js +2 -0
  53. package/build/src/lib/apple-tv/utils/uuid-generator.d.ts +9 -0
  54. package/build/src/lib/apple-tv/utils/uuid-generator.d.ts.map +1 -0
  55. package/build/src/lib/apple-tv/utils/uuid-generator.js +36 -0
  56. package/build/src/lib/lockdown/index.d.ts +87 -0
  57. package/build/src/lib/lockdown/index.d.ts.map +1 -0
  58. package/build/src/lib/lockdown/index.js +324 -0
  59. package/build/src/lib/pair-record/index.d.ts +3 -0
  60. package/build/src/lib/pair-record/index.d.ts.map +1 -0
  61. package/build/src/lib/pair-record/index.js +2 -0
  62. package/build/src/lib/pair-record/pair-record.d.ts +48 -0
  63. package/build/src/lib/pair-record/pair-record.d.ts.map +1 -0
  64. package/build/src/lib/pair-record/pair-record.js +85 -0
  65. package/build/src/lib/plist/binary-plist-creator.d.ts +14 -0
  66. package/build/src/lib/plist/binary-plist-creator.d.ts.map +1 -0
  67. package/build/src/lib/plist/binary-plist-creator.js +475 -0
  68. package/build/src/lib/plist/binary-plist-parser.d.ts +14 -0
  69. package/build/src/lib/plist/binary-plist-parser.d.ts.map +1 -0
  70. package/build/src/lib/plist/binary-plist-parser.js +449 -0
  71. package/build/src/lib/plist/constants.d.ts +36 -0
  72. package/build/src/lib/plist/constants.d.ts.map +1 -0
  73. package/build/src/lib/plist/constants.js +43 -0
  74. package/build/src/lib/plist/index.d.ts +14 -0
  75. package/build/src/lib/plist/index.d.ts.map +1 -0
  76. package/build/src/lib/plist/index.js +16 -0
  77. package/build/src/lib/plist/length-based-splitter.d.ts +43 -0
  78. package/build/src/lib/plist/length-based-splitter.d.ts.map +1 -0
  79. package/build/src/lib/plist/length-based-splitter.js +228 -0
  80. package/build/src/lib/plist/plist-creator.d.ts +8 -0
  81. package/build/src/lib/plist/plist-creator.d.ts.map +1 -0
  82. package/build/src/lib/plist/plist-creator.js +33 -0
  83. package/build/src/lib/plist/plist-decoder.d.ts +25 -0
  84. package/build/src/lib/plist/plist-decoder.d.ts.map +1 -0
  85. package/build/src/lib/plist/plist-decoder.js +103 -0
  86. package/build/src/lib/plist/plist-encoder.d.ts +10 -0
  87. package/build/src/lib/plist/plist-encoder.d.ts.map +1 -0
  88. package/build/src/lib/plist/plist-encoder.js +27 -0
  89. package/build/src/lib/plist/plist-parser.d.ts +9 -0
  90. package/build/src/lib/plist/plist-parser.d.ts.map +1 -0
  91. package/build/src/lib/plist/plist-parser.js +109 -0
  92. package/build/src/lib/plist/plist-service.d.ts +86 -0
  93. package/build/src/lib/plist/plist-service.d.ts.map +1 -0
  94. package/build/src/lib/plist/plist-service.js +180 -0
  95. package/build/src/lib/plist/unified-plist-creator.d.ts +9 -0
  96. package/build/src/lib/plist/unified-plist-creator.d.ts.map +1 -0
  97. package/build/src/lib/plist/unified-plist-creator.js +14 -0
  98. package/build/src/lib/plist/unified-plist-parser.d.ts +8 -0
  99. package/build/src/lib/plist/unified-plist-parser.d.ts.map +1 -0
  100. package/build/src/lib/plist/unified-plist-parser.js +23 -0
  101. package/build/src/lib/plist/utils.d.ts +97 -0
  102. package/build/src/lib/plist/utils.d.ts.map +1 -0
  103. package/build/src/lib/plist/utils.js +287 -0
  104. package/build/src/lib/remote-xpc/constants.d.ts +20 -0
  105. package/build/src/lib/remote-xpc/constants.d.ts.map +1 -0
  106. package/build/src/lib/remote-xpc/constants.js +21 -0
  107. package/build/src/lib/remote-xpc/handshake-frames.d.ts +74 -0
  108. package/build/src/lib/remote-xpc/handshake-frames.d.ts.map +1 -0
  109. package/build/src/lib/remote-xpc/handshake-frames.js +285 -0
  110. package/build/src/lib/remote-xpc/handshake.d.ts +14 -0
  111. package/build/src/lib/remote-xpc/handshake.d.ts.map +1 -0
  112. package/build/src/lib/remote-xpc/handshake.js +95 -0
  113. package/build/src/lib/remote-xpc/remote-xpc-connection.d.ts +55 -0
  114. package/build/src/lib/remote-xpc/remote-xpc-connection.d.ts.map +1 -0
  115. package/build/src/lib/remote-xpc/remote-xpc-connection.js +365 -0
  116. package/build/src/lib/remote-xpc/xpc-protocol.d.ts +22 -0
  117. package/build/src/lib/remote-xpc/xpc-protocol.d.ts.map +1 -0
  118. package/build/src/lib/remote-xpc/xpc-protocol.js +368 -0
  119. package/build/src/lib/tunnel/index.d.ts +69 -0
  120. package/build/src/lib/tunnel/index.d.ts.map +1 -0
  121. package/build/src/lib/tunnel/index.js +205 -0
  122. package/build/src/lib/tunnel/packet-stream-client.d.ts +46 -0
  123. package/build/src/lib/tunnel/packet-stream-client.d.ts.map +1 -0
  124. package/build/src/lib/tunnel/packet-stream-client.js +152 -0
  125. package/build/src/lib/tunnel/packet-stream-server.d.ts +37 -0
  126. package/build/src/lib/tunnel/packet-stream-server.d.ts.map +1 -0
  127. package/build/src/lib/tunnel/packet-stream-server.js +109 -0
  128. package/build/src/lib/tunnel/tunnel-api-client.d.ts +85 -0
  129. package/build/src/lib/tunnel/tunnel-api-client.d.ts.map +1 -0
  130. package/build/src/lib/tunnel/tunnel-api-client.js +207 -0
  131. package/build/src/lib/tunnel/tunnel-registry-server.d.ts +68 -0
  132. package/build/src/lib/tunnel/tunnel-registry-server.d.ts.map +1 -0
  133. package/build/src/lib/tunnel/tunnel-registry-server.js +351 -0
  134. package/build/src/lib/types.d.ts +238 -0
  135. package/build/src/lib/types.d.ts.map +1 -0
  136. package/build/src/lib/types.js +4 -0
  137. package/build/src/lib/usbmux/index.d.ts +177 -0
  138. package/build/src/lib/usbmux/index.d.ts.map +1 -0
  139. package/build/src/lib/usbmux/index.js +490 -0
  140. package/build/src/lib/usbmux/usbmux-decoder.d.ts +19 -0
  141. package/build/src/lib/usbmux/usbmux-decoder.d.ts.map +1 -0
  142. package/build/src/lib/usbmux/usbmux-decoder.js +38 -0
  143. package/build/src/lib/usbmux/usbmux-encoder.d.ts +12 -0
  144. package/build/src/lib/usbmux/usbmux-encoder.d.ts.map +1 -0
  145. package/build/src/lib/usbmux/usbmux-encoder.js +32 -0
  146. package/build/src/service-connection.d.ts +34 -0
  147. package/build/src/service-connection.d.ts.map +1 -0
  148. package/build/src/service-connection.js +51 -0
  149. package/build/src/services/index.d.ts +6 -0
  150. package/build/src/services/index.d.ts.map +1 -0
  151. package/build/src/services/index.js +5 -0
  152. package/build/src/services/ios/base-service.d.ts +35 -0
  153. package/build/src/services/ios/base-service.d.ts.map +1 -0
  154. package/build/src/services/ios/base-service.js +55 -0
  155. package/build/src/services/ios/diagnostic-service/index.d.ts +46 -0
  156. package/build/src/services/ios/diagnostic-service/index.d.ts.map +1 -0
  157. package/build/src/services/ios/diagnostic-service/index.js +169 -0
  158. package/build/src/services/ios/diagnostic-service/keys.d.ts +5 -0
  159. package/build/src/services/ios/diagnostic-service/keys.d.ts.map +1 -0
  160. package/build/src/services/ios/diagnostic-service/keys.js +770 -0
  161. package/build/src/services/ios/syslog-service/index.d.ts +91 -0
  162. package/build/src/services/ios/syslog-service/index.d.ts.map +1 -0
  163. package/build/src/services/ios/syslog-service/index.js +323 -0
  164. package/build/src/services/ios/tunnel-service/index.d.ts +17 -0
  165. package/build/src/services/ios/tunnel-service/index.d.ts.map +1 -0
  166. package/build/src/services/ios/tunnel-service/index.js +57 -0
  167. package/build/src/services.d.ts +14 -0
  168. package/build/src/services.d.ts.map +1 -0
  169. package/build/src/services.js +48 -0
  170. package/package.json +12 -3
  171. package/src/lib/apple-tv/constants.ts +42 -0
  172. package/src/lib/apple-tv/encryption/chacha20-poly1305.ts +147 -0
  173. package/src/lib/apple-tv/encryption/ed25519.ts +126 -0
  174. package/src/lib/apple-tv/encryption/hkdf.ts +95 -0
  175. package/src/lib/apple-tv/encryption/index.ts +11 -0
  176. package/src/lib/apple-tv/encryption/opack2.ts +257 -0
  177. package/.github/dependabot.yml +0 -38
  178. package/.github/workflows/format-check.yml +0 -43
  179. package/.github/workflows/lint-and-build.yml +0 -40
  180. package/.github/workflows/pr-title.yml +0 -16
  181. package/.github/workflows/publish.js.yml +0 -43
  182. package/.github/workflows/test-validation.yml +0 -40
  183. package/.mocharc.json +0 -8
  184. package/.prettierignore +0 -3
  185. package/.prettierrc +0 -17
  186. package/.releaserc +0 -48
  187. package/assets/images/ios-arch.png +0 -0
  188. package/eslint.config.js +0 -45
  189. package/npm-shrinkwrap.json +0 -2711
  190. package/test/integration/diagnostics-test.ts +0 -44
  191. package/test/integration/read-pair-record-test.ts +0 -39
  192. package/test/integration/tunnel-test.ts +0 -104
  193. package/test/unit/apple-tv/tlv/decoder.spec.ts +0 -144
  194. package/test/unit/apple-tv/tlv/encoder.spec.ts +0 -91
  195. package/test/unit/apple-tv/tlv/pairing-tlv.spec.ts +0 -101
  196. package/test/unit/apple-tv/tlv/tlv-integration.spec.ts +0 -146
  197. package/test/unit/apple-tv/utils/buffer-utils.spec.ts +0 -74
  198. package/test/unit/apple-tv/utils/uuid-generator.spec.ts +0 -39
  199. package/test/unit/fixtures/index.ts +0 -88
  200. package/test/unit/fixtures/usbmuxconnectmessage.bin +0 -0
  201. package/test/unit/fixtures/usbmuxlistdevicemessage.bin +0 -0
  202. package/test/unit/plist/error-handling.spec.ts +0 -101
  203. package/test/unit/plist/fixtures/sample.binary.plist +0 -0
  204. package/test/unit/plist/fixtures/sample.xml.plist +0 -38
  205. package/test/unit/plist/plist-parser.spec.ts +0 -283
  206. package/test/unit/plist/plist.spec.ts +0 -205
  207. package/test/unit/plist/tag-position-handling.spec.ts +0 -90
  208. package/test/unit/plist/unified-plist-parser.spec.ts +0 -227
  209. package/test/unit/plist/utils.spec.ts +0 -249
  210. package/test/unit/plist/xml-cleaning.spec.ts +0 -60
  211. package/test/unit/tunnel/tunnel-registry-server.spec.ts +0 -194
  212. package/test/unit/usbmux/usbmux-specs.ts +0 -71
  213. package/tsconfig.json +0 -36
@@ -0,0 +1,74 @@
1
+ declare class Struct {
2
+ private readonly types;
3
+ constructor(fmt: string);
4
+ byteLength(): number;
5
+ pack(...values: number[]): Buffer;
6
+ }
7
+ declare const STRUCT_HL: Struct;
8
+ type StreamAssociation = 'has-stream' | 'no-stream' | 'either';
9
+ declare class HyperframeError extends Error {
10
+ }
11
+ declare class InvalidDataError extends HyperframeError {
12
+ }
13
+ declare class Flag {
14
+ name: string;
15
+ bit: number;
16
+ constructor(name: string, bit: number);
17
+ }
18
+ declare class Flags {
19
+ definedFlags: Flag[];
20
+ flags: Set<string>;
21
+ constructor(definedFlags: Flag[]);
22
+ add(flag: string): void;
23
+ has(flag: string): boolean;
24
+ toString(): string;
25
+ }
26
+ export declare class Frame {
27
+ protected definedFlags: Flag[];
28
+ type: number | null;
29
+ streamAssociation: StreamAssociation | null;
30
+ streamId: number;
31
+ flags: Flags;
32
+ bodyLen: number;
33
+ constructor(streamId: number, flags?: string[]);
34
+ toString(): string;
35
+ serialize(): Buffer;
36
+ serializeBody(): Buffer;
37
+ protected bodyRepr(): string;
38
+ }
39
+ export declare class SettingsFrame extends Frame {
40
+ static MAX_CONCURRENT_STREAMS: number;
41
+ static INITIAL_WINDOW_SIZE: number;
42
+ settings: Record<number, number>;
43
+ constructor(streamId?: number, settings?: Record<number, number> | null, flags?: string[]);
44
+ bodyRepr(): string;
45
+ serializeBody(): Buffer;
46
+ }
47
+ export declare class DataFrame extends Frame {
48
+ data: Buffer;
49
+ padLength: number;
50
+ constructor(streamId: number, data?: Buffer | string, flags?: string[]);
51
+ serializePaddingData(): Buffer;
52
+ serializeBody(): Buffer;
53
+ }
54
+ export declare class HeadersFrame extends Frame {
55
+ data: Buffer;
56
+ padLength: number;
57
+ dependsOn: number;
58
+ streamWeight: number;
59
+ exclusive: boolean;
60
+ static ALL_FLAGS: Record<string, number>;
61
+ constructor(streamId: number, data?: Buffer | string, flags?: string[]);
62
+ serializePaddingData(): Buffer;
63
+ serializePriorityData(): Buffer;
64
+ bodyRepr(): string;
65
+ serializeBody(): Buffer;
66
+ }
67
+ export declare class WindowUpdateFrame extends Frame {
68
+ windowIncrement: number;
69
+ constructor(streamId: number, windowIncrement?: number, flags?: string[]);
70
+ bodyRepr(): string;
71
+ serializeBody(): Buffer;
72
+ }
73
+ export { InvalidDataError, STRUCT_HL };
74
+ //# sourceMappingURL=handshake-frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake-frames.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake-frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
1
+ class Struct {
2
+ types;
3
+ constructor(fmt) {
4
+ if (!fmt.startsWith('>')) {
5
+ throw new Error('Only big-endian formats supported');
6
+ }
7
+ this.types = [];
8
+ for (const ch of fmt.slice(1)) {
9
+ if ('0123456789'.includes(ch)) {
10
+ continue;
11
+ }
12
+ this.types.push(ch);
13
+ }
14
+ }
15
+ byteLength() {
16
+ let total = 0;
17
+ for (const t of this.types) {
18
+ switch (t) {
19
+ case 'H':
20
+ total += 2;
21
+ break;
22
+ case 'B':
23
+ total += 1;
24
+ break;
25
+ case 'L':
26
+ total += 4;
27
+ break;
28
+ default:
29
+ throw new TypeError('Unsupported type: ' + t);
30
+ }
31
+ }
32
+ return total;
33
+ }
34
+ pack(...values) {
35
+ if (values.length !== this.types.length) {
36
+ throw new TypeError('Incorrect number of values to pack');
37
+ }
38
+ const buf = Buffer.alloc(this.byteLength());
39
+ let offset = 0;
40
+ for (const [i, t] of this.types.entries()) {
41
+ const v = values[i];
42
+ switch (t) {
43
+ case 'H':
44
+ buf.writeUInt16BE(v, offset);
45
+ offset += 2;
46
+ break;
47
+ case 'B':
48
+ buf.writeUInt8(v, offset);
49
+ offset += 1;
50
+ break;
51
+ case 'L':
52
+ buf.writeUInt32BE(v, offset);
53
+ offset += 4;
54
+ break;
55
+ default:
56
+ throw new TypeError('Unsupported type: ' + t);
57
+ }
58
+ }
59
+ return buf;
60
+ }
61
+ }
62
+ // Struct constants
63
+ const STRUCT_HBBBL = new Struct('>HBBBL');
64
+ const STRUCT_HL = new Struct('>HL');
65
+ const STRUCT_LB = new Struct('>LB');
66
+ const STRUCT_L = new Struct('>L');
67
+ const STRUCT_B = new Struct('>B');
68
+ const STREAM_ASSOC_HAS_STREAM = 'has-stream';
69
+ const STREAM_ASSOC_NO_STREAM = 'no-stream';
70
+ const STREAM_ASSOC_EITHER = 'either';
71
+ // Error classes
72
+ class HyperframeError extends Error {
73
+ }
74
+ class InvalidDataError extends HyperframeError {
75
+ }
76
+ // Flag handling
77
+ class Flag {
78
+ name;
79
+ bit;
80
+ constructor(name, bit) {
81
+ this.name = name;
82
+ this.bit = bit;
83
+ }
84
+ }
85
+ class Flags {
86
+ definedFlags;
87
+ flags;
88
+ constructor(definedFlags) {
89
+ this.definedFlags = definedFlags;
90
+ this.flags = new Set();
91
+ }
92
+ add(flag) {
93
+ this.flags.add(flag);
94
+ }
95
+ has(flag) {
96
+ return this.flags.has(flag);
97
+ }
98
+ toString() {
99
+ return Array.from(this.flags).join(', ');
100
+ }
101
+ }
102
+ // Utility function
103
+ function rawDataRepr(data) {
104
+ if (!data || data.length === 0) {
105
+ return 'None';
106
+ }
107
+ let r = data.toString('hex');
108
+ if (r.length > 20) {
109
+ r = r.slice(0, 20) + '\u2026';
110
+ }
111
+ return '<hex:' + r + '>';
112
+ }
113
+ // Base frame class
114
+ export class Frame {
115
+ definedFlags = [];
116
+ type = null;
117
+ streamAssociation = null;
118
+ streamId;
119
+ flags;
120
+ bodyLen;
121
+ constructor(streamId, flags = []) {
122
+ this.streamId = streamId;
123
+ this.flags = new Flags(this.definedFlags);
124
+ this.bodyLen = 0;
125
+ for (const flag of flags) {
126
+ this.flags.add(flag);
127
+ }
128
+ if (!this.streamId && this.streamAssociation === STREAM_ASSOC_HAS_STREAM) {
129
+ throw new InvalidDataError(`Stream ID must be non-zero for ${this.constructor.name}`);
130
+ }
131
+ if (this.streamId && this.streamAssociation === STREAM_ASSOC_NO_STREAM) {
132
+ throw new InvalidDataError(`Stream ID must be zero for ${this.constructor.name} with streamId=${this.streamId}`);
133
+ }
134
+ }
135
+ toString() {
136
+ return `${this.constructor.name}(streamId=${this.streamId}, flags=${this.flags.toString()}): ${this.bodyRepr()}`;
137
+ }
138
+ serialize() {
139
+ const body = this.serializeBody();
140
+ this.bodyLen = body.length;
141
+ let flagsVal = 0;
142
+ for (const f of this.definedFlags) {
143
+ if (this.flags.has(f.name)) {
144
+ flagsVal |= f.bit;
145
+ }
146
+ }
147
+ const header = STRUCT_HBBBL.pack((this.bodyLen >> 8) & 0xffff, this.bodyLen & 0xff, this.type, flagsVal, this.streamId & 0x7fffffff);
148
+ return Buffer.concat([header, body]);
149
+ }
150
+ serializeBody() {
151
+ throw new Error('Not implemented');
152
+ }
153
+ bodyRepr() {
154
+ return rawDataRepr(this.serializeBody());
155
+ }
156
+ }
157
+ // Specific frame implementations
158
+ export class SettingsFrame extends Frame {
159
+ static MAX_CONCURRENT_STREAMS = 0x03;
160
+ static INITIAL_WINDOW_SIZE = 0x04;
161
+ settings;
162
+ constructor(streamId = 0, settings = null, flags = []) {
163
+ super(streamId, flags);
164
+ this.definedFlags = [new Flag('ACK', 0x01)];
165
+ this.type = 0x04;
166
+ this.streamAssociation = STREAM_ASSOC_NO_STREAM;
167
+ if (settings && flags.includes('ACK')) {
168
+ throw new InvalidDataError('Settings must be empty if ACK flag is set.');
169
+ }
170
+ this.settings = settings || {};
171
+ }
172
+ bodyRepr() {
173
+ return `settings=${JSON.stringify(this.settings)}`;
174
+ }
175
+ serializeBody() {
176
+ if (this.flags.has('ACK')) {
177
+ return Buffer.alloc(0);
178
+ }
179
+ const buffers = [];
180
+ for (const setting of Object.keys(this.settings)) {
181
+ const buf = STRUCT_HL.pack(Number(setting) & 0xff, this.settings[Number(setting)]);
182
+ buffers.push(buf);
183
+ }
184
+ return Buffer.concat(buffers);
185
+ }
186
+ }
187
+ export class DataFrame extends Frame {
188
+ data;
189
+ padLength;
190
+ constructor(streamId, data = Buffer.from(''), flags = []) {
191
+ super(streamId, flags);
192
+ this.definedFlags = [
193
+ new Flag('END_STREAM', 0x01),
194
+ new Flag('PADDED', 0x08),
195
+ ];
196
+ this.type = 0x0;
197
+ this.streamAssociation = STREAM_ASSOC_HAS_STREAM;
198
+ this.padLength = 0;
199
+ this.data = Buffer.isBuffer(data) ? data : Buffer.from(data);
200
+ }
201
+ serializePaddingData() {
202
+ if (this.flags.has('PADDED')) {
203
+ return STRUCT_B.pack(this.padLength);
204
+ }
205
+ return Buffer.alloc(0);
206
+ }
207
+ serializeBody() {
208
+ const paddingData = this.serializePaddingData();
209
+ const padding = Buffer.alloc(this.padLength, 0);
210
+ // Ensure data is a Buffer
211
+ if (!Buffer.isBuffer(this.data)) {
212
+ this.data = Buffer.from(this.data);
213
+ }
214
+ const payload = Buffer.concat([paddingData, this.data, padding]);
215
+ this.bodyLen = payload.length;
216
+ return payload;
217
+ }
218
+ }
219
+ export class HeadersFrame extends Frame {
220
+ data;
221
+ padLength;
222
+ dependsOn;
223
+ streamWeight;
224
+ exclusive;
225
+ static ALL_FLAGS = {
226
+ END_STREAM: 0x01,
227
+ END_HEADERS: 0x04,
228
+ PADDED: 0x08,
229
+ PRIORITY: 0x20,
230
+ };
231
+ constructor(streamId, data = Buffer.from(''), flags = []) {
232
+ super(streamId, flags);
233
+ // Map given flags to Flag objects using ALL_FLAGS
234
+ this.definedFlags = flags.map((flag) => new Flag(flag, HeadersFrame.ALL_FLAGS[flag]));
235
+ this.type = 0x01;
236
+ this.streamAssociation = STREAM_ASSOC_HAS_STREAM;
237
+ this.padLength = 0;
238
+ this.dependsOn = 0;
239
+ this.streamWeight = 0;
240
+ this.exclusive = false;
241
+ this.data = Buffer.isBuffer(data) ? data : Buffer.from(data);
242
+ }
243
+ serializePaddingData() {
244
+ if (this.flags.has('PADDED')) {
245
+ return STRUCT_B.pack(this.padLength);
246
+ }
247
+ return Buffer.alloc(0);
248
+ }
249
+ serializePriorityData() {
250
+ return STRUCT_LB.pack(this.dependsOn + (this.exclusive ? 0x80000000 : 0), this.streamWeight);
251
+ }
252
+ bodyRepr() {
253
+ return `exclusive=${this.exclusive}, dependsOn=${this.dependsOn}, streamWeight=${this.streamWeight}, data=${rawDataRepr(this.data)}`;
254
+ }
255
+ serializeBody() {
256
+ const paddingData = this.serializePaddingData();
257
+ const padding = Buffer.alloc(this.padLength, 0);
258
+ let priorityData;
259
+ if (this.flags.has('PRIORITY')) {
260
+ priorityData = this.serializePriorityData();
261
+ }
262
+ else {
263
+ priorityData = Buffer.alloc(0);
264
+ }
265
+ return Buffer.concat([paddingData, priorityData, this.data, padding]);
266
+ }
267
+ }
268
+ export class WindowUpdateFrame extends Frame {
269
+ windowIncrement;
270
+ constructor(streamId, windowIncrement = 0, flags = []) {
271
+ super(streamId, flags);
272
+ this.definedFlags = [];
273
+ this.type = 0x08;
274
+ this.streamAssociation = STREAM_ASSOC_EITHER;
275
+ this.windowIncrement = windowIncrement;
276
+ }
277
+ bodyRepr() {
278
+ return `windowIncrement=${this.windowIncrement}`;
279
+ }
280
+ serializeBody() {
281
+ return STRUCT_L.pack(this.windowIncrement & 0x7fffffff);
282
+ }
283
+ }
284
+ // Exported constants and types
285
+ export { InvalidDataError, STRUCT_HL };
@@ -0,0 +1,14 @@
1
+ import { Socket } from 'net';
2
+ import { type XPCDictionary } from '../types.js';
3
+ export type ChannelId = number;
4
+ export type MessageId = number;
5
+ declare class Handshake {
6
+ private _socket;
7
+ private readonly _nextMessageId;
8
+ constructor(socket: Socket);
9
+ sendFrame(frame: Buffer): Promise<void>;
10
+ sendRequest(data: XPCDictionary): Promise<void>;
11
+ perform(): Promise<void>;
12
+ }
13
+ export default Handshake;
14
+ //# sourceMappingURL=handshake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,cAAM,SAAS;IACb,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;gBAElD,MAAM,EAAE,MAAM;IAQpB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA6F/B;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { Socket } from 'net';
2
+ import {} from '../types.js';
3
+ import { Http2Constants, XpcConstants } from './constants.js';
4
+ import { DataFrame, HeadersFrame, SettingsFrame, WindowUpdateFrame, } from './handshake-frames.js';
5
+ import { encodeMessage } from './xpc-protocol.js';
6
+ class Handshake {
7
+ _socket;
8
+ _nextMessageId;
9
+ constructor(socket) {
10
+ this._socket = socket;
11
+ this._nextMessageId = {
12
+ [Http2Constants.ROOT_CHANNEL]: 0,
13
+ [Http2Constants.REPLY_CHANNEL]: 0,
14
+ };
15
+ }
16
+ async sendFrame(frame) {
17
+ return new Promise((resolve, reject) => {
18
+ if (!this._socket.writable) {
19
+ return reject(new Error('Socket is not writable'));
20
+ }
21
+ this._socket.write(frame, (error) => error ? reject(error) : resolve());
22
+ });
23
+ }
24
+ async sendRequest(data) {
25
+ const flags = XpcConstants.XPC_FLAGS_ALWAYS_SET;
26
+ const requestMessage = {
27
+ flags,
28
+ id: BigInt(this._nextMessageId[Http2Constants.ROOT_CHANNEL]),
29
+ body: data,
30
+ };
31
+ const encodedMessage = encodeMessage(requestMessage);
32
+ const dataFrame = new DataFrame(Http2Constants.ROOT_CHANNEL, encodedMessage, []);
33
+ await this.sendFrame(dataFrame.serialize());
34
+ }
35
+ async perform() {
36
+ try {
37
+ // Step 1: Send HTTP/2 magic sequence with proper error handling
38
+ await new Promise((resolve, reject) => {
39
+ if (!this._socket.writable) {
40
+ return reject(new Error('Socket is not writable for HTTP/2 magic sequence'));
41
+ }
42
+ this._socket.write(Http2Constants.HTTP2_MAGIC, (err) => err ? reject(err) : resolve());
43
+ });
44
+ // Step 2: Send SETTINGS frame on stream 0.
45
+ const settings = {
46
+ [SettingsFrame.MAX_CONCURRENT_STREAMS]: 100,
47
+ [SettingsFrame.INITIAL_WINDOW_SIZE]: 1048576,
48
+ };
49
+ const settingsFrame = new SettingsFrame(0, settings, []);
50
+ await this.sendFrame(settingsFrame.serialize());
51
+ // Step 3: Send WINDOW_UPDATE frame on stream 0.
52
+ const windowUpdateFrame = new WindowUpdateFrame(0, 983041);
53
+ await this.sendFrame(windowUpdateFrame.serialize());
54
+ // Step 4: Send a HEADERS frame on stream 1.
55
+ const headersFrameRoot = new HeadersFrame(Http2Constants.ROOT_CHANNEL, Buffer.from(''), ['END_HEADERS']);
56
+ await this.sendFrame(headersFrameRoot.serialize());
57
+ // Step 5: Send first DataFrame on stream 1 (empty payload).
58
+ await this.sendRequest({});
59
+ // Step 6: Send second DataFrame on stream 1 with specific flags.
60
+ const dataMessage = {
61
+ flags: 0x0201,
62
+ id: 0,
63
+ body: null,
64
+ };
65
+ const encodedDataMessage = encodeMessage(dataMessage);
66
+ const dataFrame = new DataFrame(Http2Constants.ROOT_CHANNEL, encodedDataMessage, []);
67
+ await this.sendFrame(dataFrame.serialize());
68
+ this._nextMessageId[Http2Constants.ROOT_CHANNEL]++;
69
+ // Step 7: Send a HEADERS frame on stream 3.
70
+ const headersFrameReply = new HeadersFrame(Http2Constants.REPLY_CHANNEL, Buffer.from(''), ['END_HEADERS']);
71
+ await this.sendFrame(headersFrameReply.serialize());
72
+ // Step 8: Open REPLY_CHANNEL with INIT_HANDSHAKE flags.
73
+ const replyMessage = {
74
+ flags: XpcConstants.XPC_FLAGS_ALWAYS_SET |
75
+ XpcConstants.XPC_FLAGS_INIT_HANDSHAKE,
76
+ id: 0,
77
+ body: null,
78
+ };
79
+ const encodedReplyMessage = encodeMessage(replyMessage);
80
+ const replyDataFrame = new DataFrame(Http2Constants.REPLY_CHANNEL, encodedReplyMessage, []);
81
+ await this.sendFrame(replyDataFrame.serialize());
82
+ this._nextMessageId[Http2Constants.REPLY_CHANNEL]++;
83
+ // Step 9: Send SETTINGS ACK frame.
84
+ const ackFrame = new SettingsFrame(0, null, ['ACK']);
85
+ await this.sendFrame(ackFrame.serialize());
86
+ }
87
+ catch (error) {
88
+ // Provide detailed error information
89
+ throw new Error(error instanceof Error
90
+ ? `Handshake failed at step: ${error.message}`
91
+ : 'Unknown handshake error');
92
+ }
93
+ }
94
+ }
95
+ export default Handshake;
@@ -0,0 +1,55 @@
1
+ interface Service {
2
+ serviceName: string;
3
+ port: string;
4
+ }
5
+ interface ServicesResponse {
6
+ services: Service[];
7
+ }
8
+ declare class RemoteXpcConnection {
9
+ private readonly _address;
10
+ private _socket;
11
+ private _handshake;
12
+ private _isConnected;
13
+ private _services;
14
+ constructor(address: [string, number]);
15
+ /**
16
+ * Connect to the remote device and perform handshake
17
+ * @returns Promise that resolves with the list of available services
18
+ */
19
+ connect(): Promise<ServicesResponse>;
20
+ /**
21
+ * Close the connection
22
+ */
23
+ close(): Promise<void>;
24
+ /**
25
+ * Get the list of available services
26
+ * @returns Array of available services
27
+ */
28
+ getServices(): Service[];
29
+ /**
30
+ * List all available services
31
+ * @returns Array of all available services
32
+ */
33
+ listAllServices(): Service[];
34
+ /**
35
+ * Find a service by name
36
+ * @param serviceName The name of the service to find
37
+ * @returns The service or throws an error if not found
38
+ */
39
+ findService(serviceName: string): Service;
40
+ /**
41
+ * Remove all listeners from the socket to prevent memory leaks
42
+ */
43
+ private cleanupSocket;
44
+ /**
45
+ * Clean up all resources
46
+ */
47
+ private cleanupResources;
48
+ /**
49
+ * Force cleanup by destroying the socket and cleaning up resources
50
+ */
51
+ private forceCleanup;
52
+ }
53
+ export default RemoteXpcConnection;
54
+ export { type Service, type ServicesResponse };
55
+ //# sourceMappingURL=remote-xpc-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-xpc-connection.d.ts","sourceRoot":"","sources":["../../../../src/lib/remote-xpc/remote-xpc-connection.ts"],"names":[],"mappings":"AAgBA,UAAU,OAAO;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAKD,cAAM,mBAAmB;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,SAAS,CAAwB;gBAE7B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAQrC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA0J1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0E5B;;;OAGG;IACH,WAAW,IAAI,OAAO,EAAE;IAOxB;;;OAGG;IACH,eAAe,IAAI,OAAO,EAAE;IAI5B;;;;OAIG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAYzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAerB;AAkFD,eAAe,mBAAmB,CAAC;AACnC,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,gBAAgB,EAAE,CAAC"}