@serveryyswys/node.operit 0.0.0-stage → 0.1.2

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 (123) hide show
  1. package/BUILTINS.json +233 -0
  2. package/DESIGN.md +513 -0
  3. package/LICENSE +674 -0
  4. package/README.md +301 -2
  5. package/dist/assert/strict.d.ts +2 -0
  6. package/dist/assert/strict.js +7 -0
  7. package/dist/assert.d.ts +3 -0
  8. package/dist/assert.js +483 -0
  9. package/dist/buffer.d.ts +60 -0
  10. package/dist/buffer.js +524 -0
  11. package/dist/child_process.d.ts +56 -0
  12. package/dist/child_process.js +371 -0
  13. package/dist/constants.d.ts +2 -0
  14. package/dist/constants.js +19 -0
  15. package/dist/crypto.d.ts +76 -0
  16. package/dist/crypto.js +312 -0
  17. package/dist/dns/promises.d.ts +34 -0
  18. package/dist/dns/promises.js +190 -0
  19. package/dist/dns.d.ts +88 -0
  20. package/dist/dns.js +259 -0
  21. package/dist/events.d.ts +40 -0
  22. package/dist/events.js +237 -0
  23. package/dist/fs/promises.d.ts +159 -0
  24. package/dist/fs/promises.js +129 -0
  25. package/dist/fs.d.ts +221 -0
  26. package/dist/fs.js +944 -0
  27. package/dist/http.d.ts +92 -0
  28. package/dist/http.js +319 -0
  29. package/dist/https.d.ts +296 -0
  30. package/dist/https.js +50 -0
  31. package/dist/index.d.ts +2422 -0
  32. package/dist/index.js +57 -0
  33. package/dist/lib/bridge.d.ts +60 -0
  34. package/dist/lib/bridge.js +205 -0
  35. package/dist/lib/bytes.d.ts +20 -0
  36. package/dist/lib/bytes.js +239 -0
  37. package/dist/lib/child-process-types.d.ts +45 -0
  38. package/dist/lib/child-process-types.js +2 -0
  39. package/dist/lib/cwd.d.ts +2 -0
  40. package/dist/lib/cwd.js +32 -0
  41. package/dist/lib/deep-equal.d.ts +3 -0
  42. package/dist/lib/deep-equal.js +223 -0
  43. package/dist/lib/deflate.d.ts +2 -0
  44. package/dist/lib/deflate.js +234 -0
  45. package/dist/lib/dns-driver.d.ts +14 -0
  46. package/dist/lib/dns-driver.js +85 -0
  47. package/dist/lib/dns-types.d.ts +22 -0
  48. package/dist/lib/dns-types.js +2 -0
  49. package/dist/lib/errors.d.ts +48 -0
  50. package/dist/lib/errors.js +424 -0
  51. package/dist/lib/fs-driver.d.ts +70 -0
  52. package/dist/lib/fs-driver.js +364 -0
  53. package/dist/lib/fs-env.d.ts +30 -0
  54. package/dist/lib/fs-env.js +157 -0
  55. package/dist/lib/fs-types.d.ts +19 -0
  56. package/dist/lib/fs-types.js +2 -0
  57. package/dist/lib/hashes.d.ts +27 -0
  58. package/dist/lib/hashes.js +432 -0
  59. package/dist/lib/http-driver.d.ts +30 -0
  60. package/dist/lib/http-driver.js +72 -0
  61. package/dist/lib/http-types.d.ts +18 -0
  62. package/dist/lib/http-types.js +2 -0
  63. package/dist/lib/inflate.d.ts +6 -0
  64. package/dist/lib/inflate.js +284 -0
  65. package/dist/lib/path-types.d.ts +37 -0
  66. package/dist/lib/path-types.js +2 -0
  67. package/dist/lib/paths.d.ts +8 -0
  68. package/dist/lib/paths.js +106 -0
  69. package/dist/lib/perf-hooks-types.d.ts +18 -0
  70. package/dist/lib/perf-hooks-types.js +2 -0
  71. package/dist/lib/process-driver.d.ts +31 -0
  72. package/dist/lib/process-driver.js +102 -0
  73. package/dist/lib/punycode.d.ts +8 -0
  74. package/dist/lib/punycode.js +179 -0
  75. package/dist/lib/stream-types.d.ts +29 -0
  76. package/dist/lib/stream-types.js +2 -0
  77. package/dist/lib/timers-types.d.ts +18 -0
  78. package/dist/lib/timers-types.js +2 -0
  79. package/dist/lib/url-search-params.d.ts +26 -0
  80. package/dist/lib/url-search-params.js +281 -0
  81. package/dist/lib/url-types.d.ts +44 -0
  82. package/dist/lib/url-types.js +2 -0
  83. package/dist/lib/url-whatwg.d.ts +78 -0
  84. package/dist/lib/url-whatwg.js +857 -0
  85. package/dist/lib/zlib-types.d.ts +12 -0
  86. package/dist/lib/zlib-types.js +2 -0
  87. package/dist/module.d.ts +8 -0
  88. package/dist/module.js +72 -0
  89. package/dist/os.d.ts +80 -0
  90. package/dist/os.js +247 -0
  91. package/dist/path/posix.d.ts +2 -0
  92. package/dist/path/posix.js +7 -0
  93. package/dist/path/win32.d.ts +2 -0
  94. package/dist/path/win32.js +10 -0
  95. package/dist/path.d.ts +3 -0
  96. package/dist/path.js +1222 -0
  97. package/dist/perf_hooks.d.ts +36 -0
  98. package/dist/perf_hooks.js +144 -0
  99. package/dist/process.d.ts +69 -0
  100. package/dist/process.js +230 -0
  101. package/dist/querystring.d.ts +15 -0
  102. package/dist/querystring.js +209 -0
  103. package/dist/stream/promises.d.ts +5 -0
  104. package/dist/stream/promises.js +10 -0
  105. package/dist/stream.d.ts +84 -0
  106. package/dist/stream.js +875 -0
  107. package/dist/string_decoder.d.ts +15 -0
  108. package/dist/string_decoder.js +237 -0
  109. package/dist/timers/promises.d.ts +19 -0
  110. package/dist/timers/promises.js +74 -0
  111. package/dist/timers.d.ts +21 -0
  112. package/dist/timers.js +41 -0
  113. package/dist/tty.d.ts +9 -0
  114. package/dist/tty.js +25 -0
  115. package/dist/unsupported.d.ts +12 -0
  116. package/dist/unsupported.js +17 -0
  117. package/dist/url.d.ts +28 -0
  118. package/dist/url.js +486 -0
  119. package/dist/util.d.ts +74 -0
  120. package/dist/util.js +515 -0
  121. package/dist/zlib.d.ts +88 -0
  122. package/dist/zlib.js +371 -0
  123. package/package.json +29 -4
