@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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +519 -0
  3. package/dist/blocknote.d.ts +62 -0
  4. package/dist/blocknote.d.ts.map +1 -0
  5. package/dist/blocknote.js +379 -0
  6. package/dist/blocknote.js.map +1 -0
  7. package/dist/browser-translator.d.ts +81 -0
  8. package/dist/browser-translator.d.ts.map +1 -0
  9. package/dist/browser-translator.js +452 -0
  10. package/dist/browser-translator.js.map +1 -0
  11. package/dist/chunking.d.ts +16 -0
  12. package/dist/chunking.d.ts.map +1 -0
  13. package/dist/chunking.js +95 -0
  14. package/dist/chunking.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/metadata.d.ts +26 -0
  20. package/dist/metadata.d.ts.map +1 -0
  21. package/dist/metadata.js +41 -0
  22. package/dist/metadata.js.map +1 -0
  23. package/dist/model-catalog.d.ts +14 -0
  24. package/dist/model-catalog.d.ts.map +1 -0
  25. package/dist/model-catalog.js +41 -0
  26. package/dist/model-catalog.js.map +1 -0
  27. package/dist/native-translation.d.ts +37 -0
  28. package/dist/native-translation.d.ts.map +1 -0
  29. package/dist/native-translation.js +80 -0
  30. package/dist/native-translation.js.map +1 -0
  31. package/dist/protocol.d.ts +59 -0
  32. package/dist/protocol.d.ts.map +1 -0
  33. package/dist/protocol.js +2 -0
  34. package/dist/protocol.js.map +1 -0
  35. package/dist/translation-memory.d.ts +50 -0
  36. package/dist/translation-memory.d.ts.map +1 -0
  37. package/dist/translation-memory.js +117 -0
  38. package/dist/translation-memory.js.map +1 -0
  39. package/dist/translator.worker.d.ts +2 -0
  40. package/dist/translator.worker.d.ts.map +1 -0
  41. package/dist/translator.worker.js +304 -0
  42. package/dist/translator.worker.js.map +1 -0
  43. package/dist/yjs.d.ts +98 -0
  44. package/dist/yjs.d.ts.map +1 -0
  45. package/dist/yjs.js +291 -0
  46. package/dist/yjs.js.map +1 -0
  47. package/package.json +78 -0
