xshell 0.0.35 → 0.0.36
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/file.d.ts +5 -2
- package/file.js +4 -1
- package/file.js.map +1 -1
- package/net.js +3 -4
- package/net.js.map +1 -1
- package/package.json +6 -6
- package/process.d.ts +5 -6
- package/process.js +58 -39
- package/process.js.map +1 -1
- package/server.d.ts +1 -0
package/file.d.ts
CHANGED
|
@@ -60,7 +60,7 @@ export declare function flist(fpd: string, { filter, deep, absolute, print }?: {
|
|
|
60
60
|
deep?: boolean;
|
|
61
61
|
absolute?: boolean;
|
|
62
62
|
print?: boolean;
|
|
63
|
-
}): Promise<
|
|
63
|
+
}): Promise<string[]>;
|
|
64
64
|
/** delete file or directory (use rimraf to delete directory fast)
|
|
65
65
|
- fp: path
|
|
66
66
|
- options?:
|
|
@@ -107,7 +107,10 @@ export declare function fmkdir(fpd: string, options?: fs.MakeDirectoryOptions &
|
|
|
107
107
|
print?: boolean;
|
|
108
108
|
suppress_existence?: boolean;
|
|
109
109
|
}): Promise<void>;
|
|
110
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
- fp_real: current real file path
|
|
112
|
+
- fp_link: file path or directory path
|
|
113
|
+
*/
|
|
111
114
|
export declare function flink(fp_real: string, fp_link: string, { junction, print }?: {
|
|
112
115
|
junction?: boolean;
|
|
113
116
|
print?: boolean;
|
package/file.js
CHANGED
|
@@ -209,7 +209,10 @@ async function fmkdir(fpd, options = {}) {
|
|
|
209
209
|
await fs_1.promises.mkdir(fpd, { recursive: true });
|
|
210
210
|
}
|
|
211
211
|
exports.fmkdir = fmkdir;
|
|
212
|
-
/**
|
|
212
|
+
/**
|
|
213
|
+
- fp_real: current real file path
|
|
214
|
+
- fp_link: file path or directory path
|
|
215
|
+
*/
|
|
213
216
|
async function flink(fp_real, fp_link, { junction = false, print = true } = {}) {
|
|
214
217
|
if (!upath_1.default.isAbsolute(fp_real) || !upath_1.default.isAbsolute(fp_link))
|
|
215
218
|
throw new Error('fpd must be absolute path');
|
package/file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["file.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fsp, watch } from 'fs'\nimport type fs from 'fs'\n\nimport path from 'upath'\nimport iconv from 'iconv-lite'\nimport { readdirAsync } from 'readdir-enhanced'\nimport fse from 'fs-extra'\nimport rimraf from 'rimraf'\n\nimport debounce from 'lodash/debounce.js'\n\n\nimport MFS from 'memfs'\ndeclare module 'memfs' {\n interface IFs {\n join: typeof path.join\n is_mfs: true\n }\n}\n\nimport { to_json } from './prototype.js'\nimport { dedent } from './utils.js'\nexport * from './ufs.js'\n\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\nexport function create_mfs () {\n mfs = MFS.createFsFromVolume(\n new MFS.Volume()\n )\n \n mfs.join = path.join.bind(path)\n mfs.is_mfs = true\n \n return mfs\n}\n\nexport let mfs: MFS.IFs\n\n\nexport async function fread (fp: string): Promise<string>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding: 'binary', print?: boolean }): Promise<Buffer>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding?: Encoding | 'auto', print?: boolean }): Promise<string>\nexport async function fread (fp: string, {\n dir, \n encoding = 'utf-8', \n print = true\n}: {\n dir?: string\n encoding?: Encoding | 'auto'\n print?: boolean } = { }\n) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \\'dir\\' parameter')\n \n if (print)\n console.log(`read: ${fp}`)\n \n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'binary')\n return buffer\n \n if (encoding === 'utf-8')\n return buffer.toString('utf8')\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(`${fp} probably has encoding: ${encoding.toLowerCase()}`)\n }\n \n return iconv.decode(buffer, encoding)\n}\n\nexport async function fread_lines (fp: string, options: { dir?: string, encoding?: Exclude<Encoding, 'binary'> | 'auto', print?: boolean } = { }) {\n return (await fread(fp, options))\n .split_lines()\n}\n\nexport async function fread_json <T = any> (fp: string, options: { dir?: string, encoding?: Encoding, print?: boolean } = { }): Promise<T> {\n return JSON.parse(\n await fread(fp, options)\n )\n}\n\n\nexport async function fwrite (fp: string, data: Buffer, options?: { dir?: string, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, { dir, encoding = 'utf-8', print = true }: { dir?: string, encoding?: Encoding, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('write:', fp)\n \n if (encoding === 'gb18030')\n data = iconv.encode(data, encoding)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n data = to_json(data)\n \n await fsp.writeFile(fp, data)\n}\n\nexport async function fappend (fp: string, data: any, { dir, print = true }: { dir?: string, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('append:', fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error('data is not Buffer or string')\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: absolute path of directory\n - optoins?:\n - deep?: `false` recursively\n - absolute?: `false` return absolute path\n - print?: `true`\n - filter?: `true` RegExp | (fp: string) => any\n*/\nexport async function flist (fpd: string, {\n filter, \n deep = false, \n absolute = false,\n print = true\n}: {\n filter?: RegExp | ((fp: string) => any)\n deep?: boolean\n absolute?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n let fps = await readdirAsync(fpd, {\n ...(absolute ? { basePath: fpd } : { }),\n deep,\n stats: false,\n })\n \n let fps_ = [ ]\n \n const filter_regexp = filter instanceof RegExp\n const filter_fn = Boolean(filter && !filter_regexp)\n \n for (let fp of fps) {\n fp = path.normalize(fp)\n \n if (filter_regexp && !filter.test(fp))\n continue\n \n if (filter_fn && !(filter as Function)(fp))\n continue\n \n if (print)\n console.log(fp)\n \n fps_.push(fp)\n }\n \n return fps_\n}\n\n\n/** delete file or directory (use rimraf to delete directory fast) \n - fp: path\n - options?:\n - print?: `true` (effective only delete single file)\n*/\nexport async function fdelete (fp: string, { print = true, fast = false }: { print?: boolean, fast?: boolean } = { }) {\n if (fp.length < 6) throw new Error(`${fp} too short`)\n if (!path.isAbsolute(fp))\n throw new Error('fpd must be absolute path')\n \n if (fp.is_dir) {\n if (print)\n console.log(`delete directory: ${fp}`.red)\n await new Promise<void>((resolve, reject) => {\n rimraf(fp, { glob: false, disableGlob: true }, error => {\n if (error)\n reject(error)\n else\n resolve()\n })\n })\n } else {\n if (print)\n console.log('delete:', fp)\n await fsp.unlink(fp)\n }\n}\n\n\n/** copy file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fcopy('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fcopy (src: string, dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`copy: ${src} → ${dst}`)\n \n await fse.copy(src, dst, { overwrite, errorOnExist: true })\n}\n\n\n/** move file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fmove('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fmove (src: string, dst: string, {\n overwrite = false,\n print = true\n}: {\n overwrite?: boolean\n print?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`move: ${src} → ${dst}`)\n \n await fse.move(src, dst, { overwrite })\n}\n\n\n/** rename file \n - fp: current filename/path\n - fp_: new filename/path\n - options?:\n - fpd?: fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` better performance without check\n */\nexport async function frename (\n fp: string, \n fp_: string,\n {\n fpd,\n print = true,\n overwrite = true\n }: {\n fpd?: string\n print?: boolean\n overwrite?: boolean\n } = { }\n) {\n if (fpd) {\n fp = path.join(fpd, fp)\n fp_ = path.join(fpd, fp_)\n } else if (!path.isAbsolute(fp) || !path.isAbsolute(fp_))\n throw new Error('fp and fp_ must be absolute path')\n \n if (print)\n console.log('rename:', fp, '→', fp_)\n \n if (!overwrite && fp_.fexists)\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\nexport async function fmkdir (fpd: string, options: fs.MakeDirectoryOptions & { print?: boolean, suppress_existence?: boolean } = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n options.print ??= true\n \n if (fpd.fexists)\n if (fpd.is_dir) {\n if (options.print && !options.suppress_existence)\n console.log('directory already exists:', fpd)\n return\n } else throw new Error(`file with same name already exists, cannot create directory: ${fpd}`)\n else if (options.print)\n console.log('mkdir:', fpd)\n \n await fsp.mkdir(fpd, { recursive: true })\n}\n\n\n/** - link: can be file path or directory path */\nexport async function flink (\n fp_real: string, \n fp_link: string, \n {\n junction = false,\n print = true \n }: { \n junction?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))\n throw new Error('fpd must be absolute path')\n \n if (fp_link.fexists)\n if (fp_link.is_dir)\n fp_link = path.join(fp_link, fp_real.fname)\n else if ( (await fsp.lstat(fp_link)).isSymbolicLink() ) {\n console.log('link already exists:', fp_link)\n return\n } else\n throw new Error('file with same name already exists, cannot create new link')\n \n \n if (print)\n console.log(`source file ${fp_real} linked to ${fp_link}`)\n \n if (junction)\n fsp.symlink(fp_real, fp_link, 'junction')\n else\n fsp.symlink(fp_real, fp_link, fp_real.is_dir ? 'dir' : 'file')\n}\n\n\nexport function link_shortcut (target: string, name: string, { args }: { args?: string[] } = { }) {\n const cmd = dedent`\n $wsh_shell = New-Object -comObject WScript.Shell\n $shortcut = $wsh_shell.CreateShortcut(\"d:/links/#{name}.lnk\")\n $shortcut.TargetPath = '${target}'\n $shortcut.Arguments = \"${args || ''}\"\n $shortcut.WorkingDirectory = '${target.fdir}'\n ${ target.is_dir ? '$shortcut.IconLocation = \"%SystemRoot%\\\\System32\\\\SHELL32.dll,3\"' : '' }\n $shortcut.Save()\n `\n console.log(cmd)\n // await psh(cmd)\n}\n\n\nexport let fwatchers: Record<string, fs.FSWatcher> = { }\n\n/**\n - fp: path of file or directory\n - callback: called when modified\n - exec: call callback when watch is executed\n \n save fs.FSWatcher in watchers, subsequent call will auto close existing watcher for the same fp\n \n https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_watch_filename_options_listener \n The listener callback gets two arguments (event, fname). \n event is either 'rename' or 'change', and filename is the name of the file which triggered the event.\n On most platforms, 'rename' is emitted whenever a filename appears or disappears in the directory.\n \n The listener callback is attached to the 'change' event fired by fs.FSWatcher, but it is not the same thing as the 'change' value of event. \n \n*/\nexport async function fwatch (\n fp: string,\n onchange: (event: string, fname: string) => any, \n { exec = true }: { exec?: boolean } = { }\n) {\n if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path')\n \n const _watcher = fwatchers[fp]\n if (_watcher)\n _watcher.close()\n \n if (exec)\n await onchange('change', fp.fname)\n \n const debounced_onchange = debounce(\n (event, fname) => {\n console.log(`file changed (${event}): ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = watch(fp, debounced_onchange)\n watcher.on('error', error => {\n console.error(error)\n })\n return fwatchers[fp] = watcher\n}\n\n\n/** open a file and replace certain pattern */\nexport async function freplace (fp: string, pattern: string | RegExp, replacement: string) {\n await fwrite(\n fp,\n (await fread(fp))\n .replaceAll(pattern, replacement)\n )\n}\n\n/** convert file encoding to UTF-8\n - fp: file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'`\n*/\nexport async function f2utf8 (fp: string, {\n dryrun = true,\n encoding = 'auto',\n}: {\n dryrun?: boolean\n encoding?: Encoding | 'auto'\n} = { }) {\n const text = await fread(fp, { encoding })\n if (dryrun) {\n console.log(text.slice(0, 10000))\n return\n }\n \n const fp_bak = `${fp.fdir}${fp.fname.replace(/(.*?)(\\.[^.]+)?$/, '$1.bak$2')}`\n if (!fp_bak.fexists)\n await fcopy(fp, fp_bak)\n \n await fwrite(fp, text)\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["file.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fsp, watch } from 'fs'\nimport type fs from 'fs'\n\nimport path from 'upath'\nimport iconv from 'iconv-lite'\nimport { readdirAsync } from 'readdir-enhanced'\nimport fse from 'fs-extra'\nimport rimraf from 'rimraf'\n\nimport debounce from 'lodash/debounce.js'\n\n\nimport MFS from 'memfs'\ndeclare module 'memfs' {\n interface IFs {\n join: typeof path.join\n is_mfs: true\n }\n}\n\nimport { to_json } from './prototype.js'\nimport { dedent } from './utils.js'\nexport * from './ufs.js'\n\n\nexport { MFS }\n\nexport type Encoding = 'utf-8' | 'gb18030' | 'shift-jis' | 'binary'\n\n\nexport function create_mfs () {\n mfs = MFS.createFsFromVolume(\n new MFS.Volume()\n )\n \n mfs.join = path.join.bind(path)\n mfs.is_mfs = true\n \n return mfs\n}\n\nexport let mfs: MFS.IFs\n\n\nexport async function fread (fp: string): Promise<string>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding: 'binary', print?: boolean }): Promise<Buffer>\nexport async function fread (fp: string, { dir, encoding, print }?: { dir?: string, encoding?: Encoding | 'auto', print?: boolean }): Promise<string>\nexport async function fread (fp: string, {\n dir, \n encoding = 'utf-8', \n print = true\n}: {\n dir?: string\n encoding?: Encoding | 'auto'\n print?: boolean } = { }\n) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \\'dir\\' parameter')\n \n if (print)\n console.log(`read: ${fp}`)\n \n const buffer = await fsp.readFile(fp)\n \n if (encoding === 'binary')\n return buffer\n \n if (encoding === 'utf-8')\n return buffer.toString('utf8')\n \n if (encoding === 'auto') {\n const { detect } = await import('chardet')\n encoding = detect(buffer) as any\n if (print)\n console.log(`${fp} probably has encoding: ${encoding.toLowerCase()}`)\n }\n \n return iconv.decode(buffer, encoding)\n}\n\nexport async function fread_lines (fp: string, options: { dir?: string, encoding?: Exclude<Encoding, 'binary'> | 'auto', print?: boolean } = { }) {\n return (await fread(fp, options))\n .split_lines()\n}\n\nexport async function fread_json <T = any> (fp: string, options: { dir?: string, encoding?: Encoding, print?: boolean } = { }): Promise<T> {\n return JSON.parse(\n await fread(fp, options)\n )\n}\n\n\nexport async function fwrite (fp: string, data: Buffer, options?: { dir?: string, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, options?: { dir?: string, encoding?: Encoding, print?: boolean }): Promise<void>\nexport async function fwrite (fp: string, data: any, { dir, encoding = 'utf-8', print = true }: { dir?: string, encoding?: Encoding, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('write:', fp)\n \n if (encoding === 'gb18030')\n data = iconv.encode(data, encoding)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n data = to_json(data)\n \n await fsp.writeFile(fp, data)\n}\n\nexport async function fappend (fp: string, data: any, { dir, print = true }: { dir?: string, print?: boolean } = { }) {\n if (dir)\n fp = path.join(dir, fp)\n else if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path, or pass in \"dir\" parameter')\n \n if (print)\n console.log('append:', fp)\n \n if (!Buffer.isBuffer(data) && typeof data !== 'string')\n throw new Error('data is not Buffer or string')\n \n await fsp.appendFile(fp, data)\n}\n\n\n/**\n - fpd: absolute path of directory\n - optoins?:\n - deep?: `false` recursively\n - absolute?: `false` return absolute path\n - print?: `true`\n - filter?: `true` RegExp | (fp: string) => any\n*/\nexport async function flist (fpd: string, {\n filter, \n deep = false, \n absolute = false,\n print = true\n}: {\n filter?: RegExp | ((fp: string) => any)\n deep?: boolean\n absolute?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n let fps = await readdirAsync(fpd, {\n ...(absolute ? { basePath: fpd } : { }),\n deep,\n stats: false,\n })\n \n let fps_: string[] = [ ]\n \n const filter_regexp = filter instanceof RegExp\n const filter_fn = Boolean(filter && !filter_regexp)\n \n for (let fp of fps) {\n fp = path.normalize(fp)\n \n if (filter_regexp && !filter.test(fp))\n continue\n \n if (filter_fn && !(filter as Function)(fp))\n continue\n \n if (print)\n console.log(fp)\n \n fps_.push(fp)\n }\n \n return fps_\n}\n\n\n/** delete file or directory (use rimraf to delete directory fast) \n - fp: path\n - options?:\n - print?: `true` (effective only delete single file)\n*/\nexport async function fdelete (fp: string, { print = true, fast = false }: { print?: boolean, fast?: boolean } = { }) {\n if (fp.length < 6) throw new Error(`${fp} too short`)\n if (!path.isAbsolute(fp))\n throw new Error('fpd must be absolute path')\n \n if (fp.is_dir) {\n if (print)\n console.log(`delete directory: ${fp}`.red)\n await new Promise<void>((resolve, reject) => {\n rimraf(fp, { glob: false, disableGlob: true }, error => {\n if (error)\n reject(error)\n else\n resolve()\n })\n })\n } else {\n if (print)\n console.log('delete:', fp)\n await fsp.unlink(fp)\n }\n}\n\n\n/** copy file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fcopy('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fcopy (src: string, dst: string, {\n print = true,\n overwrite = true,\n}: {\n print?: boolean\n overwrite?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`copy: ${src} → ${dst}`)\n \n await fse.copy(src, dst, { overwrite, errorOnExist: true })\n}\n\n\n/** move file or direcotry\n - src: src file/directory absolute path\n - dst: dst file/directory absolute path\n @example\n fmove('d:/temp/camera/', 'd:/camera/')\n*/\nexport async function fmove (src: string, dst: string, {\n overwrite = false,\n print = true\n}: {\n overwrite?: boolean\n print?: boolean\n} = { }) {\n if (src.endsWith('/') !== dst.endsWith('/'))\n throw new Error('src and dst must be both file path or directory path')\n \n if (!path.isAbsolute(src) || !path.isAbsolute(dst))\n throw new Error('src and dst must be absolute path')\n \n if (print)\n console.log(`move: ${src} → ${dst}`)\n \n await fse.move(src, dst, { overwrite })\n}\n\n\n/** rename file \n - fp: current filename/path\n - fp_: new filename/path\n - options?:\n - fpd?: fp and fp_ is in same directory\n - print?: `true`\n - overwrite?: `true` better performance without check\n */\nexport async function frename (\n fp: string, \n fp_: string,\n {\n fpd,\n print = true,\n overwrite = true\n }: {\n fpd?: string\n print?: boolean\n overwrite?: boolean\n } = { }\n) {\n if (fpd) {\n fp = path.join(fpd, fp)\n fp_ = path.join(fpd, fp_)\n } else if (!path.isAbsolute(fp) || !path.isAbsolute(fp_))\n throw new Error('fp and fp_ must be absolute path')\n \n if (print)\n console.log('rename:', fp, '→', fp_)\n \n if (!overwrite && fp_.fexists)\n throw new Error(`file already exists:${fp_}`)\n \n await fsp.rename(fp, fp_)\n}\n\n\nexport async function fmkdir (fpd: string, options: fs.MakeDirectoryOptions & { print?: boolean, suppress_existence?: boolean } = { }) {\n if (!path.isAbsolute(fpd))\n throw new Error('fpd must be absolute path')\n \n options.print ??= true\n \n if (fpd.fexists)\n if (fpd.is_dir) {\n if (options.print && !options.suppress_existence)\n console.log('directory already exists:', fpd)\n return\n } else throw new Error(`file with same name already exists, cannot create directory: ${fpd}`)\n else if (options.print)\n console.log('mkdir:', fpd)\n \n await fsp.mkdir(fpd, { recursive: true })\n}\n\n\n/** \n - fp_real: current real file path\n - fp_link: file path or directory path\n*/\nexport async function flink (\n fp_real: string, \n fp_link: string, \n {\n junction = false,\n print = true \n }: { \n junction?: boolean\n print?: boolean\n} = { }) {\n if (!path.isAbsolute(fp_real) || !path.isAbsolute(fp_link))\n throw new Error('fpd must be absolute path')\n \n if (fp_link.fexists)\n if (fp_link.is_dir)\n fp_link = path.join(fp_link, fp_real.fname)\n else if ( (await fsp.lstat(fp_link)).isSymbolicLink() ) {\n console.log('link already exists:', fp_link)\n return\n } else\n throw new Error('file with same name already exists, cannot create new link')\n \n \n if (print)\n console.log(`source file ${fp_real} linked to ${fp_link}`)\n \n if (junction)\n fsp.symlink(fp_real, fp_link, 'junction')\n else\n fsp.symlink(fp_real, fp_link, fp_real.is_dir ? 'dir' : 'file')\n}\n\n\nexport function link_shortcut (target: string, name: string, { args }: { args?: string[] } = { }) {\n const cmd = dedent`\n $wsh_shell = New-Object -comObject WScript.Shell\n $shortcut = $wsh_shell.CreateShortcut(\"d:/links/#{name}.lnk\")\n $shortcut.TargetPath = '${target}'\n $shortcut.Arguments = \"${args || ''}\"\n $shortcut.WorkingDirectory = '${target.fdir}'\n ${ target.is_dir ? '$shortcut.IconLocation = \"%SystemRoot%\\\\System32\\\\SHELL32.dll,3\"' : '' }\n $shortcut.Save()\n `\n console.log(cmd)\n // await psh(cmd)\n}\n\n\nexport let fwatchers: Record<string, fs.FSWatcher> = { }\n\n/**\n - fp: path of file or directory\n - callback: called when modified\n - exec: call callback when watch is executed\n \n save fs.FSWatcher in watchers, subsequent call will auto close existing watcher for the same fp\n \n https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_watch_filename_options_listener \n The listener callback gets two arguments (event, fname). \n event is either 'rename' or 'change', and filename is the name of the file which triggered the event.\n On most platforms, 'rename' is emitted whenever a filename appears or disappears in the directory.\n \n The listener callback is attached to the 'change' event fired by fs.FSWatcher, but it is not the same thing as the 'change' value of event. \n \n*/\nexport async function fwatch (\n fp: string,\n onchange: (event: string, fname: string) => any, \n { exec = true }: { exec?: boolean } = { }\n) {\n if (!path.isAbsolute(fp))\n throw new Error('fp must be absolute path')\n \n const _watcher = fwatchers[fp]\n if (_watcher)\n _watcher.close()\n \n if (exec)\n await onchange('change', fp.fname)\n \n const debounced_onchange = debounce(\n (event, fname) => {\n console.log(`file changed (${event}): ${fname}`)\n onchange(event, path.normalize(fname))\n },\n 500,\n { leading: false, trailing: true }\n )\n \n let watcher = watch(fp, debounced_onchange)\n watcher.on('error', error => {\n console.error(error)\n })\n return fwatchers[fp] = watcher\n}\n\n\n/** open a file and replace certain pattern */\nexport async function freplace (fp: string, pattern: string | RegExp, replacement: string) {\n await fwrite(\n fp,\n (await fread(fp))\n .replaceAll(pattern, replacement)\n )\n}\n\n/** convert file encoding to UTF-8\n - fp: file absolute path\n - options?:\n - dryrun?: `true`\n - encoding?: `'auto'`\n*/\nexport async function f2utf8 (fp: string, {\n dryrun = true,\n encoding = 'auto',\n}: {\n dryrun?: boolean\n encoding?: Encoding | 'auto'\n} = { }) {\n const text = await fread(fp, { encoding })\n if (dryrun) {\n console.log(text.slice(0, 10000))\n return\n }\n \n const fp_bak = `${fp.fdir}${fp.fname.replace(/(.*?)(\\.[^.]+)?$/, '$1.bak$2')}`\n if (!fp_bak.fexists)\n await fcopy(fp, fp_bak)\n \n await fwrite(fp, text)\n}\n\n"]}
|
package/net.js
CHANGED
|
@@ -273,17 +273,16 @@ on_open, on_close, on_error, on_message }) {
|
|
|
273
273
|
websocket.binaryType = 'arraybuffer';
|
|
274
274
|
return new Promise((resolve, reject) => {
|
|
275
275
|
websocket.addEventListener('open', async (event) => {
|
|
276
|
-
console.log(
|
|
276
|
+
console.log(`websocket opened: ${websocket.url}`);
|
|
277
277
|
await on_open?.(event, websocket);
|
|
278
278
|
resolve(websocket);
|
|
279
279
|
});
|
|
280
280
|
websocket.addEventListener('close', event => {
|
|
281
|
-
console.log(
|
|
281
|
+
console.log(`websocket closed: ${websocket.url} (code = ${event.code}, reason = '${event.reason}')`);
|
|
282
282
|
on_close?.(event, websocket);
|
|
283
283
|
});
|
|
284
284
|
websocket.addEventListener('error', event => {
|
|
285
|
-
const message =
|
|
286
|
-
console.error(message, event);
|
|
285
|
+
const message = `websocket errored: ${websocket.url}`;
|
|
287
286
|
on_error?.(event, websocket);
|
|
288
287
|
reject(Object.assign(new Error(message), { event }));
|
|
289
288
|
});
|
package/net.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"net.js","sourceRoot":"","sources":["net.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n default as request_lib,\n type OptionsWithUri,\n type OptionsWithUrl\n} from 'request'\n\nimport {\n default as request_promise,\n type FullResponse,\n} from 'request-promise-native'\nimport { RequestError, StatusCodeError } from 'request-promise-native/errors.js'\n\nimport promise_retry from 'promise-retry'\n\nimport { WebSocket } from 'ws'\n\nimport iconv from 'iconv-lite'\nimport cheerio from 'cheerio'\nimport qs from 'qs'\nimport { Cookie, MemoryCookieStore } from 'tough-cookie'\n\ndeclare module 'tough-cookie' {\n interface MemoryCookieStore {\n idx: Record<string, any>\n }\n}\n\n\nimport './prototype.js'\nimport type { Encoding } from './file.js'\nimport { inspect, output_width, concat } from './utils.js'\n\nexport enum MyProxy {\n socks5 = 'http://localhost:10080',\n whistle = 'http://localhost:8899',\n}\n\n\n// ------------------------------------ Fetch, Request\nconst cookie_store = new MemoryCookieStore()\n\nexport const cookies = {\n store: cookie_store,\n \n jar: request_promise.jar(cookie_store),\n \n get (domain_or_url: string, str = false) {\n if (domain_or_url.startsWith('http'))\n if (str)\n return this.jar.getCookieString(domain_or_url)\n else\n return this.jar.getCookies(domain_or_url)\n \n let cookies: Cookie[]\n this.store.findCookies(domain_or_url, null, true, (error, _cookies) => {\n if (error) throw error\n cookies = _cookies\n })\n return cookies\n },\n}\n\nexport { Cookie }\n\n\nexport const _request = request_promise.defaults({\n // rejectUnauthorized: false,\n \n /** prevent 302 redirect cause error, which is a boolean to set whether status codes other than 2xx should also reject the promise */\n simple: false,\n \n jar: cookies.jar\n})\n\n\nexport async function request_retry (retries: number, request_options: request_promise.OptionsWithUrl) {\n return promise_retry<FullResponse>({\n retries,\n minTimeout: 1000,\n maxTimeout: Infinity,\n factor: 2\n }, async (retry, count) => {\n try {\n return await _request(request_options)\n } catch (error) {\n if (!['ECONNRESET', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(error.cause?.code)) throw error\n if (count <= retries)\n console.log(`${`retry (${count}) …`.yellow} ${request_options.url.toString().blue.underline}`)\n return retry(error)\n }\n })\n}\n\n\nexport interface RequestOptions {\n method?: 'get' | 'post' | 'put' | 'head' | 'delete' | 'patch'\n \n queries?: Record<string, any>\n \n headers?: Record<string, string>\n \n body?: string | Record<string, any>\n \n type?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data'\n \n \n proxy?: boolean | MyProxy | string\n \n encoding?: Encoding\n \n retries?: true | number\n \n timeout?: number\n \n auth?: {\n username: string\n password: string\n }\n \n gzip?: boolean\n \n cookies?: Record<string, string>\n}\n\nexport interface RequestRawOptions extends RequestOptions {\n raw: true\n}\n\n/** \n - url: must be full url\n - options:\n - raw: `false` 传入后返回整个 response\n - encoding: `(response content-type: charset=gb18030) || 'utf-8'` when 'binary' then return buffer\n - type: `'application/json'` request content-type header (if has body)\n - proxy: `false` proxy === true then use MyProxy.whistle\n - retries: `false` could be true (default 3 times) or retry times\n - timeout: `20 * 1000`\n - gzip: `raw -> false; else -> true`\n*/\nexport async function request (url: string | URL): Promise<string>\nexport async function request (url: string | URL, options: RequestRawOptions): Promise<request_lib.Response>\nexport async function request (url: string | URL, options: RequestOptions & { encoding: 'binary' }): Promise<Buffer>\nexport async function request (url: string | URL, options: RequestOptions): Promise<string>\nexport async function request (url: string | URL, {\n queries,\n \n body,\n \n type = 'application/json',\n \n proxy,\n \n method,\n \n headers,\n \n encoding,\n \n raw = false,\n \n retries,\n \n timeout = 20 * 1000,\n \n auth,\n \n gzip,\n \n cookies,\n \n}: RequestOptions & { raw?: boolean } = { }) {\n url = url.toString()\n \n const _body = body // for error log\n \n if (body && !method)\n method = 'post'\n \n if (type === 'application/json' && typeof body !== 'undefined' && (typeof body !== 'string' && !Buffer.isBuffer(body)))\n body = JSON.stringify(body)\n \n // --- proxy\n if (proxy) {\n if (proxy === true)\n proxy = MyProxy.whistle\n } else\n proxy = false\n \n // --- gzip\n if (gzip === undefined)\n gzip = !raw\n \n \n const options: request_lib.Options & { resolveWithFullResponse: boolean } = {\n url,\n \n ... method ? { method: method.toUpperCase() } : { },\n \n proxy,\n \n gzip,\n \n encoding: null,\n \n resolveWithFullResponse: true,\n \n headers: {\n 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5',\n 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',\n ... body ? { 'content-type': type } : { }, \n ... cookies ? {\n cookie: Object.entries(cookies)\n .map(([key, value]) => \n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n ).join('; ')\n } : { },\n ... headers\n },\n \n ... queries ? { qs: queries } : { },\n \n // --- body\n ... (() => {\n if (!body) return { }\n if (type === 'application/x-www-form-urlencoded') return { form: body }\n if (type === 'multipart/form-data') return { formData: body as Record<string, any> }\n return { body }\n })(),\n \n ... timeout ? { timeout } : { },\n \n ... auth ? { auth } : { },\n }\n \n let resp: request_lib.Response\n \n try {\n if (retries) {\n if (retries === true)\n retries = 3\n \n resp = await request_retry(retries, options)\n } else\n resp = await _request(options)\n \n if (!(200 <= resp.statusCode && resp.statusCode <= 299))\n throw new StatusCodeError(resp.statusCode, resp.body, options, resp)\n \n } catch (error) {\n const {\n name, \n options: { method, url, uri, qs }, \n response,\n }: {\n options: OptionsWithUri & OptionsWithUrl\n response: FullResponse\n } & Error = error\n \n error[inspect.custom] = () => {\n let s = '─'.repeat(output_width / 2) + '\\n' +\n `${(method || 'get').toLowerCase().red} ${String(url || uri).blue.underline}\\n`\n \n if (qs)\n s += `\\n${'request.query:'.blue}\\n` +\n inspect(qs) + '\\n'\n \n if (_body)\n s += `\\n${'request.body:'.blue}\\n` +\n inspect(_body) + '\\n'\n \n if (name === 'StatusCodeError')\n s += `\\n${'response.status:'.yellow} ${String(error.statusCode).red}\\n`\n else if (error instanceof RequestError)\n s += `\\n${'response.cause:'.yellow}\\n` +\n `${inspect(error.cause)}\\n`\n else\n s += `\\n${inspect(error)}\\n`\n \n if (response) {\n s += `\\n${'response.headers:'.yellow}\\n` + \n `${inspect(response.headers)}\\n`\n \n if (response.body)\n s += `\\n${'response.body:'.yellow}\\n` +\n `${inspect(response.body.toString())}\\n`\n }\n \n s += `\\n${'stack:'.yellow}\\n` +\n `${new Error().stack}\\n` +\n '─'.repeat(output_width / 2)\n \n return s\n }\n \n throw error\n }\n \n if (raw)\n return resp\n \n if (!resp.body)\n return resp.body\n \n // --- decode body\n if (encoding === 'binary')\n return resp.body\n \n encoding ||= /charset=(.*)/.exec(resp.headers['content-type'])?.[1] as Encoding || 'utf-8'\n \n if (/utf-?8/i.test(encoding))\n return (resp.body as Buffer).toString('utf-8')\n \n return iconv.decode((resp.body as Buffer), encoding)\n}\n\n\n/** make http request and parse body as json */\nexport async function request_json <T = any> (url: string | URL, options?: RequestOptions): Promise<T> {\n const resp = await request(url, options)\n if (!resp) return\n try {\n return JSON.parse(resp)\n } catch (error) {\n console.log(resp)\n throw error\n }\n}\n\n\n/** use $.html(cheerio_element) to get outer html */\nexport function parse_html (html: string) {\n let $ = cheerio.load(html, { decodeEntities: false })\n \n Object.defineProperty($, inspect.custom, {\n configurable: true,\n enumerable: false,\n value () {\n return this.html()\n }\n })\n \n Object.defineProperty($.prototype, inspect.custom, {\n configurable: true,\n enumerable: false,\n // @ts-ignore\n value (this: cheerio.Cheerio) {\n if (this.length > 1)\n return this.map((index, element) => {\n if (typeof element === 'string') return element\n return $.html(element)\n }).get().join_lines()\n \n return this.toString()\n }\n })\n \n return $\n}\n\n\n/** use $.html(cheerio_element) to get outer html */\nexport async function request_page (url: string | URL, options?: RequestOptions) {\n return parse_html(\n await request(url, options)\n )\n}\n\n\nexport function to_curl (url: string | URL, { queries, headers, method, body, proxy, exe = true }: RequestOptions & { exe?: boolean } = { }) {\n if (proxy === true)\n proxy = process.env.http_proxy\n \n url = url.toString()\n \n if (!url.startsWith('http'))\n url = `http://${url}`\n \n return (exe ? 'curl.exe' : 'curl') + \n ' ' + ( url + (queries ? '?' : '') + qs.stringify(queries) ).quote() +\n // ( typeof proxy === 'undefined' ?\n // ''\n // :\n // ( proxy ? ' --proxy ' + proxy.quote() : ' --noproxy ' + '*'.quote())\n // ) +\n ( proxy ? ` --proxy ${proxy.quote()}` : '' ) +\n ( method && method !== 'get' ? ` -X ${method.toUpperCase()}` : '' ) +\n ( headers ? Object.entries(headers).map( ([key, value]) => ' -H ' + `${key}: ${value}`.quote() ).join('') : '' ) +\n ( body ? ' -H ' + 'content-type: application/json'.quote() : '') +\n ( body ? ' --data ' + JSON.stringify(body).quote() : '')\n}\n\n\n\n\n// ------------------------------------ rpc client\n/** post json to http://localhost:8421/api/rpc\n - func: function name\n - args?: argument array\n - options?:\n - ignore?: `false` wait for execution but do not serialize result to response\n - async?: `false` do not wait for exec\n*/\nexport async function rpc (\n func: string, \n args?: any[], \n { url = 'http://localhost:8421/api/rpc', async: _async = false, ignore = false }: { url?: string, async?: boolean, ignore?: boolean } = { }\n) {\n if (!func) throw new Error('rpc argument error: no func')\n \n return request_json(url, {\n body: {\n func,\n args,\n async: _async,\n ignore,\n }\n })\n}\n\n\nexport function rpc_curl (func: string, args: any[]) {\n const cmd = args.find( arg => typeof arg === 'object') ?\n to_curl('http://localhost:8421/api/rpc', { body: { func, args } })\n :\n to_curl('http://localhost:8421/api/rpc', { queries: { func, args } })\n return cmd\n}\n\n\nlet decoder = new TextDecoder()\n\nlet encoder = new TextEncoder()\n\n\nexport async function connect_websocket (\n url: string | URL,\n {\n protocols,\n max_payload = 2 ** 33, // 8 GB\n on_open,\n on_close,\n on_error,\n on_message\n }: {\n protocols?: string | string[]\n max_payload?: number\n on_open? (event: any, websocket: WebSocket): any\n on_close? (event: { code: number, reason: string }, websocket: WebSocket): any\n on_error? (event: any, websocket: WebSocket): any\n on_message (event: { data: ArrayBuffer }, websocket: WebSocket): any\n }\n) {\n let websocket = new WebSocket(url, protocols, { maxPayload: max_payload })\n \n // https://stackoverflow.com/questions/11821096/what-is-the-difference-between-an-arraybuffer-and-a-blob/39951543\n websocket.binaryType = 'arraybuffer'\n \n return new Promise<WebSocket>((resolve, reject) => {\n websocket.addEventListener('open', async event => {\n console.log(`${websocket.url} opened`)\n \n await on_open?.(event, websocket)\n \n resolve(websocket)\n })\n \n websocket.addEventListener('close', event => {\n console.log(`${websocket.url} closed with code = ${event.code}, reason = '${event.reason}'`)\n on_close?.(event, websocket)\n })\n \n websocket.addEventListener('error', event => {\n const message = `${websocket.url} errored`\n console.error(message, event)\n on_error?.(event, websocket)\n reject(\n Object.assign(\n new Error(message),\n { event }\n )\n )\n })\n \n websocket.addEventListener('message', event => {\n on_message(event as any, websocket)\n })\n })\n}\n\n\n/** 二进制消息格式 \n - json.length (小端序): 4 字节\n - json 数据\n - binary 数据\n*/\nexport interface Message <T extends any[] = any[]> {\n /** 本次 rpc 的 id */\n id?: number\n \n /** rpc 发起方指定被调用的 function name, 多个相同 id, func 的 message 组成一个请求流 */\n func?: string\n \n /** 等待执行,但不要序列化返回 func 的执行结果 (message 中无 args) */\n ignore?: boolean\n \n /** 不等待 func 执行,remote 收到后直接确认返回 (message 中 done = true) */\n async?: boolean\n \n /** 这个数组里面要么是对应的 JS 参数,要么是 Uint8Array 参数对应的 binary length \n args 可以是: \n - rpc 发起方调用 func 的参数,或者请求流 message 携带的数据\n - 作为结果或者响应流的 message 数据,传给请求发起方\n */\n args?: T\n \n /** bins: 哪几个 arg 是 Uint8Array 类型的,如: [0, 3] */\n bins?: number[]\n \n /** 被调方执行 func 产生的错误 */\n error?: Error\n \n /** 如果请求或者响应是一个流,通过这个 flag 表明是最后一个 message, 并且可以销毁 handler 了 */\n done?: boolean\n}\n\n/** 通过创建 Remote 对象对 WebSocket RPC 进行抽象 \n 调用方使用 remote.call 进行调用 \n 被调方在创建 Remote 对象时传入 funcs 注册处理函数,并使用 Remote.handle 方法处理 WebSocket message \n*/\nexport class Remote {\n url: string\n \n websocket: WebSocket\n \n id = 0\n \n /** 被调方的 message 处理器 */\n funcs: Record<\n string, \n (message: Message, websocket?: WebSocket) => void | Promise<void>\n >\n \n /** 调用方发起的 rpc 对应响应的 message 处理器 */\n handlers: ((message: Message) => any)[] = [ ]\n \n print = false\n \n get connected () {\n return this.websocket?.readyState === WebSocket.OPEN\n }\n \n \n static parse <T extends any[] = any[]> (array_buffer: ArrayBuffer) {\n const buf = new Uint8Array(array_buffer as ArrayBuffer)\n const dv = new DataView(array_buffer)\n \n const len_json = dv.getUint32(0, true)\n \n let offset = 4 + len_json\n \n let message: Message<T> = JSON.parse(\n decoder.decode(\n buf.subarray(4, offset)\n )\n )\n \n message.args ||= [ ] as T\n \n if (message.bins) {\n let args = message.args\n \n for (const ibin of message.bins) {\n const len_buf = args[ibin]\n args[ibin] = buf.subarray(offset, offset + len_buf)\n offset += len_buf\n }\n }\n \n return message\n }\n \n \n static pack ({\n id,\n func,\n ignore,\n async: _async,\n done,\n error,\n args: _args = [ ],\n }: Message) {\n let args = [..._args]\n \n let bins: number[] = [ ]\n let bufs: Uint8Array[] = [ ]\n \n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg instanceof Uint8Array) {\n bins.push(i)\n bufs.push(arg)\n args[i] = arg.length\n }\n }\n \n const data_json = {\n id,\n ... func ? { func } : { },\n ... ignore ? { ignore } : { },\n ... _async ? { async: _async } : { },\n ... done ? { done } : { },\n ... error ? { error } : { },\n ... args.length ? { args } : { },\n ... bins.length ? { bins } : { },\n }\n \n const str_json = encoder.encode(\n JSON.stringify(data_json)\n )\n \n let dv = new DataView(\n new ArrayBuffer(4)\n )\n \n dv.setUint32(0, str_json.length, true)\n \n return concat([\n dv,\n str_json,\n ... bufs\n ])\n }\n \n \n constructor ({\n url,\n funcs = { },\n websocket,\n }: {\n url?: string\n funcs?: Remote['funcs']\n websocket?: WebSocket\n } = { }) {\n this.url = url\n this.funcs = funcs\n this.websocket = websocket\n }\n \n \n async connect () {\n this.websocket = await connect_websocket(this.url, {\n on_message: this.handle.bind(this)\n })\n }\n \n \n disconnect () {\n this.websocket?.close()\n this.id = 0\n this.handlers = [ ]\n }\n \n \n send (message: Message, websocket = this.websocket) {\n if (!('id' in message))\n message.id = this.id\n \n websocket.send(\n Remote.pack(message)\n )\n }\n \n \n /** 调用 remote 中的 func, 返回结果由 handler 处理,处理 done message 之后的返回值作为 call 函数的返回值 */\n async call <T extends any[] = any[], R = any> (\n message: Message,\n handler: (message: Message<T>) => any\n ) {\n return new Promise<R>((resolve, reject) => {\n this.handlers[this.id] = async (message: Message<T>) => {\n const { error, done } = message\n \n if (error) {\n reject(\n Object.assign(\n new Error(),\n error\n )\n )\n return\n }\n \n let result = await handler(message)\n \n if (done)\n resolve(result)\n }\n \n this.send(message)\n \n this.id++\n })\n }\n \n \n /** 处理接收到的 WebSocket message\n 1. 被调用方接收 message 并开始处理\n 2. 调用方处理 message 响应\n */\n async handle (event: { data: ArrayBuffer }, websocket: WebSocket) {\n const message = Remote.parse(event.data)\n const { func, id, done } = message\n \n if (this.print)\n console.log(message)\n \n if (func) // 作为被调方\n try {\n const handler = this.funcs[func] || this.funcs.default\n \n if (!handler)\n throw new Error(`找不到 rpc handler: ${func}`)\n \n await handler(message, websocket)\n } catch (error) {\n this.send(\n {\n id: message.id,\n error,\n done: true\n },\n websocket\n )\n throw error\n }\n else { // 作为发起方\n this.handlers[id](message)\n if (done)\n this.handlers[id] = null\n }\n }\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"file":"net.js","sourceRoot":"","sources":["net.ts"],"names":[],"mappings":";;;;AAMA,4FAG+B;AAC/B,gEAAgF;AAEhF,0EAAyC;AAEzC,2BAA8B;AAE9B,oEAA8B;AAC9B,8DAA6B;AAC7B,oDAAmB;AACnB,+CAAwD;AA2C/C,uFA3CA,qBAAM,OA2CA;AAlCf,0BAAuB;AAEvB,yCAA0D;AAE1D,IAAY,OAGX;AAHD,WAAY,OAAO;IACf,4CAAkC,CAAA;IAClC,4CAAiC,CAAA;AACrC,CAAC,EAHW,OAAO,GAAP,eAAO,KAAP,eAAO,QAGlB;AAGD,sDAAsD;AACtD,MAAM,YAAY,GAAG,IAAI,gCAAiB,EAAE,CAAA;AAE/B,QAAA,OAAO,GAAG;IACnB,KAAK,EAAE,YAAY;IAEnB,GAAG,EAAE,gCAAe,CAAC,GAAG,CAAC,YAAY,CAAC;IAEtC,GAAG,CAAE,aAAqB,EAAE,GAAG,GAAG,KAAK;QACnC,IAAI,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,IAAI,GAAG;gBACH,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;;gBAE9C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;QAEjD,IAAI,OAAiB,CAAA;QACrB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClE,IAAI,KAAK;gBAAE,MAAM,KAAK,CAAA;YACtB,OAAO,GAAG,QAAQ,CAAA;QACtB,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAClB,CAAC;CACJ,CAAA;AAKY,QAAA,QAAQ,GAAG,gCAAe,CAAC,QAAQ,CAAC;IAC7C,6BAA6B;IAE7B,qIAAqI;IACrI,MAAM,EAAE,KAAK;IAEb,GAAG,EAAE,eAAO,CAAC,GAAG;CACnB,CAAC,CAAA;AAGK,KAAK,UAAU,aAAa,CAAE,OAAe,EAAE,eAA+C;IACjG,OAAO,IAAA,uBAAa,EAAe;QAC/B,OAAO;QACP,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,CAAC;KACZ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACtB,IAAI;YACA,OAAO,MAAM,IAAA,gBAAQ,EAAC,eAAe,CAAC,CAAA;SACzC;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;gBAAE,MAAM,KAAK,CAAA;YAC5F,IAAI,KAAK,IAAI,OAAO;gBAChB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,KAAK,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAClG,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;SACtB;IACL,CAAC,CAAC,CAAA;AACN,CAAC;AAhBD,sCAgBC;AAoDM,KAAK,UAAU,OAAO,CAAE,GAAiB,EAAE,EAC9C,OAAO,EAEP,IAAI,EAEJ,IAAI,GAAG,kBAAkB,EAEzB,KAAK,EAEL,MAAM,EAEN,OAAO,EAEP,QAAQ,EAER,GAAG,GAAG,KAAK,EAEX,OAAO,EAEP,OAAO,GAAG,EAAE,GAAG,IAAI,EAEnB,IAAI,EAEJ,IAAI,EAEJ,OAAO,MAE6B,EAAG;IACvC,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;IAEpB,MAAM,KAAK,GAAG,IAAI,CAAA,CAAE,gBAAgB;IAEpC,IAAI,IAAI,IAAI,CAAC,MAAM;QACf,MAAM,GAAG,MAAM,CAAA;IAEnB,IAAI,IAAI,KAAK,kBAAkB,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAE/B,YAAY;IACZ,IAAI,KAAK,EAAE;QACP,IAAI,KAAK,KAAK,IAAI;YACd,KAAK,GAAG,OAAO,CAAC,OAAO,CAAA;KAC9B;;QACG,KAAK,GAAG,KAAK,CAAA;IAEjB,WAAW;IACX,IAAI,IAAI,KAAK,SAAS;QAClB,IAAI,GAAG,CAAC,GAAG,CAAA;IAGf,MAAM,OAAO,GAA+D;QACxE,GAAG;QAEH,GAAI,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAG;QAEnD,KAAK;QAEL,IAAI;QAEJ,QAAQ,EAAE,IAAI;QAEd,uBAAuB,EAAE,IAAI;QAE7B,OAAO,EAAE;YACL,iBAAiB,EAAE,0DAA0D;YAC7E,YAAY,EAAE,oHAAoH;YAClI,GAAI,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;YACzC,GAAI,OAAO,CAAC,CAAC,CAAC;gBACV,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAClB,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC5D,CAAC,IAAI,CAAC,IAAI,CAAC;aACnB,CAAC,CAAC,CAAC,EAAG;YACP,GAAI,OAAO;SACd;QAED,GAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAG;QAEnC,WAAW;QACX,GAAI,CAAC,GAAG,EAAE;YACN,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAG,CAAA;YACrB,IAAI,IAAI,KAAK,mCAAmC;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;YACvE,IAAI,IAAI,KAAK,qBAAqB;gBAAE,OAAO,EAAE,QAAQ,EAAE,IAA2B,EAAE,CAAA;YACpF,OAAO,EAAE,IAAI,EAAE,CAAA;QACnB,CAAC,CAAC,EAAE;QAEJ,GAAI,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAG;QAE/B,GAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;KAC5B,CAAA;IAED,IAAI,IAA0B,CAAA;IAE9B,IAAI;QACA,IAAI,OAAO,EAAE;YACT,IAAI,OAAO,KAAK,IAAI;gBAChB,OAAO,GAAG,CAAC,CAAA;YAEf,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;SAC/C;;YACG,IAAI,GAAG,MAAM,IAAA,gBAAQ,EAAC,OAAO,CAAC,CAAA;QAElC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;YACnD,MAAM,IAAI,2BAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;KAE3E;IAAC,OAAO,KAAK,EAAE;QACZ,MAAM,EACF,IAAI,EACJ,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EACjC,QAAQ,GACX,GAGW,KAAK,CAAA;QAEjB,KAAK,CAAC,kBAAO,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,uBAAY,GAAG,CAAC,CAAC,GAAG,IAAI;gBACvC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAA;YAEnF,IAAI,EAAE;gBACF,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,IAAI;oBAC/B,IAAA,kBAAO,EAAC,EAAE,CAAC,GAAG,IAAI,CAAA;YAE1B,IAAI,KAAK;gBACL,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,IAAI;oBAC9B,IAAA,kBAAO,EAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YAE7B,IAAI,IAAI,KAAK,iBAAiB;gBAC1B,CAAC,IAAI,KAAK,kBAAkB,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;iBACtE,IAAI,KAAK,YAAY,wBAAY;gBAClC,CAAC,IAAI,KAAK,iBAAiB,CAAC,MAAM,IAAI;oBAClC,GAAG,IAAA,kBAAO,EAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAA;;gBAE/B,CAAC,IAAI,KAAK,IAAA,kBAAO,EAAC,KAAK,CAAC,IAAI,CAAA;YAEhC,IAAI,QAAQ,EAAE;gBACV,CAAC,IAAI,KAAK,mBAAmB,CAAC,MAAM,IAAI;oBACpC,GAAG,IAAA,kBAAO,EAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAA;gBAEpC,IAAI,QAAQ,CAAC,IAAI;oBACb,CAAC,IAAI,KAAK,gBAAgB,CAAC,MAAM,IAAI;wBACjC,GAAG,IAAA,kBAAO,EAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAA;aACnD;YAED,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI;gBACzB,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI;gBACxB,GAAG,CAAC,MAAM,CAAC,uBAAY,GAAG,CAAC,CAAC,CAAA;YAEhC,OAAO,CAAC,CAAA;QACZ,CAAC,CAAA;QAED,MAAM,KAAK,CAAA;KACd;IAED,IAAI,GAAG;QACH,OAAO,IAAI,CAAA;IAEf,IAAI,CAAC,IAAI,CAAC,IAAI;QACV,OAAO,IAAI,CAAC,IAAI,CAAA;IAEpB,kBAAkB;IAClB,IAAI,QAAQ,KAAK,QAAQ;QACrB,OAAO,IAAI,CAAC,IAAI,CAAA;IAEpB,QAAQ,KAAR,QAAQ,GAAK,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAa,IAAI,OAAO,EAAA;IAE1F,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,OAAQ,IAAI,CAAC,IAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAElD,OAAO,oBAAK,CAAC,MAAM,CAAE,IAAI,CAAC,IAAe,EAAE,QAAQ,CAAC,CAAA;AACxD,CAAC;AA1KD,0BA0KC;AAGD,+CAA+C;AACxC,KAAK,UAAU,YAAY,CAAY,GAAiB,EAAE,OAAwB;IACrF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACxC,IAAI,CAAC,IAAI;QAAE,OAAM;IACjB,IAAI;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;KAC1B;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,MAAM,KAAK,CAAA;KACd;AACL,CAAC;AATD,oCASC;AAGD,oDAAoD;AACpD,SAAgB,UAAU,CAAE,IAAY;IACpC,IAAI,CAAC,GAAG,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;IAErD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,kBAAO,CAAC,MAAM,EAAE;QACrC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,KAAK;YACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAA;QACtB,CAAC;KACJ,CAAC,CAAA;IAEF,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,kBAAO,CAAC,MAAM,EAAE;QAC/C,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;QACjB,aAAa;QACb,KAAK;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;oBAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;wBAAE,OAAO,OAAO,CAAA;oBAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC1B,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAA;YAEzB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC1B,CAAC;KACJ,CAAC,CAAA;IAEF,OAAO,CAAC,CAAA;AACZ,CAAC;AA3BD,gCA2BC;AAGD,oDAAoD;AAC7C,KAAK,UAAU,YAAY,CAAE,GAAiB,EAAE,OAAwB;IAC3E,OAAO,UAAU,CACb,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAC9B,CAAA;AACL,CAAC;AAJD,oCAIC;AAGD,SAAgB,OAAO,CAAE,GAAiB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,KAAyC,EAAG;IACvI,IAAI,KAAK,KAAK,IAAI;QACd,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAElC,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;IAEpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QACvB,GAAG,GAAG,UAAU,GAAG,EAAE,CAAA;IAEzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9B,GAAG,GAAG,CAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,YAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAE,CAAC,KAAK,EAAE;QACpE,mCAAmC;QACnC,SAAS;QACT,QAAQ;QACR,+EAA+E;QAC/E,MAAM;QACN,CAAE,KAAK,CAAE,CAAC,CAAE,YAAY,KAAK,CAAC,KAAK,EAAE,EAAE,CAAE,CAAC,CAAE,EAAE,CAAE;QAChD,CAAE,MAAM,IAAI,MAAM,KAAK,KAAK,CAAE,CAAC,CAAE,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAE,CAAC,CAAE,EAAE,CAAE;QACvE,CAAE,OAAO,CAAE,CAAC,CAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,KAAK,EAAE,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAE;QAClH,CAAE,IAAI,CAAE,CAAC,CAAE,MAAM,GAAG,gCAAgC,CAAC,KAAK,EAAE,CAAE,CAAC,CAAE,EAAE,CAAC;QACpE,CAAE,IAAI,CAAE,CAAC,CAAE,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAE,CAAC,CAAE,EAAE,CAAC,CAAA;AACpE,CAAC;AArBD,0BAqBC;AAKD,kDAAkD;AAClD;;;;;;EAME;AACK,KAAK,UAAU,GAAG,CACrB,IAAY,EACZ,IAAY,EACZ,EAAE,GAAG,GAAG,+BAA+B,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,KAA0D,EAAG;IAE3I,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEzD,OAAO,YAAY,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE;YACF,IAAI;YACJ,IAAI;YACJ,KAAK,EAAE,MAAM;YACb,MAAM;SACT;KACJ,CAAC,CAAA;AACN,CAAC;AAfD,kBAeC;AAGD,SAAgB,QAAQ,CAAE,IAAY,EAAE,IAAW;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAE,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACtE,CAAC;YACG,OAAO,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IAC7E,OAAO,GAAG,CAAA;AACd,CAAC;AAND,4BAMC;AAGD,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AAE/B,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AAGxB,KAAK,UAAU,iBAAiB,CACnC,GAAiB,EACjB,EACI,SAAS,EACT,WAAW,GAAG,CAAC,IAAI,EAAE,EAAG,OAAO;AAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,EAQb;IAED,IAAI,SAAS,GAAG,IAAI,cAAS,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAA;IAE1E,iHAAiH;IACjH,SAAS,CAAC,UAAU,GAAG,aAAa,CAAA;IAEpC,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;YAEjD,MAAM,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAEjC,OAAO,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,GAAG,YAAY,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;YACpG,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACxC,MAAM,OAAO,GAAG,sBAAsB,SAAS,CAAC,GAAG,EAAE,CAAA;YACrD,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAC5B,MAAM,CACF,MAAM,CAAC,MAAM,CACT,IAAI,KAAK,CAAC,OAAO,CAAC,EAClB,EAAE,KAAK,EAAE,CACZ,CACJ,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;YAC1C,UAAU,CAAC,KAAY,EAAE,SAAS,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AApDD,8CAoDC;AAsCD;;;EAGE;AACF,MAAa,MAAM;IAyGf,YAAa,EACT,GAAG,EACH,KAAK,GAAG,EAAG,EACX,SAAS,MAKT,EAAG;QA5GP,OAAE,GAAG,CAAC,CAAA;QAQN,mCAAmC;QACnC,aAAQ,GAAkC,EAAG,CAAA;QAE7C,UAAK,GAAG,KAAK,CAAA;QAkGT,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAnGD,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,KAAK,cAAS,CAAC,IAAI,CAAA;IACxD,CAAC;IAGD,MAAM,CAAC,KAAK,CAA4B,YAAyB;QAC7D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,YAA2B,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAA;QAErC,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAEtC,IAAI,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAA;QAEzB,IAAI,OAAO,GAAe,IAAI,CAAC,KAAK,CAChC,OAAO,CAAC,MAAM,CACV,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAC1B,CACJ,CAAA;QAED,OAAO,CAAC,IAAI,KAAZ,OAAO,CAAC,IAAI,GAAK,EAAQ,EAAA;QAEzB,IAAI,OAAO,CAAC,IAAI,EAAE;YACd,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;YAEvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;gBACnD,MAAM,IAAI,OAAO,CAAA;aACpB;SACJ;QAED,OAAO,OAAO,CAAA;IAClB,CAAC;IAGD,MAAM,CAAC,IAAI,CAAE,EACT,EAAE,EACF,IAAI,EACJ,MAAM,EACN,KAAK,EAAE,MAAM,EACb,IAAI,EACJ,KAAK,EACL,IAAI,EAAE,KAAK,GAAG,EAAG,GACX;QACN,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;QAErB,IAAI,IAAI,GAAa,EAAG,CAAA;QACxB,IAAI,IAAI,GAAiB,EAAG,CAAA;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACnB,IAAI,GAAG,YAAY,UAAU,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACZ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACd,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;aACvB;SACJ;QAED,MAAM,SAAS,GAAG;YACd,EAAE;YACF,GAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;YACzB,GAAI,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAG;YAC7B,GAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAG;YACpC,GAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;YACzB,GAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAG;YAC3B,GAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;YAChC,GAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAG;SACnC,CAAA;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC3B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAC5B,CAAA;QAED,IAAI,EAAE,GAAG,IAAI,QAAQ,CACjB,IAAI,WAAW,CAAC,CAAC,CAAC,CACrB,CAAA;QAED,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEtC,OAAO,IAAA,iBAAM,EAAC;YACV,EAAE;YACF,QAAQ;YACR,GAAI,IAAI;SACX,CAAC,CAAA;IACN,CAAC;IAkBD,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,SAAS,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACrC,CAAC,CAAA;IACN,CAAC;IAGD,UAAU;QACN,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAA;QACvB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QACX,IAAI,CAAC,QAAQ,GAAG,EAAG,CAAA;IACvB,CAAC;IAGD,IAAI,CAAE,OAAgB,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9C,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC;YAClB,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QAExB,SAAS,CAAC,IAAI,CACV,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CACvB,CAAA;IACL,CAAC;IAGD,+EAA+E;IAC/E,KAAK,CAAC,IAAI,CACN,OAAgB,EAChB,OAAqC;QAErC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;gBACnD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;gBAE/B,IAAI,KAAK,EAAE;oBACP,MAAM,CACF,MAAM,CAAC,MAAM,CACT,IAAI,KAAK,EAAE,EACX,KAAK,CACR,CACJ,CAAA;oBACD,OAAM;iBACT;gBAED,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;gBAEnC,IAAI,IAAI;oBACJ,OAAO,CAAC,MAAM,CAAC,CAAA;YACvB,CAAC,CAAA;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAElB,IAAI,CAAC,EAAE,EAAE,CAAA;QACb,CAAC,CAAC,CAAA;IACN,CAAC;IAGD;;;MAGE;IACF,KAAK,CAAC,MAAM,CAAE,KAA4B,EAAE,SAAoB;QAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QAElC,IAAI,IAAI,CAAC,KAAK;YACV,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAExB,IAAI,IAAI,EAAE,QAAQ;YACd,IAAI;gBACA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA;gBAEtD,IAAI,CAAC,OAAO;oBACR,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;gBAE/C,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;aACpC;YAAC,OAAO,KAAK,EAAE;gBACZ,IAAI,CAAC,IAAI,CACL;oBACI,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,KAAK;oBACL,IAAI,EAAE,IAAI;iBACb,EACD,SAAS,CACZ,CAAA;gBACD,MAAM,KAAK,CAAA;aACd;aACA,EAAG,QAAQ;YACZ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,IAAI;gBACJ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;SAC/B;IACL,CAAC;CACJ;AApND,wBAoNC","sourcesContent":["import {\n default as request_lib,\n type OptionsWithUri,\n type OptionsWithUrl\n} from 'request'\n\nimport {\n default as request_promise,\n type FullResponse,\n} from 'request-promise-native'\nimport { RequestError, StatusCodeError } from 'request-promise-native/errors.js'\n\nimport promise_retry from 'promise-retry'\n\nimport { WebSocket } from 'ws'\n\nimport iconv from 'iconv-lite'\nimport cheerio from 'cheerio'\nimport qs from 'qs'\nimport { Cookie, MemoryCookieStore } from 'tough-cookie'\n\ndeclare module 'tough-cookie' {\n interface MemoryCookieStore {\n idx: Record<string, any>\n }\n}\n\n\nimport './prototype.js'\nimport type { Encoding } from './file.js'\nimport { inspect, output_width, concat } from './utils.js'\n\nexport enum MyProxy {\n socks5 = 'http://localhost:10080',\n whistle = 'http://localhost:8899',\n}\n\n\n// ------------------------------------ Fetch, Request\nconst cookie_store = new MemoryCookieStore()\n\nexport const cookies = {\n store: cookie_store,\n \n jar: request_promise.jar(cookie_store),\n \n get (domain_or_url: string, str = false) {\n if (domain_or_url.startsWith('http'))\n if (str)\n return this.jar.getCookieString(domain_or_url)\n else\n return this.jar.getCookies(domain_or_url)\n \n let cookies: Cookie[]\n this.store.findCookies(domain_or_url, null, true, (error, _cookies) => {\n if (error) throw error\n cookies = _cookies\n })\n return cookies\n },\n}\n\nexport { Cookie }\n\n\nexport const _request = request_promise.defaults({\n // rejectUnauthorized: false,\n \n /** prevent 302 redirect cause error, which is a boolean to set whether status codes other than 2xx should also reject the promise */\n simple: false,\n \n jar: cookies.jar\n})\n\n\nexport async function request_retry (retries: number, request_options: request_promise.OptionsWithUrl) {\n return promise_retry<FullResponse>({\n retries,\n minTimeout: 1000,\n maxTimeout: Infinity,\n factor: 2\n }, async (retry, count) => {\n try {\n return await _request(request_options)\n } catch (error) {\n if (!['ECONNRESET', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(error.cause?.code)) throw error\n if (count <= retries)\n console.log(`${`retry (${count}) …`.yellow} ${request_options.url.toString().blue.underline}`)\n return retry(error)\n }\n })\n}\n\n\nexport interface RequestOptions {\n method?: 'get' | 'post' | 'put' | 'head' | 'delete' | 'patch'\n \n queries?: Record<string, any>\n \n headers?: Record<string, string>\n \n body?: string | Record<string, any>\n \n type?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data'\n \n \n proxy?: boolean | MyProxy | string\n \n encoding?: Encoding\n \n retries?: true | number\n \n timeout?: number\n \n auth?: {\n username: string\n password: string\n }\n \n gzip?: boolean\n \n cookies?: Record<string, string>\n}\n\nexport interface RequestRawOptions extends RequestOptions {\n raw: true\n}\n\n/** \n - url: must be full url\n - options:\n - raw: `false` 传入后返回整个 response\n - encoding: `(response content-type: charset=gb18030) || 'utf-8'` when 'binary' then return buffer\n - type: `'application/json'` request content-type header (if has body)\n - proxy: `false` proxy === true then use MyProxy.whistle\n - retries: `false` could be true (default 3 times) or retry times\n - timeout: `20 * 1000`\n - gzip: `raw -> false; else -> true`\n*/\nexport async function request (url: string | URL): Promise<string>\nexport async function request (url: string | URL, options: RequestRawOptions): Promise<request_lib.Response>\nexport async function request (url: string | URL, options: RequestOptions & { encoding: 'binary' }): Promise<Buffer>\nexport async function request (url: string | URL, options: RequestOptions): Promise<string>\nexport async function request (url: string | URL, {\n queries,\n \n body,\n \n type = 'application/json',\n \n proxy,\n \n method,\n \n headers,\n \n encoding,\n \n raw = false,\n \n retries,\n \n timeout = 20 * 1000,\n \n auth,\n \n gzip,\n \n cookies,\n \n}: RequestOptions & { raw?: boolean } = { }) {\n url = url.toString()\n \n const _body = body // for error log\n \n if (body && !method)\n method = 'post'\n \n if (type === 'application/json' && typeof body !== 'undefined' && (typeof body !== 'string' && !Buffer.isBuffer(body)))\n body = JSON.stringify(body)\n \n // --- proxy\n if (proxy) {\n if (proxy === true)\n proxy = MyProxy.whistle\n } else\n proxy = false\n \n // --- gzip\n if (gzip === undefined)\n gzip = !raw\n \n \n const options: request_lib.Options & { resolveWithFullResponse: boolean } = {\n url,\n \n ... method ? { method: method.toUpperCase() } : { },\n \n proxy,\n \n gzip,\n \n encoding: null,\n \n resolveWithFullResponse: true,\n \n headers: {\n 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5',\n 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',\n ... body ? { 'content-type': type } : { }, \n ... cookies ? {\n cookie: Object.entries(cookies)\n .map(([key, value]) => \n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n ).join('; ')\n } : { },\n ... headers\n },\n \n ... queries ? { qs: queries } : { },\n \n // --- body\n ... (() => {\n if (!body) return { }\n if (type === 'application/x-www-form-urlencoded') return { form: body }\n if (type === 'multipart/form-data') return { formData: body as Record<string, any> }\n return { body }\n })(),\n \n ... timeout ? { timeout } : { },\n \n ... auth ? { auth } : { },\n }\n \n let resp: request_lib.Response\n \n try {\n if (retries) {\n if (retries === true)\n retries = 3\n \n resp = await request_retry(retries, options)\n } else\n resp = await _request(options)\n \n if (!(200 <= resp.statusCode && resp.statusCode <= 299))\n throw new StatusCodeError(resp.statusCode, resp.body, options, resp)\n \n } catch (error) {\n const {\n name, \n options: { method, url, uri, qs }, \n response,\n }: {\n options: OptionsWithUri & OptionsWithUrl\n response: FullResponse\n } & Error = error\n \n error[inspect.custom] = () => {\n let s = '─'.repeat(output_width / 2) + '\\n' +\n `${(method || 'get').toLowerCase().red} ${String(url || uri).blue.underline}\\n`\n \n if (qs)\n s += `\\n${'request.query:'.blue}\\n` +\n inspect(qs) + '\\n'\n \n if (_body)\n s += `\\n${'request.body:'.blue}\\n` +\n inspect(_body) + '\\n'\n \n if (name === 'StatusCodeError')\n s += `\\n${'response.status:'.yellow} ${String(error.statusCode).red}\\n`\n else if (error instanceof RequestError)\n s += `\\n${'response.cause:'.yellow}\\n` +\n `${inspect(error.cause)}\\n`\n else\n s += `\\n${inspect(error)}\\n`\n \n if (response) {\n s += `\\n${'response.headers:'.yellow}\\n` + \n `${inspect(response.headers)}\\n`\n \n if (response.body)\n s += `\\n${'response.body:'.yellow}\\n` +\n `${inspect(response.body.toString())}\\n`\n }\n \n s += `\\n${'stack:'.yellow}\\n` +\n `${new Error().stack}\\n` +\n '─'.repeat(output_width / 2)\n \n return s\n }\n \n throw error\n }\n \n if (raw)\n return resp\n \n if (!resp.body)\n return resp.body\n \n // --- decode body\n if (encoding === 'binary')\n return resp.body\n \n encoding ||= /charset=(.*)/.exec(resp.headers['content-type'])?.[1] as Encoding || 'utf-8'\n \n if (/utf-?8/i.test(encoding))\n return (resp.body as Buffer).toString('utf-8')\n \n return iconv.decode((resp.body as Buffer), encoding)\n}\n\n\n/** make http request and parse body as json */\nexport async function request_json <T = any> (url: string | URL, options?: RequestOptions): Promise<T> {\n const resp = await request(url, options)\n if (!resp) return\n try {\n return JSON.parse(resp)\n } catch (error) {\n console.log(resp)\n throw error\n }\n}\n\n\n/** use $.html(cheerio_element) to get outer html */\nexport function parse_html (html: string) {\n let $ = cheerio.load(html, { decodeEntities: false })\n \n Object.defineProperty($, inspect.custom, {\n configurable: true,\n enumerable: false,\n value () {\n return this.html()\n }\n })\n \n Object.defineProperty($.prototype, inspect.custom, {\n configurable: true,\n enumerable: false,\n // @ts-ignore\n value (this: cheerio.Cheerio) {\n if (this.length > 1)\n return this.map((index, element) => {\n if (typeof element === 'string') return element\n return $.html(element)\n }).get().join_lines()\n \n return this.toString()\n }\n })\n \n return $\n}\n\n\n/** use $.html(cheerio_element) to get outer html */\nexport async function request_page (url: string | URL, options?: RequestOptions) {\n return parse_html(\n await request(url, options)\n )\n}\n\n\nexport function to_curl (url: string | URL, { queries, headers, method, body, proxy, exe = true }: RequestOptions & { exe?: boolean } = { }) {\n if (proxy === true)\n proxy = process.env.http_proxy\n \n url = url.toString()\n \n if (!url.startsWith('http'))\n url = `http://${url}`\n \n return (exe ? 'curl.exe' : 'curl') + \n ' ' + ( url + (queries ? '?' : '') + qs.stringify(queries) ).quote() +\n // ( typeof proxy === 'undefined' ?\n // ''\n // :\n // ( proxy ? ' --proxy ' + proxy.quote() : ' --noproxy ' + '*'.quote())\n // ) +\n ( proxy ? ` --proxy ${proxy.quote()}` : '' ) +\n ( method && method !== 'get' ? ` -X ${method.toUpperCase()}` : '' ) +\n ( headers ? Object.entries(headers).map( ([key, value]) => ' -H ' + `${key}: ${value}`.quote() ).join('') : '' ) +\n ( body ? ' -H ' + 'content-type: application/json'.quote() : '') +\n ( body ? ' --data ' + JSON.stringify(body).quote() : '')\n}\n\n\n\n\n// ------------------------------------ rpc client\n/** post json to http://localhost:8421/api/rpc\n - func: function name\n - args?: argument array\n - options?:\n - ignore?: `false` wait for execution but do not serialize result to response\n - async?: `false` do not wait for exec\n*/\nexport async function rpc (\n func: string, \n args?: any[], \n { url = 'http://localhost:8421/api/rpc', async: _async = false, ignore = false }: { url?: string, async?: boolean, ignore?: boolean } = { }\n) {\n if (!func) throw new Error('rpc argument error: no func')\n \n return request_json(url, {\n body: {\n func,\n args,\n async: _async,\n ignore,\n }\n })\n}\n\n\nexport function rpc_curl (func: string, args: any[]) {\n const cmd = args.find( arg => typeof arg === 'object') ?\n to_curl('http://localhost:8421/api/rpc', { body: { func, args } })\n :\n to_curl('http://localhost:8421/api/rpc', { queries: { func, args } })\n return cmd\n}\n\n\nlet decoder = new TextDecoder()\n\nlet encoder = new TextEncoder()\n\n\nexport async function connect_websocket (\n url: string | URL,\n {\n protocols,\n max_payload = 2 ** 33, // 8 GB\n on_open,\n on_close,\n on_error,\n on_message\n }: {\n protocols?: string | string[]\n max_payload?: number\n on_open? (event: any, websocket: WebSocket): any\n on_close? (event: { code: number, reason: string }, websocket: WebSocket): any\n on_error? (event: any, websocket: WebSocket): any\n on_message (event: { data: ArrayBuffer }, websocket: WebSocket): any\n }\n) {\n let websocket = new WebSocket(url, protocols, { maxPayload: max_payload })\n \n // https://stackoverflow.com/questions/11821096/what-is-the-difference-between-an-arraybuffer-and-a-blob/39951543\n websocket.binaryType = 'arraybuffer'\n \n return new Promise<WebSocket>((resolve, reject) => {\n websocket.addEventListener('open', async event => {\n console.log(`websocket opened: ${websocket.url}`)\n \n await on_open?.(event, websocket)\n \n resolve(websocket)\n })\n \n websocket.addEventListener('close', event => {\n console.log(`websocket closed: ${websocket.url} (code = ${event.code}, reason = '${event.reason}')`)\n on_close?.(event, websocket)\n })\n \n websocket.addEventListener('error', event => {\n const message = `websocket errored: ${websocket.url}`\n on_error?.(event, websocket)\n reject(\n Object.assign(\n new Error(message),\n { event }\n )\n )\n })\n \n websocket.addEventListener('message', event => {\n on_message(event as any, websocket)\n })\n })\n}\n\n\n/** 二进制消息格式 \n - json.length (小端序): 4 字节\n - json 数据\n - binary 数据\n*/\nexport interface Message <T extends any[] = any[]> {\n /** 本次 rpc 的 id */\n id?: number\n \n /** rpc 发起方指定被调用的 function name, 多个相同 id, func 的 message 组成一个请求流 */\n func?: string\n \n /** 等待执行,但不要序列化返回 func 的执行结果 (message 中无 args) */\n ignore?: boolean\n \n /** 不等待 func 执行,remote 收到后直接确认返回 (message 中 done = true) */\n async?: boolean\n \n /** 这个数组里面要么是对应的 JS 参数,要么是 Uint8Array 参数对应的 binary length \n args 可以是: \n - rpc 发起方调用 func 的参数,或者请求流 message 携带的数据\n - 作为结果或者响应流的 message 数据,传给请求发起方\n */\n args?: T\n \n /** bins: 哪几个 arg 是 Uint8Array 类型的,如: [0, 3] */\n bins?: number[]\n \n /** 被调方执行 func 产生的错误 */\n error?: Error\n \n /** 如果请求或者响应是一个流,通过这个 flag 表明是最后一个 message, 并且可以销毁 handler 了 */\n done?: boolean\n}\n\n/** 通过创建 Remote 对象对 WebSocket RPC 进行抽象 \n 调用方使用 remote.call 进行调用 \n 被调方在创建 Remote 对象时传入 funcs 注册处理函数,并使用 Remote.handle 方法处理 WebSocket message \n*/\nexport class Remote {\n url: string\n \n websocket: WebSocket\n \n id = 0\n \n /** 被调方的 message 处理器 */\n funcs: Record<\n string, \n (message: Message, websocket?: WebSocket) => void | Promise<void>\n >\n \n /** 调用方发起的 rpc 对应响应的 message 处理器 */\n handlers: ((message: Message) => any)[] = [ ]\n \n print = false\n \n get connected () {\n return this.websocket?.readyState === WebSocket.OPEN\n }\n \n \n static parse <T extends any[] = any[]> (array_buffer: ArrayBuffer) {\n const buf = new Uint8Array(array_buffer as ArrayBuffer)\n const dv = new DataView(array_buffer)\n \n const len_json = dv.getUint32(0, true)\n \n let offset = 4 + len_json\n \n let message: Message<T> = JSON.parse(\n decoder.decode(\n buf.subarray(4, offset)\n )\n )\n \n message.args ||= [ ] as T\n \n if (message.bins) {\n let args = message.args\n \n for (const ibin of message.bins) {\n const len_buf = args[ibin]\n args[ibin] = buf.subarray(offset, offset + len_buf)\n offset += len_buf\n }\n }\n \n return message\n }\n \n \n static pack ({\n id,\n func,\n ignore,\n async: _async,\n done,\n error,\n args: _args = [ ],\n }: Message) {\n let args = [..._args]\n \n let bins: number[] = [ ]\n let bufs: Uint8Array[] = [ ]\n \n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg instanceof Uint8Array) {\n bins.push(i)\n bufs.push(arg)\n args[i] = arg.length\n }\n }\n \n const data_json = {\n id,\n ... func ? { func } : { },\n ... ignore ? { ignore } : { },\n ... _async ? { async: _async } : { },\n ... done ? { done } : { },\n ... error ? { error } : { },\n ... args.length ? { args } : { },\n ... bins.length ? { bins } : { },\n }\n \n const str_json = encoder.encode(\n JSON.stringify(data_json)\n )\n \n let dv = new DataView(\n new ArrayBuffer(4)\n )\n \n dv.setUint32(0, str_json.length, true)\n \n return concat([\n dv,\n str_json,\n ... bufs\n ])\n }\n \n \n constructor ({\n url,\n funcs = { },\n websocket,\n }: {\n url?: string\n funcs?: Remote['funcs']\n websocket?: WebSocket\n } = { }) {\n this.url = url\n this.funcs = funcs\n this.websocket = websocket\n }\n \n \n async connect () {\n this.websocket = await connect_websocket(this.url, {\n on_message: this.handle.bind(this)\n })\n }\n \n \n disconnect () {\n this.websocket?.close()\n this.id = 0\n this.handlers = [ ]\n }\n \n \n send (message: Message, websocket = this.websocket) {\n if (!('id' in message))\n message.id = this.id\n \n websocket.send(\n Remote.pack(message)\n )\n }\n \n \n /** 调用 remote 中的 func, 返回结果由 handler 处理,处理 done message 之后的返回值作为 call 函数的返回值 */\n async call <T extends any[] = any[], R = any> (\n message: Message,\n handler: (message: Message<T>) => any\n ) {\n return new Promise<R>((resolve, reject) => {\n this.handlers[this.id] = async (message: Message<T>) => {\n const { error, done } = message\n \n if (error) {\n reject(\n Object.assign(\n new Error(),\n error\n )\n )\n return\n }\n \n let result = await handler(message)\n \n if (done)\n resolve(result)\n }\n \n this.send(message)\n \n this.id++\n })\n }\n \n \n /** 处理接收到的 WebSocket message\n 1. 被调用方接收 message 并开始处理\n 2. 调用方处理 message 响应\n */\n async handle (event: { data: ArrayBuffer }, websocket: WebSocket) {\n const message = Remote.parse(event.data)\n const { func, id, done } = message\n \n if (this.print)\n console.log(message)\n \n if (func) // 作为被调方\n try {\n const handler = this.funcs[func] || this.funcs.default\n \n if (!handler)\n throw new Error(`找不到 rpc handler: ${func}`)\n \n await handler(message, websocket)\n } catch (error) {\n this.send(\n {\n id: message.id,\n error,\n done: true\n },\n websocket\n )\n throw error\n }\n else { // 作为发起方\n this.handlers[id](message)\n if (done)\n this.handlers[id] = null\n }\n }\n}\n\n\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xshell",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.36",
|
|
4
4
|
"main": "./index.js",
|
|
5
5
|
"bin": {
|
|
6
6
|
"xshell": "./xshell.js",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
]
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@babel/core": "^7.17.
|
|
69
|
-
"@babel/parser": "^7.17.
|
|
68
|
+
"@babel/core": "^7.17.8",
|
|
69
|
+
"@babel/parser": "^7.17.8",
|
|
70
70
|
"@babel/traverse": "^7.17.3",
|
|
71
71
|
"@koa/cors": "^3.2.0",
|
|
72
72
|
"byte-size": "^8.1.0",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"promise-retry": "^2.0.1",
|
|
98
98
|
"qs": "^6.10.3",
|
|
99
99
|
"react": "^17.0.2",
|
|
100
|
-
"react-i18next": "^11.
|
|
100
|
+
"react-i18next": "^11.16.1",
|
|
101
101
|
"readdir-enhanced": "^6.0.4",
|
|
102
102
|
"request": "^2.88.2",
|
|
103
103
|
"request-promise-native": "^1.0.9",
|
|
@@ -127,10 +127,10 @@
|
|
|
127
127
|
"@types/koa": "^2.13.4",
|
|
128
128
|
"@types/koa-compress": "^4.0.3",
|
|
129
129
|
"@types/lodash": "^4.14.180",
|
|
130
|
-
"@types/node": "^17.0.
|
|
130
|
+
"@types/node": "^17.0.22",
|
|
131
131
|
"@types/promise-retry": "^1.1.3",
|
|
132
132
|
"@types/qs": "^6.9.7",
|
|
133
|
-
"@types/react": "^17.0.
|
|
133
|
+
"@types/react": "^17.0.41",
|
|
134
134
|
"@types/request": "^2.48.8",
|
|
135
135
|
"@types/request-promise-native": "^1.0.18",
|
|
136
136
|
"@types/rimraf": "^3.0.2",
|
package/process.d.ts
CHANGED
|
@@ -14,14 +14,13 @@ interface StartOptions {
|
|
|
14
14
|
encoding?: Encoding;
|
|
15
15
|
/** `true` print option (with details) */
|
|
16
16
|
print?: boolean | {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
code
|
|
21
|
-
error?: boolean;
|
|
17
|
+
stdout: boolean;
|
|
18
|
+
stderr: boolean;
|
|
19
|
+
command: boolean;
|
|
20
|
+
code: boolean;
|
|
22
21
|
};
|
|
23
22
|
/** `'pipe'` when 'ignore' then ignore stdio processing */
|
|
24
|
-
stdio?: 'pipe' | 'ignore';
|
|
23
|
+
stdio?: 'pipe' | 'ignore' | ['pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit'];
|
|
25
24
|
/** `false` whether to break the connection with child (ignore stdio, unref) */
|
|
26
25
|
detached?: boolean;
|
|
27
26
|
}
|
package/process.js
CHANGED
|
@@ -29,7 +29,16 @@ function start(exe, args = [], { cwd = exports.fp_root, encoding = 'utf-8', prin
|
|
|
29
29
|
env: { ...process.env, ...env }
|
|
30
30
|
} : {},
|
|
31
31
|
};
|
|
32
|
-
if (print)
|
|
32
|
+
if (typeof print === 'boolean')
|
|
33
|
+
print = {
|
|
34
|
+
stdout: print,
|
|
35
|
+
stderr: print,
|
|
36
|
+
command: print,
|
|
37
|
+
code: print,
|
|
38
|
+
};
|
|
39
|
+
if (typeof stdio === 'string')
|
|
40
|
+
stdio = [stdio, stdio, stdio];
|
|
41
|
+
if (print.command)
|
|
33
42
|
console.log(`${exe} ${args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' ')}`.blue);
|
|
34
43
|
if (detached) {
|
|
35
44
|
let child = (0, child_process_1.spawn)(exe, args, {
|
|
@@ -41,48 +50,56 @@ function start(exe, args = [], { cwd = exports.fp_root, encoding = 'utf-8', prin
|
|
|
41
50
|
return child;
|
|
42
51
|
}
|
|
43
52
|
let child = (0, child_process_1.spawn)(exe, args, options);
|
|
44
|
-
|
|
45
|
-
child.stdin.setDefaultEncoding('utf8');
|
|
46
|
-
// prevent child spawn error crashing nodejs process
|
|
53
|
+
// 防止 child spawn 失败时 crash nodejs 进程
|
|
47
54
|
child.on('error', error => {
|
|
48
55
|
console.error(error);
|
|
49
56
|
});
|
|
50
|
-
if (stdio === '
|
|
57
|
+
if (stdio[0] === 'pipe')
|
|
58
|
+
child.stdin.setDefaultEncoding('utf8');
|
|
59
|
+
if (stdio.every(s => s === 'ignore'))
|
|
51
60
|
return child;
|
|
52
61
|
if (encoding !== 'binary') {
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
if (stdio[1] === 'pipe') {
|
|
63
|
+
if (encoding === 'utf-8')
|
|
64
|
+
child.stdout.setEncoding('utf-8');
|
|
65
|
+
else
|
|
66
|
+
child.stdout = child.stdout.pipe(iconv_lite_1.default.decodeStream(encoding));
|
|
67
|
+
if (print.stdout)
|
|
68
|
+
child.stdout.pipe(process.stdout, { end: false });
|
|
60
69
|
}
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
if (stdio[2] === 'pipe') {
|
|
71
|
+
if (encoding === 'utf-8')
|
|
72
|
+
child.stderr.setEncoding('utf-8');
|
|
73
|
+
else
|
|
74
|
+
child.stderr = child.stderr.pipe(iconv_lite_1.default.decodeStream(encoding));
|
|
75
|
+
if (print.stderr)
|
|
76
|
+
child.stderr.pipe(process.stderr, { end: false });
|
|
64
77
|
}
|
|
65
78
|
}
|
|
66
79
|
return child;
|
|
67
80
|
}
|
|
68
81
|
exports.start = start;
|
|
69
82
|
async function call(exe, args = [], options = {}) {
|
|
70
|
-
const { encoding = 'utf-8',
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
const { encoding = 'utf-8', throw_code = true, input, } = options;
|
|
84
|
+
let { stdio = 'pipe', print = true } = options;
|
|
85
|
+
if (typeof print === 'boolean')
|
|
86
|
+
print = {
|
|
73
87
|
command: print,
|
|
74
88
|
stdout: print,
|
|
75
89
|
stderr: print,
|
|
76
90
|
code: print,
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
91
|
+
};
|
|
92
|
+
if (typeof stdio === 'string')
|
|
93
|
+
stdio = [stdio, stdio, stdio];
|
|
94
|
+
const cmd = (exe.includes(' ') ? exe.quote() : exe) +
|
|
95
|
+
args.length ? (' ' +
|
|
96
|
+
args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' ')) : '';
|
|
97
|
+
if (print.command)
|
|
83
98
|
console.log(cmd.blue);
|
|
84
|
-
|
|
85
|
-
|
|
99
|
+
let child = start(exe, args, {
|
|
100
|
+
...options,
|
|
101
|
+
print: false,
|
|
102
|
+
});
|
|
86
103
|
if (input)
|
|
87
104
|
child.stdin.write(input);
|
|
88
105
|
// --- collect output
|
|
@@ -91,29 +108,31 @@ async function call(exe, args = [], options = {}) {
|
|
|
91
108
|
let code, signal;
|
|
92
109
|
await Promise.all([
|
|
93
110
|
new Promise(resolve => {
|
|
94
|
-
child.
|
|
111
|
+
child.once('exit', (_code, _signal) => {
|
|
95
112
|
code = _code;
|
|
96
113
|
signal = _signal;
|
|
97
114
|
resolve();
|
|
98
115
|
});
|
|
99
116
|
}),
|
|
100
117
|
(async () => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
118
|
+
if (stdio[1] === 'pipe')
|
|
119
|
+
for await (const chunk of child.stdout) {
|
|
120
|
+
if (encoding !== 'binary' && print.stdout)
|
|
121
|
+
process.stdout.write(chunk);
|
|
122
|
+
stdouts.push(chunk);
|
|
123
|
+
}
|
|
106
124
|
})(),
|
|
107
125
|
(async () => {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
126
|
+
if (stdio[2] === 'pipe')
|
|
127
|
+
for await (const chunk of child.stderr) {
|
|
128
|
+
if (encoding !== 'binary' && print.stderr)
|
|
129
|
+
process.stderr.write(chunk);
|
|
130
|
+
stderrs.push(chunk);
|
|
131
|
+
}
|
|
113
132
|
})()
|
|
114
133
|
]);
|
|
115
|
-
const message = `process(${child.pid})
|
|
116
|
-
if (
|
|
134
|
+
const message = `process(${child.pid}) (${cmd}) exited ${code}${signal ? `, by signal ${signal}` : ''}.`;
|
|
135
|
+
if (print.code || code || signal)
|
|
117
136
|
console.log(message[code || signal ? 'red' : 'blue']);
|
|
118
137
|
const result = {
|
|
119
138
|
pid: child.pid,
|
package/process.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["process.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n spawn,\n type SpawnOptions,\n type ChildProcess\n} from 'child_process'\nimport { Readable } from 'stream'\n\nimport iconv from 'iconv-lite'\n\nimport './prototype.js'\nimport { Encoding } from './file.js'\nimport { inspect } from './utils.js'\n\nexport const fp_root = `${__dirname}/`.to_slash()\n\nexport const exe_node = process.execPath.to_slash()\n\n\n// ------------------------------------ start & call\ninterface StartOptions {\n /** `'d:/'` */\n cwd?: string\n \n /** `process.env` overwrite/add to process.env */\n env?: Record<string, string>\n \n /** `'utf-8'` child output encoding */\n encoding?: Encoding\n \n /** `true` print option (with details) */\n print?: boolean | {\n command?: boolean\n stdout?: boolean\n stderr?: boolean\n code?: boolean\n error?: boolean\n }\n \n /** `'pipe'` when 'ignore' then ignore stdio processing */\n stdio?: 'pipe' | 'ignore'\n \n /** `false` whether to break the connection with child (ignore stdio, unref) */\n detached?: boolean\n}\n\n/** start process \n - exe: .exe path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` arguments list\n - options\n - cwd?: `fp_root`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n*/\nexport function start (exe: string, args: string[] = [], {\n cwd = fp_root,\n \n encoding = 'utf-8',\n \n print = true,\n \n stdio = 'pipe',\n \n detached = false,\n \n env,\n \n}: StartOptions = { }): ChildProcess {\n const options: SpawnOptions = {\n cwd,\n shell: false,\n windowsHide: !detached,\n stdio,\n ... env ? {\n env: { ...process.env, ...env }\n } : { },\n }\n \n if (print)\n console.log(`${exe} ${ args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' ') }`.blue)\n \n if (detached) {\n let child = spawn(exe, args, {\n ...options,\n stdio: 'ignore',\n detached: true,\n })\n \n child.unref()\n return child\n }\n \n let child = spawn(exe, args, options)\n \n if (stdio === 'pipe')\n child.stdin.setDefaultEncoding('utf8')\n \n // prevent child spawn error crashing nodejs process\n child.on('error', error => {\n console.error(error)\n })\n \n if (stdio === 'ignore')\n return child\n \n if (encoding !== 'binary') {\n if (encoding === 'utf-8') {\n child.stdout.setEncoding('utf-8')\n child.stderr.setEncoding('utf-8')\n } else {\n child.stdout = child.stdout.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n child.stderr = child.stderr.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n }\n \n if (print) {\n child.stdout.pipe(process.stdout, { end: false })\n child.stderr.pipe(process.stderr, { end: false })\n }\n }\n \n return child\n}\n\n\nexport interface CallOptions extends StartOptions {\n throw_code?: boolean\n input?: string\n}\n\nexport interface CallResult<T = string> {\n pid: number\n stdout: T\n stderr: T\n code: number | null\n signal: NodeJS.Signals | null\n child: ChildProcess\n [inspect.custom] (): string\n}\n\n\n/** call process for result\n - exe: .exe path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` arguments list\n - options?:\n - cwd?: `'d:/'`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - input?: string\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` whether to throw Error when code is not 0\n*/\nexport async function call (exe: string, args?: string[]): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding: 'binary' }): Promise<CallResult<Buffer>>\nexport async function call (exe: string, args: string[] = [], options: CallOptions = { }): Promise<CallResult<string | Buffer>> {\n const {\n encoding = 'utf-8', \n print = true,\n throw_code = true,\n input\n } = options\n \n const print_options = typeof print === 'boolean' ?\n {\n command: print,\n stdout: print,\n stderr: print,\n code: print,\n error: print\n }\n :\n print\n \n const cmd = `${exe} ${ args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' ') }`\n \n if (print_options.command)\n console.log(cmd.blue)\n \n options.print = false\n \n let child = start(exe, args, options)\n \n if (input)\n child.stdin.write(input)\n \n // --- collect output\n let stdouts: (string | Buffer)[] = [ ]\n let stderrs: (string | Buffer)[] = [ ]\n \n let code: number | null, \n signal: NodeJS.Signals\n \n await Promise.all([\n new Promise<void>(resolve => {\n child.on('exit', (_code, _signal) => {\n code = _code\n signal = _signal\n resolve()\n })\n }),\n (async () => {\n for await (const chunk of child.stdout as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print_options.stdout)\n process.stdout.write(chunk)\n stdouts.push(chunk)\n }\n })(),\n (async () => {\n for await (const chunk of child.stderr as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print_options.stderr)\n process.stderr.write(chunk)\n stderrs.push(chunk)\n }\n })()\n ])\n \n const message = `process(${ child.pid }) '${ cmd }' exited ${ code }${ signal ? `, by signal ${ signal }` : '' }.`\n \n if (print_options.code || code || signal)\n console.log(message[code || signal ? 'red' : 'blue'])\n \n const result = {\n pid: child.pid,\n \n stdout: encoding === 'binary' ?\n Buffer.concat(stdouts as Buffer[])\n :\n (stdouts as string[]).join(''),\n \n stderr: encoding === 'binary' ?\n Buffer.concat(stderrs as Buffer[])\n :\n (stderrs as string[]).join(''),\n \n code,\n \n signal,\n \n child,\n \n [inspect.custom] () {\n return inspect(this, { omit: ['child'] })\n }\n }\n \n if (code && throw_code)\n throw Object.assign(\n new Error(message), \n result\n )\n \n return result\n}\n\n\n/** call node <js> for result\n - js: .js path (relative path will resolve based on cwd)\n - args: `[]` arguments list\n - options\n - cwd?: `'d:/'`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child process output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` whether to throw Error when code is not 0\n*/\nexport async function call_node (js: string, args: string[] = [], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }) {\n return call(exe_node, [js, ...args], options)\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["process.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n spawn,\n type SpawnOptions,\n type ChildProcess\n} from 'child_process'\nimport { Readable } from 'stream'\n\nimport iconv from 'iconv-lite'\n\nimport './prototype.js'\nimport { Encoding } from './file.js'\nimport { inspect } from './utils.js'\n\nexport const fp_root = `${__dirname}/`.to_slash()\n\nexport const exe_node = process.execPath.to_slash()\n\n\n// ------------------------------------ start & call\ninterface StartOptions {\n /** `'d:/'` */\n cwd?: string\n \n /** `process.env` overwrite/add to process.env */\n env?: Record<string, string>\n \n /** `'utf-8'` child output encoding */\n encoding?: Encoding\n \n /** `true` print option (with details) */\n print?: boolean | {\n stdout: boolean\n stderr: boolean\n command: boolean\n code: boolean\n }\n \n /** `'pipe'` when 'ignore' then ignore stdio processing */\n stdio?: 'pipe' | 'ignore' | ['pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit', 'pipe' | 'ignore' | 'inherit']\n \n /** `false` whether to break the connection with child (ignore stdio, unref) */\n detached?: boolean\n}\n\n/** start process \n - exe: .exe path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` arguments list\n - options\n - cwd?: `fp_root`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n*/\nexport function start (exe: string, args: string[] = [ ], {\n cwd = fp_root,\n \n encoding = 'utf-8',\n \n print = true,\n \n stdio = 'pipe',\n \n detached = false,\n \n env,\n}: StartOptions = { }): ChildProcess {\n const options: SpawnOptions = {\n cwd,\n shell: false,\n windowsHide: !detached,\n stdio,\n ... env ? {\n env: { ...process.env, ...env }\n } : { },\n }\n \n if (typeof print === 'boolean')\n print = {\n stdout: print,\n stderr: print,\n command: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n if (print.command)\n console.log(`${exe} ${ args.map(arg => arg.includes(' ') ? arg.quote() : arg).join(' ') }`.blue)\n \n if (detached) {\n let child = spawn(exe, args, {\n ...options,\n stdio: 'ignore',\n detached: true,\n })\n \n child.unref()\n return child\n }\n \n let child = spawn(exe, args, options)\n \n // 防止 child spawn 失败时 crash nodejs 进程\n child.on('error', error => {\n console.error(error)\n })\n \n if (stdio[0] === 'pipe')\n child.stdin.setDefaultEncoding('utf8')\n \n if (\n stdio.every(s => \n s === 'ignore')\n )\n return child\n \n if (encoding !== 'binary') {\n if (stdio[1] === 'pipe') {\n if (encoding === 'utf-8')\n child.stdout.setEncoding('utf-8')\n else\n child.stdout = child.stdout.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stdout)\n child.stdout.pipe(process.stdout, { end: false })\n }\n \n if (stdio[2] === 'pipe') {\n if (encoding === 'utf-8')\n child.stderr.setEncoding('utf-8')\n else\n child.stderr = child.stderr.pipe(\n iconv.decodeStream(encoding)\n ) as any as Readable\n \n if (print.stderr)\n child.stderr.pipe(process.stderr, { end: false })\n }\n }\n \n return child\n}\n\n\nexport interface CallOptions extends StartOptions {\n throw_code?: boolean\n input?: string\n}\n\nexport interface CallResult<T = string> {\n pid: number\n stdout: T\n stderr: T\n code: number | null\n signal: NodeJS.Signals | null\n child: ChildProcess\n [inspect.custom] (): string\n}\n\n\n/** call process for result\n - exe: .exe path or filename (full path is recommanded to skip path searching for better perf)\n - args: `[]` arguments list\n - options?:\n - cwd?: `'d:/'`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - input?: string\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` whether to throw Error when code is not 0\n*/\nexport async function call (exe: string, args?: string[]): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }): Promise<CallResult<string>>\nexport async function call (exe: string, args?: string[], options?: CallOptions & { encoding: 'binary' }): Promise<CallResult<Buffer>>\nexport async function call (exe: string, args: string[] = [], options: CallOptions = { }): Promise<CallResult<string | Buffer>> {\n const {\n encoding = 'utf-8', \n throw_code = true,\n input,\n } = options\n \n let {\n stdio = 'pipe',\n print = true\n } = options\n \n if (typeof print === 'boolean')\n print = {\n command: print,\n stdout: print,\n stderr: print,\n code: print,\n }\n \n if (typeof stdio === 'string')\n stdio = [stdio, stdio, stdio]\n \n const cmd = \n (exe.includes(' ') ? exe.quote() : exe) + \n args.length ? (\n ' ' + \n args.map(arg => \n arg.includes(' ') ? arg.quote() : arg\n ).join(' ')\n ) : ''\n \n if (print.command)\n console.log(cmd.blue)\n \n let child = start(exe, args, {\n ...options,\n print: false,\n })\n \n if (input)\n child.stdin.write(input)\n \n // --- collect output\n let stdouts: (string | Buffer)[] = [ ]\n let stderrs: (string | Buffer)[] = [ ]\n \n let code: number | null, \n signal: NodeJS.Signals\n \n await Promise.all([\n new Promise<void>(resolve => {\n child.once('exit', (_code, _signal) => {\n code = _code\n signal = _signal\n resolve()\n })\n }),\n (async () => {\n if (stdio[1] === 'pipe')\n for await (const chunk of child.stdout as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stdout)\n process.stdout.write(chunk)\n stdouts.push(chunk)\n }\n })(),\n (async () => {\n if (stdio[2] === 'pipe')\n for await (const chunk of child.stderr as AsyncIterable<string | Buffer>) {\n if (encoding !== 'binary' && print.stderr)\n process.stderr.write(chunk)\n stderrs.push(chunk)\n }\n })()\n ])\n \n const message = `process(${child.pid}) (${cmd}) exited ${code}${ signal ? `, by signal ${ signal }` : '' }.`\n \n if (print.code || code || signal)\n console.log(message[code || signal ? 'red' : 'blue'])\n \n const result = {\n pid: child.pid,\n \n stdout: encoding === 'binary' ?\n Buffer.concat(stdouts as Buffer[])\n :\n (stdouts as string[]).join(''),\n \n stderr: encoding === 'binary' ?\n Buffer.concat(stderrs as Buffer[])\n :\n (stderrs as string[]).join(''),\n \n code,\n \n signal,\n \n child,\n \n [inspect.custom] () {\n return inspect(this, { omit: ['child'] })\n }\n }\n \n if (code && throw_code)\n throw Object.assign(\n new Error(message), \n result\n )\n \n return result\n}\n\n\n/** call node <js> for result\n - js: .js path (relative path will resolve based on cwd)\n - args: `[]` arguments list\n - options\n - cwd?: `'d:/'`\n - env?: `process.env` overwrite/add to process.env\n - encoding?: `'utf-8'` child process output encoding\n - print?: `true` print option (with details)\n - stdio?: `'pipe'` when 'ignore' then ignore stdio processing\n - detached?: `false` whether to break the connection with child (ignore stdio, unref)\n - throw_code?: `true` whether to throw Error when code is not 0\n*/\nexport async function call_node (js: string, args: string[] = [], options?: CallOptions & { encoding?: 'utf-8' | 'gb18030' }) {\n return call(exe_node, [js, ...args], options)\n}\n\n"]}
|
package/server.d.ts
CHANGED