@@ -0,0 +1,223 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isDeepStrictEqual = isDeepStrictEqual;
4
+ exports.isDeepEqual = isDeepEqual;
5
+ /**
6
+ * 深比较,供 util.isDeepStrictEqual 与 assert.deepStrictEqual 共用。
7
+ *
8
+ * 目标是复刻 Node 的 `isDeepStrictEqual` 语义,几个容易漏的点:
9
+ * - `+0` 与 `-0` 不相等(要 Object.is,不能只靠 ===);
10
+ * - `NaN` 相等;
11
+ * - 比的是 constructor(沿原型链取)而不是原型对象本身:
12
+ * `Object.create({i:1})` 与 `{}` 同类,`Object.create(null)` 与 `{}` 不同类;
13
+ * 数组与非数组永不相等(另有长度检查,所以 `[]` 与 `new Array(2)` 不等);
14
+ * - 循环引用要能终止(用 a->b 的 memo 对);
15
+ * - Map / Set 按"存在一个深比较相等的对应项"判断,且 Map 的键也参与深比较;
16
+ * - 普通对象比较的是"自有可枚举字符串键 + 自有可枚举符号键",
17
+ * 所以稀疏数组与补了 undefined 的数组不相等;
18
+ * - Error 额外比较 name 与 message(它们是非枚举自有属性,Object.keys 看不到)。
19
+ */
20
+ function tagOf(value) {
21
+ return Object.prototype.toString.call(value);
22
+ }
23
+ function isTypedArrayView(value) {
24
+ return ArrayBuffer.isView(value) && !(value instanceof DataView);
25
+ }
26
+ function bytesOf(view) {
27
+ return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
28
+ }
29
+ function sameBytes(left, right) {
30
+ if (left.byteLength !== right.byteLength) {
31
+ return false;
32
+ }
33
+ const a = bytesOf(left);
34
+ const b = bytesOf(right);
35
+ for (let i = 0; i < a.length; i += 1) {
36
+ if (a[i] !== b[i]) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ }
42
+ function ownEnumerableKeys(value, loose) {
43
+ const keys = Object.keys(value);
44
+ if (loose) {
45
+ // 旧版宽松深比较只看字符串键,不看符号键
46
+ return keys;
47
+ }
48
+ const symbols = Object.getOwnPropertySymbols(value);
49
+ for (let i = 0; i < symbols.length; i += 1) {
50
+ const descriptor = Object.getOwnPropertyDescriptor(value, symbols[i]);
51
+ if (descriptor !== undefined && descriptor.enumerable === true) {
52
+ keys.push(symbols[i]);
53
+ }
54
+ }
55
+ return keys;
56
+ }
57
+ function readKey(value, key) {
58
+ return value[key];
59
+ }
60
+ function isDeepStrictEqual(left, right, loose) {
61
+ return inner(left, right, new Map(), loose === true);
62
+ }
63
+ function inner(left, right, seen, loose) {
64
+ if (left === right) {
65
+ // 宽松模式不区分 +0 / -0;严格模式要区分
66
+ return loose || left !== 0 || Object.is(left, right);
67
+ }
68
+ // 注意:函数不算"对象"—— Node 用的是 typeof x === 'object',
69
+ // 所以两个不同的函数即使都没有自有键也不相等。
70
+ const leftIsObject = typeof left === 'object' && left !== null;
71
+ const rightIsObject = typeof right === 'object' && right !== null;
72
+ if (!leftIsObject || !rightIsObject) {
73
+ if (typeof left === 'number' && typeof right === 'number' && left !== left && right !== right) {
74
+ return true;
75
+ }
76
+ const leftNil = left === null || left === undefined;
77
+ const rightNil = right === null || right === undefined;
78
+ if (leftNil || rightNil) {
79
+ return loose && leftNil && rightNil;
80
+ }
81
+ const leftPrimitive = typeof left !== 'object' && typeof left !== 'function';
82
+ const rightPrimitive = typeof right !== 'object' && typeof right !== 'function';
83
+ if (loose && leftPrimitive && rightPrimitive) {
84
+ // 只有两侧都是原始值才用 ==:对 Object.create(null) 这类对象做 == 会抛
85
+ // "Cannot convert object to primitive value"。
86
+ // eslint-disable-next-line eqeqeq
87
+ return left == right;
88
+ }
89
+ return false;
90
+ }
91
+ // Node 比的是 constructor(沿原型链取),不是原型对象本身:
92
+ // 所以 Object.create({i:1}) 与 {} 视为同类,而 Object.create(null) 不是。
93
+ if (!loose) {
94
+ const leftConstructor = left.constructor;
95
+ const rightConstructor = right.constructor;
96
+ if (leftConstructor !== rightConstructor) {
97
+ return false;
98
+ }
99
+ }
100
+ // 数组与非数组是两类,即使 constructor 相同也不比
101
+ if (Array.isArray(left) !== Array.isArray(right)) {
102
+ return false;
103
+ }
104
+ const previous = seen.get(left);
105
+ if (previous !== undefined) {
106
+ return previous === right;
107
+ }
108
+ seen.set(left, right);
109
+ const leftTag = tagOf(left);
110
+ if (leftTag !== tagOf(right)) {
111
+ return false;
112
+ }
113
+ switch (leftTag) {
114
+ case '[object Date]':
115
+ return left.getTime() === right.getTime();
116
+ case '[object RegExp]':
117
+ return left.source === right.source &&
118
+ left.flags === right.flags;
119
+ case '[object Number]':
120
+ case '[object String]':
121
+ case '[object Boolean]':
122
+ case '[object Symbol]':
123
+ case '[object BigInt]':
124
+ return left.valueOf() === right.valueOf();
125
+ case '[object ArrayBuffer]':
126
+ case '[object SharedArrayBuffer]':
127
+ return sameBytes(new Uint8Array(left), new Uint8Array(right));
128
+ default:
129
+ break;
130
+ }
131
+ if (isTypedArrayView(left) && isTypedArrayView(right)) {
132
+ return sameBytes(left, right);
133
+ }
134
+ if (left instanceof DataView && right instanceof DataView) {
135
+ return sameBytes(left, right);
136
+ }
137
+ if (left instanceof Map && right instanceof Map) {
138
+ if (left.size !== right.size) {
139
+ return false;
140
+ }
141
+ const candidates = Array.from(right.entries());
142
+ const used = new Set();
143
+ for (const entry of left.entries()) {
144
+ let matched = false;
145
+ for (let i = 0; i < candidates.length; i += 1) {
146
+ if (used.has(i)) {
147
+ continue;
148
+ }
149
+ if (inner(entry[0], candidates[i][0], seen, loose)) {
150
+ if (!inner(entry[1], candidates[i][1], seen, loose)) {
151
+ return false;
152
+ }
153
+ used.add(i);
154
+ matched = true;
155
+ break;
156
+ }
157
+ }
158
+ if (!matched) {
159
+ return false;
160
+ }
161
+ }
162
+ return true;
163
+ }
164
+ if (left instanceof Set && right instanceof Set) {
165
+ if (left.size !== right.size) {
166
+ return false;
167
+ }
168
+ const candidates = Array.from(right.values());
169
+ const used = new Set();
170
+ for (const value of left.values()) {
171
+ let matched = false;
172
+ for (let i = 0; i < candidates.length; i += 1) {
173
+ if (used.has(i)) {
174
+ continue;
175
+ }
176
+ if (inner(value, candidates[i], seen, loose)) {
177
+ used.add(i);
178
+ matched = true;
179
+ break;
180
+ }
181
+ }
182
+ if (!matched) {
183
+ return false;
184
+ }
185
+ }
186
+ return true;
187
+ }
188
+ if (left instanceof Error && right instanceof Error) {
189
+ if (left.name !== right.name || left.message !== right.message) {
190
+ return false;
191
+ }
192
+ }
193
+ // 数组还要比长度:[] 与 new Array(2) 的自有键都是空的,但 Node 认为不等
194
+ if (Array.isArray(left) && Array.isArray(right) && left.length !== right.length) {
195
+ return false;
196
+ }
197
+ const leftKeys = ownEnumerableKeys(left, loose);
198
+ const rightKeys = ownEnumerableKeys(right, loose);
199
+ if (leftKeys.length !== rightKeys.length) {
200
+ return false;
201
+ }
202
+ for (let i = 0; i < leftKeys.length; i += 1) {
203
+ const key = leftKeys[i];
204
+ let found = false;
205
+ for (let j = 0; j < rightKeys.length; j += 1) {
206
+ if (rightKeys[j] === key) {
207
+ found = true;
208
+ break;
209
+ }
210
+ }
211
+ if (!found) {
212
+ return false;
213
+ }
214
+ if (!inner(readKey(left, key), readKey(right, key), seen, loose)) {
215
+ return false;
216
+ }
217
+ }
218
+ return true;
219
+ }
220
+ /** Node 的旧版宽松深比较(assert.deepEqual),叶子用 == 且不检查原型。 */
221
+ function isDeepEqual(left, right) {
222
+ return isDeepStrictEqual(left, right, true);
223
+ }
@@ -0,0 +1,2 @@
1
+ /** 压缩为 raw DEFLATE 流。level <= 0 时退化为 stored 块。 */
2
+ export declare function deflateRaw(data: Uint8Array, level: number): Uint8Array;
@@ -0,0 +1,234 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deflateRaw = deflateRaw;
4
+ /**
5
+ * 纯 JS 的 DEFLATE 压缩(RFC 1951)。
6
+ *
7
+ * 策略:
8
+ * level <= 0 -> 只用 stored 块(不压缩,但一定是合法流)
9
+ * level > 0 -> 定长 Huffman 块 + LZ77(哈希链,链长随 level 增大)
10
+ *
11
+ * 没有实现动态 Huffman(那需要再写一套频率统计与码长编码),
12
+ * 因此压缩率不如 zlib,但**输出一定是任何解压器都能读的合法 DEFLATE 流** ——
13
+ * 这一点由 test/zlib.test.js 的"我们压的 Node 能解"方向验证。
14
+ */
15
+ const LENGTH_BASE = [
16
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
17
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258
18
+ ];
19
+ const LENGTH_EXTRA = [
20
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
21
+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
22
+ ];
23
+ const DISTANCE_BASE = [
24
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
25
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577
26
+ ];
27
+ const DISTANCE_EXTRA = [
28
+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
29
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
30
+ ];
31
+ const WINDOW_SIZE = 32768;
32
+ const MIN_MATCH = 3;
33
+ const MAX_MATCH = 258;
34
+ const HASH_BITS = 15;
35
+ const HASH_SIZE = 1 << HASH_BITS;
36
+ const HASH_MASK = HASH_SIZE - 1;
37
+ function makeWriter(hint) {
38
+ return {
39
+ bytes: new Uint8Array(Math.max(64, hint)),
40
+ length: 0,
41
+ bits: 0,
42
+ bitCount: 0
43
+ };
44
+ }
45
+ function ensureCapacity(writer, extra) {
46
+ if (writer.length + extra <= writer.bytes.length) {
47
+ return;
48
+ }
49
+ let size = writer.bytes.length;
50
+ while (size < writer.length + extra) {
51
+ size *= 2;
52
+ }
53
+ const grown = new Uint8Array(size);
54
+ grown.set(writer.bytes.subarray(0, writer.length));
55
+ writer.bytes = grown;
56
+ }
57
+ /** DEFLATE 的位是"字节内低位优先",所以按 LSB 累加。 */
58
+ function writeBits(writer, value, count) {
59
+ writer.bits |= value << writer.bitCount;
60
+ writer.bitCount += count;
61
+ while (writer.bitCount >= 8) {
62
+ ensureCapacity(writer, 1);
63
+ writer.bytes[writer.length] = writer.bits & 0xff;
64
+ writer.length += 1;
65
+ writer.bits >>>= 8;
66
+ writer.bitCount -= 8;
67
+ }
68
+ }
69
+ /** Huffman 码本身是"高位优先",所以逐位从最高位发出。 */
70
+ function writeCode(writer, code, length) {
71
+ for (let i = length - 1; i >= 0; i -= 1) {
72
+ writeBits(writer, (code >> i) & 1, 1);
73
+ }
74
+ }
75
+ function writeFixedLiteral(writer, symbol) {
76
+ if (symbol < 144) {
77
+ writeCode(writer, 0x30 + symbol, 8);
78
+ }
79
+ else if (symbol < 256) {
80
+ writeCode(writer, 0x190 + (symbol - 144), 9);
81
+ }
82
+ else if (symbol < 280) {
83
+ writeCode(writer, symbol - 256, 7);
84
+ }
85
+ else {
86
+ writeCode(writer, 0xc0 + (symbol - 280), 8);
87
+ }
88
+ }
89
+ function writeFixedDistance(writer, symbol) {
90
+ writeCode(writer, symbol, 5);
91
+ }
92
+ function lengthIndex(length) {
93
+ for (let i = LENGTH_BASE.length - 1; i >= 0; i -= 1) {
94
+ if (length >= LENGTH_BASE[i]) {
95
+ return i;
96
+ }
97
+ }
98
+ return 0;
99
+ }
100
+ function distanceIndex(distance) {
101
+ for (let i = DISTANCE_BASE.length - 1; i >= 0; i -= 1) {
102
+ if (distance >= DISTANCE_BASE[i]) {
103
+ return i;
104
+ }
105
+ }
106
+ return 0;
107
+ }
108
+ function flushBits(writer) {
109
+ if (writer.bitCount > 0) {
110
+ ensureCapacity(writer, 1);
111
+ writer.bytes[writer.length] = writer.bits & 0xff;
112
+ writer.length += 1;
113
+ writer.bits = 0;
114
+ writer.bitCount = 0;
115
+ }
116
+ }
117
+ function writeStoredBlocks(writer, data) {
118
+ flushBits(writer);
119
+ let offset = 0;
120
+ const MAX_STORED = 65535;
121
+ if (data.length === 0) {
122
+ writeBits(writer, 1, 1);
123
+ writeBits(writer, 0, 2);
124
+ flushBits(writer);
125
+ ensureCapacity(writer, 4);
126
+ writer.bytes[writer.length] = 0;
127
+ writer.bytes[writer.length + 1] = 0;
128
+ writer.bytes[writer.length + 2] = 0xff;
129
+ writer.bytes[writer.length + 3] = 0xff;
130
+ writer.length += 4;
131
+ return;
132
+ }
133
+ while (offset < data.length) {
134
+ const size = Math.min(MAX_STORED, data.length - offset);
135
+ const isFinal = offset + size >= data.length ? 1 : 0;
136
+ writeBits(writer, isFinal, 1);
137
+ writeBits(writer, 0, 2);
138
+ flushBits(writer);
139
+ ensureCapacity(writer, 4 + size);
140
+ writer.bytes[writer.length] = size & 0xff;
141
+ writer.bytes[writer.length + 1] = (size >>> 8) & 0xff;
142
+ writer.bytes[writer.length + 2] = (~size) & 0xff;
143
+ writer.bytes[writer.length + 3] = ((~size) >>> 8) & 0xff;
144
+ writer.length += 4;
145
+ writer.bytes.set(data.subarray(offset, offset + size), writer.length);
146
+ writer.length += size;
147
+ offset += size;
148
+ }
149
+ }
150
+ function hashAt(data, position) {
151
+ const value = (data[position] << 16) ^ (data[position + 1] << 8) ^ data[position + 2];
152
+ return (value * 2654435761) >>> (32 - HASH_BITS) & HASH_MASK;
153
+ }
154
+ function writeCompressedBlock(writer, data, maxChain) {
155
+ const head = new Int32Array(HASH_SIZE).fill(-1);
156
+ const previous = new Int32Array(data.length).fill(-1);
157
+ writeBits(writer, 1, 1);
158
+ writeBits(writer, 1, 2);
159
+ let position = 0;
160
+ while (position < data.length) {
161
+ let bestLength = 0;
162
+ let bestDistance = 0;
163
+ if (position + MIN_MATCH <= data.length) {
164
+ const hash = hashAt(data, position);
165
+ let candidate = head[hash];
166
+ let chain = 0;
167
+ const limit = Math.max(0, position - WINDOW_SIZE);
168
+ while (candidate >= limit && candidate >= 0 && chain < maxChain) {
169
+ if (data[candidate] === data[position] &&
170
+ data[candidate + 1] === data[position + 1] &&
171
+ data[candidate + 2] === data[position + 2]) {
172
+ let length = 0;
173
+ const maxLength = Math.min(MAX_MATCH, data.length - position);
174
+ while (length < maxLength && data[candidate + length] === data[position + length]) {
175
+ length += 1;
176
+ }
177
+ if (length > bestLength) {
178
+ bestLength = length;
179
+ bestDistance = position - candidate;
180
+ if (length === maxLength) {
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ candidate = previous[candidate];
186
+ chain += 1;
187
+ }
188
+ }
189
+ if (bestLength >= MIN_MATCH) {
190
+ const lIndex = lengthIndex(bestLength);
191
+ writeFixedLiteral(writer, 257 + lIndex);
192
+ if (LENGTH_EXTRA[lIndex] > 0) {
193
+ writeBits(writer, bestLength - LENGTH_BASE[lIndex], LENGTH_EXTRA[lIndex]);
194
+ }
195
+ const dIndex = distanceIndex(bestDistance);
196
+ writeFixedDistance(writer, dIndex);
197
+ if (DISTANCE_EXTRA[dIndex] > 0) {
198
+ writeBits(writer, bestDistance - DISTANCE_BASE[dIndex], DISTANCE_EXTRA[dIndex]);
199
+ }
200
+ for (let i = 0; i < bestLength; i += 1) {
201
+ const at = position + i;
202
+ if (at + MIN_MATCH <= data.length) {
203
+ const hash = hashAt(data, at);
204
+ previous[at] = head[hash];
205
+ head[hash] = at;
206
+ }
207
+ }
208
+ position += bestLength;
209
+ }
210
+ else {
211
+ writeFixedLiteral(writer, data[position]);
212
+ if (position + MIN_MATCH <= data.length) {
213
+ const hash = hashAt(data, position);
214
+ previous[position] = head[hash];
215
+ head[hash] = position;
216
+ }
217
+ position += 1;
218
+ }
219
+ }
220
+ writeFixedLiteral(writer, 256);
221
+ }
222
+ /** 压缩为 raw DEFLATE 流。level <= 0 时退化为 stored 块。 */
223
+ function deflateRaw(data, level) {
224
+ const writer = makeWriter(Math.max(64, Math.floor(data.length / 2)));
225
+ if (level <= 0) {
226
+ writeStoredBlocks(writer, data);
227
+ return writer.bytes.subarray(0, writer.length);
228
+ }
229
+ const normalized = Math.min(9, Math.floor(level));
230
+ const maxChain = normalized <= 1 ? 4 : (normalized <= 3 ? 8 : (normalized <= 6 ? 32 : 128));
231
+ writeCompressedBlock(writer, data, maxChain);
232
+ flushBits(writer);
233
+ return writer.bytes.subarray(0, writer.length);
234
+ }
@@ -0,0 +1,14 @@
1
+ export interface AddressRecord {
2
+ address: string;
3
+ family: number;
4
+ }
5
+ export interface DnsDriver {
6
+ /** 对应 getaddrinfo:可能返回多条(IPv4 与 IPv6 都在)。失败时抛 Java 侧映射过的错误。 */
7
+ lookup(hostname: string): AddressRecord[];
8
+ /** 反向查询:地址 -> 规范主机名。 */
9
+ canonicalNameOf(address: string): string;
10
+ }
11
+ /** 宿主注入点:桌面测试用,传 null 恢复为 Operit Java 驱动。 */
12
+ export declare function setDriver(next: DnsDriver | null): void;
13
+ export declare function createJavaDriver(): DnsDriver;
14
+ export declare function getDriver(): DnsDriver;
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.setDriver = setDriver;
37
+ exports.createJavaDriver = createJavaDriver;
38
+ exports.getDriver = getDriver;
39
+ /**
40
+ * dns 的宿主驱动层:把"怎么把主机名解析成地址"收敛在一处,便于测试注入。
41
+ *
42
+ * 基于 java.net.InetAddress(即 getaddrinfo),这也是 dns.lookup 在 Node 里的实现路径。
43
+ * **记录级查询(resolveMx / resolveTxt 等)在 Android 上不成立**:
44
+ * 那需要 JNDI 的 DNS provider,而 com.sun.jndi.dns 不在 Android 里,
45
+ * 所以 dns.ts 对它们显式抛 ONJ_UNSUPPORTED,不做半个实现。
46
+ */
47
+ const bridge = __importStar(require("./bridge"));
48
+ const errors_1 = require("./errors");
49
+ let driver = null;
50
+ /** 宿主注入点:桌面测试用,传 null 恢复为 Operit Java 驱动。 */
51
+ function setDriver(next) {
52
+ driver = next;
53
+ }
54
+ /** Java 可能给链路本地地址带上作用域(fe80::1%wlan0),Node 不给,这里去掉。 */
55
+ function stripScope(address) {
56
+ const percent = address.indexOf('%');
57
+ return percent < 0 ? address : address.slice(0, percent);
58
+ }
59
+ function createJavaDriver() {
60
+ return {
61
+ lookup(hostname) {
62
+ const list = bridge.callStatic('java.net.InetAddress', 'getAllByName', [hostname]);
63
+ if (!Array.isArray(list)) {
64
+ throw (0, errors_1.createError)('EIO', 'getaddrinfo', hostname);
65
+ }
66
+ const out = [];
67
+ for (let i = 0; i < list.length; i += 1) {
68
+ const raw = String(bridge.callInstance(list[i], 'getHostAddress', []));
69
+ const address = stripScope(raw);
70
+ out.push({ address: address, family: address.indexOf(':') >= 0 ? 6 : 4 });
71
+ }
72
+ return out;
73
+ },
74
+ canonicalNameOf(address) {
75
+ const handle = bridge.callStatic('java.net.InetAddress', 'getByName', [address]);
76
+ return String(bridge.callInstance(handle, 'getCanonicalHostName', []));
77
+ }
78
+ };
79
+ }
80
+ function getDriver() {
81
+ if (driver === null) {
82
+ driver = createJavaDriver();
83
+ }
84
+ return driver;
85
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * dns 的公开类型。
3
+ *
4
+ * 独立成文件的原因与其他 types 文件相同:dns.ts 用 `export =` 导出模块本体,
5
+ * 而 dns/promises.ts 与它共用同一份 lookup 选项类型 —— 两处各写一份会互相泄漏无法命名。
6
+ */
7
+ export interface LookupOptions {
8
+ family?: number;
9
+ hints?: number;
10
+ all?: boolean;
11
+ verbatim?: boolean;
12
+ }
13
+ export interface AddressRecord {
14
+ address: string;
15
+ family: number;
16
+ }
17
+ export interface DnsError extends Error {
18
+ code: string;
19
+ errno: number;
20
+ syscall: string;
21
+ hostname: string;
22
+ }
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Node 错误码与 Java 异常之间的唯一翻译层。
3
+ *
4
+ * 设计约束:
5
+ * - 每个错误对象都必须带 code。三方库普遍靠 code 分支(fs.existsSync、mkdirp、tar 等),
6
+ * 没有 code 的实现等于跑不通。
7
+ * - Java 侧异常类名来自 bridge 的错误文本前缀,形如 "java.io.FileNotFoundException: /x"。
8
+ * - 未归类的 Java 异常一律映射为 EIO,并把原始类名与消息写进 message —— 这是明确定义的行为,
9
+ * Node 自己的 fs 在无法归类的系统错误上也报 EIO。
10
+ */
11
+ /** 与 Linux errno 对齐,供依赖 errno 数值的三方库使用。 */
12
+ export declare const ERRNO: Readonly<Record<string, number>>;
13
+ export interface NodeStyleError extends Error {
14
+ code: string;
15
+ errno?: number;
16
+ syscall?: string;
17
+ path?: string;
18
+ dest?: string;
19
+ cause?: unknown;
20
+ javaClass?: string;
21
+ javaMessage?: string;
22
+ isJavaError?: boolean;
23
+ }
24
+ export interface ParsedJavaError {
25
+ className: string;
26
+ message: string;
27
+ }
28
+ /** 构造一个 Node 形状的错误。syscall / path / dest 与 Node 自身的字段语义一致。 */
29
+ export declare function createError(code: string, syscall: string, targetPath?: string, destPath?: string): NodeStyleError;
30
+ /** node.operit 内部状态错误。 */
31
+ export declare function onjError(code: string, detail?: string): NodeStyleError;
32
+ /**
33
+ * 从 Java bridge 的错误文本里剥离异常类名。
34
+ * 形如 "java.io.FileNotFoundException: /sdcard/x" 或 "java.lang.SecurityException"。
35
+ */
36
+ export declare function parseJavaError(text: string): ParsedJavaError;
37
+ /**
38
+ * Java 异常类名 → Node 错误码。
39
+ * 先查精确表,再按消息特征识别少数几种,仍未命中则 EIO。
40
+ */
41
+ export declare function codeForJavaException(className: string, javaMessage: string): string;
42
+ /** 由 Java 错误文本构造中间态错误,保留原始类名与消息。 */
43
+ export declare function javaError(text: string): NodeStyleError;
44
+ /**
45
+ * 给中间态错误补上 syscall / path,产出语义完整的 Node 错误。
46
+ * 非 Java 错误原样返回。
47
+ */
48
+ export declare function withContext(err: unknown, syscall: string, targetPath?: string, destPath?: string): unknown;