reddb-cli 0.1.2-next.30 → 0.1.2-next.32
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/README.md +18 -21
- package/package.json +1 -1
- package/sdk/index.d.ts +0 -5
- package/sdk/red-sdk.js +5 -279
package/README.md
CHANGED
|
@@ -35,8 +35,7 @@ RedDB uses the same core engine across three practical modes:
|
|
|
35
35
|
That means the storage model stays the same whether you:
|
|
36
36
|
|
|
37
37
|
- open a local `.rdb` file inside your Rust process
|
|
38
|
-
- run `red server --http`
|
|
39
|
-
- run `red server --grpc`
|
|
38
|
+
- run `red server --grpc-bind 127.0.0.1:50051 --http-bind 127.0.0.1:8080`
|
|
40
39
|
- expose the same database to AI agents through MCP
|
|
41
40
|
|
|
42
41
|
## Install
|
|
@@ -69,24 +68,18 @@ Release page:
|
|
|
69
68
|
|
|
70
69
|
### npx
|
|
71
70
|
|
|
72
|
-
`reddb` is also published as an npm
|
|
71
|
+
`reddb-cli` is also published as an npm package that installs and runs the real `red` binary for you.
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
Run RedDB through `npx`:
|
|
75
74
|
|
|
76
75
|
```bash
|
|
77
|
-
npx reddb
|
|
76
|
+
npx reddb-cli@latest version
|
|
78
77
|
```
|
|
79
78
|
|
|
80
|
-
|
|
79
|
+
Start an HTTP server through `npx`:
|
|
81
80
|
|
|
82
81
|
```bash
|
|
83
|
-
npx reddb
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Wrapper help:
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
npx reddb --sdk-help
|
|
82
|
+
npx reddb-cli@latest server --http --path ./data/reddb.rdb --bind 127.0.0.1:8080
|
|
90
83
|
```
|
|
91
84
|
|
|
92
85
|
### Build from source
|
|
@@ -98,11 +91,14 @@ cargo build --release --bin red
|
|
|
98
91
|
|
|
99
92
|
## Run a server
|
|
100
93
|
|
|
101
|
-
###
|
|
94
|
+
### Local Dev
|
|
102
95
|
|
|
103
96
|
```bash
|
|
104
97
|
mkdir -p ./data
|
|
105
|
-
red server
|
|
98
|
+
red server \
|
|
99
|
+
--path ./data/reddb.rdb \
|
|
100
|
+
--grpc-bind 127.0.0.1:50051 \
|
|
101
|
+
--http-bind 127.0.0.1:8080
|
|
106
102
|
```
|
|
107
103
|
|
|
108
104
|
Create data:
|
|
@@ -133,12 +129,10 @@ Health check:
|
|
|
133
129
|
curl -s http://127.0.0.1:8080/health
|
|
134
130
|
```
|
|
135
131
|
|
|
136
|
-
|
|
132
|
+
This is the recommended local setup because it gives you:
|
|
137
133
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
red server --grpc --path ./data/reddb.rdb --bind 127.0.0.1:50051
|
|
141
|
-
```
|
|
134
|
+
- HTTP for `curl`, browser tooling, and scripts
|
|
135
|
+
- gRPC for `red connect` and service-to-service clients
|
|
142
136
|
|
|
143
137
|
## Connect to RedDB
|
|
144
138
|
|
|
@@ -162,7 +156,10 @@ curl -X POST http://127.0.0.1:8080/query \
|
|
|
162
156
|
Start a gRPC server first:
|
|
163
157
|
|
|
164
158
|
```bash
|
|
165
|
-
red server
|
|
159
|
+
red server \
|
|
160
|
+
--path ./data/reddb.rdb \
|
|
161
|
+
--grpc-bind 127.0.0.1:50051 \
|
|
162
|
+
--http-bind 127.0.0.1:8080
|
|
166
163
|
```
|
|
167
164
|
|
|
168
165
|
Then connect:
|
package/package.json
CHANGED
package/sdk/index.d.ts
CHANGED
|
@@ -135,8 +135,6 @@ export interface InternalNamespace {
|
|
|
135
135
|
ensureObject: (...args: unknown[]) => unknown;
|
|
136
136
|
execFilePromise: (...args: unknown[]) => unknown;
|
|
137
137
|
exists: (...args: unknown[]) => unknown;
|
|
138
|
-
formatWrapperBinaryStatus: (...args: unknown[]) => unknown;
|
|
139
|
-
formatWrapperHelp: (...args: unknown[]) => unknown;
|
|
140
138
|
getBinaryInfo: (...args: unknown[]) => unknown;
|
|
141
139
|
getDefaultBinaryName: (...args: unknown[]) => unknown;
|
|
142
140
|
getInstalledVersion: (...args: unknown[]) => unknown;
|
|
@@ -146,7 +144,6 @@ export interface InternalNamespace {
|
|
|
146
144
|
legacyInstallDir: (...args: unknown[]) => unknown;
|
|
147
145
|
normalizeReleaseTag: (...args: unknown[]) => unknown;
|
|
148
146
|
parseInstalledVersion: (...args: unknown[]) => unknown;
|
|
149
|
-
parseWrapperArgs: (...args: unknown[]) => unknown;
|
|
150
147
|
request: (...args: unknown[]) => unknown;
|
|
151
148
|
requestJson: (...args: unknown[]) => unknown;
|
|
152
149
|
requestText: (...args: unknown[]) => unknown;
|
|
@@ -157,11 +154,9 @@ export interface InternalNamespace {
|
|
|
157
154
|
resolveManagedBinaryPath: (...args: unknown[]) => unknown;
|
|
158
155
|
resolveManagedUpgradeDestination: (...args: unknown[]) => unknown;
|
|
159
156
|
sha256File: (...args: unknown[]) => unknown;
|
|
160
|
-
splitWrapperArgs: (...args: unknown[]) => unknown;
|
|
161
157
|
spawnBinary: (...args: unknown[]) => unknown;
|
|
162
158
|
upgradeBinary: (...args: unknown[]) => unknown;
|
|
163
159
|
waitForChild: (...args: unknown[]) => unknown;
|
|
164
|
-
writeLine: (...args: unknown[]) => unknown;
|
|
165
160
|
verifyChecksum: (...args: unknown[]) => unknown;
|
|
166
161
|
}
|
|
167
162
|
|
package/sdk/red-sdk.js
CHANGED
|
@@ -11,27 +11,6 @@ const { execFile, spawn } = require('child_process');
|
|
|
11
11
|
|
|
12
12
|
const SDK_VERSION = require(path.join(__dirname, '..', 'package.json')).version;
|
|
13
13
|
const DEFAULT_REPO = 'forattini-dev/reddb';
|
|
14
|
-
const WRAPPER_OPTION_TYPES = Object.freeze({
|
|
15
|
-
'asset-name': 'string',
|
|
16
|
-
'auto-download': 'boolean',
|
|
17
|
-
'binary-path': 'string',
|
|
18
|
-
channel: 'string',
|
|
19
|
-
'check-update': 'boolean',
|
|
20
|
-
download: 'boolean',
|
|
21
|
-
force: 'boolean',
|
|
22
|
-
'github-token': 'string',
|
|
23
|
-
install: 'boolean',
|
|
24
|
-
'no-verify': 'boolean',
|
|
25
|
-
'print-binary-path': 'boolean',
|
|
26
|
-
'release-version': 'string',
|
|
27
|
-
repo: 'string',
|
|
28
|
-
'sdk-help': 'boolean',
|
|
29
|
-
'static-build': 'boolean',
|
|
30
|
-
'target-dir': 'string',
|
|
31
|
-
upgrade: 'boolean',
|
|
32
|
-
version: 'string',
|
|
33
|
-
verify: 'boolean'
|
|
34
|
-
});
|
|
35
14
|
|
|
36
15
|
function getDefaultBinaryName(platform = process.platform) {
|
|
37
16
|
return platform === 'win32' ? 'red.exe' : 'red';
|
|
@@ -537,193 +516,6 @@ function spawnBinary(binaryPath, args, options = {}) {
|
|
|
537
516
|
});
|
|
538
517
|
}
|
|
539
518
|
|
|
540
|
-
function splitWrapperArgs(argv) {
|
|
541
|
-
const rawArgs = Array.isArray(argv) ? argv.slice() : [];
|
|
542
|
-
const wrapperArgs = [];
|
|
543
|
-
let index = 0;
|
|
544
|
-
|
|
545
|
-
while (index < rawArgs.length) {
|
|
546
|
-
const token = rawArgs[index];
|
|
547
|
-
|
|
548
|
-
if (token === '--') {
|
|
549
|
-
return {
|
|
550
|
-
wrapperArgs,
|
|
551
|
-
passthroughArgs: rawArgs.slice(index + 1),
|
|
552
|
-
usedDoubleDash: true
|
|
553
|
-
};
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
if (!token || !token.startsWith('--')) {
|
|
557
|
-
break;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
const eqIndex = token.indexOf('=');
|
|
561
|
-
const optionName = token.slice(2, eqIndex === -1 ? undefined : eqIndex);
|
|
562
|
-
const optionType = WRAPPER_OPTION_TYPES[optionName];
|
|
563
|
-
|
|
564
|
-
if (!optionType) {
|
|
565
|
-
break;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
if (optionType === 'string' && eqIndex === -1) {
|
|
569
|
-
const nextToken = rawArgs[index + 1];
|
|
570
|
-
if (optionName === 'version' && (!nextToken || String(nextToken).startsWith('-'))) {
|
|
571
|
-
break;
|
|
572
|
-
}
|
|
573
|
-
if (nextToken === undefined) {
|
|
574
|
-
wrapperArgs.push(token);
|
|
575
|
-
index += 1;
|
|
576
|
-
continue;
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
wrapperArgs.push(token);
|
|
581
|
-
index += 1;
|
|
582
|
-
|
|
583
|
-
if (optionType === 'string' && eqIndex === -1 && index < rawArgs.length) {
|
|
584
|
-
wrapperArgs.push(rawArgs[index]);
|
|
585
|
-
index += 1;
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
return {
|
|
590
|
-
wrapperArgs,
|
|
591
|
-
passthroughArgs: rawArgs.slice(index),
|
|
592
|
-
usedDoubleDash: false
|
|
593
|
-
};
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
async function parseWrapperArgs(argv, runtime = {}) {
|
|
597
|
-
const split = splitWrapperArgs(argv);
|
|
598
|
-
|
|
599
|
-
const options = {};
|
|
600
|
-
const wrapperArgs = split.wrapperArgs;
|
|
601
|
-
|
|
602
|
-
for (let i = 0; i < wrapperArgs.length; i++) {
|
|
603
|
-
const token = wrapperArgs[i];
|
|
604
|
-
if (!token.startsWith('--')) continue;
|
|
605
|
-
|
|
606
|
-
const eqIndex = token.indexOf('=');
|
|
607
|
-
const name = eqIndex !== -1 ? token.slice(2, eqIndex) : token.slice(2);
|
|
608
|
-
const type = WRAPPER_OPTION_TYPES[name];
|
|
609
|
-
|
|
610
|
-
if (!type) continue;
|
|
611
|
-
|
|
612
|
-
if (type === 'boolean') {
|
|
613
|
-
options[name] = true;
|
|
614
|
-
} else if (eqIndex !== -1) {
|
|
615
|
-
options[name] = token.slice(eqIndex + 1);
|
|
616
|
-
} else if (i + 1 < wrapperArgs.length) {
|
|
617
|
-
i++;
|
|
618
|
-
options[name] = wrapperArgs[i];
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
const releaseVersion = options['release-version'] || options['version'];
|
|
623
|
-
|
|
624
|
-
return {
|
|
625
|
-
passthroughArgs: split.passthroughArgs,
|
|
626
|
-
rawArgs: Array.isArray(argv) ? argv.slice() : [],
|
|
627
|
-
usedDoubleDash: split.usedDoubleDash,
|
|
628
|
-
resolveOptions: {
|
|
629
|
-
binaryPath: options['binary-path'],
|
|
630
|
-
targetDir: options['target-dir'],
|
|
631
|
-
autoDownload: options['auto-download'] || options['download'] || false,
|
|
632
|
-
repo: options['repo'],
|
|
633
|
-
channel: options['channel'],
|
|
634
|
-
releaseVersion,
|
|
635
|
-
assetName: options['asset-name'],
|
|
636
|
-
githubToken: options['github-token'],
|
|
637
|
-
verify: options['verify'] !== false && !options['no-verify'],
|
|
638
|
-
staticBuild: options['static-build'] || false,
|
|
639
|
-
force: options['force'] || false,
|
|
640
|
-
version: releaseVersion
|
|
641
|
-
},
|
|
642
|
-
wrapperOptions: {
|
|
643
|
-
sdkHelp: options['sdk-help'] || false,
|
|
644
|
-
checkUpdate: options['check-update'] || false,
|
|
645
|
-
upgrade: options['upgrade'] || false,
|
|
646
|
-
install: options['install'] || false,
|
|
647
|
-
printBinaryPath: options['print-binary-path'] || false
|
|
648
|
-
}
|
|
649
|
-
};
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
function writeLine(stream, message) {
|
|
653
|
-
stream.write(`${message}\n`);
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
function formatWrapperBinaryStatus(result) {
|
|
657
|
-
if (result && Object.prototype.hasOwnProperty.call(result, 'latestVersion')) {
|
|
658
|
-
if (!result.currentVersion) {
|
|
659
|
-
return `reddb is not installed; latest available is ${result.latestVersion}`;
|
|
660
|
-
}
|
|
661
|
-
if (result.hasUpdate) {
|
|
662
|
-
return `reddb update available at ${result.binaryPath}: ${result.currentVersion} -> ${result.latestVersion}`;
|
|
663
|
-
}
|
|
664
|
-
return `reddb is up to date at ${result.binaryPath} (${result.currentVersion})`;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
if (result && Object.prototype.hasOwnProperty.call(result, 'previousVersion')) {
|
|
668
|
-
if (!result.changed) {
|
|
669
|
-
return `reddb already at ${result.binaryPath} (${result.version || 'version unknown'})`;
|
|
670
|
-
}
|
|
671
|
-
if (result.previousVersion) {
|
|
672
|
-
return `reddb upgraded at ${result.binaryPath}: ${result.previousVersion} -> ${result.version}`;
|
|
673
|
-
}
|
|
674
|
-
return `reddb installed at ${result.binaryPath} (${result.version || 'version unknown'})`;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
if (result && result.binaryPath) {
|
|
678
|
-
if (!result.changed) {
|
|
679
|
-
return `reddb already installed at ${result.binaryPath}${result.version ? ` (${result.version})` : ''}`;
|
|
680
|
-
}
|
|
681
|
-
return `reddb installed at ${result.binaryPath}${result.version ? ` (${result.version})` : ''}`;
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
return 'reddb binary status unavailable';
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
function formatWrapperHelp() {
|
|
688
|
-
const lines = [
|
|
689
|
-
'reddb SDK wrapper',
|
|
690
|
-
'',
|
|
691
|
-
'Usage:',
|
|
692
|
-
' red [wrapper options] [reddb args]',
|
|
693
|
-
' npx reddb [reddb args]',
|
|
694
|
-
' pnpm dlx reddb -- [reddb args]',
|
|
695
|
-
'',
|
|
696
|
-
'Wrapper options:',
|
|
697
|
-
' --binary-path <path> Use an explicit reddb binary',
|
|
698
|
-
' --target-dir <dir> Resolve or install the managed binary in this directory',
|
|
699
|
-
' --auto-download Download the binary if it is missing before command execution',
|
|
700
|
-
' --install Ensure the managed binary is installed',
|
|
701
|
-
' --upgrade Upgrade the managed binary to the requested release',
|
|
702
|
-
' --check-update Check the installed binary against the latest release',
|
|
703
|
-
' --print-binary-path Print the resolved binary path and exit',
|
|
704
|
-
' --channel <name> Release channel for downloads (stable, latest, next)',
|
|
705
|
-
' --release-version <tag> Pin a release version for install or upgrade',
|
|
706
|
-
' --version <tag> Alias for --release-version',
|
|
707
|
-
' --asset-name <name> Override the release asset name',
|
|
708
|
-
' --repo <owner/name> Override the GitHub repository',
|
|
709
|
-
' --github-token <token> GitHub token for release downloads',
|
|
710
|
-
' --static-build Prefer static Linux assets when available',
|
|
711
|
-
' --force Force a reinstall when used with --upgrade',
|
|
712
|
-
' --no-verify Skip SHA256 verification on download',
|
|
713
|
-
' --sdk-help Show this wrapper help',
|
|
714
|
-
'',
|
|
715
|
-
'Notes:',
|
|
716
|
-
' Wrapper options must come before the reddb command.',
|
|
717
|
-
' Managed installs default to ~/.local/bin and still detect legacy ~/.reddb/bin installs.',
|
|
718
|
-
' When installed from pnpm/npm, the package postinstall step stores the managed binary',
|
|
719
|
-
' in package-local .reddb/bin and the wrapper can use it automatically.',
|
|
720
|
-
' Use "red --version" to query the real reddb binary version after installation.',
|
|
721
|
-
''
|
|
722
|
-
];
|
|
723
|
-
|
|
724
|
-
return lines.join('\n');
|
|
725
|
-
}
|
|
726
|
-
|
|
727
519
|
function waitForChild(child) {
|
|
728
520
|
return new Promise((resolve, reject) => {
|
|
729
521
|
child.on('error', reject);
|
|
@@ -844,82 +636,21 @@ async function createClient(options = {}) {
|
|
|
844
636
|
}
|
|
845
637
|
|
|
846
638
|
async function runCli(argv = process.argv.slice(2), runtime = {}) {
|
|
847
|
-
const stdout = runtime.stdout || process.stdout;
|
|
848
639
|
const stderr = runtime.stderr || process.stderr;
|
|
849
640
|
|
|
850
641
|
try {
|
|
851
|
-
const
|
|
852
|
-
const cliOptions =
|
|
642
|
+
const rawArgs = Array.isArray(argv) ? argv.slice() : [];
|
|
643
|
+
const cliOptions = {
|
|
853
644
|
cwd: runtime.cwd || process.cwd(),
|
|
854
645
|
env: Object.assign({}, process.env, runtime.env || {})
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
if (parsed.wrapperOptions.sdkHelp) {
|
|
858
|
-
writeLine(stdout, formatWrapperHelp());
|
|
859
|
-
return 0;
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
let resolvedInfo = null;
|
|
863
|
-
|
|
864
|
-
if (parsed.wrapperOptions.checkUpdate) {
|
|
865
|
-
const updateStatus = await checkForUpdates(cliOptions);
|
|
866
|
-
const updateMessage = formatWrapperBinaryStatus(updateStatus);
|
|
867
|
-
|
|
868
|
-
if (parsed.passthroughArgs.length === 0) {
|
|
869
|
-
writeLine(stdout, updateMessage);
|
|
870
|
-
return 0;
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
writeLine(stderr, updateMessage);
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
if (parsed.wrapperOptions.upgrade) {
|
|
877
|
-
const upgradeResult = await upgradeBinary(cliOptions);
|
|
878
|
-
resolvedInfo = {
|
|
879
|
-
binaryPath: upgradeResult.binaryPath,
|
|
880
|
-
source: upgradeResult.source
|
|
881
|
-
};
|
|
882
|
-
|
|
883
|
-
if (parsed.passthroughArgs.length === 0 && !parsed.wrapperOptions.printBinaryPath) {
|
|
884
|
-
writeLine(stdout, formatWrapperBinaryStatus(upgradeResult));
|
|
885
|
-
return 0;
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
writeLine(stderr, formatWrapperBinaryStatus(upgradeResult));
|
|
889
|
-
} else if (parsed.wrapperOptions.install) {
|
|
890
|
-
const installResult = await ensureInstalled(cliOptions);
|
|
891
|
-
resolvedInfo = {
|
|
892
|
-
binaryPath: installResult.binaryPath,
|
|
893
|
-
source: installResult.source
|
|
894
|
-
};
|
|
895
|
-
|
|
896
|
-
if (parsed.passthroughArgs.length === 0 && !parsed.wrapperOptions.printBinaryPath) {
|
|
897
|
-
writeLine(stdout, formatWrapperBinaryStatus(installResult));
|
|
898
|
-
return 0;
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
writeLine(stderr, formatWrapperBinaryStatus(installResult));
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
if (!resolvedInfo) {
|
|
905
|
-
resolvedInfo = await resolveBinaryWithInfo(cliOptions);
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
if (parsed.wrapperOptions.printBinaryPath) {
|
|
909
|
-
if (parsed.passthroughArgs.length === 0) {
|
|
910
|
-
writeLine(stdout, resolvedInfo.binaryPath);
|
|
911
|
-
return 0;
|
|
912
|
-
}
|
|
913
|
-
writeLine(stderr, `reddb binary: ${resolvedInfo.binaryPath}`);
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
const binaryPath = resolvedInfo.binaryPath;
|
|
646
|
+
};
|
|
647
|
+
const binaryPath = await resolveBinary(cliOptions);
|
|
917
648
|
const spawnOptions = {
|
|
918
649
|
cwd: runtime.cwd || process.cwd(),
|
|
919
650
|
env: Object.assign({}, process.env, runtime.env || {}),
|
|
920
651
|
stdio: runtime.stdio || 'inherit'
|
|
921
652
|
};
|
|
922
|
-
const child = spawnBinary(binaryPath,
|
|
653
|
+
const child = spawnBinary(binaryPath, rawArgs, spawnOptions);
|
|
923
654
|
|
|
924
655
|
return waitForChild(child);
|
|
925
656
|
} catch (error) {
|
|
@@ -955,8 +686,6 @@ module.exports._internal = {
|
|
|
955
686
|
ensureObject,
|
|
956
687
|
execFilePromise,
|
|
957
688
|
exists,
|
|
958
|
-
formatWrapperBinaryStatus,
|
|
959
|
-
formatWrapperHelp,
|
|
960
689
|
getBinaryInfo,
|
|
961
690
|
getDefaultBinaryName,
|
|
962
691
|
getInstalledVersion,
|
|
@@ -966,7 +695,6 @@ module.exports._internal = {
|
|
|
966
695
|
legacyInstallDir,
|
|
967
696
|
normalizeReleaseTag,
|
|
968
697
|
parseInstalledVersion,
|
|
969
|
-
parseWrapperArgs,
|
|
970
698
|
request,
|
|
971
699
|
requestJson,
|
|
972
700
|
requestText,
|
|
@@ -977,11 +705,9 @@ module.exports._internal = {
|
|
|
977
705
|
resolveManagedBinaryPath,
|
|
978
706
|
resolveManagedUpgradeDestination,
|
|
979
707
|
sha256File,
|
|
980
|
-
splitWrapperArgs,
|
|
981
708
|
spawnBinary,
|
|
982
709
|
upgradeBinary,
|
|
983
710
|
waitForChild,
|
|
984
|
-
writeLine,
|
|
985
711
|
verifyChecksum
|
|
986
712
|
};
|
|
987
713
|
|