@defensestation/yjs-local-translator 0.3.0-dev.2.d2befbc
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/LICENSE +21 -0
- package/README.md +519 -0
- package/dist/blocknote.d.ts +62 -0
- package/dist/blocknote.d.ts.map +1 -0
- package/dist/blocknote.js +379 -0
- package/dist/blocknote.js.map +1 -0
- package/dist/browser-translator.d.ts +81 -0
- package/dist/browser-translator.d.ts.map +1 -0
- package/dist/browser-translator.js +452 -0
- package/dist/browser-translator.js.map +1 -0
- package/dist/chunking.d.ts +16 -0
- package/dist/chunking.d.ts.map +1 -0
- package/dist/chunking.js +95 -0
- package/dist/chunking.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +26 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +41 -0
- package/dist/metadata.js.map +1 -0
- package/dist/model-catalog.d.ts +14 -0
- package/dist/model-catalog.d.ts.map +1 -0
- package/dist/model-catalog.js +41 -0
- package/dist/model-catalog.js.map +1 -0
- package/dist/native-translation.d.ts +37 -0
- package/dist/native-translation.d.ts.map +1 -0
- package/dist/native-translation.js +80 -0
- package/dist/native-translation.js.map +1 -0
- package/dist/protocol.d.ts +59 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/translation-memory.d.ts +50 -0
- package/dist/translation-memory.d.ts.map +1 -0
- package/dist/translation-memory.js +117 -0
- package/dist/translation-memory.js.map +1 -0
- package/dist/translator.worker.d.ts +2 -0
- package/dist/translator.worker.d.ts.map +1 -0
- package/dist/translator.worker.js +304 -0
- package/dist/translator.worker.js.map +1 -0
- package/dist/yjs.d.ts +98 -0
- package/dist/yjs.d.ts.map +1 -0
- package/dist/yjs.js +291 -0
- package/dist/yjs.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { DEFAULT_MAX_CHUNK_LENGTH, splitTextIntoChunks } from "./chunking.js";
|
|
2
|
+
import { DEFAULT_MODEL_CATALOG, getTranslationRoute, normalizeLanguageCode } from "./model-catalog.js";
|
|
3
|
+
import { NativeTranslatorPool } from "./native-translation.js";
|
|
4
|
+
import { createTranslationMemoryKey } from "./translation-memory.js";
|
|
5
|
+
export class TranslationAbortedError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super("Translation was aborted.");
|
|
8
|
+
this.name = "TranslationAbortedError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_TRANSFORMERS_URL = "https://cdn.jsdelivr.net/npm/@huggingface/transformers@4.2.0/dist/transformers.min.js";
|
|
12
|
+
function createRequestId() {
|
|
13
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
14
|
+
return crypto.randomUUID();
|
|
15
|
+
}
|
|
16
|
+
return `translation-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
17
|
+
}
|
|
18
|
+
function defaultWorkerFactory() {
|
|
19
|
+
return new Worker(new URL("./translator.worker.js", import.meta.url), {
|
|
20
|
+
type: "module",
|
|
21
|
+
name: "yjs-local-translator"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function isAbortError(error) {
|
|
25
|
+
return error instanceof Error && error.name === "AbortError";
|
|
26
|
+
}
|
|
27
|
+
async function readTranslationStream(stream, onDelta) {
|
|
28
|
+
const reader = stream.getReader();
|
|
29
|
+
let streamedText = "";
|
|
30
|
+
try {
|
|
31
|
+
for (;;) {
|
|
32
|
+
const { done, value } = await reader.read();
|
|
33
|
+
if (done) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value !== "string" || !value) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Some implementations stream cumulative snapshots instead of deltas.
|
|
40
|
+
let delta = value;
|
|
41
|
+
if (streamedText && value.startsWith(streamedText)) {
|
|
42
|
+
delta = value.slice(streamedText.length);
|
|
43
|
+
streamedText = value;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
streamedText += value;
|
|
47
|
+
}
|
|
48
|
+
if (delta) {
|
|
49
|
+
onDelta(delta, streamedText);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
reader.releaseLock();
|
|
55
|
+
}
|
|
56
|
+
return streamedText;
|
|
57
|
+
}
|
|
58
|
+
export class BrowserTranslator {
|
|
59
|
+
configuration;
|
|
60
|
+
workerFactory;
|
|
61
|
+
useNativeTranslation;
|
|
62
|
+
translationMemory;
|
|
63
|
+
nativePool = new NativeTranslatorPool();
|
|
64
|
+
requests = new Map();
|
|
65
|
+
worker;
|
|
66
|
+
disposed = false;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
this.configuration = {
|
|
69
|
+
transformersUrl: options.transformersUrl ?? DEFAULT_TRANSFORMERS_URL,
|
|
70
|
+
dtype: options.dtype ?? "int8",
|
|
71
|
+
device: options.device ?? "wasm",
|
|
72
|
+
graphOptimizationLevel: options.graphOptimizationLevel ?? "disabled",
|
|
73
|
+
modelCatalog: options.modelCatalog ?? DEFAULT_MODEL_CATALOG,
|
|
74
|
+
...(options.maxNewTokens === undefined
|
|
75
|
+
? {}
|
|
76
|
+
: { maxNewTokens: options.maxNewTokens }),
|
|
77
|
+
...(options.maxChunkLength === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { maxChunkLength: options.maxChunkLength })
|
|
80
|
+
};
|
|
81
|
+
this.workerFactory = options.workerFactory ?? defaultWorkerFactory;
|
|
82
|
+
this.useNativeTranslation = options.useNativeTranslation ?? true;
|
|
83
|
+
this.translationMemory = options.translationMemory;
|
|
84
|
+
}
|
|
85
|
+
async translate(text, options) {
|
|
86
|
+
if (this.disposed) {
|
|
87
|
+
throw new Error("The translator has been disposed.");
|
|
88
|
+
}
|
|
89
|
+
if (!text.trim()) {
|
|
90
|
+
throw new Error("Translation text must not be empty.");
|
|
91
|
+
}
|
|
92
|
+
if (options.signal?.aborted) {
|
|
93
|
+
throw new TranslationAbortedError();
|
|
94
|
+
}
|
|
95
|
+
const sourceLanguage = normalizeLanguageCode(options.sourceLanguage);
|
|
96
|
+
const targetLanguage = normalizeLanguageCode(options.targetLanguage);
|
|
97
|
+
if (sourceLanguage === targetLanguage) {
|
|
98
|
+
options.onStatus?.({
|
|
99
|
+
status: "route",
|
|
100
|
+
requestId: createRequestId(),
|
|
101
|
+
models: [],
|
|
102
|
+
message: "The source and target languages are the same."
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
text,
|
|
106
|
+
sourceLanguage: options.sourceLanguage,
|
|
107
|
+
targetLanguage: options.targetLanguage,
|
|
108
|
+
models: [],
|
|
109
|
+
engine: "none"
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (this.translationMemory) {
|
|
113
|
+
return this.translateWithMemory(text, sourceLanguage, targetLanguage, options);
|
|
114
|
+
}
|
|
115
|
+
if (this.useNativeTranslation) {
|
|
116
|
+
const nativeResult = await this.translateNatively(text, sourceLanguage, targetLanguage, options);
|
|
117
|
+
if (nativeResult) {
|
|
118
|
+
return nativeResult;
|
|
119
|
+
}
|
|
120
|
+
if (options.signal?.aborted) {
|
|
121
|
+
throw new TranslationAbortedError();
|
|
122
|
+
}
|
|
123
|
+
if (this.disposed) {
|
|
124
|
+
throw new Error("The translator has been disposed.");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return this.translateWithWorker(text, options);
|
|
128
|
+
}
|
|
129
|
+
async translateWithMemory(text, sourceLanguage, targetLanguage, options) {
|
|
130
|
+
const memory = this.translationMemory;
|
|
131
|
+
if (!memory) {
|
|
132
|
+
return this.translateWithWorker(text, options);
|
|
133
|
+
}
|
|
134
|
+
const readMemory = async (key) => {
|
|
135
|
+
try {
|
|
136
|
+
return await memory.get(key);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const writeMemory = async (key, value) => {
|
|
143
|
+
try {
|
|
144
|
+
await memory.set(key, value);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// A failing cache must not fail the translation.
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const chunks = splitTextIntoChunks(text, this.configuration.maxChunkLength ?? DEFAULT_MAX_CHUNK_LENGTH);
|
|
151
|
+
let nativeAvailable = false;
|
|
152
|
+
if (this.useNativeTranslation) {
|
|
153
|
+
const modelId = `native:${sourceLanguage}>${targetLanguage}`;
|
|
154
|
+
const instance = await this.nativePool.acquire(sourceLanguage, targetLanguage, (progress) => {
|
|
155
|
+
options.onProgress?.({
|
|
156
|
+
modelId,
|
|
157
|
+
progress,
|
|
158
|
+
message: "Downloading the built-in browser translation model..."
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
nativeAvailable = instance !== undefined;
|
|
162
|
+
}
|
|
163
|
+
const engineId = nativeAvailable
|
|
164
|
+
? `native:${sourceLanguage}>${targetLanguage}`
|
|
165
|
+
: getTranslationRoute(sourceLanguage, targetLanguage, this.configuration.modelCatalog)
|
|
166
|
+
.map((step) => step.id)
|
|
167
|
+
.join(",");
|
|
168
|
+
let streamedText = "";
|
|
169
|
+
const emitDelta = (delta) => {
|
|
170
|
+
if (!delta) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
streamedText += delta;
|
|
174
|
+
options.onDelta?.(delta, streamedText);
|
|
175
|
+
};
|
|
176
|
+
const outputs = [];
|
|
177
|
+
const models = new Set();
|
|
178
|
+
let engine = "memory";
|
|
179
|
+
for (const chunk of chunks) {
|
|
180
|
+
if (this.disposed) {
|
|
181
|
+
throw new Error("The translator has been disposed.");
|
|
182
|
+
}
|
|
183
|
+
if (options.signal?.aborted) {
|
|
184
|
+
throw new TranslationAbortedError();
|
|
185
|
+
}
|
|
186
|
+
const key = createTranslationMemoryKey(engineId, sourceLanguage, targetLanguage, chunk.text);
|
|
187
|
+
let translation = await readMemory(key);
|
|
188
|
+
if (translation === undefined) {
|
|
189
|
+
const chunkOptions = {
|
|
190
|
+
sourceLanguage: options.sourceLanguage,
|
|
191
|
+
targetLanguage: options.targetLanguage,
|
|
192
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
193
|
+
...(options.onProgress === undefined
|
|
194
|
+
? {}
|
|
195
|
+
: { onProgress: options.onProgress }),
|
|
196
|
+
...(options.onStatus === undefined
|
|
197
|
+
? {}
|
|
198
|
+
: { onStatus: options.onStatus }),
|
|
199
|
+
onDelta: (delta) => emitDelta(delta)
|
|
200
|
+
};
|
|
201
|
+
let result;
|
|
202
|
+
if (nativeAvailable) {
|
|
203
|
+
result = await this.translateNatively(chunk.text, sourceLanguage, targetLanguage, chunkOptions);
|
|
204
|
+
}
|
|
205
|
+
if (!result) {
|
|
206
|
+
result = await this.translateWithWorker(chunk.text, chunkOptions);
|
|
207
|
+
}
|
|
208
|
+
translation = result.text;
|
|
209
|
+
engine = result.engine;
|
|
210
|
+
for (const model of result.models) {
|
|
211
|
+
models.add(model);
|
|
212
|
+
}
|
|
213
|
+
await writeMemory(key, translation);
|
|
214
|
+
emitDelta(chunk.separator);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
emitDelta(translation + chunk.separator);
|
|
218
|
+
}
|
|
219
|
+
outputs.push(translation + chunk.separator);
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
text: outputs.join(""),
|
|
223
|
+
sourceLanguage: options.sourceLanguage,
|
|
224
|
+
targetLanguage: options.targetLanguage,
|
|
225
|
+
models: [...models],
|
|
226
|
+
engine
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
unloadModels() {
|
|
230
|
+
if (this.disposed) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
this.nativePool.destroyAll();
|
|
234
|
+
this.worker?.postMessage({
|
|
235
|
+
type: "unload-models"
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
dispose() {
|
|
239
|
+
if (this.disposed) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
this.disposed = true;
|
|
243
|
+
this.teardownWorker();
|
|
244
|
+
this.nativePool.destroyAll();
|
|
245
|
+
this.failAllRequests(new Error("The translator was disposed."));
|
|
246
|
+
}
|
|
247
|
+
async translateNatively(text, sourceLanguage, targetLanguage, options) {
|
|
248
|
+
const requestId = createRequestId();
|
|
249
|
+
const modelId = `native:${sourceLanguage}>${targetLanguage}`;
|
|
250
|
+
const downloadMessage = "Downloading the built-in browser translation model...";
|
|
251
|
+
const instance = await this.nativePool.acquire(sourceLanguage, targetLanguage, (progress) => {
|
|
252
|
+
options.onProgress?.({ modelId, progress, message: downloadMessage });
|
|
253
|
+
options.onStatus?.({
|
|
254
|
+
status: "progress",
|
|
255
|
+
requestId,
|
|
256
|
+
modelId,
|
|
257
|
+
progress,
|
|
258
|
+
message: downloadMessage
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
if (!instance) {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
if (options.signal?.aborted) {
|
|
265
|
+
throw new TranslationAbortedError();
|
|
266
|
+
}
|
|
267
|
+
options.onStatus?.({
|
|
268
|
+
status: "route",
|
|
269
|
+
requestId,
|
|
270
|
+
models: [modelId],
|
|
271
|
+
message: "Using the built-in browser translator."
|
|
272
|
+
});
|
|
273
|
+
options.onStatus?.({
|
|
274
|
+
status: "processing",
|
|
275
|
+
requestId,
|
|
276
|
+
modelId,
|
|
277
|
+
message: "Translating..."
|
|
278
|
+
});
|
|
279
|
+
const callOptions = options.signal ? { signal: options.signal } : {};
|
|
280
|
+
let deltasDelivered = false;
|
|
281
|
+
try {
|
|
282
|
+
let translation;
|
|
283
|
+
if (options.onDelta && typeof instance.translateStreaming === "function") {
|
|
284
|
+
translation = await readTranslationStream(instance.translateStreaming(text, callOptions), (delta, streamedText) => {
|
|
285
|
+
deltasDelivered = true;
|
|
286
|
+
options.onDelta?.(delta, streamedText);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
translation = await instance.translate(text, callOptions);
|
|
291
|
+
if (translation) {
|
|
292
|
+
deltasDelivered = true;
|
|
293
|
+
options.onDelta?.(translation, translation);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (options.signal?.aborted) {
|
|
297
|
+
throw new TranslationAbortedError();
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
text: translation,
|
|
301
|
+
sourceLanguage: options.sourceLanguage,
|
|
302
|
+
targetLanguage: options.targetLanguage,
|
|
303
|
+
models: [modelId],
|
|
304
|
+
engine: "native"
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (error instanceof TranslationAbortedError) {
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
if (options.signal?.aborted || isAbortError(error)) {
|
|
312
|
+
throw new TranslationAbortedError();
|
|
313
|
+
}
|
|
314
|
+
// Nothing was streamed to the caller yet, so the worker engine can
|
|
315
|
+
// still take over without duplicating output.
|
|
316
|
+
if (!deltasDelivered) {
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
translateWithWorker(text, options) {
|
|
323
|
+
const worker = this.ensureWorker();
|
|
324
|
+
const requestId = createRequestId();
|
|
325
|
+
return new Promise((resolve, reject) => {
|
|
326
|
+
const pending = {
|
|
327
|
+
sourceLanguage: options.sourceLanguage,
|
|
328
|
+
targetLanguage: options.targetLanguage,
|
|
329
|
+
streamedText: "",
|
|
330
|
+
resolve,
|
|
331
|
+
reject,
|
|
332
|
+
options
|
|
333
|
+
};
|
|
334
|
+
if (options.signal) {
|
|
335
|
+
const abort = () => {
|
|
336
|
+
if (!this.requests.delete(requestId)) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
this.worker?.postMessage({
|
|
340
|
+
type: "cancel",
|
|
341
|
+
requestId
|
|
342
|
+
});
|
|
343
|
+
reject(new TranslationAbortedError());
|
|
344
|
+
};
|
|
345
|
+
options.signal.addEventListener("abort", abort, { once: true });
|
|
346
|
+
pending.removeAbortListener = () => options.signal?.removeEventListener("abort", abort);
|
|
347
|
+
}
|
|
348
|
+
this.requests.set(requestId, pending);
|
|
349
|
+
worker.postMessage({
|
|
350
|
+
type: "translate",
|
|
351
|
+
requestId,
|
|
352
|
+
text,
|
|
353
|
+
sourceLanguage: options.sourceLanguage,
|
|
354
|
+
targetLanguage: options.targetLanguage
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
ensureWorker() {
|
|
359
|
+
if (!this.worker) {
|
|
360
|
+
this.worker = this.workerFactory();
|
|
361
|
+
this.worker.addEventListener("message", this.handleMessage);
|
|
362
|
+
this.worker.addEventListener("error", this.handleWorkerError);
|
|
363
|
+
this.worker.addEventListener("messageerror", this.handleWorkerMessageError);
|
|
364
|
+
this.worker.postMessage({
|
|
365
|
+
type: "configure",
|
|
366
|
+
configuration: this.configuration
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return this.worker;
|
|
370
|
+
}
|
|
371
|
+
teardownWorker() {
|
|
372
|
+
if (!this.worker) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
this.worker.removeEventListener("message", this.handleMessage);
|
|
376
|
+
this.worker.removeEventListener("error", this.handleWorkerError);
|
|
377
|
+
this.worker.removeEventListener("messageerror", this.handleWorkerMessageError);
|
|
378
|
+
this.worker.terminate();
|
|
379
|
+
this.worker = undefined;
|
|
380
|
+
}
|
|
381
|
+
failAllRequests(error) {
|
|
382
|
+
for (const requestId of [...this.requests.keys()]) {
|
|
383
|
+
const pending = this.requests.get(requestId);
|
|
384
|
+
if (!pending) {
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
this.finishRequest(requestId);
|
|
388
|
+
pending.reject(error);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
handleMessage = (event) => {
|
|
392
|
+
const message = event.data;
|
|
393
|
+
const pending = this.requests.get(message.requestId);
|
|
394
|
+
if (!pending) {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
switch (message.status) {
|
|
398
|
+
case "partial":
|
|
399
|
+
pending.streamedText += message.delta;
|
|
400
|
+
pending.options.onDelta?.(message.delta, pending.streamedText);
|
|
401
|
+
return;
|
|
402
|
+
case "progress":
|
|
403
|
+
pending.options.onProgress?.({
|
|
404
|
+
modelId: message.modelId,
|
|
405
|
+
message: message.message,
|
|
406
|
+
...(message.file === undefined ? {} : { file: message.file }),
|
|
407
|
+
...(message.progress === undefined
|
|
408
|
+
? {}
|
|
409
|
+
: { progress: message.progress }),
|
|
410
|
+
...(message.loaded === undefined ? {} : { loaded: message.loaded }),
|
|
411
|
+
...(message.total === undefined ? {} : { total: message.total })
|
|
412
|
+
});
|
|
413
|
+
pending.options.onStatus?.(message);
|
|
414
|
+
return;
|
|
415
|
+
case "route":
|
|
416
|
+
case "loading":
|
|
417
|
+
case "model-ready":
|
|
418
|
+
case "processing":
|
|
419
|
+
pending.options.onStatus?.(message);
|
|
420
|
+
return;
|
|
421
|
+
case "success":
|
|
422
|
+
this.finishRequest(message.requestId);
|
|
423
|
+
pending.resolve({
|
|
424
|
+
text: message.translation,
|
|
425
|
+
sourceLanguage: pending.sourceLanguage,
|
|
426
|
+
targetLanguage: pending.targetLanguage,
|
|
427
|
+
models: message.models,
|
|
428
|
+
engine: "transformers"
|
|
429
|
+
});
|
|
430
|
+
return;
|
|
431
|
+
case "error":
|
|
432
|
+
this.finishRequest(message.requestId);
|
|
433
|
+
pending.reject(new Error(message.error));
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
handleWorkerError = (event) => {
|
|
437
|
+
// The worker is in an unknown state; drop it so the next translation
|
|
438
|
+
// starts a fresh one instead of hanging forever.
|
|
439
|
+
this.teardownWorker();
|
|
440
|
+
this.failAllRequests(new Error(event.message || "The translation worker failed."));
|
|
441
|
+
};
|
|
442
|
+
handleWorkerMessageError = () => {
|
|
443
|
+
this.teardownWorker();
|
|
444
|
+
this.failAllRequests(new Error("The translation worker sent a message that could not be read."));
|
|
445
|
+
};
|
|
446
|
+
finishRequest(requestId) {
|
|
447
|
+
const pending = this.requests.get(requestId);
|
|
448
|
+
pending?.removeAbortListener?.();
|
|
449
|
+
this.requests.delete(requestId);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=browser-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-translator.js","sourceRoot":"","sources":["../src/browser-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TextChunk {
|
|
2
|
+
/** Model input for this chunk, with no leading or trailing whitespace. */
|
|
3
|
+
text: string;
|
|
4
|
+
/** Whitespace that followed the chunk in the source text. */
|
|
5
|
+
separator: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const DEFAULT_MAX_CHUNK_LENGTH = 500;
|
|
8
|
+
/**
|
|
9
|
+
* Splits text into translation-sized chunks on paragraph and sentence
|
|
10
|
+
* boundaries. Marian/OPUS models truncate input past roughly 512 tokens, so
|
|
11
|
+
* every chunk stays within maxChunkLength characters unless a single word
|
|
12
|
+
* exceeds it. Joining each chunk's text and separator reproduces the source
|
|
13
|
+
* text, so translated chunks can be reassembled with original spacing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function splitTextIntoChunks(text: string, maxChunkLength?: number): TextChunk[];
|
|
16
|
+
//# sourceMappingURL=chunking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAiD5C;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,MAAiC,GAChD,SAAS,EAAE,CAsEb"}
|
package/dist/chunking.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const DEFAULT_MAX_CHUNK_LENGTH = 500;
|
|
2
|
+
const SENTENCE_PATTERN = /[^.!?…。!?]+[.!?…。!?]+["'”’)\]]*\s*|[^.!?…。!?]+/g;
|
|
3
|
+
function segmentSentences(text) {
|
|
4
|
+
if (typeof Intl !== "undefined" && typeof Intl.Segmenter === "function") {
|
|
5
|
+
const segmenter = new Intl.Segmenter(undefined, {
|
|
6
|
+
granularity: "sentence"
|
|
7
|
+
});
|
|
8
|
+
const segments = Array.from(segmenter.segment(text), (item) => item.segment);
|
|
9
|
+
if (segments.length > 0) {
|
|
10
|
+
return segments;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return text.match(SENTENCE_PATTERN) ?? [text];
|
|
14
|
+
}
|
|
15
|
+
function splitOversizedSentence(sentence, maxChunkLength) {
|
|
16
|
+
if (sentence.length <= maxChunkLength) {
|
|
17
|
+
return [sentence];
|
|
18
|
+
}
|
|
19
|
+
const pieces = [];
|
|
20
|
+
let rest = sentence;
|
|
21
|
+
while (rest.length > maxChunkLength) {
|
|
22
|
+
const window = rest.slice(0, maxChunkLength);
|
|
23
|
+
const lastWhitespace = window.search(/\s\S*$/);
|
|
24
|
+
const cut = lastWhitespace > 0 ? lastWhitespace + 1 : maxChunkLength;
|
|
25
|
+
pieces.push(rest.slice(0, cut));
|
|
26
|
+
rest = rest.slice(cut);
|
|
27
|
+
}
|
|
28
|
+
if (rest) {
|
|
29
|
+
pieces.push(rest);
|
|
30
|
+
}
|
|
31
|
+
return pieces;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Splits text into translation-sized chunks on paragraph and sentence
|
|
35
|
+
* boundaries. Marian/OPUS models truncate input past roughly 512 tokens, so
|
|
36
|
+
* every chunk stays within maxChunkLength characters unless a single word
|
|
37
|
+
* exceeds it. Joining each chunk's text and separator reproduces the source
|
|
38
|
+
* text, so translated chunks can be reassembled with original spacing.
|
|
39
|
+
*/
|
|
40
|
+
export function splitTextIntoChunks(text, maxChunkLength = DEFAULT_MAX_CHUNK_LENGTH) {
|
|
41
|
+
const limit = Math.max(1, Math.floor(maxChunkLength));
|
|
42
|
+
const chunks = [];
|
|
43
|
+
const appendSeparator = (separator) => {
|
|
44
|
+
if (!separator) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const last = chunks[chunks.length - 1];
|
|
48
|
+
if (last) {
|
|
49
|
+
last.separator += separator;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const pushSegment = (segment) => {
|
|
53
|
+
const trailing = segment.match(/\s*$/)?.[0] ?? "";
|
|
54
|
+
const withoutTrailing = trailing
|
|
55
|
+
? segment.slice(0, segment.length - trailing.length)
|
|
56
|
+
: segment;
|
|
57
|
+
const leading = withoutTrailing.match(/^\s*/)?.[0] ?? "";
|
|
58
|
+
const body = leading ? withoutTrailing.slice(leading.length) : withoutTrailing;
|
|
59
|
+
appendSeparator(leading);
|
|
60
|
+
if (body) {
|
|
61
|
+
chunks.push({ text: body, separator: trailing });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
appendSeparator(trailing);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const parts = text.split(/(\n+)/);
|
|
68
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
69
|
+
const part = parts[index] ?? "";
|
|
70
|
+
if (index % 2 === 1) {
|
|
71
|
+
appendSeparator(part);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!part) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (part.length <= limit) {
|
|
78
|
+
pushSegment(part);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
let group = "";
|
|
82
|
+
for (const sentence of segmentSentences(part).flatMap((item) => splitOversizedSentence(item, limit))) {
|
|
83
|
+
if (group && group.length + sentence.length > limit) {
|
|
84
|
+
pushSegment(group);
|
|
85
|
+
group = "";
|
|
86
|
+
}
|
|
87
|
+
group += sentence;
|
|
88
|
+
}
|
|
89
|
+
if (group) {
|
|
90
|
+
pushSegment(group);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return chunks;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=chunking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { BrowserTranslator, TranslationAbortedError, type BrowserTranslatorOptions, type TranslateOptions, type TranslationEngine, type TranslationProgress, type TranslationResult, type TranslationStatusEvent } from "./browser-translator.js";
|
|
2
|
+
export { DEFAULT_MODEL_CATALOG, getTranslationRoute, normalizeLanguageCode, type LanguageCode, type ModelCatalog, type TranslationModel } from "./model-catalog.js";
|
|
3
|
+
export { DEFAULT_MAX_CHUNK_LENGTH, splitTextIntoChunks, type TextChunk } from "./chunking.js";
|
|
4
|
+
export { getNativeTranslatorApi, type NativeTranslationAvailability, type NativeTranslatorApi, type NativeTranslatorInstance } from "./native-translation.js";
|
|
5
|
+
export { InMemoryTranslationMemory, IndexedDBTranslationMemory, createTranslationMemoryKey, type TranslationMemory } from "./translation-memory.js";
|
|
6
|
+
export { createTranslationMetadata, hashText, isTranslationStale, type TranslationMetadata } from "./metadata.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,QAAQ,EACR,kBAAkB,EAClB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { BrowserTranslator, TranslationAbortedError } from "./browser-translator.js";
|
|
2
|
+
export { DEFAULT_MODEL_CATALOG, getTranslationRoute, normalizeLanguageCode } from "./model-catalog.js";
|
|
3
|
+
export { DEFAULT_MAX_CHUNK_LENGTH, splitTextIntoChunks } from "./chunking.js";
|
|
4
|
+
export { getNativeTranslatorApi } from "./native-translation.js";
|
|
5
|
+
export { InMemoryTranslationMemory, IndexedDBTranslationMemory, createTranslationMemoryKey } from "./translation-memory.js";
|
|
6
|
+
export { createTranslationMetadata, hashText, isTranslationStale } from "./metadata.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EAOxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EAItB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EAEpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,sBAAsB,EAIvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAE3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,QAAQ,EACR,kBAAkB,EAEnB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TranslationResult } from "./browser-translator.js";
|
|
2
|
+
/**
|
|
3
|
+
* Provenance record stored next to a translation so staleness can be
|
|
4
|
+
* detected after the source changes.
|
|
5
|
+
*/
|
|
6
|
+
export interface TranslationMetadata {
|
|
7
|
+
sourceHash: string;
|
|
8
|
+
sourceLanguage: string;
|
|
9
|
+
targetLanguage: string;
|
|
10
|
+
models: string[];
|
|
11
|
+
engine: string;
|
|
12
|
+
translatedAt: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* FNV-1a 64-bit hash of a string, returned as a fixed-width hex string.
|
|
16
|
+
* Used to compare a stored source snapshot against the current source
|
|
17
|
+
* without storing the full text.
|
|
18
|
+
*/
|
|
19
|
+
export declare function hashText(text: string): string;
|
|
20
|
+
export declare function createTranslationMetadata(sourceText: string, result: TranslationResult): TranslationMetadata;
|
|
21
|
+
/**
|
|
22
|
+
* Returns true when the metadata is missing, malformed, or was created from
|
|
23
|
+
* a different source text than the one passed in.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isTranslationStale(sourceText: string, metadata: unknown): boolean;
|
|
26
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS7C;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,mBAAmB,CASrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAYT"}
|