@omnimedia/omnitool 1.1.0-4 → 1.1.0-41
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/package.json +8 -4
- package/s/context.ts +0 -7
- package/s/demo/demo.bundle.ts +35 -5
- package/s/demo/demo.css +5 -0
- package/s/demo/routines/transcode-test.ts +8 -4
- package/s/demo/routines/transitions-test.ts +43 -0
- package/s/demo/routines/waveform-test.ts +3 -2
- package/s/driver/driver.ts +19 -11
- package/s/driver/fns/schematic.ts +46 -23
- package/s/driver/fns/work.ts +114 -102
- package/s/features/transition/parts/fragment.ts +24 -0
- package/s/features/transition/parts/types.ts +94 -0
- package/s/features/transition/parts/uniforms.ts +29 -0
- package/s/features/transition/parts/vertex.ts +31 -0
- package/s/features/transition/transition.ts +60 -0
- package/s/index.html.ts +6 -1
- package/s/timeline/index.ts +2 -0
- package/s/timeline/parts/basics.ts +1 -1
- package/s/timeline/parts/compositor/export.ts +77 -0
- package/s/timeline/parts/compositor/parts/html-tree.ts +37 -0
- package/s/timeline/parts/compositor/parts/schedulers.ts +95 -0
- package/s/timeline/parts/compositor/parts/tree-builder.ts +196 -0
- package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +30 -0
- package/s/timeline/parts/compositor/playback.ts +94 -0
- package/s/timeline/parts/compositor/samplers/html.ts +115 -0
- package/s/timeline/parts/compositor/samplers/webcodecs.ts +61 -0
- package/s/timeline/parts/filmstrip.ts +42 -15
- package/s/timeline/parts/item.ts +48 -6
- package/s/timeline/parts/media.ts +21 -0
- package/s/timeline/parts/waveform.ts +3 -4
- package/s/timeline/sugar/builders.ts +102 -0
- package/s/timeline/sugar/o.ts +163 -38
- package/s/timeline/sugar/omni-test.ts +5 -3
- package/s/timeline/sugar/omni.ts +26 -11
- package/s/timeline/types.ts +29 -0
- package/s/timeline/utils/audio-stream.ts +15 -0
- package/s/timeline/utils/matrix.ts +33 -0
- package/s/timeline/utils/video-cursor.ts +40 -0
- package/x/context.d.ts +1 -4
- package/x/context.js +1 -5
- package/x/context.js.map +1 -1
- package/x/demo/demo.bundle.js +23 -6
- package/x/demo/demo.bundle.js.map +1 -1
- package/x/demo/demo.bundle.min.js +606 -36
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/demo.css +5 -0
- package/x/demo/routines/transcode-test.js +8 -4
- package/x/demo/routines/transcode-test.js.map +1 -1
- package/x/demo/routines/transitions-test.d.ts +5 -0
- package/x/demo/routines/transitions-test.js +35 -0
- package/x/demo/routines/transitions-test.js.map +1 -0
- package/x/demo/routines/waveform-test.d.ts +2 -1
- package/x/demo/routines/waveform-test.js +2 -2
- package/x/demo/routines/waveform-test.js.map +1 -1
- package/x/driver/driver.d.ts +4 -6
- package/x/driver/driver.js +17 -10
- package/x/driver/driver.js.map +1 -1
- package/x/driver/driver.worker.bundle.min.js +2537 -148
- package/x/driver/driver.worker.bundle.min.js.map +4 -4
- package/x/driver/fns/host.d.ts +9 -2
- package/x/driver/fns/schematic.d.ts +40 -22
- package/x/driver/fns/work.d.ts +11 -4
- package/x/driver/fns/work.js +107 -101
- package/x/driver/fns/work.js.map +1 -1
- package/x/features/speech/transcribe/worker.bundle.min.js +542 -542
- package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
- package/x/features/transition/parts/fragment.d.ts +1 -0
- package/x/features/transition/parts/fragment.js +25 -0
- package/x/features/transition/parts/fragment.js.map +1 -0
- package/x/features/transition/parts/types.d.ts +23 -0
- package/x/features/transition/parts/types.js.map +1 -0
- package/x/features/transition/parts/uniforms.d.ts +31 -0
- package/x/features/transition/parts/uniforms.js +27 -0
- package/x/features/transition/parts/uniforms.js.map +1 -0
- package/x/features/transition/parts/vertex.d.ts +1 -0
- package/x/features/transition/parts/vertex.js +32 -0
- package/x/features/transition/parts/vertex.js.map +1 -0
- package/x/features/transition/transition.d.ts +5 -0
- package/x/features/transition/transition.js +50 -0
- package/x/features/transition/transition.js.map +1 -0
- package/x/index.html +13 -3
- package/x/index.html.js +6 -1
- package/x/index.html.js.map +1 -1
- package/x/timeline/index.d.ts +2 -0
- package/x/timeline/index.js +2 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/basics.d.ts +1 -1
- package/x/timeline/parts/compositor/export.d.ts +11 -0
- package/x/timeline/parts/compositor/export.js +64 -0
- package/x/timeline/parts/compositor/export.js.map +1 -0
- package/x/timeline/parts/compositor/parts/html-tree.d.ts +3 -0
- package/x/timeline/parts/compositor/parts/html-tree.js +40 -0
- package/x/timeline/parts/compositor/parts/html-tree.js.map +1 -0
- package/x/timeline/parts/compositor/parts/schedulers.d.ts +15 -0
- package/x/timeline/parts/compositor/parts/schedulers.js +70 -0
- package/x/timeline/parts/compositor/parts/schedulers.js.map +1 -0
- package/x/timeline/parts/compositor/parts/tree-builder.d.ts +37 -0
- package/x/timeline/parts/compositor/parts/tree-builder.js +160 -0
- package/x/timeline/parts/compositor/parts/tree-builder.js.map +1 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +3 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js +28 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +1 -0
- package/x/timeline/parts/compositor/playback.d.ts +26 -0
- package/x/timeline/parts/compositor/playback.js +79 -0
- package/x/timeline/parts/compositor/playback.js.map +1 -0
- package/x/timeline/parts/compositor/samplers/html.d.ts +3 -0
- package/x/timeline/parts/compositor/samplers/html.js +106 -0
- package/x/timeline/parts/compositor/samplers/html.js.map +1 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +3 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.js +52 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.js.map +1 -0
- package/x/timeline/parts/filmstrip.d.ts +2 -1
- package/x/timeline/parts/filmstrip.js +29 -10
- package/x/timeline/parts/filmstrip.js.map +1 -1
- package/x/timeline/parts/item.d.ts +42 -8
- package/x/timeline/parts/item.js +7 -3
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/media.d.ts +3 -0
- package/x/timeline/parts/media.js +17 -0
- package/x/timeline/parts/media.js.map +1 -1
- package/x/timeline/parts/waveform.d.ts +2 -1
- package/x/timeline/parts/waveform.js +2 -4
- package/x/timeline/parts/waveform.js.map +1 -1
- package/x/timeline/sugar/builders.js +104 -0
- package/x/timeline/sugar/builders.js.map +1 -0
- package/x/timeline/sugar/o.d.ts +27 -5
- package/x/timeline/sugar/o.js +137 -38
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/timeline/sugar/omni-test.js +4 -2
- package/x/timeline/sugar/omni-test.js.map +1 -1
- package/x/timeline/sugar/omni.d.ts +8 -2
- package/x/timeline/sugar/omni.js +22 -9
- package/x/timeline/sugar/omni.js.map +1 -1
- package/x/timeline/types.d.ts +24 -0
- package/x/timeline/types.js +2 -0
- package/x/timeline/types.js.map +1 -0
- package/x/timeline/utils/audio-stream.d.ts +6 -0
- package/x/timeline/utils/audio-stream.js +17 -0
- package/x/timeline/utils/audio-stream.js.map +1 -0
- package/x/timeline/utils/matrix.d.ts +8 -0
- package/x/timeline/utils/matrix.js +26 -0
- package/x/timeline/utils/matrix.js.map +1 -0
- package/x/timeline/utils/video-cursor.d.ts +10 -0
- package/x/timeline/utils/video-cursor.js +36 -0
- package/x/timeline/utils/video-cursor.js.map +1 -0
- package/s/tools/common/loader.ts +0 -26
- package/s/tools/common/transformer-pipeline.ts +0 -26
- package/s/tools/speech-recognition/common/model.ts +0 -26
- package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
- package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
- package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
- package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
- package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
- package/s/tools/speech-recognition/whisper/tool.ts +0 -70
- package/x/tools/common/loader.d.ts +0 -19
- package/x/tools/common/loader.js +0 -18
- package/x/tools/common/loader.js.map +0 -1
- package/x/tools/common/transformer-pipeline.d.ts +0 -8
- package/x/tools/common/transformer-pipeline.js +0 -24
- package/x/tools/common/transformer-pipeline.js.map +0 -1
- package/x/tools/speech-recognition/common/model.d.ts +0 -14
- package/x/tools/speech-recognition/common/model.js +0 -16
- package/x/tools/speech-recognition/common/model.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
- package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
- package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
- package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
- package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
- package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
- package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
- package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/tool.js +0 -63
- package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
- /package/x/{tools/speech-recognition/whisper → features/transition}/parts/types.js +0 -0
- /package/x/{tools/speech-recognition/whisper/parts/worker.bundle.d.ts → timeline/sugar/builders.d.ts} +0 -0
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Comrade } from "@e280/comrade";
|
|
2
|
-
export const setupWhisperHost = (events) => (Comrade.host(_shell => ({
|
|
3
|
-
async updateModelLoadProgress(item) {
|
|
4
|
-
events.onModelLoadProgress.pub(item);
|
|
5
|
-
},
|
|
6
|
-
async deliverTranscriptionChunk(chunk) {
|
|
7
|
-
events.onTranscriptionChunk.pub({
|
|
8
|
-
text: chunk.text,
|
|
9
|
-
timestamp: chunk.timestamp
|
|
10
|
-
});
|
|
11
|
-
},
|
|
12
|
-
async updateTps(value) {
|
|
13
|
-
events.onTpsUpdate.pub(value);
|
|
14
|
-
},
|
|
15
|
-
async updateTranscribeProgress(value) {
|
|
16
|
-
events.onTranscribeProgress(value);
|
|
17
|
-
}
|
|
18
|
-
})));
|
|
19
|
-
//# sourceMappingURL=host.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/host.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAIrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAkC,EAAE,EAAE,CAAC,CACvE,OAAO,CAAC,IAAI,CAAmB,MAAM,CAAC,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,uBAAuB,CAAC,IAAI;QACjC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,KAAK,CAAC,yBAAyB,CAAC,KAAK;QACpC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC,CAAA;IACH,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,KAAK;QACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,CAAC,wBAAwB,CAAC,KAAK;QACnC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;CACD,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Pub } from "@e280/stz";
|
|
2
|
-
import { AsSchematic } from "@e280/comrade";
|
|
3
|
-
import { LoaderEvents } from "../../../common/loader.js";
|
|
4
|
-
import { ProgressItem, TranscriptionChunk, TranscriptionMessage, TranscriptionResult, Word } from "../parts/types.js";
|
|
5
|
-
export type WhisperSchematic = AsSchematic<{
|
|
6
|
-
work: {
|
|
7
|
-
transcribe(input: TranscriptionMessage): Promise<TranscriptionResult | null>;
|
|
8
|
-
};
|
|
9
|
-
host: {
|
|
10
|
-
updateModelLoadProgress(item: ProgressItem): Promise<void>;
|
|
11
|
-
deliverTranscriptionChunk(chunk: TranscriptionChunk): Promise<void>;
|
|
12
|
-
updateTps(value: number): Promise<void>;
|
|
13
|
-
updateTranscribeProgress(value: number): Promise<void>;
|
|
14
|
-
};
|
|
15
|
-
}>;
|
|
16
|
-
export interface SpeechRecognizerHostEvents extends LoaderEvents {
|
|
17
|
-
onTranscriptionChunk: Pub<Word[]>;
|
|
18
|
-
onTranscribeProgress: Pub<[number]>;
|
|
19
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schematic.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/schematic.ts"],"names":[],"mappings":""}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { TranscriptionChunk } from "../parts/types.js";
|
|
2
|
-
export declare const setupWhisperWork: import("@e280/comrade").SetupWork<{
|
|
3
|
-
work: {
|
|
4
|
-
transcribe(input: import("../parts/types.js").TranscriptionMessage): Promise<import("../parts/types.js").TranscriptionResult | null>;
|
|
5
|
-
};
|
|
6
|
-
host: {
|
|
7
|
-
updateModelLoadProgress(item: import("../parts/types.js").ProgressItem): Promise<void>;
|
|
8
|
-
deliverTranscriptionChunk(chunk: TranscriptionChunk): Promise<void>;
|
|
9
|
-
updateTps(value: number): Promise<void>;
|
|
10
|
-
updateTranscribeProgress(value: number): Promise<void>;
|
|
11
|
-
};
|
|
12
|
-
}>;
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { Comrade } from "@e280/comrade";
|
|
2
|
-
//@ts-ignore
|
|
3
|
-
import { WhisperTextStreamer } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";
|
|
4
|
-
import { PipelineFactory } from "../../../common/transformer-pipeline.js";
|
|
5
|
-
// TODO suspicious globals, probably bad
|
|
6
|
-
const pipeline = new PipelineFactory("automatic-speech-recognition");
|
|
7
|
-
let transcriber;
|
|
8
|
-
export const setupWhisperWork = Comrade.work(shell => ({
|
|
9
|
-
async transcribe({ audio, model, language, duration }) {
|
|
10
|
-
const isDistil = model.startsWith("distil-whisper/");
|
|
11
|
-
if (!pipeline.model || pipeline.model !== model) {
|
|
12
|
-
pipeline.instance?.dispose()?.();
|
|
13
|
-
pipeline.instance = null;
|
|
14
|
-
transcriber = await pipeline.createInstance(model, (data) => {
|
|
15
|
-
if (data.progress)
|
|
16
|
-
shell.host.updateModelLoadProgress({
|
|
17
|
-
id: data.file,
|
|
18
|
-
progress: data.progress
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
const timePrecision = transcriber.processor.feature_extractor.config.chunk_length /
|
|
23
|
-
transcriber.model.config.max_source_positions;
|
|
24
|
-
const chunkLength = isDistil ? 20 : 30;
|
|
25
|
-
const strideLength = isDistil ? 3 : 5;
|
|
26
|
-
let chunkCount = 0;
|
|
27
|
-
let startTime = null;
|
|
28
|
-
let tokenCount = 0;
|
|
29
|
-
let tps = 0;
|
|
30
|
-
const chunkDuration = chunkLength - strideLength;
|
|
31
|
-
const estimateProgress = () => {
|
|
32
|
-
const audioProgressSeconds = chunkCount * chunkDuration;
|
|
33
|
-
return Math.min(audioProgressSeconds / duration, 1);
|
|
34
|
-
};
|
|
35
|
-
const streamer = new WhisperTextStreamer(transcriber.tokenizer, {
|
|
36
|
-
time_precision: timePrecision,
|
|
37
|
-
token_callback_function: () => {
|
|
38
|
-
startTime ??= performance.now();
|
|
39
|
-
if (++tokenCount > 1) {
|
|
40
|
-
tps = (tokenCount / (performance.now() - startTime)) * 1000;
|
|
41
|
-
shell.host.updateTps(tps);
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
callback_function: (textChunk) => {
|
|
45
|
-
shell.host.deliverTranscriptionChunk(textChunk);
|
|
46
|
-
},
|
|
47
|
-
on_finalize: () => {
|
|
48
|
-
startTime = null;
|
|
49
|
-
tokenCount = 0;
|
|
50
|
-
chunkCount++;
|
|
51
|
-
const progress = estimateProgress();
|
|
52
|
-
shell.host.updateTranscribeProgress(progress);
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
const output = await transcriber(audio, {
|
|
56
|
-
top_k: 0,
|
|
57
|
-
do_sample: false,
|
|
58
|
-
chunk_length_s: chunkLength,
|
|
59
|
-
stride_length_s: strideLength,
|
|
60
|
-
language,
|
|
61
|
-
task: "transcribe",
|
|
62
|
-
return_timestamps: "word", // if using "word" the on_chunk_start & end is not called thus we cant retrieve timestamps, only after whole thing finishes
|
|
63
|
-
force_full_sequences: false,
|
|
64
|
-
streamer,
|
|
65
|
-
});
|
|
66
|
-
if (!output)
|
|
67
|
-
return null;
|
|
68
|
-
return {
|
|
69
|
-
tps,
|
|
70
|
-
...output,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}));
|
|
74
|
-
//# sourceMappingURL=work.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/work.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface ProgressItem {
|
|
2
|
-
id: string;
|
|
3
|
-
progress: number;
|
|
4
|
-
}
|
|
5
|
-
export type Word = {
|
|
6
|
-
text: string;
|
|
7
|
-
timestamp: [start: number, end: number];
|
|
8
|
-
};
|
|
9
|
-
export type WordGroup = Word[];
|
|
10
|
-
export type Transcript = WordGroup[];
|
|
11
|
-
export interface TranscriptionChunk {
|
|
12
|
-
text: string;
|
|
13
|
-
offset: number;
|
|
14
|
-
timestamp: [number, number];
|
|
15
|
-
finalised: boolean;
|
|
16
|
-
}
|
|
17
|
-
export interface TranscriptionMessage {
|
|
18
|
-
audio: Float32Array;
|
|
19
|
-
model: string;
|
|
20
|
-
subtask: string | null;
|
|
21
|
-
language: string | null;
|
|
22
|
-
duration: number;
|
|
23
|
-
}
|
|
24
|
-
export interface TranscriptionResult {
|
|
25
|
-
text: string;
|
|
26
|
-
chunks: TranscriptionChunk[];
|
|
27
|
-
tps: number;
|
|
28
|
-
}
|
|
29
|
-
export type ProgressCallback = (data: any) => void;
|
|
30
|
-
export type SpeechRecognizerModels = "onnx-community/whisper-tiny_timestamped";
|
|
31
|
-
export type SpeechRecognizerSubtasks = "transcribe";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/parts/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.bundle.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/parts/worker.bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAErC,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAA;AAG/C,MAAM,OAAO,CAAC,MAAM,CAAmB,gBAAgB,CAAC,CAAA"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
function ae(t,e){return{error:r=>t.error({...e,...r}),rpcRequest:r=>t.rpcRequest({...e,...r}),rpcError:r=>t.rpcError({...e,...r})}}var _=()=>t=>({plain:t.none,errMessage:t.mix(t.brightRed,t.bold),errName:t.red,errStack:t.mix(t.red,t.dim),timestamp:t.blue,timestampErr:t.red});function he(){return _()}var y=Object.freeze({black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m",bgBrightBlack:"\x1B[100m",bgBrightRed:"\x1B[101m",bgBrightGreen:"\x1B[102m",bgBrightYellow:"\x1B[103m",bgBrightBlue:"\x1B[104m",bgBrightMagenta:"\x1B[105m",bgBrightCyan:"\x1B[106m",bgBrightWhite:"\x1B[107m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",inverse:"\x1B[7m",hidden:"\x1B[8m",strikethrough:"\x1B[9m",reset:"\x1B[0m"});var H=()=>({none:t=>t,uncolor:Ae,mix:qe,hex:_e,rgb:ge,bgRgb:He});function Ae(t){return t.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"")}function qe(...t){return e=>{for(let r of t)e=r(e);return e}}function _e(t){t=t.replace(/^#/,"");let e,r,o,n;if(t.length===3)e=parseInt(t.split("").map(s=>s+s).join(""),16);else if(t.length===6)e=parseInt(t,16);else throw new Error("Invalid hex color");return r=e>>16&255,o=e>>8&255,n=e&255,ge(r,o,n)}function ge(t,e,r){let o=`\x1B[38;2;${t};${e};${r}m`;return n=>`${o}${n}${y.reset}`}function He(t,e,r){let o=`\x1B[48;2;${t};${e};${r}m`;return n=>`${o}${n}${y.reset}`}var M={...Object.fromEntries(Object.entries(y).map(([t])=>[t,e=>e])),...H()};var $={...Object.fromEntries(Object.entries(y).map(([t,e])=>[t,r=>`${e}${r}${y.reset}`])),...H()};function ce(){return typeof Deno<"u"&&typeof Deno.version<"u"}function ue(){return typeof process<"u"&&process.versions&&process.versions.node}function xe(){return ue()?process.env.FORCE_COLOR||process.stdout.isTTY&&process.env.TERM!=="dumb":ce()?Deno.env.get("FORCE_COLOR")||Deno.isatty(Deno.stdout.rid)&&Deno.env.get("TERM")!=="dumb":!1}var pe=()=>xe()?$:M;var U=()=>({colors:t,theme:e})=>{let r=e(t);function o(i){let a=i.stack?`
|
|
2
|
-
`+i.stack+`
|
|
3
|
-
`:"";return[r.errName(i.name+":"),r.errMessage(i.message)].join(" ")+r.errStack(a)}function n(i){return i&&i instanceof Error?o(i):i}function s(i){return i&&i instanceof Error?o(i):r.errMessage(i)}return{stdout:i=>i.map(n),stderr:i=>i.map(s)}};function I(...t){return e=>({stdout:r=>{for(let o of t)r=o(e).stdout(r);return r},stderr:r=>{for(let o of t)r=o(e).stderr(r);return r}})}function Ue(){return{icon:"\u{1F6A8}",now:()=>Date.now()}}var F=t=>({colors:e,theme:r})=>{let o={...Ue(),...t},n=r(e),s=new Date(o.now()),i=s.getUTCFullYear().toString().padStart(4,"0"),a=(s.getUTCMonth()+1).toString().padStart(2,"0"),c=s.getUTCDate().toString().padStart(2,"0"),u=`${i}-${a}-${c}`,p=s.getUTCHours().toString().padStart(2,"0"),m=s.getUTCMinutes().toString().padStart(2,"0"),O=s.getUTCSeconds().toString().padStart(2,"0"),se=s.getUTCMilliseconds().toString().padStart(3,"0"),ie=`${p}:${m}:${O}.${se}`,q=`${u}::${ie}`;return{stdout:T=>[n.timestamp(q),...T],stderr:T=>[n.timestampErr(q),...[o.icon].filter(Boolean),...T]}};function be(){return I(U(),F())}var N=()=>({stdout:async t=>{await Deno.stdout.write(new TextEncoder().encode(t+`
|
|
4
|
-
`))},stderr:async t=>{await Deno.stderr.write(new TextEncoder().encode(t+`
|
|
5
|
-
`))}});var L=()=>({stdout:async t=>void process.stdout.write(t+`
|
|
6
|
-
`),stderr:async t=>void process.stderr.write(t+`
|
|
7
|
-
`)});var Y=()=>({stdout:async t=>console.log(t),stderr:async t=>console.error(t)});var ye=()=>ce()?N():ue()?L():Y();var we=()=>({stdout:async()=>{},stderr:async()=>{}});function ve(){return()=>({stdout:t=>t,stderr:t=>t})}var R=class t{static writers={auto:ye,void:we,deno:N,node:L,console:Y};static colors={auto:pe,colorful:()=>$,colorless:()=>M};static themes={auto:he,basic:_};static shapers={auto:be,none:ve,errors:U,timestamp:F};writer=t.writers.auto();colors=t.colors.auto();theme=t.themes.auto();shaper=t.shapers.auto();async log(...e){await this.writer.stdout(this.shaper(this).stdout(e).join(" "))}async error(...e){await this.writer.stderr(this.shaper(this).stderr(e).join(" "))}setWriter(e){return this.writer=e,this}setColors(e){return this.colors=e,this}setTheme(e){return this.theme=e,this}setShaper(...e){return this.shaper=I(...e),this}};var P=class extends R{static dummy(){return new this().setWriter(R.writers.void())}rpcRequest=async({request:e,...r})=>{let o=this.colors.none;this.log(...this.#e(r),o(`${e.method}()`))};rpcError=async({request:e,error:r,...o})=>{this.error(...this.#e(o),`${e.method}()`,r)};#e({meta:e,label:r,remote:o}){let n=this.colors.mix(this.colors.blue,this.colors.dim),s=this.colors.mix(this.colors.cyan,this.colors.dim);return[e?this.#t(e):void 0,r||void 0,o===void 0?void 0:o?n("<-"):s("->")].filter(Boolean)}#t(e){let{headers:r}=e.request;return[this.colors.yellow(`[${e.ip}]`),this.colors.green(r.origin?r.origin:"(no-origin)")].join(" ")}};var l=class extends P{rpcRequest=async()=>{}};var d=Object.freeze({eq(t,e){if(t.length!==e.length)return!1;for(let r=0;r<=t.length;r++)if(t.at(r)!==e.at(r))return!1;return!0},random(t){return crypto.getRandomValues(new Uint8Array(t))}});var v=Object.freeze({fromBytes(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")},toBytes(t){if(t.length%2!==0)throw new Error("must have even number of hex characters");let e=new Uint8Array(t.length/2);for(let r=0;r<t.length;r+=2)e[r/2]=parseInt(t.slice(r,r+2),16);return e},random(t=32){return this.fromBytes(d.random(t))},string(t){return v.fromBytes(t)},bytes(t){return v.toBytes(t)}});var me=58,J="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",fe=Object.freeze({fromBytes(t){let e=BigInt("0x"+v.fromBytes(t)),r="";for(;e>0;){let o=e%BigInt(me);e=e/BigInt(me),r=J[Number(o)]+r}for(let o of t)if(o===0)r=J[0]+r;else break;return r},toBytes(t){let e=BigInt(0);for(let i of t){let a=J.indexOf(i);if(a===-1)throw new Error(`Invalid character '${i}' in base58 string`);e=e*BigInt(me)+BigInt(a)}let r=e.toString(16);r.length%2!==0&&(r="0"+r);let o=v.toBytes(r),n=0;for(let i of t)if(i===J[0])n++;else break;let s=new Uint8Array(n+o.length);return s.set(o,n),s},random(t=32){return this.fromBytes(d.random(t))},string(t){return fe.fromBytes(t)},bytes(t){return fe.toBytes(t)}});var ke=class{lexicon;static lexicons=Object.freeze({base2:{characters:"01"},hex:{characters:"0123456789abcdef"},base36:{characters:"0123456789abcdefghijklmnopqrstuvwxyz"},base58:{characters:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"},base62:{characters:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},base64url:{negativePrefix:"~",characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},base64:{characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",padding:{character:"=",size:4}}});lookup;negativePrefix;constructor(e){this.lexicon=e,this.lookup=Object.fromEntries([...e.characters].map((r,o)=>[r,o])),this.negativePrefix=e.negativePrefix??"-"}toBytes(e){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let a=0,c=0,u=[];for(let p of e){if(p===this.lexicon.padding?.character)continue;let m=this.lookup[p];if(m===void 0)throw new Error(`Invalid character: ${p}`);for(a=a<<r|m,c+=r;c>=8;)c-=8,u.push(a>>c&255)}return new Uint8Array(u)}let o=0n,n=BigInt(this.lexicon.characters.length),s=!1;e.startsWith(this.negativePrefix)&&(e=e.slice(this.negativePrefix.length),s=!0);for(let a of e){let c=this.lookup[a];if(c===void 0)throw new Error(`Invalid character: ${a}`);o=o*n+BigInt(c)}let i=[];for(;o>0n;)i.unshift(Number(o%256n)),o=o/256n;return new Uint8Array(i)}fromBytes(e){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let i=0,a=0,c="";for(let u of e)for(i=i<<8|u,a+=8;a>=r;){a-=r;let p=i>>a&(1<<r)-1;c+=this.lexicon.characters[p]}if(a>0){let u=i<<r-a&(1<<r)-1;c+=this.lexicon.characters[u]}if(this.lexicon.padding)for(;c.length%this.lexicon.padding.size!==0;)c+=this.lexicon.padding.character;return c}let o=0n;for(let i of e)o=(o<<8n)+BigInt(i);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return s}toInteger(e){if(!e)return 0;let r=0n,o=!1,n=BigInt(this.lexicon.characters.length);e.startsWith(this.negativePrefix)&&(e=e.slice(this.negativePrefix.length),o=!0);for(let s of e){let i=this.lookup[s];if(i===void 0)throw new Error(`Invalid character: ${s}`);r=r*n+BigInt(i)}return Number(o?-r:r)}fromInteger(e){e=Math.floor(e);let r=e<0,o=BigInt(r?-e:e);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return r?`${this.negativePrefix}${s}`:s}random(e=32){return this.fromBytes(d.random(e))}};var le=Object.freeze({fromBytes(t){return typeof btoa=="function"?btoa(String.fromCharCode(...t)):Buffer.from(t).toString("base64")},toBytes(t){return typeof atob=="function"?Uint8Array.from(atob(t),e=>e.charCodeAt(0)):Uint8Array.from(Buffer.from(t,"base64"))},random(t=32){return this.fromBytes(d.random(t))},string(t){return le.fromBytes(t)},bytes(t){return le.toBytes(t)}});var Be=Object.freeze({fromBytes(t){return new TextDecoder().decode(t)},toBytes(t){return new TextEncoder().encode(t)},string(t){return Be.fromBytes(t)},bytes(t){return Be.toBytes(t)}});var V=Object.freeze({set:t=>t!=null,unset:t=>t==null,boolean:t=>typeof t=="boolean",number:t=>typeof t=="number",string:t=>typeof t=="string",bigint:t=>typeof t=="bigint",object:t=>typeof t=="object"&&t!==null,array:t=>Array.isArray(t),fn:t=>typeof t=="function",symbol:t=>typeof t=="symbol"});var W=class extends Error{milliseconds;name=this.constructor.name;constructor(e){super(`deadline exceeded (${(e/1e3).toFixed(1)} seconds)`),this.milliseconds=e}};function Z(t,e){return t<=0||t===1/0?e():new Promise((r,o)=>{let n=setTimeout(()=>o(new W(t)),t);e().then(r).catch(o).finally(()=>clearTimeout(n))})}function f(){let t,e,r=new Promise((n,s)=>{t=n,e=s});function o(n){return n.then(t).catch(e),r}return{promise:r,resolve:t,reject:e,entangle:o}}function Se(t,e){let r=t;for(let o of e)if(r=r[o],V.unset(r))break;return r}function Fe(t){return{map:e=>Ee(t,e),filter:e=>Te(t,e)}}Fe.pipe=Object.freeze({map:t=>e=>Ee(e,t),filter:t=>e=>Te(e,t)});var Ee=(t,e)=>Object.fromEntries(Object.entries(t).map(([r,o])=>[r,e(o,r)])),Te=(t,e)=>Object.fromEntries(Object.entries(t).filter(([r,o])=>e(o,r)));function Ne(){let t=new Set;function e(s){return t.add(s),()=>{t.delete(s)}}async function r(...s){await Promise.all([...t].map(i=>i(...s)))}async function o(){let{promise:s,resolve:i}=f(),a=e((...c)=>{i(c),a()});return s}function n(){t.clear()}return e.pub=r,e.sub=e,e.on=e,e.next=o,e.clear=n,r.pub=r,r.sub=e,r.on=e,r.next=o,r.clear=n,[r,e]}function G(t){let e=Ne()[0];return t&&e.sub(t),e}var g=class{#e=[];add(...e){return this.#e.push(...e),this}disposable(e){return this.bag(e,()=>e.dispose())}bag(e,r){return this.add(()=>r(e)),e}dispose(){for(let e of this.#e.reverse())e();this.#e=[]}};var w;(function(t){t.version="2.0";function e(r){return"id"in r?r.id:null}t.getId=e,t.errorCodes={serverError:-32e3,unexposedError:-32001}})(w||(w={}));var Q=class extends Error{name=this.constructor.name},k=class extends Error{name=this.constructor.name};async function Re({tap:t,request:e,action:r}){let o=w.getId(e);try{let n=await r();return o===null?null:{id:o,result:n,jsonrpc:w.version}}catch(n){return t.rpcError({request:e,error:n}),o===null?null:{id:o,jsonrpc:w.version,error:n instanceof Q?{code:w.errorCodes.serverError,message:n.message}:{code:w.errorCodes.unexposedError,message:"unexposed error"}}}}function K(t){let e=t.tap??new l;return async r=>{let o=r.method.split("."),n=Se(t.fns,o),s=async()=>await n(...r.params);return e.rpcRequest({request:r}),await Re({tap:e,request:r,action:s})}}var je=Symbol("tune"),Le=Symbol("query"),Ye=Symbol("notify"),Je=Symbol("settings");function Ce(t){function e(r){let o={notify:void 0};return new Proxy(()=>{},{apply:(n,s,i)=>t(r,i,o),get:(n,s)=>{if(s!=="then")return s===je?i=>(...a)=>t(r,a,{...o,...i}):s===Ye?(...i)=>t(r,i,{...o,notify:!0}):s===Le?(...i)=>t(r,i,{...o,notify:!1}):s===Je?o:(n[s]||(n[s]=e([...r,s])),n[s])},set:(n,s,i)=>(n[s]=i,!0)})}return e([])}function B(t){let{endpoint:e,tap:r=new l}=t,o=1;return Ce(async(n,s,i)=>{let a=i.notify??t.notify??!1,c=i.transfer,u={jsonrpc:"2.0",method:n.join("."),params:s},p=a?u:{...u,id:o++};r.rpcRequest({request:p});let m=await e(p,{transfer:c});if(a&&!m)return null;if(!m)throw new k("response was null, but shouldn't be, because the request was not a notification");if("error"in m)throw new k(t.label?`${t.label}: ${m.error.message}`:m.error.message);return m.result})}function D(t){return B({endpoint:K(t),tap:t.tap})}var S=class{recv=G();sendRequest=G();sendResponse=G();static makeEntangledPair({origin:e="example.e280.org"}={}){let r=new this,o=new this,n=[r.sendRequest.sub(i=>o.recv(i,{origin:e})),r.sendResponse.sub(i=>o.recv(i,{origin:e})),o.sendRequest.sub(i=>r.recv(i,{origin:e})),o.sendResponse.sub(i=>r.recv(i,{origin:e}))];return[r,o,()=>n.forEach(i=>i())]}};function X(t,e){return t.addEventListener("message",e),()=>t.removeEventListener("message",e)}function Oe(t,e){return async(r,{transfer:o}={})=>{if("id"in r){let n=f();return e(r,o,n.promise),t.wait(r.id,r.method).then(s=>(n.resolve(s),s))}else{let n=Promise.resolve(null);return e(r,o,n),n}}}function Me(t){let e=[],r=[];for(let o of Array.isArray(t)?t:[t])"method"in o?e.push(o):r.push(o);return{requests:e,responses:r}}async function $e(t,e){let r=(await Promise.all(e.map(async o=>t(o)))).filter(o=>o!==null);return r.length===0?null:r.length===1?r[0]:r}var j=class extends S{#e=new g;constructor(e){super(),this.#e.add(this.sendRequest.sub((r,o)=>e.postMessage(r,o)),this.sendResponse.sub((r,o)=>e.postMessage(r,o)),X(e,r=>this.recv(r.data,r)))}dispose(){this.#e.dispose()}};var ee=class{remote;transfer;constructor(e){this.remote=e}};var de=Object.freeze({timeout:6e4,maxRequestBytes:1e7});var te=class{timeout;pending=new Map;constructor(e){this.timeout=e}async wait(e,r){let o=f();return this.pending.set(e,{method:r,deferred:o}),await Z(this.timeout,()=>o.promise).catch(n=>{throw n instanceof W&&(n.message=`request #${e} ${r}(), ${n.message}`),n})}deliverResponse(e){let r=this.pending.get(e.id);r&&("error"in e?r.deferred.reject(new k(e.error.message)):r.deferred.resolve(e))}};var E=class{options;remote;remoteEndpoint;#e;#t=new g;constructor(e){this.options=e;let{conduit:r,tap:o}=e;this.#e=new te(e.timeout??de.timeout),this.remoteEndpoint=Oe(this.#e,r.sendRequest.pub.bind(r.sendRequest)),this.remote=B({endpoint:this.remoteEndpoint,tap:o&&ae(o,{remote:!0})}),this.#t.add(r.recv.sub(n=>this.recv(n)))}async recv(e){let r=new ee(this.remote),{conduit:o,rpc:n,tap:s}=this.options,{requests:i,responses:a}=Me(e);for(let m of a)this.#e.deliverResponse(m);if(!n)return;let c=await n(r),u=K({fns:c,tap:s&&ae(s,{remote:!1})}),p=await $e(u,i);p&&await o.sendResponse(p,r.transfer)}dispose(){this.#t.dispose()}};var x={derive:{host:t=>({host:t.remote.host,get transfer(){return t.transfer},set transfer(e){t.transfer=e}}),work:t=>({work:t.remote,get transfer(){return t.transfer},set transfer(e){t.transfer=e}})},mock:{host:()=>({host:void 0,transfer:void 0}),work:()=>({work:void 0,transfer:void 0})}};var b=new l;async function Ie(t,e,r={}){let o=r.tap??b,n=new E({tap:o,timeout:r.timeout??1/0,conduit:new j(t.getSelf()),rpc:async s=>e(x.derive.host(s))});return await n.remote.infra.ready(),n.remote.host}var C=class{worker;messenger;constructor(e,r){this.worker=e,this.messenger=r}static async make(e,r){let o=r.tap??b,n=r.label??"comrade",s=e.loadWorker(r.workerUrl,n),i=f(),a={async ready(){i.resolve()}},c=new E({tap:o,timeout:r.timeout??1/0,conduit:new j(s),rpc:async u=>({infra:a,host:r.setupHost(x.derive.work(u))})});return await i.promise,new this(s,c)}get work(){return this.messenger.remote}terminate(){this.worker.terminate()}};var re=class{threads;static async make(e,r){let o=r.workerCount??e.guessOptimalThreadCount(),n=await Promise.all([...Array(o)].map(async(s,i)=>C.make(e,{...r,label:r.label??`${r.label??"comrade"}_${i+1}`})));return new this(n,{tap:r.tap})}work;#e=new Set;#t=[];constructor(e,r={}){this.threads=e;let o=r.tap??b,n=async(s,i)=>this.#o({request:s,prom:f(),transfer:i?.transfer});this.work=B({tap:o,endpoint:n}),e.forEach(s=>this.#e.add(s))}get threadCount(){return this.threads.length}terminate(){for(let e of this.threads)e.terminate()}#o(e){return this.#t.push(e),this.#r(),e.prom.promise}#r(){for(;this.#e.size>0&&this.#t.length>0;){let e=[...this.#e].pop();this.#e.delete(e);let r=this.#t.shift();this.#e.delete(e);let o=e.messenger.remoteEndpoint(r.request,{transfer:r.transfer});r.prom.entangle(o).finally(()=>{this.#e.add(e),this.#r()})}}};var Pe=t=>({thread:e=>C.make(t,e),cluster:e=>re.make(t,e),worker:(e,r={})=>Ie(t,e,r),work:e=>e,host:e=>e,mocks(e){let{setupWork:r,setupHost:o,tap:n=b}=e,s=x.mock.host(),i=x.mock.work();return i.work=D({tap:n,fns:r(s)}),s.host=D({tap:n,fns:o(i)}),{workShell:i,hostShell:s,work:i.work,host:s.host}},mockWork(e,r=b){let o=x.mock.host(),n=x.mock.work();return n.work=D({tap:r,fns:e(o)}),{workShell:n,hostShell:o,work:n.work,mockHost:s=>(o.host=D({tap:r,fns:s(n)}),{workShell:n,hostShell:o,work:n.work,host:o.host})}}});var We=()=>({getSelf(){return self},guessOptimalThreadCount(){let t=navigator.hardwareConcurrency??1;return Math.max(1,t-1)},loadWorker(t,e){return new window.Worker(t,{name:e,type:"module"})},async loadWasm(t){return WebAssembly.instantiateStreaming(fetch(t))}});var Qe=We(),oe=Pe(Qe);import{WhisperTextStreamer as Xe}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";import{pipeline as Ke}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";var ne=class{task;instance=null;model=null;constructor(e){this.task=e}async createInstance(e,r){return this.model=e,this.instance=await Ke(this.task,this.model,{dtype:{encoder_model:this.model==="onnx-community/whisper-large-v3-turbo"?"fp16":"fp32",decoder_model_merged:"q4"},device:"webgpu",progress_callback:r})}};var z=new ne("automatic-speech-recognition"),A,De=oe.work(t=>({async transcribe({audio:e,model:r,language:o,duration:n}){let s=r.startsWith("distil-whisper/");(!z.model||z.model!==r)&&(z.instance?.dispose()?.(),z.instance=null,A=await z.createInstance(r,h=>{h.progress&&t.host.updateModelLoadProgress({id:h.file,progress:h.progress})}));let i=A.processor.feature_extractor.config.chunk_length/A.model.config.max_source_positions,a=s?20:30,c=s?3:5,u=0,p=null,m=0,O=0,se=a-c,ie=()=>{let h=u*se;return Math.min(h/n,1)},q=new Xe(A.tokenizer,{time_precision:i,token_callback_function:()=>{p??=performance.now(),++m>1&&(O=m/(performance.now()-p)*1e3,t.host.updateTps(O))},callback_function:h=>{t.host.deliverTranscriptionChunk(h)},on_finalize:()=>{p=null,m=0,u++;let h=ie();t.host.updateTranscribeProgress(h)}}),T=await A(e,{top_k:0,do_sample:!1,chunk_length_s:a,stride_length_s:c,language:o,task:"transcribe",return_timestamps:"word",force_full_sequences:!1,streamer:q});return T?{tps:O,...T}:null}}));await oe.worker(De);
|
|
8
|
-
//# sourceMappingURL=worker.bundle.min.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../node_modules/@e280/renraku/s/core/taps/bind.ts", "../../../../../node_modules/@e280/sten/s/themes/basic.ts", "../../../../../node_modules/@e280/sten/s/themes/auto.ts", "../../../../../node_modules/@e280/sten/s/colors/parts/codes.ts", "../../../../../node_modules/@e280/sten/s/colors/parts/color-fns.ts", "../../../../../node_modules/@e280/sten/s/colors/colorless.ts", "../../../../../node_modules/@e280/sten/s/colors/colorful.ts", "../../../../../node_modules/@e280/sten/s/utils/supports.ts", "../../../../../node_modules/@e280/sten/s/colors/auto.ts", "../../../../../node_modules/@e280/sten/s/shapers/errors.ts", "../../../../../node_modules/@e280/sten/s/shapers/shaper.ts", "../../../../../node_modules/@e280/sten/s/shapers/timestamp.ts", "../../../../../node_modules/@e280/sten/s/shapers/auto.ts", "../../../../../node_modules/@e280/sten/s/writers/deno.ts", "../../../../../node_modules/@e280/sten/s/writers/node.ts", "../../../../../node_modules/@e280/sten/s/writers/console.ts", "../../../../../node_modules/@e280/sten/s/writers/auto.ts", "../../../../../node_modules/@e280/sten/s/writers/void.ts", "../../../../../node_modules/@e280/sten/s/shapers/none.ts", "../../../../../node_modules/@e280/sten/s/logger.ts", "../../../../../node_modules/@e280/renraku/s/core/taps/logger.ts", "../../../../../node_modules/@e280/renraku/s/core/taps/error.ts", "../../../../../node_modules/@e280/stz/s/data/bytes.ts", "../../../../../node_modules/@e280/stz/s/data/hex.ts", "../../../../../node_modules/@e280/stz/s/data/base58.ts", "../../../../../node_modules/@e280/stz/s/data/base-x.ts", "../../../../../node_modules/@e280/stz/s/data/base64.ts", "../../../../../node_modules/@e280/stz/s/data/txt.ts", "../../../../../node_modules/@e280/stz/s/is.ts", "../../../../../node_modules/@e280/stz/s/deadline.ts", "../../../../../node_modules/@e280/stz/s/defer.ts", "../../../../../node_modules/@e280/stz/s/drill.ts", "../../../../../node_modules/@e280/stz/s/ob.ts", "../../../../../node_modules/@e280/stz/s/pubsub.ts", "../../../../../node_modules/@e280/stz/s/trash.ts", "../../../../../node_modules/@e280/renraku/s/core/json-rpc.ts", "../../../../../node_modules/@e280/renraku/s/core/errors.ts", "../../../../../node_modules/@e280/renraku/s/core/execute.ts", "../../../../../node_modules/@e280/renraku/s/core/endpoint.ts", "../../../../../node_modules/@e280/renraku/s/core/remote-proxy.ts", "../../../../../node_modules/@e280/renraku/s/core/remote.ts", "../../../../../node_modules/@e280/renraku/s/core/mock.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/conduits/conduit.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/parts/helpers.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/conduits/postable.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/parts/meta.ts", "../../../../../node_modules/@e280/renraku/s/defaults.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/parts/response-waiter.ts", "../../../../../node_modules/@e280/renraku/s/transports/messenger/messenger.ts", "../../../../../node_modules/@e280/comrade/s/parts/shells.ts", "../../../../../node_modules/@e280/comrade/s/parts/default-tap.ts", "../../../../../node_modules/@e280/comrade/s/parts/worker.ts", "../../../../../node_modules/@e280/comrade/s/parts/thread.ts", "../../../../../node_modules/@e280/comrade/s/parts/cluster.ts", "../../../../../node_modules/@e280/comrade/s/comrade.ts", "../../../../../node_modules/@e280/comrade/s/compat/browser.ts", "../../../../../node_modules/@e280/comrade/s/index.browser.ts", "../../../../../s/tools/speech-recognition/whisper/fns/work.ts", "../../../../../s/tools/common/transformer-pipeline.ts", "../../../../../s/tools/speech-recognition/whisper/parts/worker.bundle.ts"],
|
|
4
|
-
"sourcesContent": ["\nimport {Tap, TapContext} from \"../types.js\"\n\nexport function bindTap(tap: Tap, ctx: TapContext): Tap {\n\treturn {\n\t\terror: o => tap.error({...ctx, ...o}),\n\t\trpcRequest: o => tap.rpcRequest({...ctx, ...o}),\n\t\trpcError: o => tap.rpcError({...ctx, ...o}),\n\t}\n}\n\n", "\nimport {asTheme} from \"./theme.js\"\n\nexport const basicTheme = () => asTheme(colors => ({\n\tplain: colors.none,\n\terrMessage: colors.mix(colors.brightRed, colors.bold),\n\terrName: colors.red,\n\terrStack: colors.mix(colors.red, colors.dim),\n\ttimestamp: colors.blue,\n\ttimestampErr: colors.red,\n}))\n\n", "\nimport {basicTheme} from \"./basic.js\"\n\nexport function autoTheme() {\n\treturn basicTheme()\n}\n\n", "\nexport const codes = Object.freeze({\n\n\t// regular colors\n\tblack: \"\\u001b[30m\",\n\tred: \"\\u001b[31m\",\n\tgreen: \"\\u001b[32m\",\n\tyellow: \"\\u001b[33m\",\n\tblue: \"\\u001b[34m\",\n\tmagenta: \"\\u001b[35m\",\n\tcyan: \"\\u001b[36m\",\n\twhite: \"\\u001b[37m\",\n\n\t// bright colors\n\tbrightBlack: \"\\u001b[90m\",\n\tbrightRed: \"\\u001b[91m\",\n\tbrightGreen: \"\\u001b[92m\",\n\tbrightYellow: \"\\u001b[93m\",\n\tbrightBlue: \"\\u001b[94m\",\n\tbrightMagenta: \"\\u001b[95m\",\n\tbrightCyan: \"\\u001b[96m\",\n\tbrightWhite: \"\\u001b[97m\",\n\n\t// background colors\n\tbgBlack: \"\\u001b[40m\",\n\tbgRed: \"\\u001b[41m\",\n\tbgGreen: \"\\u001b[42m\",\n\tbgYellow: \"\\u001b[43m\",\n\tbgBlue: \"\\u001b[44m\",\n\tbgMagenta: \"\\u001b[45m\",\n\tbgCyan: \"\\u001b[46m\",\n\tbgWhite: \"\\u001b[47m\",\n\n\t// bright background colors\n\tbgBrightBlack: \"\\u001b[100m\",\n\tbgBrightRed: \"\\u001b[101m\",\n\tbgBrightGreen: \"\\u001b[102m\",\n\tbgBrightYellow: \"\\u001b[103m\",\n\tbgBrightBlue: \"\\u001b[104m\",\n\tbgBrightMagenta: \"\\u001b[105m\",\n\tbgBrightCyan: \"\\u001b[106m\",\n\tbgBrightWhite: \"\\u001b[107m\",\n\n\t// styles\n\tbold: \"\\u001b[1m\",\n\tdim: \"\\u001b[2m\",\n\titalic: \"\\u001b[3m\",\n\tunderline: \"\\u001b[4m\",\n\tinverse: \"\\u001b[7m\",\n\thidden: \"\\u001b[8m\",\n\tstrikethrough: \"\\u001b[9m\",\n\n\t// reset\n\treset: \"\\u001b[0m\",\n})\n\n", "\nimport {codes} from \"./codes.js\"\n\nexport type ColorFn = (s: string) => string\n\nexport const colorFns = () => ({\n\tnone: (s: string) => s,\n\tuncolor,\n\tmix,\n\thex,\n\trgb,\n\tbgRgb,\n})\n\nexport function uncolor(s: string) {\n\treturn s.replace(\n\t\t/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n\t\t\"\",\n\t)\n}\n\nexport function mix(...colorFns: ColorFn[]) {\n\treturn (s: string) => {\n\t\tfor (const fn of colorFns)\n\t\t\ts = fn(s)\n\t\treturn s\n\t}\n}\n\nexport function hex(hex: string) {\n\thex = hex.replace(/^#/, \"\")\n\tlet bigint: number\n\tlet r: number\n\tlet g: number\n\tlet b: number\n\n\tif (hex.length === 3)\n\t\tbigint = parseInt(hex.split('').map(c => c + c).join(''), 16)\n\telse if (hex.length === 6)\n\t\tbigint = parseInt(hex, 16)\n\telse\n\t\tthrow new Error('Invalid hex color')\n\n\tr = (bigint >> 16) & 255\n\tg = (bigint >> 8) & 255\n\tb = bigint & 255\n\treturn rgb(r, g, b)\n}\n\nexport function rgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[38;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\nexport function bgRgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[48;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\n", "\nimport {Colors} from \"./colorful.js\"\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport const colorless = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => s,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n} as Colors\n\n", "\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport type Colors = typeof colorful\n\nexport const colorful = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key, code]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => `${code}${s}${codes.reset}`,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n}\n\n", "\ndeclare const Deno: any\n\nexport function isDeno() {\n\treturn typeof Deno !== \"undefined\" && typeof Deno.version !== \"undefined\"\n}\n\nexport function isNode() {\n\treturn (\n\t\ttypeof process !== \"undefined\" &&\n\t\tprocess.versions &&\n\t\tprocess.versions.node\n\t)\n}\n\nexport function isColorSupported() {\n\tif (isNode())\n\t\treturn (process.env.FORCE_COLOR) || (\n\t\t\tprocess.stdout.isTTY &&\n\t\t\tprocess.env.TERM !== \"dumb\"\n\t\t)\n\n\telse if (isDeno())\n\t\treturn (Deno.env.get(\"FORCE_COLOR\")) || (\n\t\t\tDeno.isatty(Deno.stdout.rid) &&\n\t\t\tDeno.env.get(\"TERM\") !== \"dumb\"\n\t\t)\n\n\telse\n\t\treturn false\n}\n\nexport function exit(code: number) {\n\tif (isNode())\n\t\tprocess.exit(code)\n\telse if (isDeno())\n\t\tDeno.exit(code)\n}\n\nexport function hasEnv(name: string): boolean {\n\tif (isNode())\n\t\treturn name in process.env\n\telse if (isDeno())\n\t\treturn Deno.env.get(name) !== undefined\n\treturn false\n}\n\nexport function hasArg(arg: string): boolean {\n\tif (isNode())\n\t\treturn process.argv.slice(1).includes(arg)\n\telse if (isDeno())\n\t\treturn Deno.args.includes(arg)\n\telse\n\t\treturn false\n}\n\nfunction findArgValue(name: string, args: string[]) {\n\tfor (const arg of args) {\n\t\tif (arg.includes(\"=\")) {\n\t\t\tconst [first, ...rest] = arg.split(\"=\")\n\t\t\tif (first === name)\n\t\t\t\treturn rest.join(\"=\")\n\t\t}\n\t}\n}\n\nexport function getArg(name: string) {\n\tif (isNode())\n\t\treturn findArgValue(name, process.argv.slice(1))\n\telse if (isDeno())\n\t\treturn findArgValue(name, Deno.args)\n}\n\nexport function getEnv(name: string): string | undefined {\n\tif (isNode())\n\t\treturn process.env[name]\n\telse if (isDeno())\n\t\treturn Deno.env.get(name)\n}\n\nexport async function writeStdout(line: string) {\n\tif (isNode())\n\t\tprocess.stdout.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.log(line)\n}\n\nexport async function writeStderr(line: string) {\n\tif (isNode())\n\t\tprocess.stderr.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.error(line)\n}\n\n", "\nimport {colorless} from \"./colorless.js\"\nimport {colorful, Colors} from \"./colorful.js\"\nimport {isColorSupported} from \"../utils/supports.js\"\n\nexport const autoColors = (): Colors => {\n\treturn isColorSupported()\n\t\t? colorful\n\t\t: colorless\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport const errorsShaper = (): Shaper => ({colors, theme}) => {\n\tconst palette = theme(colors)\n\n\tfunction errstring(error: Error) {\n\t\tconst stack = error.stack\n\t\t\t? \"\\n\" + error.stack + \"\\n\"\n\t\t\t: \"\"\n\t\treturn [\n\t\t\tpalette.errName(error.name + \":\"),\n\t\t\tpalette.errMessage(error.message),\n\t\t].join(\" \") + palette.errStack(stack)\n\t}\n\n\tfunction processErrors(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: item\n\t}\n\n\tfunction processAll(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: palette.errMessage(item)\n\t}\n\n\treturn {\n\t\tstdout: items => items.map(processErrors),\n\t\tstderr: items => items.map(processAll),\n\t}\n}\n\n", "\nimport {Theme} from \"../themes/theme.js\"\nimport {Colors} from \"../colors/colorful.js\"\n\nexport type ShaperContext = {\n\tcolors: Colors\n\ttheme: Theme\n}\n\nexport type Shaper = (context: ShaperContext) => ShaperFns\n\nexport type ShaperFns = {\n\tstdout: (items: any[]) => any[]\n\tstderr: (items: any[]) => any[]\n}\n\nexport function asShaper(shaper: Shaper) {\n\treturn shaper\n}\n\nexport function combineShapers(...shapers: Shaper[]): Shaper {\n\treturn context => ({\n\t\tstdout: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stdout(items)\n\t\t\treturn items\n\t\t},\n\t\tstderr: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stderr(items)\n\t\t\treturn items\n\t\t},\n\t})\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport type TimestampOptions = {\n\ticon: string | undefined\n\tnow: () => number\n}\n\nfunction defaultTimestampOptions(): TimestampOptions {\n\treturn {\n\t\ticon: \"\uD83D\uDEA8\",\n\t\tnow: () => Date.now(),\n\t}\n}\n\nexport const timestampShaper = (options?: Partial<TimestampOptions>): Shaper => ({colors, theme}) => {\n\tconst opts = {...defaultTimestampOptions(), ...options}\n\tconst palette = theme(colors)\n\n\tconst date = new Date(opts.now())\n\n\tconst year = date.getUTCFullYear().toString().padStart(4, \"0\")\n\tconst month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\")\n\tconst day = date.getUTCDate().toString().padStart(2, \"0\")\n\tconst calendar = `${year}-${month}-${day}`\n\n\tconst hour = date.getUTCHours().toString().padStart(2, \"0\")\n\tconst minute = date.getUTCMinutes().toString().padStart(2, \"0\")\n\tconst second = date.getUTCSeconds().toString().padStart(2, \"0\")\n\tconst milliseconds = date.getUTCMilliseconds().toString().padStart(3, \"0\")\n\tconst clock = `${hour}:${minute}:${second}.${milliseconds}`\n\n\tconst stamp = `${calendar}::${clock}`\n\n\treturn {\n\t\tstdout: items => [\n\t\t\tpalette.timestamp(stamp),\n\t\t\t...items,\n\t\t],\n\t\tstderr: items => [\n\t\t\tpalette.timestampErr(stamp),\n\t\t\t...[opts.icon].filter(Boolean),\n\t\t\t...items,\n\t\t],\n\t}\n}\n\n", "\nimport {errorsShaper} from \"./errors.js\"\nimport {combineShapers} from \"./shaper.js\"\nimport {timestampShaper} from \"./timestamp.js\"\n\nexport function autoShaper() {\n\treturn combineShapers(\n\t\terrorsShaper(),\n\t\ttimestampShaper(),\n\t)\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\ndeclare const Deno: any\n\nexport const denoWriter = (): Writer => ({\n\tstdout: async line => {\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n\tstderr: async line => {\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const nodeWriter = (): Writer => ({\n\tstdout: async(line: string) => void process.stdout.write(line + \"\\n\"),\n\tstderr: async(line: string) => void process.stderr.write(line + \"\\n\"),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const consoleWriter = (): Writer => ({\n\tstdout: async line => console.log(line),\n\tstderr: async line => console.error(line),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\nimport {denoWriter} from \"./deno.js\"\nimport {nodeWriter} from \"./node.js\"\nimport {consoleWriter} from \"./console.js\"\nimport {isDeno, isNode} from \"../utils/supports.js\"\n\nexport const autoWriter = (): Writer => {\n\tif (isDeno()) return denoWriter()\n\telse if (isNode()) return nodeWriter()\n\telse return consoleWriter()\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const voidWriter = (): Writer => ({\n\tstdout: async() => undefined,\n\tstderr: async() => undefined,\n})\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport function noneShaper(): Shaper {\n\treturn () => ({\n\t\tstdout: items => items,\n\t\tstderr: items => items,\n\t})\n}\n\n", "\nimport {Theme} from \"./themes/theme.js\"\nimport {Writer} from \"./writers/writer.js\"\nimport {autoTheme} from \"./themes/auto.js\"\nimport {autoColors} from \"./colors/auto.js\"\nimport {autoShaper} from \"./shapers/auto.js\"\nimport {autoWriter} from \"./writers/auto.js\"\nimport {basicTheme} from \"./themes/basic.js\"\nimport {denoWriter} from \"./writers/deno.js\"\nimport {nodeWriter} from \"./writers/node.js\"\nimport {voidWriter} from \"./writers/void.js\"\nimport {noneShaper} from \"./shapers/none.js\"\nimport {colorless} from \"./colors/colorless.js\"\nimport {errorsShaper} from \"./shapers/errors.js\"\nimport {consoleWriter} from \"./writers/console.js\"\nimport {colorful, Colors} from \"./colors/colorful.js\"\nimport {timestampShaper} from \"./shapers/timestamp.js\"\nimport {combineShapers, Shaper} from \"./shapers/shaper.js\"\n\nexport class Logger {\n\tstatic writers = {\n\t\tauto: autoWriter,\n\t\tvoid: voidWriter,\n\t\tdeno: denoWriter,\n\t\tnode: nodeWriter,\n\t\tconsole: consoleWriter,\n\t}\n\n\tstatic colors = {\n\t\tauto: autoColors,\n\t\tcolorful: () => colorful,\n\t\tcolorless: () => colorless,\n\t}\n\n\tstatic themes = {\n\t\tauto: autoTheme,\n\t\tbasic: basicTheme,\n\t}\n\n\tstatic shapers = {\n\t\tauto: autoShaper,\n\t\tnone: noneShaper,\n\t\terrors: errorsShaper,\n\t\ttimestamp: timestampShaper,\n\t}\n\n\twriter: Writer = Logger.writers.auto()\n\tcolors: Colors = Logger.colors.auto()\n\ttheme: Theme = Logger.themes.auto()\n\tshaper: Shaper = Logger.shapers.auto()\n\n\tasync log(...items: any[]) {\n\t\tawait this.writer.stdout(\n\t\t\tthis.shaper(this).stdout(items).join(\" \")\n\t\t)\n\t}\n\n\tasync error(...items: any[]) {\n\t\tawait this.writer.stderr(\n\t\t\tthis.shaper(this).stderr(items).join(\" \")\n\t\t)\n\t}\n\n\tsetWriter(writer: Writer) {\n\t\tthis.writer = writer\n\t\treturn this\n\t}\n\n\tsetColors(colors: Colors) {\n\t\tthis.colors = colors\n\t\treturn this\n\t}\n\n\tsetTheme(theme: Theme) {\n\t\tthis.theme = theme\n\t\treturn this\n\t}\n\n\tsetShaper(...shapers: Shaper[]) {\n\t\tthis.shaper = combineShapers(...shapers)\n\t\treturn this\n\t}\n}\n\n", "\nimport {Logger} from \"@e280/sten\"\nimport {Tap, HttpMeta, TapContext} from \"../types.js\"\n\nexport class LoggerTap extends Logger implements Tap {\n\tstatic dummy() {\n\t\treturn new this().setWriter(Logger.writers.void())\n\t}\n\n\trpcRequest: Tap[\"rpcRequest\"] = async({request, ...context}) => {\n\t\tconst g = this.colors.none\n\t\tthis.log(\n\t\t\t...this.#context(context),\n\t\t\tg(`${request.method}()`),\n\t\t)\n\t}\n\n\trpcError: Tap[\"rpcError\"] = async({request, error, ...context}) => {\n\t\tthis.error(\n\t\t\t...this.#context(context),\n\t\t\t`${request.method}()`,\n\t\t\terror,\n\t\t)\n\t}\n\n\t#context({meta, label, remote}: TapContext) {\n\t\tconst cRemote = this.colors.mix(this.colors.blue, this.colors.dim)\n\t\tconst cLocal = this.colors.mix(this.colors.cyan, this.colors.dim)\n\t\treturn [\n\t\t\tmeta\n\t\t\t\t? this.#meta(meta)\n\t\t\t\t: undefined,\n\t\t\tlabel\n\t\t\t\t? label\n\t\t\t\t: undefined,\n\t\t\tremote === undefined\n\t\t\t\t? undefined\n\t\t\t\t: remote\n\t\t\t\t\t? cRemote(\"<-\")\n\t\t\t\t\t: cLocal(\"->\"),\n\t\t].filter(Boolean)\n\t}\n\n\t#meta(meta: HttpMeta) {\n\t\tconst {headers} = meta.request\n\t\treturn [\n\t\t\tthis.colors.yellow(`[${meta.ip}]`),\n\t\t\tthis.colors.green(headers.origin ?headers.origin :\"(no-origin)\"),\n\t\t].join(\" \")\n\t}\n}\n\n", "\nimport {Tap} from \"../types.js\"\nimport {LoggerTap} from \"./logger.js\"\n\nexport class ErrorTap extends LoggerTap implements Tap {\n\trpcRequest: Tap[\"rpcRequest\"] = async() => {}\n}\n\n", "\nexport const Bytes = Object.freeze({\n\teq(a: Uint8Array, b: Uint8Array) {\n\t\tif (a.length !== b.length)\n\t\t\treturn false\n\t\tfor (let i = 0; i <= a.length; i++) {\n\t\t\tif (a.at(i) !== b.at(i))\n\t\t\t\treturn false\n\t\t}\n\t\treturn true\n\t},\n\n\trandom(count: number) {\n\t\treturn crypto.getRandomValues(new Uint8Array(count))\n\t},\n})\n\n", "\n/*\n\n256-bit hex ids look like this:\n\n\t8ff8dfbc7c994c5439d2dd327b9898aa6796f97fb396e262985f03f868707e32\n\t6b99284a2c4a1c5f101502bd009f9fb592ca4427e4375155e411ddd07ed9da6b\n\t2eb73fb00a2b9e38c855b5aa353b530d820a3a2dcea5013b7e4e277ddfe9d0ad\n\n*/\n\nimport {Bytes} from \"./bytes.js\"\n\nexport const Hex = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn [...bytes]\n\t\t\t.map(byte => byte.toString(16).padStart(2, \"0\"))\n\t\t\t.join(\"\")\n\t},\n\n\ttoBytes(string: string) {\n\t\tif (string.length % 2 !== 0)\n\t\t\tthrow new Error(\"must have even number of hex characters\")\n\t\tconst bytes = new Uint8Array(string.length / 2)\n\t\tfor (let i = 0; i < string.length; i += 2)\n\t\t\tbytes[i / 2] = parseInt(string.slice(i, i + 2), 16)\n\t\treturn bytes\n\t},\n\n\t/** generate a random hex string. byteCount defaults to 32. */\n\trandom(byteCount = 32) {\n\t\treturn this.fromBytes(Bytes.random(byteCount))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Hex.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Hex.toBytes(string)\n\t},\n})\n\n", "\n/*\n\n256-bit base58 ids look like this:\n\n\t9X1D9rdkDgRdykzmogNcxfopRc7TnbS869ow1E2ehCFS\n\tAmRKyNfq6jhhsd9qda1Y6rAVS2NLUqyTUvfcB2wUiiAC\n\t8skYcqBAXsejDcJzsZMo19PErt43DHP3bykaXBtMvdu\n\n*/\n\nimport {Hex} from \"./hex.js\"\nimport {Bytes} from \"./bytes.js\"\n\nconst base = 58\nconst characters = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\nexport const Base58 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\tlet intVal = BigInt(\"0x\" + Hex.fromBytes(bytes))\n\t\tlet encoded = \"\"\n\n\t\twhile (intVal > 0) {\n\t\t\tconst remainder = intVal % BigInt(base)\n\t\t\tintVal = intVal / BigInt(base)\n\t\t\tencoded = characters[Number(remainder)] + encoded\n\t\t}\n\n\t\tfor (const byte of bytes) {\n\t\t\tif (byte === 0) encoded = characters[0] + encoded\n\t\t\telse break\n\t\t}\n\n\t\treturn encoded\n\t},\n\n\ttoBytes(string: string) {\n\t\tlet intVal = BigInt(0)\n\n\t\tfor (const char of string) {\n\t\t\tconst index = characters.indexOf(char)\n\t\t\tif (index === -1) throw new Error(`Invalid character '${char}' in base58 string`)\n\t\t\tintVal = intVal * BigInt(base) + BigInt(index)\n\t\t}\n\n\t\tlet hex = intVal.toString(16)\n\t\tif (hex.length % 2 !== 0) hex = \"0\" + hex\n\t\tconst bytes = Hex.toBytes(hex)\n\n\t\tlet leadingZeroes = 0\n\t\tfor (const char of string) {\n\t\t\tif (char === characters[0]) leadingZeroes++\n\t\t\telse break\n\t\t}\n\n\t\tconst decoded = new Uint8Array(leadingZeroes + bytes.length)\n\t\tdecoded.set(bytes, leadingZeroes)\n\t\treturn decoded\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base58.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Base58.toBytes(string)\n\t},\n})\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport type Lexicon = {\n\tcharacters: string\n\tnegativePrefix?: string\n\tpadding?: {\n\t\tcharacter: string\n\t\tsize: number\n\t}\n}\n\nexport class BaseX {\n\tstatic lexicons = Object.freeze({\n\t\tbase2: {characters: \"01\"},\n\t\thex: {characters: \"0123456789abcdef\"},\n\t\tbase36: {characters: \"0123456789abcdefghijklmnopqrstuvwxyz\"},\n\t\tbase58: {characters: \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"},\n\t\tbase62: {characters: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"},\n\t\tbase64url: {\n\t\t\tnegativePrefix: \"~\",\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\",\n\t\t},\n\t\tbase64: {\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n\t\t\tpadding: {character: \"=\", size: 4},\n\t\t},\n\t})\n\n\tprivate lookup: Record<string, number>\n\tprivate negativePrefix: string\n\n\tconstructor(public lexicon: Lexicon) {\n\t\tthis.lookup = Object.fromEntries(\n\t\t\t[...lexicon.characters].map((char, i) => [char, i])\n\t\t)\n\t\tthis.negativePrefix = lexicon.negativePrefix ?? \"-\"\n\t}\n\n\ttoBytes(s: string): Uint8Array {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tconst output: number[] = []\n\n\t\t\tfor (const char of s) {\n\t\t\t\tif (char === this.lexicon.padding?.character) continue\n\t\t\t\tconst val = this.lookup[char]\n\t\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\t\tbitBuffer = (bitBuffer << bitsPerChar) | val\n\t\t\t\tbitCount += bitsPerChar\n\n\t\t\t\twhile (bitCount >= 8) {\n\t\t\t\t\tbitCount -= 8\n\t\t\t\t\toutput.push((bitBuffer >> bitCount) & 0xFF)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new Uint8Array(output)\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet negative = false\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst val = this.lookup[char]\n\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tnum = num * base + BigInt(val)\n\t\t}\n\t\tconst out: number[] = []\n\t\twhile (num > 0n) {\n\t\t\tout.unshift(Number(num % 256n))\n\t\t\tnum = num / 256n\n\t\t}\n\t\treturn new Uint8Array(out)\n\t}\n\n\tfromBytes(bytes: Uint8Array): string {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tlet out = \"\"\n\n\t\t\tfor (const byte of bytes) {\n\t\t\t\tbitBuffer = (bitBuffer << 8) | byte\n\t\t\t\tbitCount += 8\n\n\t\t\t\twhile (bitCount >= bitsPerChar) {\n\t\t\t\t\tbitCount -= bitsPerChar\n\t\t\t\t\tconst index = (bitBuffer >> bitCount) & ((1 << bitsPerChar) - 1)\n\t\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// \uD83E\uDE79 flush remaining bits\n\t\t\tif (bitCount > 0) {\n\t\t\t\tconst index = (bitBuffer << (bitsPerChar - bitCount)) & ((1 << bitsPerChar) - 1)\n\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t}\n\n\t\t\t// Add padding if applicable\n\t\t\tif (this.lexicon.padding) {\n\t\t\t\twhile (out.length % this.lexicon.padding.size !== 0)\n\t\t\t\t\tout += this.lexicon.padding.character\n\t\t\t}\n\n\t\t\treturn out\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tfor (const byte of bytes)\n\t\t\tnum = (num << 8n) + BigInt(byte)\n\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn out\n\t}\n\n\ttoInteger(s: string) {\n\t\tif (!s) return 0\n\t\tlet n = 0n\n\t\tlet negative = false\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst value = this.lookup[char]\n\t\t\tif (value === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tn = n * base + BigInt(value)\n\t\t}\n\t\treturn Number(negative ? -n : n)\n\t}\n\n\tfromInteger(n: number) {\n\t\tn = Math.floor(n)\n\t\tconst negative = n < 0\n\t\tlet num = BigInt(negative ? -n : n)\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn negative ? `${this.negativePrefix}${out}` : out\n\t}\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t}\n}\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport const Base64 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn (typeof btoa === \"function\")\n\t\t\t? btoa(String.fromCharCode(...bytes))\n\t\t\t: Buffer.from(bytes).toString(\"base64\")\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn (typeof atob === \"function\")\n\t\t\t? Uint8Array.from(atob(string), char => char.charCodeAt(0))\n\t\t\t: Uint8Array.from(Buffer.from(string, \"base64\"))\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated rename to \"fromBytes\" */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base64.fromBytes(bytes)\n\t},\n\n\t/** @deprecated rename to \"toBytes\" */\n\tbytes(string: string) {\n\t\treturn Base64.toBytes(string)\n\t},\n})\n\n", "\nexport const Txt = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn new TextDecoder().decode(bytes)\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn new TextEncoder().encode(string)\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Txt.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Txt.toBytes(string)\n\t},\n})\n\n", "\nexport const is = Object.freeze({\n\tset: <X>(x: X): x is NonNullable<X> =>\n\t\tx !== undefined && x !== null,\n\n\tunset: (x: any): x is (undefined | null) =>\n\t\tx === undefined || x === null,\n\n\tboolean: (x: any): x is boolean =>\n\t\ttypeof x === \"boolean\",\n\n\tnumber: (x: any): x is number =>\n\t\ttypeof x === \"number\",\n\n\tstring: (x: any): x is string =>\n\t\ttypeof x === \"string\",\n\n\tbigint: (x: any): x is bigint =>\n\t\ttypeof x === \"bigint\",\n\n\tobject: <X>(x: X): x is object & NonNullable<X> =>\n\t\ttypeof x === \"object\" && x !== null,\n\n\tarray: (x: any | any[]): x is any[] =>\n\t\tArray.isArray(x),\n\n\tfn: (x: any): x is (...a: any[]) => any =>\n\t\ttypeof x === \"function\",\n\n\tsymbol: (x: any): x is symbol =>\n\t\ttypeof x === \"symbol\",\n})\n\n", "\nexport class DeadlineError extends Error {\n\tname = this.constructor.name\n\tconstructor(public milliseconds: number) {\n\t\tsuper(`deadline exceeded (${(milliseconds / 1000).toFixed(1)} seconds)`)\n\t}\n}\n\n/** set a deadline for a fn to do something, will reject with a `DeadlineError` if it takes too long */\nexport function deadline<R>(milliseconds: number, fn: () => Promise<R>) {\n\tif (milliseconds <= 0 || milliseconds === Infinity)\n\t\treturn fn()\n\n\treturn new Promise<R>((resolve, reject) => {\n\t\tconst id = setTimeout(\n\t\t\t() => reject(new DeadlineError(milliseconds)),\n\t\t\tmilliseconds,\n\t\t)\n\t\tfn()\n\t\t\t.then(resolve)\n\t\t\t.catch(reject)\n\t\t\t.finally(() => clearTimeout(id))\n\t})\n}\n\n", "\n/** a promise which can be resolved from the outside */\nexport type Deferred<R = void> = {\n\tpromise: Promise<R>\n\tresolve: (result: R) => void\n\treject: (reason: any) => void\n\n\t/** ties the fate of this deferred promise to the outcome of the provided outsidePromise */\n\tentangle: (outsidePromise: Promise<R>) => Promise<R>\n}\n\n/** returns a deferred promise with exposed resolve and reject fns */\nexport function defer<R = void>(): Deferred<R> {\n\tlet resolve!: (result: R) => void\n\tlet reject!: (reason: any) => void\n\n\tconst promise = new Promise<R>((res, rej) => {\n\t\tresolve = res\n\t\treject = rej\n\t})\n\n\tfunction entangle(outside: Promise<R>) {\n\t\toutside.then(resolve).catch(reject)\n\t\treturn promise\n\t}\n\n\treturn {promise, resolve, reject, entangle}\n}\n\n", "\nimport {is} from \"./is.js\"\n\n/** return a value within an object tree, found at the given path. */\nexport function drill<xResult>(\n\t\tobject: {[key: string]: any},\n\t\tpath: string[],\n\t): xResult {\n\n\tlet current: any = object\n\n\tfor (const key of path) {\n\t\tcurrent = current[key]\n\t\tif (is.unset(current))\n\t\t\tbreak\n\t}\n\n\treturn current\n}\n\n", "\nexport function ob<Ob extends object>(o: Ob) {\n\treturn {\n\t\tmap: <Value>(transform: ObTransform<Ob, Value>) => (\n\t\t\tobMap(o, transform)\n\t\t),\n\t\tfilter: (predicate: ObPredicate<Ob>) => (\n\t\t\tobFilter(o, predicate)\n\t\t),\n\t}\n}\n\n////////////\n////////////\n\nob.pipe = Object.freeze({\n\tmap: <O extends {}, Value>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => Value,\n\t\t) => (\n\t\t(o: O) => obMap(o, transform)\n\t),\n\tfilter: <O extends {}>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => boolean,\n\t\t) => (\n\t\t(o: O) => obFilter(o, transform) as {[key: string]: O[keyof O]}\n\t),\n})\n\n////////////\n////////////\n\nexport type ObTransform<Ob extends object, Value> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => Value\n)\n\nexport type ObPredicate<Ob extends object> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => boolean\n)\n\n////////////\n////////////\n\nconst obMap = <Ob extends object, Value>(\n\t\to: Ob,\n\t\ttransform: ObTransform<Ob, Value>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).map(\n\t\t\t([key, value]: any) => [key, transform(value, key)]\n\t\t)\n\t) as {[P in keyof Ob]: Value}\n}\n\nconst obFilter = <Ob extends object>(\n\t\to: Ob,\n\t\tpredicate: ObPredicate<Ob>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).filter(\n\t\t\t([key, value]: any) => predicate(value, key)\n\t\t)\n\t) as {[P in keyof Ob]?: Ob[keyof Ob]}\n}\n\n", "\nimport {defer} from \"./defer.js\"\n\nexport type Listener<A extends any[]> = (...a: A) => (void | Promise<void>)\n\nexport interface Xub<A extends any[] = []> {\n\n\t/** publish to all subscribed listeners. */\n\tpub(...a: A): Promise<void>\n\n\t/** subscribe a listener function. */\n\tsub(fn: Listener<A>): () => void\n\n\t/**\n\t * subscribe a listener function.\n\t * @alias sub\n\t */\n\ton(fn: Listener<A>): () => void\n\n\t/** wait for the next published value */\n\tnext(): Promise<A>\n\n\t/** wipe all listeners attached to this. */\n\tclear(): void\n}\n\n/** subscriber fn that can be published to. */\nexport interface Sub<A extends any[] = []> extends Xub<A> {\n\t(fn: Listener<A>): () => void\n}\n\n/** publisher fn that can be published to. */\nexport interface Pub<A extends any[] = []> extends Xub<A> {\n\t(...a: A): Promise<void>\n}\n\nexport function xub<A extends any[] = []>() {\n\tconst set = new Set<Listener<A>>()\n\n\tfunction sub(fn: Listener<A>) {\n\t\tset.add(fn)\n\t\treturn () => { set.delete(fn) }\n\t}\n\n\tasync function pub(...a: A) {\n\t\tawait Promise.all([...set].map(fn => fn(...a)))\n\t}\n\n\tasync function next() {\n\t\tconst {promise, resolve} = defer<A>()\n\t\tconst unsubscribe = sub((...a) => {\n\t\t\tresolve(a)\n\t\t\tunsubscribe()\n\t\t})\n\t\treturn promise\n\t}\n\n\tfunction clear() {\n\t\tset.clear()\n\t}\n\n\tsub.pub = pub\n\tsub.sub = sub\n\tsub.on = sub\n\tsub.next = next\n\tsub.clear = clear\n\n\tpub.pub = pub\n\tpub.sub = sub\n\tpub.on = sub\n\tpub.next = next\n\tpub.clear = clear\n\n\treturn [pub, sub] as [Pub<A>, Sub<A>]\n}\n\n/** create a subscriber fn that can be published to */\nexport function sub<A extends any[] = []>(listener?: Listener<A>): Sub<A> {\n\tconst fn = xub<A>()[1]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n/** create a publisher fn that can be subscribed to */\nexport function pub<A extends any[] = []>(listener?: Listener<A>): Pub<A> {\n\tconst fn = xub<A>()[0]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n", "\n/** a trashcan where you can collect disposer fns, and dispose them all at once */\nexport class Trash {\n\t#fns: (() => void)[] = []\n\n\t/** add a disposer fn to the trashcan */\n\tadd(...fns: (() => void)[]) {\n\t\tthis.#fns.push(...fns)\n\t\treturn this\n\t}\n\n\t/** add a disposable object to the trashcan, and return the object */\n\tdisposable<X extends {dispose: () => void}>(x: X) {\n\t\treturn this.bag(x, () => x.dispose())\n\t}\n\n\t/** add an item's disposer fn, and return the item */\n\tbag<X>(x: X, fn: (x: X) => void) {\n\t\tthis.add(() => fn(x))\n\t\treturn x\n\t}\n\n\t/** dispose of everything in the trashcan */\n\tdispose() {\n\t\tfor (const fn of this.#fns.reverse())\n\t\t\tfn()\n\t\tthis.#fns = []\n\t}\n}\n\n", "\nexport namespace JsonRpc {\n\texport type Requestish = Request | Request[]\n\texport type Respondish = Response | Response[]\n\texport type Bidirectional = Requestish | Respondish\n\n\t/////////////////////////////////////////////////////////////\n\n\texport const version = \"2.0\"\n\n\texport type Request<P extends Params = any> = (\n\t\t| Query<P>\n\t\t| Notification<P>\n\t)\n\n\texport type Response<Result = any> = (\n\t\t| Success<Result>\n\t\t| Failure\n\t)\n\n\texport type Serializable = (\n\t\t| void\n\t\t| null\n\t\t| undefined\n\t\t| boolean\n\t\t| number\n\t\t| string\n\t\t| Serializable[]\n\t\t| {[key: string]: Serializable}\n\t)\n\n\t/////////////////////////////////////////////////////////////\n\n\texport type Id = number | string\n\texport type Params = Serializable[] | Record<string, Serializable>\n\n\texport type Notification<P extends Params> = {\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Query<P extends Params> = {\n\t\tid: Id\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Error = {\n\t\tcode: number\n\t\tmessage: string\n\t\tdata?: any\n\t}\n\n\texport type Success<Result> = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\tresult: Result\n\t}\n\n\texport type Failure = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\terror: Error\n\t}\n\n\t/////////////////////////////////////////////////////////////\n\n\texport function getId(request: Request): Id | null {\n\t\treturn \"id\" in request\n\t\t\t? request.id\n\t\t\t: null\n\t}\n\n\texport const errorCodes = {\n\t\tserverError: -32000,\n\t\tunexposedError: -32001,\n\t}\n}\n\n", "\n/**\n * An error that has a publicly viewable name and message.\n * - this error class, and its subclasses, are the only kinds of errors that renraku will send back to clients\n * - so if you want a client to be able to read an error message you throw, it must be a subclass of ExposedError\n */\nexport class ExposedError extends Error {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class RemoteError extends Error {\n\treadonly name = this.constructor.name\n}\n\nexport class RemoteTimeoutError extends RemoteError {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class HttpError extends Error {\n\treadonly name = this.constructor.name\n\treadonly code: number\n\n\tconstructor(code: number, message: string) {\n\t\tsuper(message)\n\t\tthis.code = code\n\t}\n}\n\n", "\nimport {Tap} from \"./types.js\"\nimport {JsonRpc} from \"./json-rpc.js\"\nimport {ExposedError} from \"./errors.js\"\n\nexport async function execute<R>({\n\t\ttap,\n\t\trequest,\n\t\taction,\n\t}: {\n\t\ttap: Tap\n\t\trequest: JsonRpc.Request\n\t\taction: () => Promise<R>\n\t}): Promise<JsonRpc.Response<R> | null> {\n\n\tconst id = JsonRpc.getId(request)\n\n\ttry {\n\t\tconst result = await action()\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tresult,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t}\n\t}\n\n\tcatch (error) {\n\t\ttap.rpcError({request, error})\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t\terror: (error instanceof ExposedError)\n\t\t\t\t? {\n\t\t\t\t\tcode: JsonRpc.errorCodes.serverError,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tcode: JsonRpc.errorCodes.unexposedError,\n\t\t\t\t\tmessage: `unexposed error`,\n\t\t\t\t},\n\t\t}\n\t}\n}\n\n", "\nimport {drill} from \"@e280/stz\"\nimport {execute} from \"./execute.js\"\nimport {ErrorTap} from \"./taps/error.js\"\nimport {Endpoint, Fn, Fns, Tap} from \"./types.js\"\n\nexport type EndpointOptions<F extends Fns> = {\n\tfns: F\n\ttap?: Tap\n}\n\n/**\n * Create a renraku endpoint for your fns.\n * - an endpoint is a function that accepts json rpc requests\n * - for each request, it calls the appropriate fn\n * - it then returns the fn's in json rpc response format\n */\nexport function makeEndpoint<F extends Fns>(options: EndpointOptions<F>): Endpoint {\n\tconst tap = options.tap ?? new ErrorTap()\n\n\treturn async request => {\n\t\tconst path = request.method.split(\".\")\n\t\tconst fn = drill(options.fns, path) as Fn\n\t\tconst action = async() => await fn(...request.params)\n\n\t\ttap.rpcRequest({request})\n\n\t\tconst response = await execute({\n\t\t\ttap,\n\t\t\trequest,\n\t\t\taction,\n\t\t})\n\n\t\treturn response\n\t}\n}\n\n", "\nimport {Fn, Fns} from \"./types.js\"\n\nexport const tune = Symbol(\"tune\")\nexport const query = Symbol(\"query\")\nexport const notify = Symbol(\"notify\")\nexport const settings = Symbol(\"settings\")\n\nexport type TuneSymbol = typeof tune\nexport type QuerySymbol = typeof query\nexport type NotifySymbol = typeof notify\nexport type SettingsSymbol = typeof settings\n\nexport type Executor = (\n\tpath: string[],\n\targs: any[],\n\tsettings: Settings,\n) => Promise<any>\n\nexport type Settings = {\n\tnotify?: boolean\n\ttransfer?: Transferable[]\n}\n\nexport type Remote<F extends Fn | Fns> = (\n\tF extends Fn\n\t\t? F & {\n\t\t\t[tune]: (settings: Settings) => F\n\t\t\t[query]: F\n\t\t\t[notify]: F\n\t\t\t[settings]: Settings\n\t\t}\n\t\t: F extends Fns\n\t\t\t? {[K in keyof F]: Remote<F[K]>}\n\t\t\t: never\n)\n\nexport function remoteProxy<F extends Fns>(executor: Executor) {\n\n\tfunction recurse(path: string[]) {\n\t\tconst currentSettings: Settings = {notify: undefined}\n\n\t\treturn new Proxy((() => {}) as any, {\n\t\t\tapply: (_, _this, args) => {\n\t\t\t\treturn executor(path, args, currentSettings)\n\t\t\t},\n\t\t\tget: (target, key: string | QuerySymbol | NotifySymbol | TuneSymbol | SettingsSymbol) => {\n\n\t\t\t\tif (key === \"then\")\n\t\t\t\t\treturn undefined\n\n\t\t\t\tif (key === tune)\n\t\t\t\t\treturn (settings: Settings) => (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\t...settings,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === notify)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: true,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === query)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: false,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === settings)\n\t\t\t\t\treturn currentSettings\n\n\t\t\t\tif (!target[key])\n\t\t\t\t\ttarget[key] = recurse([...path, key])\n\n\t\t\t\treturn target[key]\n\t\t\t},\n\t\t\tset: (target, key: string, value: any) => {\n\t\t\t\ttarget[key] = value\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\t}\n\n\treturn recurse([]) as Remote<F>\n}\n\n", "\nimport {JsonRpc} from \"./json-rpc.js\"\nimport {RemoteError} from \"./errors.js\"\nimport {ErrorTap} from \"./taps/error.js\"\nimport {remoteProxy} from \"./remote-proxy.js\"\nimport {Endpoint, Fns, Tap} from \"./types.js\"\n\nexport type RemoteOptions = {\n\tendpoint: Endpoint\n\tlabel?: string\n\tnotify?: boolean\n\ttap?: Tap\n}\n\n/**\n * Create a renraku remote for the given endpoint.\n * - the remote uses js proxies to mirror the shape of your fns object\n * - so when you make async calls on the remote, it will convert those into json rpc requests that are actuated on the given endpoint\n * - the endpoint you provide could be making network calls, or doing something else, the remote doesn't care how the endpoint is implemented\n */\nexport function makeRemote<F extends Fns>(options: RemoteOptions) {\n\tconst {endpoint, tap = new ErrorTap()} = options\n\tlet id = 1\n\n\treturn remoteProxy<F>(async(\n\t\t\tpath,\n\t\t\tparams,\n\t\t\tsettings,\n\t\t) => {\n\n\t\tconst notify = settings.notify ?? options.notify ?? false\n\t\tconst transfer = settings.transfer\n\n\t\tconst base: JsonRpc.Notification<any[]> = {\n\t\t\tjsonrpc: \"2.0\" as const,\n\t\t\tmethod: path.join(\".\"),\n\t\t\tparams,\n\t\t}\n\n\t\tconst request: JsonRpc.Request = (\n\t\t\tnotify\n\t\t\t\t? base\n\t\t\t\t: {...base, id: id++}\n\t\t)\n\n\t\ttap.rpcRequest({request})\n\n\t\tconst response = await endpoint(request, {transfer})\n\n\t\tif (notify && !response)\n\t\t\treturn null\n\n\t\tif (!response)\n\t\t\tthrow new RemoteError(\"response was null, but shouldn't be, because the request was not a notification\")\n\n\t\tif (\"error\" in response)\n\t\t\tthrow new RemoteError(\n\t\t\t\toptions.label\n\t\t\t\t\t? `${options.label}: ${response.error.message}`\n\t\t\t\t\t: response.error.message\n\t\t\t)\n\n\t\treturn response.result\n\t})\n}\n\n", "\nimport {Fns} from \"./types.js\"\nimport {makeRemote} from \"./remote.js\"\nimport {Remote} from \"./remote-proxy.js\"\nimport {makeEndpoint, EndpointOptions} from \"./endpoint.js\"\n\n/**\n * Wrap your fns in an endpoint and remote.\n * - this gives you a real renraku remote where you can use the `tune` symbol and such\n * - this is useful for when you have special logic that relies on that special renraku functionality\n */\nexport function makeMock<F extends Fns>(options: EndpointOptions<F>): Remote<F> {\n\treturn makeRemote<F>({endpoint: makeEndpoint(options), tap: options.tap})\n}\n\n", "\nimport {pub} from \"@e280/stz\"\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\n\nexport class Conduit {\n\trecv = pub<[incoming: JsonRpc.Bidirectional, {origin: string}]>()\n\tsendRequest = pub<[request: JsonRpc.Requestish, transfer: Transferable[] | undefined]>()\n\tsendResponse = pub<[response: JsonRpc.Respondish, transfer: Transferable[] | undefined]>()\n\n\tstatic makeEntangledPair({origin = \"example.e280.org\"}: {origin?: string} = {}) {\n\t\tconst a = new this()\n\t\tconst b = new this()\n\n\t\tconst disposers = [\n\t\t\ta.sendRequest.sub(data => b.recv(data, {origin})),\n\t\t\ta.sendResponse.sub(data => b.recv(data, {origin})),\n\t\t\tb.sendRequest.sub(data => a.recv(data, {origin})),\n\t\t\tb.sendResponse.sub(data => a.recv(data, {origin})),\n\t\t]\n\n\t\tconst dispose = () => disposers.forEach(fn => fn())\n\t\treturn [a, b, dispose] as [Conduit, Conduit, () => void]\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint} from \"../../../core/types.js\"\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\nimport {Channel, ChannelMessage} from \"../types.js\"\nimport {ResponseWaiter} from \"./response-waiter.js\"\n\nexport function onMessage(channel: Channel, fn: (e: ChannelMessage) => void) {\n\tchannel.addEventListener(\"message\", fn)\n\treturn () => channel.removeEventListener(\"message\", fn)\n}\n\n////////////////\n\nexport type SendRequestFn = (\n\trequest: JsonRpc.Request,\n\ttransfer: Transferable[] | undefined,\n\tdone: Promise<JsonRpc.Response | null>,\n) => void\n\nexport function makeRemoteEndpoint(waiter: ResponseWaiter, sendRequest: SendRequestFn): Endpoint {\n\treturn async(request, {transfer} = {}) => {\n\t\tif (\"id\" in request) {\n\t\t\tconst done = defer<JsonRpc.Response | null>()\n\t\t\tsendRequest(request, transfer, done.promise)\n\t\t\treturn waiter.wait(request.id, request.method).then(response => {\n\t\t\t\tdone.resolve(response)\n\t\t\t\treturn response\n\t\t\t})\n\t\t}\n\t\telse {\n\t\t\tconst done = Promise.resolve(null)\n\t\t\tsendRequest(request, transfer, done)\n\t\t\treturn done\n\t\t}\n\t}\n}\n\nexport function interpretIncoming(json: JsonRpc.Bidirectional) {\n\tconst requests: JsonRpc.Request[] = []\n\tconst responses: JsonRpc.Response[] = []\n\n\tfor (const item of (Array.isArray(json) ? json : [json])) {\n\t\tif (\"method\" in item) requests.push(item)\n\t\telse responses.push(item)\n\t}\n\n\treturn {requests, responses}\n}\n\nexport async function handleIncomingRequests(\n\t\tlocalEndpoint: Endpoint,\n\t\trequests: JsonRpc.Request[],\n\t): Promise<JsonRpc.Respondish | null> {\n\n\tconst responses = (\n\t\tawait Promise.all(\n\t\t\trequests.map(async request => localEndpoint(request))\n\t\t)\n\t).filter(r => r !== null)\n\n\tif (responses.length === 0)\n\t\treturn null\n\n\treturn (responses.length === 1)\n\t\t? responses[0]\n\t\t: responses\n}\n\nexport function handleIncomingResponses(\n\t\twaiter: ResponseWaiter,\n\t\tresponses: JsonRpc.Response[],\n\t) {\n\n\tfor (const response of responses)\n\t\twaiter.deliverResponse(response)\n}\n\n", "\nimport {Trash} from \"@e280/stz\"\nimport {Conduit} from \"./conduit.js\"\nimport {PostableChannel} from \"../types.js\"\nimport {onMessage} from \"../parts/helpers.js\"\n\nexport class PostableConduit extends Conduit {\n\t#trash = new Trash()\n\n\tconstructor(channel: PostableChannel) {\n\t\tsuper()\n\t\tthis.#trash.add(\n\t\t\tthis.sendRequest.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tthis.sendResponse.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tonMessage(channel, e => this.recv(e.data, e)),\n\t\t)\n\t}\n\n\tdispose() {\n\t\tthis.#trash.dispose()\n\t}\n}\n\n", "\nimport {Fns} from \"../../../core/types.js\"\nimport {Remote} from \"../../../core/remote-proxy.js\"\n\nexport class MessengerMeta<RemoteFns extends Fns> {\n\ttransfer: Transferable[] | undefined\n\n\tconstructor(public remote: Remote<RemoteFns>) {}\n}\n\n", "\nexport const defaults = Object.freeze({\n\ttimeout: 60_000,\n\tmaxRequestBytes: 10_000_000,\n})\n\n", "\nimport {deadline, DeadlineError, defer, Deferred} from \"@e280/stz\"\n\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\nimport {RemoteError} from \"../../../core/errors.js\"\n\ntype Pend = {\n\tmethod: string\n\tdeferred: Deferred<JsonRpc.Response>\n}\n\nexport class ResponseWaiter {\n\tpending = new Map<JsonRpc.Id, Pend>()\n\n\tconstructor(public timeout: number) {}\n\n\tasync wait(id: JsonRpc.Id, method: string) {\n\t\tconst deferred = defer<JsonRpc.Response>()\n\t\tthis.pending.set(id, {method, deferred})\n\t\treturn await deadline(this.timeout, () => deferred.promise)\n\t\t\t.catch(error => {\n\t\t\t\tif (error instanceof DeadlineError)\n\t\t\t\t\terror.message = `request #${id} ${method}(), ${error.message}`\n\t\t\t\tthrow error\n\t\t\t})\n\t}\n\n\tdeliverResponse(response: JsonRpc.Response) {\n\t\tconst pend = this.pending.get(response.id)\n\t\tif (pend) {\n\t\t\tif (\"error\" in response)\n\t\t\t\tpend.deferred.reject(new RemoteError(response.error.message))\n\t\t\telse\n\t\t\t\tpend.deferred.resolve(response)\n\t\t}\n\t}\n}\n\n", "\nimport {Trash} from \"@e280/stz\"\n\nimport {defaults} from \"../../defaults.js\"\nimport {MessengerOptions} from \"./types.js\"\nimport {MessengerMeta} from \"./parts/meta.js\"\nimport {JsonRpc} from \"../../core/json-rpc.js\"\nimport {bindTap} from \"../../core/taps/bind.js\"\nimport {makeRemote} from \"../../core/remote.js\"\nimport {Remote} from \"../../core/remote-proxy.js\"\nimport {Endpoint, Fns} from \"../../core/types.js\"\nimport {makeEndpoint} from \"../../core/endpoint.js\"\nimport {ResponseWaiter} from \"./parts/response-waiter.js\"\nimport {handleIncomingRequests, interpretIncoming, makeRemoteEndpoint} from \"./parts/helpers.js\"\n\n/**\n * Establish a renraku remote that communicates over the given conduit.\n * - supports two-way or one-way communication\n * - you can use a messenger to call a remote messenger\n * - you can use a messenger to respond to incoming requests\n */\nexport class Messenger<LocalFns extends Fns = any, RemoteFns extends Fns = any> {\n\tremote: Remote<RemoteFns>\n\tremoteEndpoint: Endpoint\n\n\t#waiter: ResponseWaiter\n\t#trash = new Trash()\n\n\tconstructor(private options: MessengerOptions<LocalFns, RemoteFns>) {\n\t\tconst {conduit, tap} = options\n\n\t\tthis.#waiter = new ResponseWaiter(options.timeout ?? defaults.timeout)\n\n\t\tthis.remoteEndpoint = makeRemoteEndpoint(\n\t\t\tthis.#waiter,\n\t\t\tconduit.sendRequest.pub.bind(conduit.sendRequest),\n\t\t)\n\n\t\tthis.remote = makeRemote<RemoteFns>({\n\t\t\tendpoint: this.remoteEndpoint,\n\t\t\ttap: tap && bindTap(tap, {remote: true}),\n\t\t})\n\n\t\tthis.#trash.add(conduit.recv.sub(m => this.recv(m)))\n\t}\n\n\tasync recv(incoming: JsonRpc.Bidirectional) {\n\t\tconst meta = new MessengerMeta<RemoteFns>(this.remote)\n\t\tconst {conduit, rpc, tap} = this.options\n\n\t\tconst {requests, responses} = interpretIncoming(incoming)\n\n\t\tfor (const response of responses)\n\t\t\tthis.#waiter.deliverResponse(response)\n\n\t\tif (!rpc)\n\t\t\treturn\n\n\t\tconst fns = await rpc(meta)\n\t\tconst endpoint = makeEndpoint({\n\t\t\tfns,\n\t\t\ttap: tap && bindTap(tap, {remote: false}),\n\t\t})\n\n\t\tconst outgoing = await handleIncomingRequests(endpoint, requests)\n\t\tif (outgoing)\n\t\t\tawait conduit.sendResponse(outgoing, meta.transfer)\n\t}\n\n\tdispose() {\n\t\tthis.#trash.dispose()\n\t}\n}\n\n", "\nimport {MessengerMeta, Remote} from \"@e280/renraku\"\nimport {MinistryFns, Schematic} from \"./types.js\"\n\nexport type HostShell<S extends Schematic> = {\n\thost: Remote<S[\"host\"]>\n\ttransfer: Transferable[] | undefined\n}\n\nexport type WorkShell<S extends Schematic> = {\n\twork: Remote<S[\"work\"]>\n\ttransfer: Transferable[] | undefined\n}\n\nexport const shells = {\n\tderive: {\n\t\thost: <S extends Schematic>(meta: MessengerMeta<MinistryFns<S>>): HostShell<S> => ({\n\t\t\thost: meta.remote.host,\n\t\t\tget transfer() { return meta.transfer },\n\t\t\tset transfer(t) { meta.transfer = t },\n\t\t}),\n\t\twork: <S extends Schematic>(meta: MessengerMeta<S[\"work\"]>): WorkShell<S> => ({\n\t\t\twork: meta.remote,\n\t\t\tget transfer() { return meta.transfer },\n\t\t\tset transfer(t) { meta.transfer = t },\n\t\t}),\n\t},\n\tmock: {\n\t\thost: <S extends Schematic>(): HostShell<S> => ({\n\t\t\thost: undefined as any,\n\t\t\ttransfer: undefined,\n\t\t}),\n\t\twork: <S extends Schematic>(): WorkShell<S> => ({\n\t\t\twork: undefined as any,\n\t\t\ttransfer: undefined,\n\t\t})\n\t},\n}\n\n", "\nimport {ErrorTap} from \"@e280/renraku\"\n\nexport const defaultTap = new ErrorTap()\n\n", "\nimport {Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {shells} from \"./shells.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {MinistryFns, Schematic, SetupWork, WorkerOpts} from \"./types.js\"\n\n/**\n * create a web worker\n */\nexport async function worker<S extends Schematic>(\n\t\tcompat: Compat,\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) {\n\n\tconst tap = options.tap ?? defaultTap\n\n\tconst messenger = new Messenger<S[\"work\"], MinistryFns<S>>({\n\t\ttap,\n\t\ttimeout: options.timeout ?? Infinity,\n\t\tconduit: new PostableConduit(compat.getSelf()),\n\t\trpc: async m => setupWork(\n\t\t\tshells.derive.host<S>(m),\n\t\t),\n\t})\n\n\tawait messenger.remote.infra.ready()\n\treturn messenger.remote.host\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {shells} from \"./shells.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {Compat, CompatWorker} from \"../compat/types.js\"\nimport {Infra, MinistryFns, Schematic, ThreadOptions} from \"./types.js\"\n\nexport class Thread<S extends Schematic> {\n\tconstructor(\n\t\tpublic worker: CompatWorker,\n\t\tpublic messenger: Messenger<MinistryFns<S>, S[\"work\"]>,\n\t) {}\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ThreadOptions<S>) {\n\t\tconst tap = options.tap ?? defaultTap\n\t\tconst label = options.label ?? \"comrade\"\n\t\tconst worker = compat.loadWorker(options.workerUrl, label)\n\t\tconst readyprom = defer<void>()\n\n\t\tconst infra: Infra = {\n\t\t\tasync ready() {\n\t\t\t\treadyprom.resolve()\n\t\t\t},\n\t\t}\n\n\t\tconst messenger = new Messenger<MinistryFns<S>, S[\"work\"]>({\n\t\t\ttap,\n\t\t\ttimeout: options.timeout ?? Infinity,\n\t\t\tconduit: new PostableConduit(worker),\n\t\t\trpc: async m => ({\n\t\t\t\tinfra,\n\t\t\t\thost: options.setupHost(\n\t\t\t\t\tshells.derive.work<S>(m)\n\t\t\t\t),\n\t\t\t}),\n\t\t})\n\n\t\tawait readyprom.promise\n\t\treturn new this<S>(worker, messenger)\n\t}\n\n\tget work() {\n\t\treturn this.messenger.remote\n\t}\n\n\tterminate() {\n\t\tthis.worker.terminate()\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint, makeRemote, Remote, Tap} from \"@e280/renraku\"\n\nimport {Thread} from \"./thread.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {ClusterOptions, Schematic, Task} from \"./types.js\"\n\n/**\n * a pool of web workers\n * - please use `await Cluster.make(options)` to create your worker pool\n * - call your worker functions like `await cluster.remote.hello()`\n */\nexport class Cluster<S extends Schematic> {\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ClusterOptions<S>) {\n\t\tconst workerCount = options.workerCount ?? compat.guessOptimalThreadCount()\n\t\tconst threads = await Promise.all([...Array(workerCount)].map(\n\t\t\tasync(_, index) => Thread.make(compat, {\n\t\t\t\t...options,\n\t\t\t\tlabel: options.label ?? `${options.label ?? \"comrade\"}_${index + 1}`,\n\t\t\t})\n\t\t))\n\t\treturn new this<S>(threads, {tap: options.tap})\n\t}\n\n\twork: Remote<S[\"work\"]>\n\t#available = new Set<Thread<S>>()\n\t#tasks: Task[] = []\n\n\tconstructor(private threads: Thread<S>[], options: {tap?: Tap} = {}) {\n\t\tconst tap = options.tap ?? defaultTap\n\n\t\t// delegation\n\t\tconst remoteEndpoint: Endpoint = async(request, special) => this.#scheduleTask({\n\t\t\trequest,\n\t\t\tprom: defer(),\n\t\t\ttransfer: special?.transfer,\n\t\t})\n\n\t\t// remote proxy to call comrade fns\n\t\tthis.work = makeRemote({\n\t\t\ttap,\n\t\t\tendpoint: remoteEndpoint,\n\t\t})\n\n\t\t// in the beginning, all threads are available\n\t\tthreads.forEach(t => this.#available.add(t))\n\t}\n\n\tget threadCount() {\n\t\treturn this.threads.length\n\t}\n\n\tterminate() {\n\t\tfor (const thread of this.threads)\n\t\t\tthread.terminate()\n\t}\n\n\t#scheduleTask(task: Task) {\n\t\tthis.#tasks.push(task)\n\t\tthis.#distributeTasks()\n\t\treturn task.prom.promise\n\t}\n\n\t#distributeTasks() {\n\t\twhile (this.#available.size > 0 && this.#tasks.length > 0) {\n\t\t\tconst thread = [...this.#available].pop()!\n\t\t\tthis.#available.delete(thread)\n\n\t\t\tconst task = this.#tasks.shift()!\n\n\t\t\t// this thread is no longer available\n\t\t\tthis.#available.delete(thread)\n\n\t\t\t// call the thread endpoint\n\t\t\tconst callprom = thread.messenger.remoteEndpoint(task.request, {transfer: task.transfer})\n\n\t\t\t// resolve/reject the task prom when callprom is done\n\t\t\ttask.prom.entangle(callprom).finally(() => {\n\n\t\t\t\t// thread is ready again\n\t\t\t\tthis.#available.add(thread)\n\n\t\t\t\t// distribute more tasks\n\t\t\t\tthis.#distributeTasks()\n\t\t\t})\n\t\t}\n\t}\n}\n\n", "\nimport {makeMock, Tap} from \"@e280/renraku\"\n\nimport {worker} from \"./parts/worker.js\"\nimport {Compat} from \"./compat/types.js\"\nimport {Thread} from \"./parts/thread.js\"\nimport {shells} from \"./parts/shells.js\"\nimport {Cluster} from \"./parts/cluster.js\"\nimport {defaultTap} from \"./parts/default-tap.js\"\nimport {ClusterOptions, Mocks, Schematic, SetupHost, SetupWork, ThreadOptions, WorkerOpts} from \"./parts/types.js\"\n\nexport const setupComrade = (compat: Compat) => ({\n\tthread: <S extends Schematic>(options: ThreadOptions<S>) => Thread.make(compat, options),\n\tcluster: <S extends Schematic>(options: ClusterOptions<S>) => Cluster.make(compat, options),\n\n\tworker: <S extends Schematic>(\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) => worker(compat, setupWork, options),\n\n\twork: <S extends Schematic>(fn: SetupWork<S>) => fn,\n\thost: <S extends Schematic>(fn: SetupHost<S>) => fn,\n\n\tmocks<S extends Schematic>(options: {\n\t\t\ttap?: Tap\n\t\t\tsetupWork: SetupWork<S>\n\t\t\tsetupHost: SetupHost<S>\n\t\t}): Mocks<S> {\n\n\t\tconst {setupWork, setupHost, tap = defaultTap} = options\n\n\t\tconst hostShell = shells.mock.host<S>()\n\t\tconst workShell = shells.mock.work<S>()\n\n\t\tworkShell.work = makeMock({tap, fns: setupWork(hostShell)})\n\t\thostShell.host = makeMock({tap, fns: setupHost(workShell)})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\thost: hostShell.host,\n\t\t}\n\t},\n\n\tmockWork<S extends Schematic>(setupWork: SetupWork<S>, tap: Tap = defaultTap) {\n\t\tconst hostShell = shells.mock.host<S>()\n\t\tconst workShell = shells.mock.work<S>()\n\n\t\tworkShell.work = makeMock({tap, fns: setupWork(hostShell)})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\tmockHost: (setupHost: SetupHost<S>): Mocks<S> => {\n\t\t\t\thostShell.host = makeMock({tap, fns: setupHost(workShell)})\n\t\t\t\treturn {\n\t\t\t\t\tworkShell,\n\t\t\t\t\thostShell,\n\t\t\t\t\twork: workShell.work,\n\t\t\t\t\thost: hostShell.host,\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n})\n\n", "\nimport {Compat, CompatWorker} from \"./types.js\"\n\nexport const setupBrowserCompat = (): Compat => ({\n\tgetSelf() {\n\t\treturn self\n\t},\n\n\tguessOptimalThreadCount() {\n\t\tconst count = navigator.hardwareConcurrency ?? 1\n\t\treturn Math.max(1, count - 1)\n\t},\n\n\tloadWorker(url, name) {\n\t\treturn new window.Worker(url, {name, type: \"module\"}) as CompatWorker\n\t},\n\n\tasync loadWasm(url) {\n\t\treturn WebAssembly.instantiateStreaming(fetch(url))\n\t},\n})\n\n", "\nimport {setupComrade} from \"./comrade.js\"\nimport {setupBrowserCompat} from \"./compat/browser.js\"\n\nexport const compat = setupBrowserCompat()\nexport const Comrade = setupComrade(compat)\n\nexport * from \"./exports.js\"\n\n", "import {Comrade} from \"@e280/comrade\"\n//@ts-ignore\nimport {pipeline, WhisperTextStreamer} from \"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js\"\n\nimport {WhisperSchematic} from \"./schematic.js\"\nimport {TranscriptionChunk} from \"../parts/types.js\"\nimport {PipelineFactory} from \"../../../common/transformer-pipeline.js\"\n\n// TODO suspicious globals, probably bad\nconst pipeline = new PipelineFactory(\"automatic-speech-recognition\")\nlet transcriber: any\n\nexport const setupWhisperWork = Comrade.work<WhisperSchematic>(shell => ({\n\tasync transcribe({audio, model, language, duration}) {\n\t\tconst isDistil = model.startsWith(\"distil-whisper/\")\n\n\t\tif(!pipeline.model || pipeline.model !== model) {\n\t\t\tpipeline.instance?.dispose()?.()\n\t\t\tpipeline.instance = null\n\t\t\ttranscriber = await pipeline.createInstance(\n\t\t\t\tmodel,\n\t\t\t\t(data) => {\n\t\t\t\t\tif(data.progress)\n\t\t\t\t\t\tshell.host.updateModelLoadProgress({\n\t\t\t\t\t\t\tid: data.file,\n\t\t\t\t\t\t\tprogress: data.progress\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\n\t\tconst timePrecision =\n\t\t\ttranscriber.processor.feature_extractor.config.chunk_length /\n\t\t\ttranscriber.model.config.max_source_positions\n\n\t\tconst chunkLength = isDistil ? 20 : 30\n\t\tconst strideLength = isDistil ? 3 : 5\n\n\t\tlet chunkCount = 0\n\t\tlet startTime: number | null = null\n\t\tlet tokenCount = 0\n\t\tlet tps = 0\n\n\t\tconst chunkDuration = chunkLength - strideLength\n\n\t\tconst estimateProgress = () => {\n\t\t\tconst audioProgressSeconds = chunkCount * chunkDuration\n\t\t\treturn Math.min(audioProgressSeconds / duration, 1)\n\t\t}\n\n\t\tconst streamer = new WhisperTextStreamer(transcriber.tokenizer, {\n\t\t\ttime_precision: timePrecision,\n\t\t\ttoken_callback_function: () => {\n\t\t\t\tstartTime ??= performance.now()\n\t\t\t\tif (++tokenCount > 1) {\n\t\t\t\t\ttps = (tokenCount / (performance.now() - startTime)) * 1000\n\t\t\t\t\tshell.host.updateTps(tps)\n\t\t\t\t}\n\t\t\t},\n\t\t\tcallback_function: (textChunk: any) => {\n\t\t\t\tshell.host.deliverTranscriptionChunk(textChunk)\n\t\t\t},\n\t\t\ton_finalize: () => {\n\t\t\t\tstartTime = null\n\t\t\t\ttokenCount = 0\n\t\t\t\tchunkCount++\n\t\t\t\tconst progress = estimateProgress()\n\t\t\t\tshell.host.updateTranscribeProgress(progress)\n\t\t\t},\n\t\t})\n\n\t\tconst output = await transcriber(audio, {\n\t\t\ttop_k: 0,\n\t\t\tdo_sample: false,\n\t\t\tchunk_length_s: chunkLength,\n\t\t\tstride_length_s: strideLength,\n\t\t\tlanguage,\n\t\t\ttask: \"transcribe\",\n\t\t\treturn_timestamps: \"word\", // if using \"word\" the on_chunk_start & end is not called thus we cant retrieve timestamps, only after whole thing finishes\n\t\t\tforce_full_sequences: false,\n\t\t\tstreamer,\n\t\t})\n\n\t\tif (!output) return null\n\n\t\treturn {\n\t\t\ttps,\n\t\t\t...output,\n\t\t}\n\t}\n}))\n", "//@ts-ignore\nimport {pipeline} from \"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js\"\n\nimport {ProgressCallback} from \"../speech-recognition/whisper/parts/types.js\"\n\nexport class PipelineFactory {\n\tinstance: any = null\n\tmodel: string | null = null\n\n\tconstructor(public task: string) {}\n\n\tasync createInstance(model: string, progressCallback?: ProgressCallback) {\n\t\tthis.model = model\n\t\treturn this.instance = await pipeline(this.task, this.model, {\n\t\t\tdtype: {\n\t\t\t\tencoder_model:\n\t\t\t\t\tthis.model === \"onnx-community/whisper-large-v3-turbo\"\n\t\t\t\t\t\t? \"fp16\"\n\t\t\t\t\t\t: \"fp32\",\n\t\t\t\tdecoder_model_merged: \"q4\",\n\t\t\t},\n\t\t\tdevice: \"webgpu\",\n\t\t\tprogress_callback: progressCallback,\n\t\t})\n\t}\n}\n", "import {Comrade} from \"@e280/comrade\"\n\nimport {setupWhisperWork} from \"../fns/work.js\"\nimport {WhisperSchematic} from \"../fns/schematic.js\"\n\nawait Comrade.worker<WhisperSchematic>(setupWhisperWork)\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["bindTap", "tap", "ctx", "o", "basicTheme", "colors", "autoTheme", "basicTheme", "codes", "colorFns", "s", "uncolor", "mix", "hex", "rgb", "bgRgb", "fn", "bigint", "g", "b", "c", "r", "code", "codes", "colorless", "codes", "key", "s", "colorFns", "colorful", "codes", "key", "code", "s", "colorFns", "isDeno", "isNode", "isColorSupported", "autoColors", "isColorSupported", "colorful", "colorless", "errorsShaper", "colors", "theme", "palette", "errstring", "error", "stack", "processErrors", "item", "processAll", "items", "combineShapers", "shapers", "context", "items", "shaper", "defaultTimestampOptions", "timestampShaper", "options", "colors", "theme", "opts", "palette", "date", "year", "month", "day", "calendar", "hour", "minute", "second", "milliseconds", "clock", "stamp", "items", "autoShaper", "combineShapers", "errorsShaper", "timestampShaper", "denoWriter", "line", "nodeWriter", "line", "consoleWriter", "line", "autoWriter", "isDeno", "denoWriter", "isNode", "nodeWriter", "consoleWriter", "voidWriter", "noneShaper", "items", "Logger", "_Logger", "autoWriter", "voidWriter", "denoWriter", "nodeWriter", "consoleWriter", "autoColors", "colorful", "colorless", "autoTheme", "basicTheme", "autoShaper", "noneShaper", "errorsShaper", "timestampShaper", "items", "writer", "colors", "theme", "shapers", "combineShapers", "LoggerTap", "Logger", "request", "context", "g", "#context", "error", "meta", "label", "remote", "cRemote", "cLocal", "#meta", "headers", "ErrorTap", "LoggerTap", "Bytes", "a", "b", "i", "count", "Hex", "bytes", "byte", "string", "i", "byteCount", "Bytes", "base", "characters", "Base58", "bytes", "intVal", "Hex", "encoded", "remainder", "byte", "string", "char", "index", "hex", "leadingZeroes", "decoded", "count", "Bytes", "BaseX", "lexicon", "char", "i", "s", "bitsPerChar", "bitBuffer", "bitCount", "output", "val", "num", "base", "negative", "out", "bytes", "byte", "index", "n", "value", "count", "Bytes", "Base64", "bytes", "string", "char", "count", "Bytes", "Txt", "bytes", "string", "is", "x", "DeadlineError", "milliseconds", "deadline", "fn", "resolve", "reject", "id", "defer", "resolve", "reject", "promise", "res", "rej", "entangle", "outside", "drill", "object", "path", "current", "key", "is", "ob", "o", "transform", "obMap", "predicate", "obFilter", "key", "value", "xub", "set", "sub", "fn", "pub", "a", "next", "promise", "resolve", "defer", "unsubscribe", "clear", "pub", "listener", "fn", "xub", "Trash", "#fns", "fns", "x", "fn", "JsonRpc", "getId", "request", "ExposedError", "RemoteError", "execute", "tap", "request", "action", "id", "JsonRpc", "result", "error", "ExposedError", "makeEndpoint", "options", "tap", "ErrorTap", "request", "path", "fn", "drill", "action", "execute", "tune", "query", "notify", "settings", "remoteProxy", "executor", "recurse", "path", "currentSettings", "_", "_this", "args", "target", "key", "value", "makeRemote", "options", "endpoint", "tap", "ErrorTap", "id", "remoteProxy", "path", "params", "settings", "notify", "transfer", "base", "request", "response", "RemoteError", "makeMock", "options", "makeRemote", "makeEndpoint", "Conduit", "pub", "origin", "a", "b", "disposers", "data", "fn", "onMessage", "channel", "fn", "makeRemoteEndpoint", "waiter", "sendRequest", "request", "transfer", "done", "defer", "response", "interpretIncoming", "json", "requests", "responses", "item", "handleIncomingRequests", "localEndpoint", "r", "PostableConduit", "Conduit", "#trash", "Trash", "channel", "m", "transfer", "onMessage", "e", "MessengerMeta", "remote", "defaults", "ResponseWaiter", "timeout", "id", "method", "deferred", "defer", "deadline", "error", "DeadlineError", "response", "pend", "RemoteError", "Messenger", "#waiter", "#trash", "Trash", "options", "conduit", "tap", "ResponseWaiter", "defaults", "makeRemoteEndpoint", "makeRemote", "bindTap", "m", "incoming", "meta", "MessengerMeta", "rpc", "requests", "responses", "interpretIncoming", "response", "fns", "endpoint", "makeEndpoint", "outgoing", "handleIncomingRequests", "shells", "meta", "t", "defaultTap", "ErrorTap", "worker", "compat", "setupWork", "options", "tap", "defaultTap", "messenger", "Messenger", "PostableConduit", "m", "shells", "Thread", "worker", "messenger", "compat", "options", "tap", "defaultTap", "label", "readyprom", "defer", "infra", "Messenger", "PostableConduit", "m", "shells", "Cluster", "compat", "options", "workerCount", "threads", "_", "index", "Thread", "#available", "#tasks", "tap", "defaultTap", "remoteEndpoint", "request", "special", "#scheduleTask", "defer", "makeRemote", "t", "thread", "task", "#distributeTasks", "callprom", "setupComrade", "compat", "options", "Thread", "Cluster", "setupWork", "worker", "fn", "setupHost", "tap", "defaultTap", "hostShell", "shells", "workShell", "makeMock", "setupBrowserCompat", "count", "url", "name", "compat", "setupBrowserCompat", "Comrade", "setupComrade", "WhisperTextStreamer", "pipeline", "PipelineFactory", "task", "model", "progressCallback", "pipeline", "PipelineFactory", "transcriber", "setupWhisperWork", "Comrade", "shell", "audio", "model", "language", "duration", "isDistil", "data", "timePrecision", "chunkLength", "strideLength", "chunkCount", "startTime", "tokenCount", "tps", "chunkDuration", "estimateProgress", "audioProgressSeconds", "streamer", "WhisperTextStreamer", "textChunk", "progress", "output", "Comrade", "setupWhisperWork"]
|
|
7
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Thread } from "@e280/comrade";
|
|
2
|
-
import { WordGroup } from "./parts/types.js";
|
|
3
|
-
import { SpeechRecognizer } from "../common/model.js";
|
|
4
|
-
import { WhisperSchematic } from "./fns/schematic.js";
|
|
5
|
-
export declare class Whisper extends SpeechRecognizer {
|
|
6
|
-
#private;
|
|
7
|
-
thread: Thread<WhisperSchematic>;
|
|
8
|
-
constructor(thread: Thread<WhisperSchematic>);
|
|
9
|
-
static setup(): Promise<Whisper>;
|
|
10
|
-
init(): Promise<void>;
|
|
11
|
-
transcribe(source: Blob): Promise<WordGroup>;
|
|
12
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { Comrade } from "@e280/comrade";
|
|
2
|
-
import { context } from "../../../context.js";
|
|
3
|
-
import { setupWhisperHost } from "./fns/host.js";
|
|
4
|
-
import { SpeechRecognizer } from "../common/model.js";
|
|
5
|
-
export class Whisper extends SpeechRecognizer {
|
|
6
|
-
thread;
|
|
7
|
-
constructor(thread) {
|
|
8
|
-
super('whisper', "onnx-community/whisper-tiny_timestamped");
|
|
9
|
-
this.thread = thread;
|
|
10
|
-
}
|
|
11
|
-
static async setup() {
|
|
12
|
-
const thread = await Comrade.thread({
|
|
13
|
-
label: "OmnitoolDriver",
|
|
14
|
-
workerUrl: new URL("/tools/speech-recognition/whisper/parts/worker.bundle.min.js", import.meta.url),
|
|
15
|
-
setupHost: setupWhisperHost({
|
|
16
|
-
...this.loaderEvents,
|
|
17
|
-
...this.speechRecognizerEvents
|
|
18
|
-
})
|
|
19
|
-
});
|
|
20
|
-
return new this(thread);
|
|
21
|
-
}
|
|
22
|
-
async init() {
|
|
23
|
-
// there should be called loading of the model in worker instead when transcribe is called ..
|
|
24
|
-
}
|
|
25
|
-
async #transcribe(source, options) {
|
|
26
|
-
const arrayBuffer = await source.arrayBuffer();
|
|
27
|
-
const audioCTX = new AudioContext({ sampleRate: 16000 });
|
|
28
|
-
const audioData = await audioCTX.decodeAudioData(arrayBuffer);
|
|
29
|
-
let audio;
|
|
30
|
-
if (audioData.numberOfChannels === 2) {
|
|
31
|
-
const SCALING_FACTOR = Math.sqrt(2);
|
|
32
|
-
const left = audioData.getChannelData(0);
|
|
33
|
-
const right = audioData.getChannelData(1);
|
|
34
|
-
audio = new Float32Array(left.length);
|
|
35
|
-
for (let i = 0; i < audioData.length; ++i) {
|
|
36
|
-
audio[i] = (SCALING_FACTOR * (left[i] + right[i])) / 2;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
audio = audioData.getChannelData(0);
|
|
41
|
-
}
|
|
42
|
-
const driver = await context.driver;
|
|
43
|
-
const duration = await driver.getAudioDuration(source);
|
|
44
|
-
return await this.thread.work.transcribe({
|
|
45
|
-
audio,
|
|
46
|
-
duration,
|
|
47
|
-
model: this.model,
|
|
48
|
-
subtask: this.multilingual ? "transcribe" : null,
|
|
49
|
-
language: this.multilingual && options?.language !== "auto"
|
|
50
|
-
? options?.language ?? "english"
|
|
51
|
-
: null
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
async transcribe(source) {
|
|
55
|
-
const result = await this.#transcribe(source);
|
|
56
|
-
const words = result?.chunks.map((chunk) => ({
|
|
57
|
-
text: chunk.text.trim(),
|
|
58
|
-
timestamp: chunk.timestamp,
|
|
59
|
-
}));
|
|
60
|
-
return words;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../s/tools/speech-recognition/whisper/tool.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|