package/dist/yjs.js ADDED
@@ -0,0 +1,291 @@
1
+ import { TranslationAbortedError } from "./browser-translator.js";
2
+ import { createTranslationMetadata, isTranslationStale } from "./metadata.js";
3
+ export const YJS_TRANSLATION_ORIGIN = Symbol("yjs-local-translator");
4
+ export class TranslationConflictError extends Error {
5
+ constructor(message = "The source changed while it was being translated.") {
6
+ super(message);
7
+ this.name = "TranslationConflictError";
8
+ }
9
+ }
10
+ function isHighSurrogate(code) {
11
+ return code >= 0xd800 && code <= 0xdbff;
12
+ }
13
+ function isLowSurrogate(code) {
14
+ return code >= 0xdc00 && code <= 0xdfff;
15
+ }
16
+ /**
17
+ * Replaces the content of a Y.Text with a minimal edit: the longest common
18
+ * prefix and suffix are left untouched, so collaborator cursors and relative
19
+ * positions outside the changed region survive the update.
20
+ */
21
+ export function applyMinimalYTextEdit(target, nextValue) {
22
+ const current = target.toString();
23
+ if (current === nextValue) {
24
+ return;
25
+ }
26
+ const maxShared = Math.min(current.length, nextValue.length);
27
+ let prefix = 0;
28
+ while (prefix < maxShared &&
29
+ current.charCodeAt(prefix) === nextValue.charCodeAt(prefix)) {
30
+ prefix += 1;
31
+ }
32
+ if (prefix > 0 && isHighSurrogate(current.charCodeAt(prefix - 1))) {
33
+ prefix -= 1;
34
+ }
35
+ let suffix = 0;
36
+ while (suffix < maxShared - prefix &&
37
+ current.charCodeAt(current.length - 1 - suffix) ===
38
+ nextValue.charCodeAt(nextValue.length - 1 - suffix)) {
39
+ suffix += 1;
40
+ }
41
+ if (suffix > 0 && isLowSurrogate(current.charCodeAt(current.length - suffix))) {
42
+ suffix -= 1;
43
+ }
44
+ const deleteLength = current.length - prefix - suffix;
45
+ if (deleteLength > 0) {
46
+ target.delete(prefix, deleteLength);
47
+ }
48
+ const insertText = nextValue.slice(prefix, nextValue.length - suffix);
49
+ if (insertText) {
50
+ target.insert(prefix, insertText);
51
+ }
52
+ }
53
+ /**
54
+ * Translates a complete Y.Text value. Streamed deltas are delivered only to
55
+ * callbacks; the shared type is updated once, after the final output exists.
56
+ */
57
+ export async function translateYText(translator, source, options) {
58
+ const sourceSnapshot = source.toString();
59
+ const target = options.target ?? source;
60
+ const conflictPolicy = options.conflictPolicy ?? "abort";
61
+ const result = await translator.translate(sourceSnapshot, options);
62
+ if (conflictPolicy === "abort" && source.toString() !== sourceSnapshot) {
63
+ throw new TranslationConflictError();
64
+ }
65
+ const apply = () => {
66
+ applyMinimalYTextEdit(target, result.text);
67
+ if (options.metadataMap && options.metadataKey !== undefined) {
68
+ options.metadataMap.set(options.metadataKey, createTranslationMetadata(sourceSnapshot, result));
69
+ }
70
+ };
71
+ const doc = target.doc ?? source.doc;
72
+ if (doc) {
73
+ doc.transact(apply, options.transactionOrigin ?? YJS_TRANSLATION_ORIGIN);
74
+ }
75
+ else {
76
+ apply();
77
+ }
78
+ return result;
79
+ }
80
+ /**
81
+ * Translates a string stored in a Y.Map and writes the finished translation
82
+ * in one transaction. Use targetKey to keep the source and translation side
83
+ * by side instead of replacing the source value. When stored side by side, a
84
+ * metadata record is written under "<targetKey>:meta" so staleness can be
85
+ * detected after the source changes.
86
+ */
87
+ export async function translateYMapString(translator, sourceMap, sourceKey, options) {
88
+ const sourceValue = sourceMap.get(sourceKey);
89
+ if (typeof sourceValue !== "string") {
90
+ throw new TypeError(`Y.Map value at "${sourceKey}" must be a string.`);
91
+ }
92
+ const sourceSnapshot = sourceValue;
93
+ const targetMap = options.targetMap ?? sourceMap;
94
+ const targetKey = options.targetKey ?? sourceKey;
95
+ const conflictPolicy = options.conflictPolicy ?? "abort";
96
+ const translatingInPlace = targetMap === sourceMap && targetKey === sourceKey;
97
+ const storeMetadata = options.storeMetadata ?? !translatingInPlace;
98
+ const metadataKey = options.metadataKey ?? `${targetKey}:meta`;
99
+ const result = await translator.translate(sourceSnapshot, options);
100
+ if (conflictPolicy === "abort" &&
101
+ sourceMap.get(sourceKey) !== sourceSnapshot) {
102
+ throw new TranslationConflictError();
103
+ }
104
+ const apply = () => {
105
+ targetMap.set(targetKey, result.text);
106
+ if (storeMetadata) {
107
+ targetMap.set(metadataKey, createTranslationMetadata(sourceSnapshot, result));
108
+ }
109
+ };
110
+ const doc = targetMap.doc ?? sourceMap.doc;
111
+ if (doc) {
112
+ doc.transact(apply, options.transactionOrigin ?? YJS_TRANSLATION_ORIGIN);
113
+ }
114
+ else {
115
+ apply();
116
+ }
117
+ return result;
118
+ }
119
+ /**
120
+ * Returns true when the translation stored beside a Y.Map source value is
121
+ * missing or was produced from a different source text. Returns false when
122
+ * there is no source string to translate.
123
+ */
124
+ export function isYMapTranslationStale(map, sourceKey, targetKey, metadataKey = `${targetKey}:meta`) {
125
+ const source = map.get(sourceKey);
126
+ if (typeof source !== "string" || !source.trim()) {
127
+ return false;
128
+ }
129
+ if (map.get(targetKey) === undefined) {
130
+ return true;
131
+ }
132
+ return isTranslationStale(source, map.get(metadataKey));
133
+ }
134
+ function createWatcher(config) {
135
+ let timer;
136
+ let running = false;
137
+ let rerun = false;
138
+ let stopped = false;
139
+ let controller;
140
+ const run = async () => {
141
+ if (stopped) {
142
+ return;
143
+ }
144
+ if (running) {
145
+ rerun = true;
146
+ return;
147
+ }
148
+ if (!config.getSourceText().trim()) {
149
+ return;
150
+ }
151
+ running = true;
152
+ controller = new AbortController();
153
+ try {
154
+ const result = await config.translate(controller.signal);
155
+ config.onTranslated?.(result);
156
+ }
157
+ catch (error) {
158
+ if (error instanceof TranslationConflictError) {
159
+ // The source moved on while translating; run again with fresh text.
160
+ rerun = true;
161
+ }
162
+ else if (!(error instanceof TranslationAbortedError)) {
163
+ config.onError?.(error instanceof Error ? error : new Error(String(error)));
164
+ }
165
+ }
166
+ finally {
167
+ running = false;
168
+ controller = undefined;
169
+ if (rerun && !stopped) {
170
+ rerun = false;
171
+ schedule();
172
+ }
173
+ }
174
+ };
175
+ const schedule = () => {
176
+ if (stopped) {
177
+ return;
178
+ }
179
+ if (timer !== undefined) {
180
+ clearTimeout(timer);
181
+ }
182
+ timer = setTimeout(() => {
183
+ timer = undefined;
184
+ const sourceText = config.getSourceText();
185
+ if (!sourceText.trim()) {
186
+ return;
187
+ }
188
+ config.onStale?.(sourceText);
189
+ if (config.autoTranslate) {
190
+ void run();
191
+ }
192
+ }, config.debounceMs);
193
+ };
194
+ const unsubscribe = config.subscribe((transaction) => {
195
+ if (transaction.origin === config.origin) {
196
+ return;
197
+ }
198
+ if (config.localOnly && !transaction.local) {
199
+ return;
200
+ }
201
+ schedule();
202
+ });
203
+ if (config.immediate) {
204
+ schedule();
205
+ }
206
+ return () => {
207
+ stopped = true;
208
+ if (timer !== undefined) {
209
+ clearTimeout(timer);
210
+ timer = undefined;
211
+ }
212
+ controller?.abort();
213
+ unsubscribe();
214
+ };
215
+ }
216
+ /**
217
+ * Observes a source Y.Text and keeps a target Y.Text translated. Changes are
218
+ * debounced, transactions written by the watcher itself are ignored, and by
219
+ * default only local edits trigger retranslation so a single client in a
220
+ * collaborative session does the work. Returns a stop function.
221
+ */
222
+ export function watchYText(translator, source, options) {
223
+ const target = options.target;
224
+ if (!target || target === source) {
225
+ throw new Error("watchYText requires a target Y.Text different from the source.");
226
+ }
227
+ return createWatcher({
228
+ debounceMs: options.debounceMs ?? 1500,
229
+ autoTranslate: options.autoTranslate ?? true,
230
+ immediate: options.immediate ?? false,
231
+ localOnly: options.localOnly ?? true,
232
+ origin: options.transactionOrigin ?? YJS_TRANSLATION_ORIGIN,
233
+ onStale: options.onStale,
234
+ onTranslated: options.onTranslated,
235
+ onError: options.onError,
236
+ getSourceText: () => source.toString(),
237
+ translate: (signal) => translateYText(translator, source, {
238
+ ...options,
239
+ signal,
240
+ conflictPolicy: options.conflictPolicy ?? "abort"
241
+ }),
242
+ subscribe: (notify) => {
243
+ const observer = (_event, transaction) => {
244
+ notify({ origin: transaction.origin, local: transaction.local });
245
+ };
246
+ source.observe(observer);
247
+ return () => source.unobserve(observer);
248
+ }
249
+ });
250
+ }
251
+ /**
252
+ * Observes one string value in a Y.Map and keeps a translated value beside
253
+ * it. Same debounce, origin, and locality rules as watchYText. Returns a
254
+ * stop function.
255
+ */
256
+ export function watchYMapString(translator, sourceMap, sourceKey, options) {
257
+ const targetMap = options.targetMap ?? sourceMap;
258
+ if (targetMap === sourceMap && options.targetKey === sourceKey) {
259
+ throw new Error("watchYMapString requires a targetKey or targetMap different from the source.");
260
+ }
261
+ return createWatcher({
262
+ debounceMs: options.debounceMs ?? 1500,
263
+ autoTranslate: options.autoTranslate ?? true,
264
+ immediate: options.immediate ?? false,
265
+ localOnly: options.localOnly ?? true,
266
+ origin: options.transactionOrigin ?? YJS_TRANSLATION_ORIGIN,
267
+ onStale: options.onStale,
268
+ onTranslated: options.onTranslated,
269
+ onError: options.onError,
270
+ getSourceText: () => {
271
+ const value = sourceMap.get(sourceKey);
272
+ return typeof value === "string" ? value : "";
273
+ },
274
+ translate: (signal) => translateYMapString(translator, sourceMap, sourceKey, {
275
+ ...options,
276
+ signal,
277
+ conflictPolicy: options.conflictPolicy ?? "abort"
278
+ }),
279
+ subscribe: (notify) => {
280
+ const observer = (event, transaction) => {
281
+ if (!event.keysChanged.has(sourceKey)) {
282
+ return;
283
+ }
284
+ notify({ origin: transaction.origin, local: transaction.local });
285
+ };
286
+ sourceMap.observe(observer);
287
+ return () => sourceMap.unobserve(observer);
288
+ }
289
+ });
290
+ }
291
+ //# sourceMappingURL=yjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs.js","sourceRoot":"","sources":["../src/yjs.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@defensestation/yjs-local-translator",
3
+ "version": "0.3.0-dev.2.d2befbc",
4
+ "description": "Private in-browser translation with streamed previews and single-transaction Yjs and BlockNote commits.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "",
8
+ "keywords": [
9
+ "yjs",
10
+ "blocknote",
11
+ "translation",
12
+ "transformers.js",
13
+ "local-first",
14
+ "offline",
15
+ "web-worker",
16
+ "collaboration"
17
+ ],
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "main": "./dist/index.js",
24
+ "module": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ },
31
+ "./yjs": {
32
+ "types": "./dist/yjs.d.ts",
33
+ "import": "./dist/yjs.js"
34
+ },
35
+ "./blocknote": {
36
+ "types": "./dist/blocknote.d.ts",
37
+ "import": "./dist/blocknote.js"
38
+ },
39
+ "./worker": {
40
+ "types": "./dist/translator.worker.d.ts",
41
+ "import": "./dist/translator.worker.js"
42
+ }
43
+ },
44
+ "sideEffects": false,
45
+ "scripts": {
46
+ "clean": "rm -rf dist coverage *.tgz",
47
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
48
+ "test": "vitest run",
49
+ "check": "rm -rf dist && tsc -p tsconfig.build.json && vitest run",
50
+ "pack:local": "rm -rf dist && tsc -p tsconfig.build.json && vitest run && yarn pack"
51
+ },
52
+ "peerDependencies": {
53
+ "@blocknote/core": ">=0.51.0 <1",
54
+ "@tiptap/pm": ">=3.0.0 <4",
55
+ "yjs": ">=13.6.0 <14"
56
+ },
57
+ "peerDependenciesMeta": {
58
+ "@blocknote/core": {
59
+ "optional": true
60
+ },
61
+ "@tiptap/pm": {
62
+ "optional": true
63
+ },
64
+ "yjs": {
65
+ "optional": true
66
+ }
67
+ },
68
+ "devDependencies": {
69
+ "@blocknote/core": "0.51.4",
70
+ "typescript": "5.9.3",
71
+ "vitest": "4.1.10",
72
+ "yjs": "13.6.31"
73
+ },
74
+ "engines": {
75
+ "node": ">=20"
76
+ },
77
+ "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
78
+ }