echogarden 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -1
- package/data/lexicons/heteronyms.json +674 -0
- package/data/schemas/options.json +1057 -0
- package/data/tables/lcid-table.json +7427 -0
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignment.js +99 -0
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
- package/dist/alignment/SpeechAlignment.d.ts +27 -0
- package/dist/alignment/SpeechAlignment.js +266 -0
- package/dist/alignment/SpeechAlignment.js.map +1 -0
- package/dist/api/API.d.ts +8 -0
- package/dist/api/API.js +10 -0
- package/dist/api/API.js.map +1 -0
- package/dist/api/APIOptions.d.ts +12 -0
- package/dist/api/APIOptions.js +2 -0
- package/dist/api/APIOptions.js.map +1 -0
- package/dist/api/Alignment.d.ts +32 -0
- package/dist/api/Alignment.js +134 -0
- package/dist/api/Alignment.js.map +1 -0
- package/dist/api/Denoising.d.ts +14 -0
- package/dist/api/Denoising.js +66 -0
- package/dist/api/Denoising.js.map +1 -0
- package/dist/api/Globals.d.ts +1 -0
- package/dist/api/Globals.js +2 -0
- package/dist/api/Globals.js.map +1 -0
- package/dist/api/LanguageDetection.d.ts +49 -0
- package/dist/api/LanguageDetection.js +118 -0
- package/dist/api/LanguageDetection.js.map +1 -0
- package/dist/api/Recognition.d.ts +49 -0
- package/dist/api/Recognition.js +162 -0
- package/dist/api/Recognition.js.map +1 -0
- package/dist/api/Synthesis.d.ts +125 -0
- package/dist/api/Synthesis.js +892 -0
- package/dist/api/Synthesis.js.map +1 -0
- package/dist/api/Translation.d.ts +25 -0
- package/dist/api/Translation.js +69 -0
- package/dist/api/Translation.js.map +1 -0
- package/dist/api/Vad.d.ts +25 -0
- package/dist/api/Vad.js +88 -0
- package/dist/api/Vad.js.map +1 -0
- package/dist/audio/AudioBufferConversion.d.ts +15 -0
- package/dist/audio/AudioBufferConversion.js +228 -0
- package/dist/audio/AudioBufferConversion.js.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +9 -0
- package/dist/audio/AudioPlayer.js +232 -0
- package/dist/audio/AudioPlayer.js.map +1 -0
- package/dist/audio/AudioRecorder.d.ts +3 -0
- package/dist/audio/AudioRecorder.js +68 -0
- package/dist/audio/AudioRecorder.js.map +1 -0
- package/dist/audio/AudioUtilities.d.ts +48 -0
- package/dist/audio/AudioUtilities.js +209 -0
- package/dist/audio/AudioUtilities.js.map +1 -0
- package/dist/audio/SoxPath.d.ts +1 -0
- package/dist/audio/SoxPath.js +19 -0
- package/dist/audio/SoxPath.js.map +1 -0
- package/dist/cli/CLI.d.ts +8 -0
- package/dist/cli/CLI.js +860 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/CLIConfigFile.d.ts +3 -0
- package/dist/cli/CLIConfigFile.js +62 -0
- package/dist/cli/CLIConfigFile.js.map +1 -0
- package/dist/cli/CLILauncher.d.ts +2 -0
- package/dist/cli/CLILauncher.js +22 -0
- package/dist/cli/CLILauncher.js.map +1 -0
- package/dist/cli/CLIOptionsSchema.d.ts +5 -0
- package/dist/cli/CLIOptionsSchema.js +36 -0
- package/dist/cli/CLIOptionsSchema.js.map +1 -0
- package/dist/cli/CLIParser.d.ts +6 -0
- package/dist/cli/CLIParser.js +34 -0
- package/dist/cli/CLIParser.js.map +1 -0
- package/dist/cli/CLIStarter.d.ts +1 -0
- package/dist/cli/CLIStarter.js +3 -0
- package/dist/cli/CLIStarter.js.map +1 -0
- package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
- package/dist/codecs/FFMpegTranscoder.js +169 -0
- package/dist/codecs/FFMpegTranscoder.js.map +1 -0
- package/dist/codecs/TIMITCodec.d.ts +9 -0
- package/dist/codecs/TIMITCodec.js +14 -0
- package/dist/codecs/TIMITCodec.js.map +1 -0
- package/dist/codecs/WaveCodec.d.ts +19 -0
- package/dist/codecs/WaveCodec.js +208 -0
- package/dist/codecs/WaveCodec.js.map +1 -0
- package/dist/denoising/RNNoise.d.ts +6 -0
- package/dist/denoising/RNNoise.js +68 -0
- package/dist/denoising/RNNoise.js.map +1 -0
- package/dist/dsp/BiquadFilter.d.ts +26 -0
- package/dist/dsp/BiquadFilter.js +399 -0
- package/dist/dsp/BiquadFilter.js.map +1 -0
- package/dist/dsp/FFT.d.ts +9 -0
- package/dist/dsp/FFT.js +135 -0
- package/dist/dsp/FFT.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +25 -0
- package/dist/dsp/MFCC.js +162 -0
- package/dist/dsp/MFCC.js.map +1 -0
- package/dist/dsp/MelSpectogram.d.ts +19 -0
- package/dist/dsp/MelSpectogram.js +102 -0
- package/dist/dsp/MelSpectogram.js.map +1 -0
- package/dist/dsp/Rubberband.d.ts +52 -0
- package/dist/dsp/Rubberband.js +186 -0
- package/dist/dsp/Rubberband.js.map +1 -0
- package/dist/dsp/Sonic.d.ts +2 -0
- package/dist/dsp/Sonic.js +39 -0
- package/dist/dsp/Sonic.js.map +1 -0
- package/dist/dsp/SpeexResampler.d.ts +3 -0
- package/dist/dsp/SpeexResampler.js +53 -0
- package/dist/dsp/SpeexResampler.js.map +1 -0
- package/dist/math/VectorMath.d.ts +70 -0
- package/dist/math/VectorMath.js +564 -0
- package/dist/math/VectorMath.js.map +1 -0
- package/dist/nlp/ChineseSegmentation.d.ts +1 -0
- package/dist/nlp/ChineseSegmentation.js +53 -0
- package/dist/nlp/ChineseSegmentation.js.map +1 -0
- package/dist/nlp/CompromiseNLP.d.ts +15 -0
- package/dist/nlp/CompromiseNLP.js +66 -0
- package/dist/nlp/CompromiseNLP.js.map +1 -0
- package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
- package/dist/nlp/EspeakPhonemizer.js +133 -0
- package/dist/nlp/EspeakPhonemizer.js.map +1 -0
- package/dist/nlp/IPA.d.ts +19 -0
- package/dist/nlp/IPA.js +113 -0
- package/dist/nlp/IPA.js.map +1 -0
- package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
- package/dist/nlp/JapaneseSegmentation.js +40 -0
- package/dist/nlp/JapaneseSegmentation.js.map +1 -0
- package/dist/nlp/Lexicon.d.ts +17 -0
- package/dist/nlp/Lexicon.js +6 -0
- package/dist/nlp/Lexicon.js.map +1 -0
- package/dist/nlp/PhoneConversion.d.ts +6 -0
- package/dist/nlp/PhoneConversion.js +467 -0
- package/dist/nlp/PhoneConversion.js.map +1 -0
- package/dist/nlp/Segmentation.d.ts +41 -0
- package/dist/nlp/Segmentation.js +158 -0
- package/dist/nlp/Segmentation.js.map +1 -0
- package/dist/nlp/TextNormalizer.d.ts +4 -0
- package/dist/nlp/TextNormalizer.js +69 -0
- package/dist/nlp/TextNormalizer.js.map +1 -0
- package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
- package/dist/recognition/AmazonTranscribeSTT.js +79 -0
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
- package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
- package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
- package/dist/recognition/GoogleCloudSTT.js +66 -0
- package/dist/recognition/GoogleCloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +9 -0
- package/dist/recognition/SileroSTT.js +125 -0
- package/dist/recognition/SileroSTT.js.map +1 -0
- package/dist/recognition/VoskSTT.d.ts +10 -0
- package/dist/recognition/VoskSTT.js +78 -0
- package/dist/recognition/VoskSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +69 -0
- package/dist/recognition/WhisperSTT.js +977 -0
- package/dist/recognition/WhisperSTT.js.map +1 -0
- package/dist/server/Server.d.ts +1 -0
- package/dist/server/Server.js +18 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
- package/dist/subtitles/Subtitles.d.ts +25 -0
- package/dist/subtitles/Subtitles.js +286 -0
- package/dist/subtitles/Subtitles.js.map +1 -0
- package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
- package/dist/synthesis/AwsPollyTTS.js +51 -0
- package/dist/synthesis/AwsPollyTTS.js.map +1 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
- package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
- package/dist/synthesis/CoquiServerTTS.js +22 -0
- package/dist/synthesis/CoquiServerTTS.js.map +1 -0
- package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
- package/dist/synthesis/ElevenLabsTTS.js +48 -0
- package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +46 -0
- package/dist/synthesis/EspeakTTS.js +353 -0
- package/dist/synthesis/EspeakTTS.js.map +1 -0
- package/dist/synthesis/FliteTTS.d.ts +17 -0
- package/dist/synthesis/FliteTTS.js +326 -0
- package/dist/synthesis/FliteTTS.js.map +1 -0
- package/dist/synthesis/GoogleCloudTTS.d.ts +16 -0
- package/dist/synthesis/GoogleCloudTTS.js +72 -0
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
- package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
- package/dist/synthesis/GoogleTranslateTTS.js +177 -0
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.d.ts +4 -0
- package/dist/synthesis/SamTTS.js +21 -0
- package/dist/synthesis/SamTTS.js.map +1 -0
- package/dist/synthesis/SapiTTS.d.ts +9 -0
- package/dist/synthesis/SapiTTS.js +211 -0
- package/dist/synthesis/SapiTTS.js.map +1 -0
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
- package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
- package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
- package/dist/synthesis/SvoxPicoTTS.js +236 -0
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
- package/dist/synthesis/VitsTTS.d.ts +27 -0
- package/dist/synthesis/VitsTTS.js +359 -0
- package/dist/synthesis/VitsTTS.js.map +1 -0
- package/dist/tests/Test.d.ts +1 -0
- package/dist/tests/Test.js +10 -0
- package/dist/tests/Test.js.map +1 -0
- package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
- package/dist/utilities/BinaryArrayConversion.js +115 -0
- package/dist/utilities/BinaryArrayConversion.js.map +1 -0
- package/dist/utilities/Compression.d.ts +4 -0
- package/dist/utilities/Compression.js +67 -0
- package/dist/utilities/Compression.js.map +1 -0
- package/dist/utilities/FileDownloader.d.ts +3 -0
- package/dist/utilities/FileDownloader.js +147 -0
- package/dist/utilities/FileDownloader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +30 -0
- package/dist/utilities/FileSystem.js +141 -0
- package/dist/utilities/FileSystem.js.map +1 -0
- package/dist/utilities/Hashing.d.ts +10 -0
- package/dist/utilities/Hashing.js +169 -0
- package/dist/utilities/Hashing.js.map +1 -0
- package/dist/utilities/Locale.d.ts +9 -0
- package/dist/utilities/Locale.js +65 -0
- package/dist/utilities/Locale.js.map +1 -0
- package/dist/utilities/Logger.d.ts +11 -0
- package/dist/utilities/Logger.js +49 -0
- package/dist/utilities/Logger.js.map +1 -0
- package/dist/utilities/NdArrayUtilities.d.ts +3 -0
- package/dist/utilities/NdArrayUtilities.js +22 -0
- package/dist/utilities/NdArrayUtilities.js.map +1 -0
- package/dist/utilities/ObjectUtilities.d.ts +4 -0
- package/dist/utilities/ObjectUtilities.js +132 -0
- package/dist/utilities/ObjectUtilities.js.map +1 -0
- package/dist/utilities/OpenPromise.d.ts +6 -0
- package/dist/utilities/OpenPromise.js +12 -0
- package/dist/utilities/OpenPromise.js.map +1 -0
- package/dist/utilities/PackageManager.d.ts +4 -0
- package/dist/utilities/PackageManager.js +46 -0
- package/dist/utilities/PackageManager.js.map +1 -0
- package/dist/utilities/RandomGenerator.d.ts +35 -0
- package/dist/utilities/RandomGenerator.js +149 -0
- package/dist/utilities/RandomGenerator.js.map +1 -0
- package/dist/utilities/TarballMaker.d.ts +4 -0
- package/dist/utilities/TarballMaker.js +50 -0
- package/dist/utilities/TarballMaker.js.map +1 -0
- package/dist/utilities/Timeline.d.ts +20 -0
- package/dist/utilities/Timeline.js +110 -0
- package/dist/utilities/Timeline.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +68 -0
- package/dist/utilities/Utilities.js +305 -0
- package/dist/utilities/Utilities.js.map +1 -0
- package/dist/utilities/WasmMemoryManager.d.ts +142 -0
- package/dist/utilities/WasmMemoryManager.js +407 -0
- package/dist/utilities/WasmMemoryManager.js.map +1 -0
- package/dist/utilities/WebReader.d.ts +1 -0
- package/dist/utilities/WebReader.js +47 -0
- package/dist/utilities/WebReader.js.map +1 -0
- package/dist/utilities/WikipediaReader.d.ts +1 -0
- package/dist/utilities/WikipediaReader.js +31 -0
- package/dist/utilities/WikipediaReader.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
- package/dist/voice-activity-detection/SileroVAD.js +58 -0
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
- package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
- package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
- package/docs/CLI.md +234 -0
- package/docs/Development.md +3 -0
- package/docs/Engines.md +80 -0
- package/docs/Licenses.md +37 -0
- package/docs/Options.md +192 -0
- package/docs/Roadmap.md +16 -0
- package/docs/Technical.md +72 -0
- package/package.json +119 -19
- package/cli.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Test.js","sourceRoot":"","sources":["../../src/tests/Test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAIzF,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,gCAAgC,EAAE,CAAA;AAClC,gDAAgD;AAChD,kDAAkD;AAElD,yhBAAyhB;AAEzhB,8CAA8C;AAE9C,8CAA8C;AAE9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { languageCodeToName } from '../utilities/Locale.js';
|
|
3
|
+
import { OpenPromise } from '../utilities/OpenPromise.js';
|
|
4
|
+
import { resolveModuleMainPath, roundToDigits } from '../utilities/Utilities.js';
|
|
5
|
+
let fastTextLanguageDetectionModel;
|
|
6
|
+
export async function detectLanguage(text, defaultLang = "en-US", probabilityThreshold = 0.01) {
|
|
7
|
+
const model = await loadLanguageDetectionModel();
|
|
8
|
+
const predictionsVector = model.predict(text, -1, 0.0);
|
|
9
|
+
const predictions = [];
|
|
10
|
+
for (let i = 0; i < predictionsVector.size(); i++) {
|
|
11
|
+
const prediction = predictionsVector.get(i);
|
|
12
|
+
const languageCode = prediction[1].substring(9);
|
|
13
|
+
const probability = roundToDigits(prediction[0], 3);
|
|
14
|
+
predictions.push({
|
|
15
|
+
language: languageCode,
|
|
16
|
+
languageName: languageCodeToName(languageCode),
|
|
17
|
+
probability
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return predictions;
|
|
21
|
+
}
|
|
22
|
+
async function loadLanguageDetectionModel() {
|
|
23
|
+
if (fastTextLanguageDetectionModel) {
|
|
24
|
+
return fastTextLanguageDetectionModel;
|
|
25
|
+
}
|
|
26
|
+
const { FastText, addOnPostRun } = await import('@echogarden/fasttext-wasm');
|
|
27
|
+
const resultPromise = new OpenPromise();
|
|
28
|
+
addOnPostRun(async () => {
|
|
29
|
+
const fastText = new FastText();
|
|
30
|
+
const moduleMainPath = await resolveModuleMainPath('@echogarden/fasttext-wasm');
|
|
31
|
+
const modelPath = path.join(path.dirname(moduleMainPath), 'lid.176.ftz');
|
|
32
|
+
const model = await fastText.loadModel(modelPath);
|
|
33
|
+
fastTextLanguageDetectionModel = model;
|
|
34
|
+
resultPromise.resolve(model);
|
|
35
|
+
});
|
|
36
|
+
return resultPromise.promise;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=FastTextLanguageDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FastTextLanguageDetection.js","sourceRoot":"","sources":["../../src/text-language-detection/FastTextLanguageDetection.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEhF,IAAI,8BAAmC,CAAA;AAEvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,WAAW,GAAG,OAAO,EAAE,oBAAoB,GAAG,IAAI;IACpG,MAAM,KAAK,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAEhD,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAEtD,MAAM,WAAW,GAA6B,EAAE,CAAA;IAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAEnD,WAAW,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,YAAY;YACtB,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAAC;YAC9C,WAAW;SACX,CAAC,CAAA;KACF;IAED,OAAO,WAAW,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,0BAA0B;IACxC,IAAI,8BAA8B,EAAE;QACnC,OAAO,8BAA8B,CAAA;KACrC;IAED,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAA;IAE5E,MAAM,aAAa,GAAG,IAAI,WAAW,EAAO,CAAA;IAE5C,YAAY,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAE/B,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,2BAA2B,CAAC,CAAA;QAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAA;QAExE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAEjD,8BAA8B,GAAG,KAAK,CAAA;QACtC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,aAAa,CAAC,OAAO,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { detectAll } from 'tinyld';
|
|
2
|
+
import { languageCodeToName } from '../utilities/Locale.js';
|
|
3
|
+
export async function detectLanguage(text) {
|
|
4
|
+
const tinyldResults = detectAll(text);
|
|
5
|
+
const results = tinyldResults.map(result => ({
|
|
6
|
+
language: result.lang,
|
|
7
|
+
languageName: languageCodeToName(result.lang),
|
|
8
|
+
probability: result.accuracy
|
|
9
|
+
}));
|
|
10
|
+
return results;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=TinyLDLanguageDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TinyLDLanguageDetection.js","sourceRoot":"","sources":["../../src/text-language-detection/TinyLDLanguageDetection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAChD,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAErC,MAAM,OAAO,GACZ,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,YAAY,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,MAAM,CAAC,QAAQ;KAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
export declare function int8ToBuffer(ints: Int8Array): Buffer;
|
|
3
|
+
export declare function bufferToInt8(buffer: Buffer): Int8Array;
|
|
4
|
+
export declare function int16ToBufferLE(ints: Int16Array): Buffer;
|
|
5
|
+
export declare function bufferLEToInt16(buffer: Buffer): Int16Array;
|
|
6
|
+
export declare function int24ToBufferLE(ints: Int32Array): Buffer;
|
|
7
|
+
export declare function bufferLEToInt24(buffer: Buffer): Int32Array;
|
|
8
|
+
export declare function int32ToBufferLE(ints: Int32Array): Buffer;
|
|
9
|
+
export declare function bufferLEToInt32(buffer: Buffer): Int32Array;
|
|
10
|
+
export declare function float32ToBufferLE(floats: Float32Array): Buffer;
|
|
11
|
+
export declare function bufferLEToFloat32(buffer: Buffer): Float32Array;
|
|
12
|
+
export declare function float64ToBufferLE(floats: Float64Array): Buffer;
|
|
13
|
+
export declare function bufferLEToFloat64(buffer: Buffer): Float64Array;
|
|
14
|
+
export declare function float64Tofloat32(doubles: Float64Array): Float32Array;
|
|
15
|
+
export declare function float32Tofloat64(floats: Float32Array): Float64Array;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Typed arrays to Buffer (little endian) conversions
|
|
2
|
+
// int8 <-> bufferLE
|
|
3
|
+
export function int8ToBuffer(ints) {
|
|
4
|
+
const buffer = Buffer.alloc(ints.length);
|
|
5
|
+
for (let i = 0; i < ints.length; i++) {
|
|
6
|
+
buffer[i] = ints[i] + 128;
|
|
7
|
+
}
|
|
8
|
+
return buffer;
|
|
9
|
+
}
|
|
10
|
+
export function bufferToInt8(buffer) {
|
|
11
|
+
const result = new Int8Array(buffer.length);
|
|
12
|
+
for (let i = 0; i < result.length; i++) {
|
|
13
|
+
result[i] = buffer[i] - 128;
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
// int16 <-> bufferLE
|
|
18
|
+
export function int16ToBufferLE(ints) {
|
|
19
|
+
const buffer = Buffer.alloc(ints.length * 2);
|
|
20
|
+
for (let i = 0; i < ints.length; i++) {
|
|
21
|
+
buffer.writeInt16LE(ints[i], i * 2);
|
|
22
|
+
}
|
|
23
|
+
return buffer;
|
|
24
|
+
}
|
|
25
|
+
export function bufferLEToInt16(buffer) {
|
|
26
|
+
const result = new Int16Array(buffer.length / 2);
|
|
27
|
+
for (let i = 0; i < result.length; i++) {
|
|
28
|
+
result[i] = buffer.readInt16LE(i * 2);
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
// int24 <-> bufferLE (uses int32 for storage)
|
|
33
|
+
export function int24ToBufferLE(ints) {
|
|
34
|
+
const buffer = Buffer.alloc(ints.length * 3);
|
|
35
|
+
for (let i = 0; i < ints.length; i++) {
|
|
36
|
+
const val = ints[i];
|
|
37
|
+
const encodedVal = val < 0 ? val + 0x1000000 : val;
|
|
38
|
+
buffer[(i * 3) + 0] = (encodedVal >> 0) & 0xff;
|
|
39
|
+
buffer[(i * 3) + 1] = (encodedVal >> 8) & 0xff;
|
|
40
|
+
buffer[(i * 3) + 2] = (encodedVal >> 16) & 0xff;
|
|
41
|
+
}
|
|
42
|
+
return buffer;
|
|
43
|
+
}
|
|
44
|
+
export function bufferLEToInt24(buffer) {
|
|
45
|
+
const result = new Int32Array(buffer.length / 3);
|
|
46
|
+
for (let i = 0; i < result.length; i++) {
|
|
47
|
+
const b0 = buffer[(i * 3) + 0];
|
|
48
|
+
const b1 = buffer[(i * 3) + 1];
|
|
49
|
+
const b2 = buffer[(i * 3) + 2];
|
|
50
|
+
const encodedVal = (b0 << 0) + (b1 << 8) + (b2 << 16);
|
|
51
|
+
result[i] = encodedVal > 0x800000 ? encodedVal - 0x1000000 : encodedVal;
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
// int32 <-> bufferLE
|
|
56
|
+
export function int32ToBufferLE(ints) {
|
|
57
|
+
const buffer = Buffer.alloc(ints.length * 4);
|
|
58
|
+
for (let i = 0; i < ints.length; i++) {
|
|
59
|
+
buffer.writeInt32LE(ints[i], i * 4);
|
|
60
|
+
}
|
|
61
|
+
return buffer;
|
|
62
|
+
}
|
|
63
|
+
export function bufferLEToInt32(buffer) {
|
|
64
|
+
const result = new Int32Array(buffer.length / 4);
|
|
65
|
+
for (let i = 0; i < result.length; i++) {
|
|
66
|
+
result[i] = buffer.readInt32LE(i * 4);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
// float32 <-> bufferLE
|
|
71
|
+
export function float32ToBufferLE(floats) {
|
|
72
|
+
const buffer = Buffer.alloc(floats.length * 4);
|
|
73
|
+
for (let i = 0; i < floats.length; i++) {
|
|
74
|
+
buffer.writeFloatLE(floats[i], i * 4);
|
|
75
|
+
}
|
|
76
|
+
return buffer;
|
|
77
|
+
}
|
|
78
|
+
export function bufferLEToFloat32(buffer) {
|
|
79
|
+
const result = new Float32Array(buffer.length / 4);
|
|
80
|
+
for (let i = 0; i < result.length; i++) {
|
|
81
|
+
result[i] = buffer.readFloatLE(i * 4);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
// float64 <-> bufferLE
|
|
86
|
+
export function float64ToBufferLE(floats) {
|
|
87
|
+
const buffer = Buffer.alloc(floats.length * 8);
|
|
88
|
+
for (let i = 0; i < floats.length; i++) {
|
|
89
|
+
buffer.writeDoubleLE(floats[i], i * 8);
|
|
90
|
+
}
|
|
91
|
+
return buffer;
|
|
92
|
+
}
|
|
93
|
+
export function bufferLEToFloat64(buffer) {
|
|
94
|
+
const result = new Float64Array(buffer.length / 8);
|
|
95
|
+
for (let i = 0; i < result.length; i++) {
|
|
96
|
+
result[i] = buffer.readDoubleLE(i * 8);
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
// float64 <-> float32
|
|
101
|
+
export function float64Tofloat32(doubles) {
|
|
102
|
+
const floats = new Float32Array(doubles.length);
|
|
103
|
+
for (let i = 0; i < doubles.length; i++) {
|
|
104
|
+
floats[i] = doubles[i];
|
|
105
|
+
}
|
|
106
|
+
return floats;
|
|
107
|
+
}
|
|
108
|
+
export function float32Tofloat64(floats) {
|
|
109
|
+
const doubles = new Float64Array(floats.length);
|
|
110
|
+
for (let i = 0; i < floats.length; i++) {
|
|
111
|
+
doubles[i] = floats[i];
|
|
112
|
+
}
|
|
113
|
+
return doubles;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=BinaryArrayConversion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BinaryArrayConversion.js","sourceRoot":"","sources":["../../src/utilities/BinaryArrayConversion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function createTarball(filePath: string, outputFile: string, prefixPath?: string): Promise<void>;
|
|
2
|
+
export declare function createTarballForFile(filePath: string, outputFile: string, prefixPath?: string): Promise<void>;
|
|
3
|
+
export declare function createTarballForDir(inputDir: string, outputFile: string, prefixPath?: string): Promise<void>;
|
|
4
|
+
export declare function extractTarball(filepath: string, outputDir: string): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { Logger } from './Logger.js';
|
|
3
|
+
import { readdir, stat } from './FileSystem.js';
|
|
4
|
+
export async function createTarball(filePath, outputFile, prefixPath = "") {
|
|
5
|
+
const pathStat = await stat(filePath);
|
|
6
|
+
if (pathStat.isDirectory()) {
|
|
7
|
+
await createTarballForDir(filePath, outputFile, prefixPath);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
await createTarballForFile(filePath, outputFile, prefixPath);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function createTarballForFile(filePath, outputFile, prefixPath = "") {
|
|
14
|
+
const logger = new Logger();
|
|
15
|
+
logger.start(`Creating ${prefixPath || path.basename(outputFile)}`);
|
|
16
|
+
const { default: tar } = await import('tar');
|
|
17
|
+
const inputFileStat = await stat(filePath);
|
|
18
|
+
if (!inputFileStat.isFile()) {
|
|
19
|
+
throw new Error(`${filePath} is not a file`);
|
|
20
|
+
}
|
|
21
|
+
const filename = path.basename(filePath);
|
|
22
|
+
const dirname = path.dirname(filePath);
|
|
23
|
+
await tar.create({
|
|
24
|
+
gzip: { level: 9, memLevel: 9 },
|
|
25
|
+
file: outputFile,
|
|
26
|
+
cwd: dirname,
|
|
27
|
+
prefix: prefixPath,
|
|
28
|
+
mode: 0o775,
|
|
29
|
+
filter: (path, stat) => {
|
|
30
|
+
stat.mode |= 0o775;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}, [filename]);
|
|
34
|
+
logger.end();
|
|
35
|
+
}
|
|
36
|
+
export async function createTarballForDir(inputDir, outputFile, prefixPath = "") {
|
|
37
|
+
const logger = new Logger();
|
|
38
|
+
logger.start(`Creating ${prefixPath || path.basename(outputFile)}`);
|
|
39
|
+
const { default: tar } = await import('tar');
|
|
40
|
+
const inputDirStat = await stat(inputDir);
|
|
41
|
+
if (!inputDirStat.isDirectory()) {
|
|
42
|
+
throw new Error(`${inputDir} is not a directory`);
|
|
43
|
+
}
|
|
44
|
+
const filesInBaseDir = await readdir(inputDir);
|
|
45
|
+
await tar.create({
|
|
46
|
+
gzip: { level: 9, memLevel: 9 },
|
|
47
|
+
file: outputFile,
|
|
48
|
+
cwd: inputDir,
|
|
49
|
+
prefix: prefixPath,
|
|
50
|
+
mode: 0o775,
|
|
51
|
+
filter: (path, stat) => {
|
|
52
|
+
stat.mode |= 0o775;
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}, filesInBaseDir);
|
|
56
|
+
logger.end();
|
|
57
|
+
}
|
|
58
|
+
export async function extractTarball(filepath, outputDir) {
|
|
59
|
+
const { default: tar } = await import('tar');
|
|
60
|
+
await tar.extract({
|
|
61
|
+
file: filepath,
|
|
62
|
+
cwd: outputDir,
|
|
63
|
+
preserveOwner: false,
|
|
64
|
+
//noChmod: true
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Compression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Compression.js","sourceRoot":"","sources":["../../src/utilities/Compression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { GaxiosOptions } from "gaxios";
|
|
2
|
+
export declare function downloadAndExtractTarball(options: GaxiosOptions, targetDir: string, baseTempPath: string, displayName?: string): Promise<void>;
|
|
3
|
+
export declare function downloadFile(options: GaxiosOptions, targetFilePath: string, prompt?: string): Promise<void>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { request } from "gaxios";
|
|
2
|
+
import { getRandomHexString } from "./Utilities.js";
|
|
3
|
+
import { OpenPromise } from "./OpenPromise.js";
|
|
4
|
+
import { Timer } from "./Timer.js";
|
|
5
|
+
import { Logger } from "./Logger.js";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { extractTarball } from "./Compression.js";
|
|
8
|
+
import { createWriteStream, move, remove, readdir, ensureDir } from "./FileSystem.js";
|
|
9
|
+
export async function downloadAndExtractTarball(options, targetDir, baseTempPath, displayName = "archive") {
|
|
10
|
+
const logger = new Logger();
|
|
11
|
+
const randomID = getRandomHexString(16).toLowerCase();
|
|
12
|
+
const tempTarballPath = path.join(baseTempPath, `/${randomID}.tarball`);
|
|
13
|
+
const tempDirPath = path.join(baseTempPath, `/${randomID}`);
|
|
14
|
+
await ensureDir(tempDirPath);
|
|
15
|
+
await downloadFile(options, tempTarballPath, `Downloading ${displayName}`);
|
|
16
|
+
logger.start(`Extracting ${displayName}`);
|
|
17
|
+
await extractTarball(tempTarballPath, tempDirPath);
|
|
18
|
+
await remove(tempTarballPath);
|
|
19
|
+
for (const filename of await readdir(tempDirPath)) {
|
|
20
|
+
const sourceFilePath = path.join(tempDirPath, filename);
|
|
21
|
+
const targetFilePath = path.join(targetDir, filename);
|
|
22
|
+
await move(sourceFilePath, targetFilePath, { overwrite: true });
|
|
23
|
+
}
|
|
24
|
+
await remove(tempDirPath);
|
|
25
|
+
logger.end();
|
|
26
|
+
}
|
|
27
|
+
export async function downloadFile(options, targetFilePath, prompt = "Downloading") {
|
|
28
|
+
const logger = new Logger();
|
|
29
|
+
const downloadPromise = new OpenPromise();
|
|
30
|
+
const timer = new Timer();
|
|
31
|
+
options.responseType = 'stream';
|
|
32
|
+
const response = await request(options);
|
|
33
|
+
const ttyOutput = process.stderr.isTTY === true;
|
|
34
|
+
logger.write(`${prompt}.. `);
|
|
35
|
+
const rateAveragingWindowSeconds = 5.0;
|
|
36
|
+
let downloadStarted = false;
|
|
37
|
+
let downloadedBytes = 0;
|
|
38
|
+
let totalBytes = undefined;
|
|
39
|
+
const statusUpdateInterval = 250;
|
|
40
|
+
let lastString = prompt;
|
|
41
|
+
const downloadStateHistory = [];
|
|
42
|
+
function updateStatus() {
|
|
43
|
+
if (!downloadStarted) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const totalMBytes = (totalBytes || 0) / 1000 / 1000;
|
|
47
|
+
const downloadedMBytes = downloadedBytes / 1000 / 1000;
|
|
48
|
+
const elapsedTime = timer.elapsedTimeSeconds;
|
|
49
|
+
const cumulativeDownloadRate = downloadedMBytes / elapsedTime;
|
|
50
|
+
const windowStartRecord = downloadStateHistory.find(r => r.time >= timer.elapsedTimeSeconds - rateAveragingWindowSeconds);
|
|
51
|
+
let windowDownloadRate;
|
|
52
|
+
if (windowStartRecord) {
|
|
53
|
+
windowDownloadRate = (downloadedMBytes - windowStartRecord.downloadedMBytes) / (elapsedTime - windowStartRecord.time);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
windowDownloadRate = cumulativeDownloadRate;
|
|
57
|
+
}
|
|
58
|
+
downloadStateHistory.push({ time: elapsedTime, downloadedMBytes });
|
|
59
|
+
const isLastUpdate = downloadedMBytes == totalMBytes;
|
|
60
|
+
const downloadedMbytesStr = downloadedMBytes.toFixed(2);
|
|
61
|
+
const totalMbytesStr = totalMBytes.toFixed(2);
|
|
62
|
+
const downloadRateStr = windowDownloadRate.toFixed(2);
|
|
63
|
+
const cumulativeDownloadRateStr = cumulativeDownloadRate.toFixed(2);
|
|
64
|
+
if (ttyOutput) {
|
|
65
|
+
let newString;
|
|
66
|
+
if (totalBytes != undefined) {
|
|
67
|
+
const percentage = (downloadedMBytes / totalMBytes) * 100;
|
|
68
|
+
newString = `${prompt}.. ${downloadedMbytesStr}MB/${totalMbytesStr}MB (${percentage.toFixed(1)}%, ${timer.elapsedTimeSeconds.toFixed(1)}s, ${downloadRateStr}MB/s)`;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
newString = `${prompt}.. ${downloadedMbytesStr}MB (${timer.elapsedTimeSeconds.toFixed(1)}s, ${downloadRateStr}MB/s)`;
|
|
72
|
+
}
|
|
73
|
+
if (newString != lastString) {
|
|
74
|
+
logger.write('\r');
|
|
75
|
+
logger.write(newString);
|
|
76
|
+
}
|
|
77
|
+
lastString = newString;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (totalBytes == undefined) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const percent = downloadedBytes / totalBytes;
|
|
84
|
+
const percentDisplay = `${(Math.floor(percent * 10) * 10).toString()}%`;
|
|
85
|
+
if (lastString == prompt) {
|
|
86
|
+
logger.write(`(${totalMbytesStr}MB): `);
|
|
87
|
+
}
|
|
88
|
+
if (percentDisplay != lastString) {
|
|
89
|
+
logger.write(percentDisplay);
|
|
90
|
+
if (percent == 1.0) {
|
|
91
|
+
logger.write(` (${timer.elapsedTimeSeconds.toFixed(2)}s, ${cumulativeDownloadRateStr}MB/s)`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
logger.write(` `);
|
|
95
|
+
}
|
|
96
|
+
lastString = percentDisplay;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const partialFilePath = `${targetFilePath}.${getRandomHexString(16)}.partial`;
|
|
101
|
+
const fileWriteStream = createWriteStream(partialFilePath, { encoding: "binary", autoClose: true });
|
|
102
|
+
let statusInterval = setInterval(() => {
|
|
103
|
+
updateStatus();
|
|
104
|
+
}, statusUpdateInterval);
|
|
105
|
+
response.data.on("data", (chunk) => {
|
|
106
|
+
try {
|
|
107
|
+
const contentLengthString = response.headers['content-length'];
|
|
108
|
+
totalBytes = contentLengthString != undefined ? parseInt(contentLengthString) : undefined;
|
|
109
|
+
const chunkLength = chunk.length;
|
|
110
|
+
fileWriteStream.write(chunk);
|
|
111
|
+
downloadedBytes += chunkLength;
|
|
112
|
+
if (downloadStarted == false) {
|
|
113
|
+
downloadStarted = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
clearInterval(statusInterval);
|
|
118
|
+
downloadPromise.reject(err);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
response.data.on("end", async () => {
|
|
122
|
+
try {
|
|
123
|
+
clearInterval(statusInterval);
|
|
124
|
+
updateStatus();
|
|
125
|
+
fileWriteStream.end();
|
|
126
|
+
logger.write("\n");
|
|
127
|
+
await move(partialFilePath, targetFilePath, { overwrite: true });
|
|
128
|
+
downloadPromise.resolve();
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
clearInterval(statusInterval);
|
|
132
|
+
downloadPromise.reject(err);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
response.data.on("error", async (err) => {
|
|
136
|
+
try {
|
|
137
|
+
clearInterval(statusInterval);
|
|
138
|
+
fileWriteStream.end();
|
|
139
|
+
await remove(partialFilePath);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
downloadPromise.reject(err);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return downloadPromise.promise;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=FileDownloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileDownloader.js","sourceRoot":"","sources":["../../src/utilities/FileDownloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import * as fsExtra from 'fs-extra/esm';
|
|
4
|
+
import gracefulFS from 'graceful-fs';
|
|
5
|
+
export declare const readFile: typeof gracefulFS.readFile.__promisify__;
|
|
6
|
+
export declare const readdir: typeof gracefulFS.readdir.__promisify__;
|
|
7
|
+
export declare const stat: typeof gracefulFS.stat.__promisify__;
|
|
8
|
+
export declare const open: typeof gracefulFS.open.__promisify__;
|
|
9
|
+
export declare const close: typeof gracefulFS.close.__promisify__;
|
|
10
|
+
export declare const chmod: typeof gracefulFS.chmod.__promisify__;
|
|
11
|
+
export declare const createReadStream: typeof gracefulFS.createReadStream;
|
|
12
|
+
export declare const createWriteStream: typeof gracefulFS.createWriteStream;
|
|
13
|
+
export declare const existsSync: typeof gracefulFS.existsSync;
|
|
14
|
+
export declare const ensureDir: typeof fsExtra.ensureDir;
|
|
15
|
+
export declare const move: typeof fsExtra.move;
|
|
16
|
+
export declare const remove: typeof fsExtra.remove;
|
|
17
|
+
export declare const copy: typeof fsExtra.copy;
|
|
18
|
+
export declare const outputFile: typeof fsExtra.outputFile;
|
|
19
|
+
export declare function readDirRecursive(dir: string, fileFilter?: (filePath: string) => boolean): Promise<string[]>;
|
|
20
|
+
export declare function isFileIsUpToDate(filePath: string, timeRangeSeconds: number): Promise<boolean>;
|
|
21
|
+
export declare function getModuleRootDir(): string;
|
|
22
|
+
export declare function resolveToModuleRootDir(relativePath: string): string;
|
|
23
|
+
export declare function getFileExtension(filename: string): string;
|
|
24
|
+
export declare function computeFileSha256Hex(filePath: string): Promise<string>;
|
|
25
|
+
export declare function readAndParseJsonFile(jsonFilePath: string): Promise<any>;
|
|
26
|
+
export declare function writeFile(filePath: string, data: string | NodeJS.ArrayBufferView, options?: fsExtra.WriteFileOptions): Promise<void>;
|
|
27
|
+
export declare function writeFileSafe(filePath: string, data: string | NodeJS.ArrayBufferView, options?: fsExtra.WriteFileOptions): Promise<void>;
|
|
28
|
+
export declare function getAppTempDir(appName: string): string;
|
|
29
|
+
export declare function getAppDataDir(appName: string): string;
|
|
30
|
+
export declare function chmodRecursive(rootPath: string, newMode: number): Promise<void>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as fsExtra from 'fs-extra/esm';
|
|
2
|
+
import gracefulFS from 'graceful-fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { OpenPromise } from './OpenPromise.js';
|
|
8
|
+
import { getRandomHexString } from './Utilities.js';
|
|
9
|
+
import { appName } from '../api/Globals.js';
|
|
10
|
+
export const readFile = promisify(gracefulFS.readFile);
|
|
11
|
+
//export const writeFile = promisify(gracefulFS.writeFile)
|
|
12
|
+
export const readdir = promisify(gracefulFS.readdir);
|
|
13
|
+
export const stat = promisify(gracefulFS.stat);
|
|
14
|
+
export const open = promisify(gracefulFS.open);
|
|
15
|
+
export const close = promisify(gracefulFS.close);
|
|
16
|
+
export const chmod = promisify(gracefulFS.chmod);
|
|
17
|
+
export const createReadStream = gracefulFS.createReadStream;
|
|
18
|
+
export const createWriteStream = gracefulFS.createWriteStream;
|
|
19
|
+
export const existsSync = gracefulFS.existsSync;
|
|
20
|
+
export const ensureDir = fsExtra.ensureDir;
|
|
21
|
+
export const move = fsExtra.move;
|
|
22
|
+
export const remove = fsExtra.remove;
|
|
23
|
+
export const copy = fsExtra.copy;
|
|
24
|
+
export const outputFile = fsExtra.outputFile;
|
|
25
|
+
export async function readDirRecursive(dir, fileFilter) {
|
|
26
|
+
if (!(await stat(dir)).isDirectory()) {
|
|
27
|
+
throw new Error(`'${dir}' is not a directory`);
|
|
28
|
+
}
|
|
29
|
+
const filenamesInDir = await readdir(dir);
|
|
30
|
+
const filesInDir = filenamesInDir.map(filename => path.join(dir, filename));
|
|
31
|
+
const result = [];
|
|
32
|
+
const subDirectories = [];
|
|
33
|
+
for (const filePath of filesInDir) {
|
|
34
|
+
if ((await stat(filePath)).isDirectory()) {
|
|
35
|
+
subDirectories.push(filePath);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (fileFilter && !fileFilter(filePath)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
result.push(filePath);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const subDirectory of subDirectories) {
|
|
45
|
+
const filesInSubdirectory = await readDirRecursive(subDirectory, fileFilter);
|
|
46
|
+
result.push(...filesInSubdirectory);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
export async function isFileIsUpToDate(filePath, timeRangeSeconds) {
|
|
51
|
+
const fileUpdateTime = (await stat(filePath)).mtime.valueOf();
|
|
52
|
+
const currentTime = (new Date()).valueOf();
|
|
53
|
+
const differenceInMilliseconds = currentTime - fileUpdateTime;
|
|
54
|
+
const differenceInSeconds = differenceInMilliseconds / 60;
|
|
55
|
+
return differenceInSeconds <= timeRangeSeconds;
|
|
56
|
+
}
|
|
57
|
+
export function getModuleRootDir() {
|
|
58
|
+
const currentScriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
59
|
+
return path.resolve(currentScriptDir, '..', '..');
|
|
60
|
+
}
|
|
61
|
+
export function resolveToModuleRootDir(relativePath) {
|
|
62
|
+
return path.resolve(getModuleRootDir(), relativePath);
|
|
63
|
+
}
|
|
64
|
+
export function getFileExtension(filename) {
|
|
65
|
+
const fileExtensionIndex = filename.lastIndexOf(".");
|
|
66
|
+
if (fileExtensionIndex == -1) {
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
return filename.substring(fileExtensionIndex + 1).toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
export async function computeFileSha256Hex(filePath) {
|
|
72
|
+
const resultOpenPromise = new OpenPromise();
|
|
73
|
+
const crypto = await import('crypto');
|
|
74
|
+
const hash = crypto.createHash('sha256');
|
|
75
|
+
const readStream = createReadStream(filePath);
|
|
76
|
+
readStream.on('data', data => hash.update(data));
|
|
77
|
+
readStream.on('error', error => resultOpenPromise.reject(error));
|
|
78
|
+
readStream.on('end', () => resultOpenPromise.resolve(hash.digest('hex')));
|
|
79
|
+
return resultOpenPromise.promise;
|
|
80
|
+
}
|
|
81
|
+
export async function readAndParseJsonFile(jsonFilePath) {
|
|
82
|
+
const fileContent = await readFile(jsonFilePath, { encoding: "utf-8" });
|
|
83
|
+
return JSON.parse(fileContent);
|
|
84
|
+
}
|
|
85
|
+
export async function writeFile(filePath, data, options) {
|
|
86
|
+
return outputFile(filePath, data, options);
|
|
87
|
+
}
|
|
88
|
+
export async function writeFileSafe(filePath, data, options) {
|
|
89
|
+
const tempDir = getAppTempDir(appName);
|
|
90
|
+
const tempFilePath = `${tempDir}${getRandomHexString(16)}.partial`;
|
|
91
|
+
await writeFile(tempFilePath, data, options);
|
|
92
|
+
await move(tempFilePath, filePath, { overwrite: true });
|
|
93
|
+
}
|
|
94
|
+
export function getAppTempDir(appName) {
|
|
95
|
+
let tempDir;
|
|
96
|
+
const platform = process.platform;
|
|
97
|
+
const homeDir = os.homedir();
|
|
98
|
+
if (platform == "win32") {
|
|
99
|
+
tempDir = path.join(homeDir, "AppData", "Local", "Temp", appName);
|
|
100
|
+
}
|
|
101
|
+
else if (platform == "darwin") {
|
|
102
|
+
tempDir = path.join(homeDir, "Library", "Caches", appName);
|
|
103
|
+
}
|
|
104
|
+
else if (platform == "linux") {
|
|
105
|
+
tempDir = path.join(homeDir, ".cache", appName);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
throw new Error(`Unsupport platform ${platform}`);
|
|
109
|
+
}
|
|
110
|
+
return tempDir;
|
|
111
|
+
}
|
|
112
|
+
export function getAppDataDir(appName) {
|
|
113
|
+
let dataDir;
|
|
114
|
+
const platform = process.platform;
|
|
115
|
+
const homeDir = os.homedir();
|
|
116
|
+
if (platform == "win32") {
|
|
117
|
+
dataDir = path.join(homeDir, "AppData", "Local", appName);
|
|
118
|
+
}
|
|
119
|
+
else if (platform == "darwin") {
|
|
120
|
+
dataDir = path.join(homeDir, "Library", "Application Support", appName);
|
|
121
|
+
}
|
|
122
|
+
else if (platform == "linux") {
|
|
123
|
+
dataDir = path.join(homeDir, ".local", "share", appName);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error(`Unsupport platform ${platform}`);
|
|
127
|
+
}
|
|
128
|
+
return dataDir;
|
|
129
|
+
}
|
|
130
|
+
export async function chmodRecursive(rootPath, newMode) {
|
|
131
|
+
const rootPathStat = await stat(rootPath);
|
|
132
|
+
await chmod(rootPath, newMode);
|
|
133
|
+
if (rootPathStat.isDirectory()) {
|
|
134
|
+
const fileList = await readdir(rootPath);
|
|
135
|
+
for (const filename of fileList) {
|
|
136
|
+
const filePath = path.join(rootPath, filename);
|
|
137
|
+
await chmodRecursive(filePath, newMode);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=FileSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystem.js","sourceRoot":"","sources":["../../src/utilities/FileSystem.ts"],"names":[],"mappings":"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"}
|