@web-ppt/fonts 0.8.0 → 0.9.0-beta.1

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.
@@ -1,215 +1,279 @@
1
- import { c as W, f as C, m as G } from "./provider-9-K8y5p4.js";
2
- import { F as l } from "./fault-HMYM9DhC.js";
3
- const B = "web-ppt-fonts/1";
4
- function z(w, y) {
5
- const u = W(y), h = new AbortController(), g = C(y.limits);
6
- let i = !1, d = Promise.resolve();
7
- const m = (v) => {
8
- const s = v.data;
9
- i || !s || s.protocol !== B || !Number.isSafeInteger(s.id) || (d = d.then(async () => {
10
- if (i) return;
11
- let t;
12
- try {
13
- if (s.operation === "register") t = await u.register({
14
- id: s.face.id,
15
- family: s.face.family,
16
- origin: s.face.origin,
17
- bytes: s.bytes,
18
- restrictions: s.face.embedding
19
- }, { purpose: "view-print" });
20
- else if (s.operation === "shape") t = await u.shape(s.faceId, s.text, s.options);
21
- else if (s.operation === "outline") t = await u.outline(s.faceId, s.glyphId, { purpose: s.purpose });
22
- else if (s.operation === "decode")
23
- if (!y.decodeEot) t = { ok: !1, reason: "decoder-unavailable" };
24
- else if (!(s.bytes instanceof Uint8Array) || s.bytes.length > g.maxFontBytes || !Number.isSafeInteger(s.maxOutputBytes) || s.maxOutputBytes < 1) t = { ok: !1, reason: "resource-limit" };
25
- else {
26
- const a = Math.min(s.maxOutputBytes, g.maxFontBytes), r = await y.decodeEot(s.bytes, { signal: h.signal, maxOutputBytes: a });
27
- t = r != null && r.length ? r.length > a ? { ok: !1, reason: "resource-limit" } : { ok: !0, value: new Uint8Array(r) } : { ok: !1, reason: "decode-failed" };
28
- }
29
- else t = { ok: !1, reason: "shaper-failed" };
30
- } catch (a) {
31
- t = { ok: !1, reason: a instanceof l ? a.reason : s.operation === "decode" ? "decode-failed" : "shaper-failed" };
32
- }
33
- i || w.postMessage(
34
- { protocol: B, id: s.id, result: t },
35
- t.ok && t.value instanceof Uint8Array ? [t.value.buffer] : []
36
- );
37
- }).catch(() => {
38
- }));
39
- };
40
- return w.addEventListener("message", m), () => {
41
- i || (i = !0, h.abort(), w.removeEventListener("message", m), u.dispose());
42
- };
1
+ import { n as e, r as t, t as n } from "./provider-B6_T5p3K.js";
2
+ import { t as r } from "./fault-Wg7mCzGf.js";
3
+ // src/glyphs/worker-protocol.ts
4
+ var i = "web-ppt-fonts/1";
5
+ // src/glyphs/worker-server.ts
6
+ function a(t, a) {
7
+ let o = n(a), s = new AbortController(), c = e(a.limits), l = !1, u = Promise.resolve(), d = (e) => {
8
+ let n = e.data;
9
+ !l && n && n.protocol === "web-ppt-fonts/1" && Number.isSafeInteger(n.id) && (u = u.then(async () => {
10
+ if (l) return;
11
+ let e;
12
+ try {
13
+ if (n.operation === "register") e = await o.register({
14
+ id: n.face.id,
15
+ family: n.face.family,
16
+ origin: n.face.origin,
17
+ bytes: n.bytes,
18
+ restrictions: n.face.embedding
19
+ }, { purpose: "view-print" });
20
+ else if (n.operation === "shape") e = await o.shape(n.faceId, n.text, n.options);
21
+ else if (n.operation === "outline") e = await o.outline(n.faceId, n.glyphId, { purpose: n.purpose });
22
+ else if (n.operation === "decode") {
23
+ if (!a.decodeEot) e = {
24
+ ok: !1,
25
+ reason: "decoder-unavailable"
26
+ };
27
+ else if (!(n.bytes instanceof Uint8Array) || n.bytes.length > c.maxFontBytes || !Number.isSafeInteger(n.maxOutputBytes) || n.maxOutputBytes < 1) e = {
28
+ ok: !1,
29
+ reason: "resource-limit"
30
+ };
31
+ else {
32
+ let t = Math.min(n.maxOutputBytes, c.maxFontBytes), r = await a.decodeEot(n.bytes, {
33
+ signal: s.signal,
34
+ maxOutputBytes: t
35
+ });
36
+ e = r?.length ? r.length > t ? {
37
+ ok: !1,
38
+ reason: "resource-limit"
39
+ } : {
40
+ ok: !0,
41
+ value: new Uint8Array(r)
42
+ } : {
43
+ ok: !1,
44
+ reason: "decode-failed"
45
+ };
46
+ }
47
+ } else e = {
48
+ ok: !1,
49
+ reason: "shaper-failed"
50
+ };
51
+ } catch (t) {
52
+ e = {
53
+ ok: !1,
54
+ reason: t instanceof r ? t.reason : n.operation === "decode" ? "decode-failed" : "shaper-failed"
55
+ };
56
+ }
57
+ l || t.postMessage({
58
+ protocol: i,
59
+ id: n.id,
60
+ result: e
61
+ }, e.ok && e.value instanceof Uint8Array ? [e.value.buffer] : []);
62
+ }).catch(() => {}));
63
+ };
64
+ return t.addEventListener("message", d), () => {
65
+ l || (l = !0, s.abort(), t.removeEventListener("message", d), o.dispose());
66
+ };
43
67
  }
44
- function _(w, y, u, h) {
45
- const g = () => {
46
- throw new l("shaper-failed");
47
- };
48
- (!w || typeof w != "object") && g();
49
- const i = w;
50
- if ((!Array.isArray(i.glyphs) || !Array.isArray(i.clusters) || i.faceId !== y.id || i.text !== u || i.unitsPerEm !== y.unitsPerEm || i.script !== h.script || i.direction !== h.direction || i.language !== h.language) && g(), i.glyphs.length > Math.max(256, u.length * 32) || i.clusters.length > i.glyphs.length)
51
- throw new l("resource-limit");
52
- const d = [];
53
- let m = 0, v = 0;
54
- for (const t of i.clusters) {
55
- (!t || !Number.isInteger(t.glyphEnd) || !Number.isInteger(t.end) || t.glyphStart !== m || t.glyphEnd <= m || t.glyphEnd > i.glyphs.length || t.start !== v || t.end <= v || t.end > u.length || t.text !== u.slice(t.start, t.end)) && g();
56
- for (let a = t.glyphStart; a < t.glyphEnd; a++) {
57
- const r = i.glyphs[a];
58
- (!r || typeof r != "object") && g(), d.push({ ...r, cluster: t.start });
59
- }
60
- m = t.glyphEnd, v = t.end;
61
- }
62
- (m !== i.glyphs.length || v !== u.length) && g();
63
- const s = G(y, u, h, d);
64
- return (!s.ok || s.value.xAdvance !== i.xAdvance || s.value.yAdvance !== i.yAdvance) && g(), d;
68
+ // src/glyphs/worker-result.ts
69
+ function o(e, n, i, a) {
70
+ let o = () => {
71
+ throw new r("shaper-failed");
72
+ };
73
+ e && typeof e == "object" || o();
74
+ let s = e;
75
+ if (Array.isArray(s.glyphs) && Array.isArray(s.clusters) && s.faceId === n.id && s.text === i && s.unitsPerEm === n.unitsPerEm && s.script === a.script && s.direction === a.direction && s.language === a.language || o(), s.glyphs.length > Math.max(256, i.length * 32) || s.clusters.length > s.glyphs.length) throw new r("resource-limit");
76
+ let c = [], l = 0, u = 0;
77
+ for (let e of s.clusters) {
78
+ (!e || !Number.isInteger(e.glyphEnd) || !Number.isInteger(e.end) || e.glyphStart !== l || e.glyphEnd <= l || e.glyphEnd > s.glyphs.length || e.start !== u || e.end <= u || e.end > i.length || e.text !== i.slice(e.start, e.end)) && o();
79
+ for (let t = e.glyphStart; t < e.glyphEnd; t++) {
80
+ let n = s.glyphs[t];
81
+ n && typeof n == "object" || o(), c.push({
82
+ ...n,
83
+ cluster: e.start
84
+ });
85
+ }
86
+ l = e.glyphEnd, u = e.end;
87
+ }
88
+ (l !== s.glyphs.length || u !== i.length) && o();
89
+ let d = t(n, i, a, c);
90
+ return d.ok && d.value.xAdvance === s.xAdvance && d.value.yAdvance === s.yAdvance || o(), c;
65
91
  }
66
- function D(w, y = {}) {
67
- const u = y.maxQueuedRequests ?? 64, h = y.requestTimeoutMs ?? 3e4, g = y.maxPendingBytes ?? 64 * 1024 * 1024;
68
- if (!Number.isInteger(u) || u < 1 || !Number.isSafeInteger(g) || g < 1 || !Number.isFinite(h) || h < 1) throw new RangeError("Invalid font worker budget");
69
- const i = /* @__PURE__ */ new Map(), d = [], m = /* @__PURE__ */ new Set(), v = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Set();
70
- let t = !1, a, r, R = 0, S = 0, L = 0, M = "action", k, A;
71
- const O = () => {
72
- k !== void 0 && clearTimeout(k), k = void 0, A == null || A(), A = void 0, a == null || a.terminate(), a = void 0, m.clear();
73
- }, b = (e, o, n) => {
74
- var E;
75
- L -= e.cost, (E = e.signal) == null || E.removeEventListener("abort", e.cancel), e === r && (k !== void 0 && clearTimeout(k), k = void 0, r = void 0), n ? e.reject(n) : e.resolve(o);
76
- }, I = () => {
77
- O(), r && b(r, void 0, new l("shaper-failed"));
78
- for (const e of d.splice(0)) b(e, void 0, new l("shaper-failed"));
79
- }, q = () => {
80
- if (!r || !a) return;
81
- const e = r.font;
82
- M = !e || m.has(e.info.id) ? "action" : "register", S = ++R;
83
- const o = { protocol: B, id: S };
84
- if (M === "register" && e) {
85
- const n = e.bytes.slice();
86
- a.postMessage({ ...o, operation: "register", face: e.info, bytes: n }, [n.buffer]);
87
- } else if (r.action.operation === "decode") {
88
- const n = r.action.bytes.slice();
89
- a.postMessage({ ...o, ...r.action, bytes: n }, [n.buffer]);
90
- } else e && a.postMessage({ ...o, ...r.action, faceId: e.info.id });
91
- }, F = () => {
92
- if (!(r || t || !d.length)) {
93
- r = d.shift();
94
- try {
95
- if (!a) {
96
- const e = w();
97
- a = e;
98
- const o = (E) => {
99
- if (a !== e || !r) return;
100
- const c = E.data;
101
- if (!(!c || c.protocol !== B || c.id !== S)) {
102
- if (!c.result || typeof c.result.ok != "boolean") {
103
- I();
104
- return;
105
- }
106
- if (!c.result.ok) {
107
- b(r, void 0, new l(c.result.reason, c.result.missing, c.result.range)), F();
108
- return;
109
- }
110
- if (M === "register") {
111
- m.add(r.font.info.id);
112
- try {
113
- q();
114
- } catch {
115
- I();
116
- }
117
- } else
118
- b(r, c.result.value), F();
119
- }
120
- }, n = () => {
121
- a === e && I();
122
- };
123
- e.addEventListener("message", o), e.addEventListener("error", n), e.addEventListener("messageerror", n), A = () => {
124
- e.removeEventListener("message", o), e.removeEventListener("error", n), e.removeEventListener("messageerror", n);
125
- };
126
- }
127
- k = setTimeout(I, h), q();
128
- } catch {
129
- I();
130
- }
131
- }
132
- }, N = (e, o, n) => new Promise((E, c) => {
133
- if (t) {
134
- c(new l("provider-disposed"));
135
- return;
136
- }
137
- if (n != null && n.aborted) {
138
- c(new l("aborted"));
139
- return;
140
- }
141
- const x = o.operation === "decode" ? o.bytes.length : o.operation === "shape" ? o.text.length * 2 : 0;
142
- if (d.length + (r ? 1 : 0) >= u || L + x > g) {
143
- c(new l("resource-limit"));
144
- return;
145
- }
146
- o.operation === "decode" && (o = { ...o, bytes: new Uint8Array(o.bytes) }), L += x;
147
- const p = { font: e, action: o, cost: x, signal: n, resolve: E, reject: c, cancel: () => {
148
- if (r === p)
149
- O(), b(p, void 0, new l("aborted"));
150
- else {
151
- const f = d.indexOf(p);
152
- if (f < 0) return;
153
- d.splice(f, 1), b(p, void 0, new l("aborted"));
154
- }
155
- F();
156
- } };
157
- n == null || n.addEventListener("abort", p.cancel, { once: !0 }), d.push(p), F();
158
- });
159
- return {
160
- async decodeEot(e, o) {
161
- return await N(void 0, { operation: "decode", bytes: e, maxOutputBytes: o.maxOutputBytes }, o.signal);
162
- },
163
- async open(e, o) {
164
- if (t || o.aborted) throw new l(t ? "provider-disposed" : "aborted");
165
- if (v.has(e.info.id)) throw new l("duplicate-face-id");
166
- v.add(e.info.id);
167
- let n = { info: { ...e.info, bbox: [...e.info.bbox], embedding: { ...e.info.embedding } }, bytes: new Uint8Array(e.bytes) };
168
- i.set(n.info.id, n);
169
- const E = n.info.id, c = () => {
170
- if (!n) return;
171
- const p = n;
172
- if (n = void 0, i.delete(E), s.delete(c), !t) {
173
- for (let f = d.length - 1; f >= 0; f--) d[f].font === p && b(d.splice(f, 1)[0], void 0, new l("face-unavailable"));
174
- (r == null ? void 0 : r.font) === p ? b(r, void 0, new l("face-unavailable")) : r && (d.unshift(r), r = void 0), O(), F();
175
- }
176
- };
177
- s.add(c);
178
- const x = () => {
179
- if (!n || t) throw new l("provider-disposed");
180
- return n;
181
- };
182
- return {
183
- async shape(p, f) {
184
- const P = x(), T = { purpose: f.purpose, script: f.script, direction: f.direction, language: f.language }, U = await N(P, { operation: "shape", text: p, options: T }, f.signal);
185
- return _(U, P.info, p, f);
186
- },
187
- async outline(p, f) {
188
- return await N(x(), { operation: "outline", glyphId: p, purpose: f.purpose }, f.signal);
189
- },
190
- dispose: c
191
- };
192
- },
193
- state() {
194
- return {
195
- disposed: t,
196
- retainedFontBytes: [...i.values()].reduce((e, o) => e + o.bytes.length, 0),
197
- pendingRequests: d.length + (r ? 1 : 0),
198
- pendingBytes: L,
199
- workerActive: !!a
200
- };
201
- },
202
- dispose() {
203
- if (!t) {
204
- t = !0, O(), r && b(r, void 0, new l("provider-disposed"));
205
- for (const e of d.splice(0)) b(e, void 0, new l("provider-disposed"));
206
- for (const e of [...s]) e();
207
- i.clear(), v.clear();
208
- }
209
- }
210
- };
92
+ // src/glyphs/worker-client.ts
93
+ function s(e, t = {}) {
94
+ let n = t.maxQueuedRequests ?? 64, a = t.requestTimeoutMs ?? 3e4, s = t.maxPendingBytes ?? 67108864;
95
+ if (!Number.isInteger(n) || n < 1 || !Number.isSafeInteger(s) || s < 1 || !Number.isFinite(a) || a < 1) throw RangeError("Invalid font worker budget");
96
+ let c = /* @__PURE__ */ new Map(), l = [], u = /* @__PURE__ */ new Set(), d = /* @__PURE__ */ new Set(), f = /* @__PURE__ */ new Set(), p = !1, m, h, g = 0, _ = 0, v = 0, y = "action", b, x, S = () => {
97
+ b !== void 0 && clearTimeout(b), b = void 0, x?.(), x = void 0, m?.terminate(), m = void 0, u.clear();
98
+ }, C = (e, t, n) => {
99
+ v -= e.cost, e.signal?.removeEventListener("abort", e.cancel), e === h && (b !== void 0 && clearTimeout(b), b = void 0, h = void 0), n ? e.reject(n) : e.resolve(t);
100
+ }, w = () => {
101
+ S(), h && C(h, void 0, new r("shaper-failed"));
102
+ for (let e of l.splice(0)) C(e, void 0, new r("shaper-failed"));
103
+ }, T = () => {
104
+ if (!h || !m) return;
105
+ let e = h.font;
106
+ y = !e || u.has(e.info.id) ? "action" : "register", _ = ++g;
107
+ let t = {
108
+ protocol: i,
109
+ id: _
110
+ };
111
+ if (y === "register" && e) {
112
+ let n = e.bytes.slice();
113
+ m.postMessage({
114
+ ...t,
115
+ operation: "register",
116
+ face: e.info,
117
+ bytes: n
118
+ }, [n.buffer]);
119
+ } else if (h.action.operation === "decode") {
120
+ let e = h.action.bytes.slice();
121
+ m.postMessage({
122
+ ...t,
123
+ ...h.action,
124
+ bytes: e
125
+ }, [e.buffer]);
126
+ } else e && m.postMessage({
127
+ ...t,
128
+ ...h.action,
129
+ faceId: e.info.id
130
+ });
131
+ }, E = () => {
132
+ if (!(h || p || !l.length)) {
133
+ h = l.shift();
134
+ try {
135
+ if (!m) {
136
+ let t = e();
137
+ m = t;
138
+ let n = (e) => {
139
+ if (m !== t || !h) return;
140
+ let n = e.data;
141
+ if (n && n.protocol === "web-ppt-fonts/1" && n.id === _) {
142
+ if (!n.result || typeof n.result.ok != "boolean") w();
143
+ else if (!n.result.ok) C(h, void 0, new r(n.result.reason, n.result.missing, n.result.range)), E();
144
+ else if (y === "register") {
145
+ u.add(h.font.info.id);
146
+ try {
147
+ T();
148
+ } catch {
149
+ w();
150
+ }
151
+ } else C(h, n.result.value), E();
152
+ }
153
+ }, i = () => {
154
+ m === t && w();
155
+ };
156
+ t.addEventListener("message", n), t.addEventListener("error", i), t.addEventListener("messageerror", i), x = () => {
157
+ t.removeEventListener("message", n), t.removeEventListener("error", i), t.removeEventListener("messageerror", i);
158
+ };
159
+ }
160
+ b = setTimeout(w, a), T();
161
+ } catch {
162
+ w();
163
+ }
164
+ }
165
+ }, D = (e, t, i) => new Promise((a, o) => {
166
+ if (p) {
167
+ o(new r("provider-disposed"));
168
+ return;
169
+ }
170
+ if (i?.aborted) {
171
+ o(new r("aborted"));
172
+ return;
173
+ }
174
+ let c = t.operation === "decode" ? t.bytes.length : t.operation === "shape" ? t.text.length * 2 : 0;
175
+ if (l.length + +!!h >= n || v + c > s) {
176
+ o(new r("resource-limit"));
177
+ return;
178
+ }
179
+ t.operation === "decode" && (t = {
180
+ ...t,
181
+ bytes: new Uint8Array(t.bytes)
182
+ }), v += c;
183
+ let u = {
184
+ font: e,
185
+ action: t,
186
+ cost: c,
187
+ signal: i,
188
+ resolve: a,
189
+ reject: o,
190
+ cancel: () => {
191
+ if (h === u) S(), C(u, void 0, new r("aborted"));
192
+ else {
193
+ let e = l.indexOf(u);
194
+ if (e < 0) return;
195
+ l.splice(e, 1), C(u, void 0, new r("aborted"));
196
+ }
197
+ E();
198
+ }
199
+ };
200
+ i?.addEventListener("abort", u.cancel, { once: !0 }), l.push(u), E();
201
+ });
202
+ return {
203
+ async decodeEot(e, t) {
204
+ return await D(void 0, {
205
+ operation: "decode",
206
+ bytes: e,
207
+ maxOutputBytes: t.maxOutputBytes
208
+ }, t.signal);
209
+ },
210
+ async open(e, t) {
211
+ if (p || t.aborted) throw new r(p ? "provider-disposed" : "aborted");
212
+ if (d.has(e.info.id)) throw new r("duplicate-face-id");
213
+ d.add(e.info.id);
214
+ let n = {
215
+ info: {
216
+ ...e.info,
217
+ bbox: [...e.info.bbox],
218
+ embedding: { ...e.info.embedding }
219
+ },
220
+ bytes: new Uint8Array(e.bytes)
221
+ };
222
+ c.set(n.info.id, n);
223
+ let i = n.info.id, a = () => {
224
+ if (!n) return;
225
+ let e = n;
226
+ if (n = void 0, c.delete(i), f.delete(a), !p) {
227
+ for (let t = l.length - 1; t >= 0; t--) l[t].font === e && C(l.splice(t, 1)[0], void 0, new r("face-unavailable"));
228
+ h?.font === e ? C(h, void 0, new r("face-unavailable")) : h &&= (l.unshift(h), void 0), S(), E();
229
+ }
230
+ };
231
+ f.add(a);
232
+ let s = () => {
233
+ if (!n || p) throw new r("provider-disposed");
234
+ return n;
235
+ };
236
+ return {
237
+ async shape(e, t) {
238
+ let n = s(), r = {
239
+ purpose: t.purpose,
240
+ script: t.script,
241
+ direction: t.direction,
242
+ language: t.language
243
+ };
244
+ return o(await D(n, {
245
+ operation: "shape",
246
+ text: e,
247
+ options: r
248
+ }, t.signal), n.info, e, t);
249
+ },
250
+ async outline(e, t) {
251
+ return await D(s(), {
252
+ operation: "outline",
253
+ glyphId: e,
254
+ purpose: t.purpose
255
+ }, t.signal);
256
+ },
257
+ dispose: a
258
+ };
259
+ },
260
+ state() {
261
+ return {
262
+ disposed: p,
263
+ retainedFontBytes: [...c.values()].reduce((e, t) => e + t.bytes.length, 0),
264
+ pendingRequests: l.length + +!!h,
265
+ pendingBytes: v,
266
+ workerActive: !!m
267
+ };
268
+ },
269
+ dispose() {
270
+ if (!p) {
271
+ p = !0, S(), h && C(h, void 0, new r("provider-disposed"));
272
+ for (let e of l.splice(0)) C(e, void 0, new r("provider-disposed"));
273
+ for (let e of [...f]) e();
274
+ c.clear(), d.clear();
275
+ }
276
+ }
277
+ };
211
278
  }
212
- export {
213
- D as createWorkerFontShaper,
214
- z as serveFontWorker
215
- };
279
+ export { s as createWorkerFontShaper, a as serveFontWorker };