@docmentis/udoc-server 0.0.0-stage → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +41 -2
  4. package/config.example.toml +26 -0
  5. package/dist/collaboration.d.ts +25 -0
  6. package/dist/collaboration.d.ts.map +1 -0
  7. package/dist/collaboration.js +348 -0
  8. package/dist/collaboration.js.map +1 -0
  9. package/dist/config.d.ts +30 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +87 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/document.d.ts +29 -0
  14. package/dist/document.d.ts.map +1 -0
  15. package/dist/document.js +308 -0
  16. package/dist/document.js.map +1 -0
  17. package/dist/http.d.ts +44 -0
  18. package/dist/http.d.ts.map +1 -0
  19. package/dist/http.js +96 -0
  20. package/dist/http.js.map +1 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/main.d.ts +3 -0
  26. package/dist/main.d.ts.map +1 -0
  27. package/dist/main.js +105 -0
  28. package/dist/main.js.map +1 -0
  29. package/dist/package.d.ts +5 -0
  30. package/dist/package.d.ts.map +1 -0
  31. package/dist/package.js +116 -0
  32. package/dist/package.js.map +1 -0
  33. package/dist/route.d.ts +56 -0
  34. package/dist/route.d.ts.map +1 -0
  35. package/dist/route.js +126 -0
  36. package/dist/route.js.map +1 -0
  37. package/dist/server.d.ts +45 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +103 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/session-pool.d.ts +19 -0
  42. package/dist/session-pool.d.ts.map +1 -0
  43. package/dist/session-pool.js +95 -0
  44. package/dist/session-pool.js.map +1 -0
  45. package/dist/store.d.ts +115 -0
  46. package/dist/store.d.ts.map +1 -0
  47. package/dist/store.js +441 -0
  48. package/dist/store.js.map +1 -0
  49. package/dist/version.d.ts +2 -0
  50. package/dist/version.d.ts.map +1 -0
  51. package/dist/version.js +10 -0
  52. package/dist/version.js.map +1 -0
  53. package/package.json +76 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration.js","sourceRoot":"","sources":["../src/collaboration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** What `udoc-server` runs with. */
2
+ export interface Settings {
3
+ port: number;
4
+ host: string;
5
+ /** Absolute. */
6
+ dataDir: string;
7
+ /** In seconds. */
8
+ sessionTimeout: number;
9
+ sessionPool: number;
10
+ }
11
+ /** A setting's name: its flag's, without the dashes, and its key in a config file. */
12
+ export type SettingName = "port" | "host" | "data-dir" | "session-timeout" | "session-pool";
13
+ /** The settings as given — a flag's text, a config file's value — before they are checked. */
14
+ export type GivenSettings = Partial<Record<SettingName, unknown>>;
15
+ /** Every setting's name. */
16
+ export declare const SETTING_NAMES: SettingName[];
17
+ /**
18
+ * The settings a TOML config file at `path` gives. Its `data-dir` resolves
19
+ * against the file's own directory, so a file and the data it names can move
20
+ * together.
21
+ */
22
+ export declare function readConfigFile(path: string): Promise<GivenSettings>;
23
+ /**
24
+ * The settings to run with: each from `flags` when given there, else from
25
+ * `file` (read from `filePath`), else its default. Flags are text, as the
26
+ * command line gives them; a config file's values are already typed, so a
27
+ * number written as a string is refused there.
28
+ */
29
+ export declare function settingsOf(flags: Partial<Record<SettingName, string>>, file?: GivenSettings, filePath?: string): Settings;
30
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA,oCAAoC;AACpC,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,sFAAsF;AACtF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAE5F,8FAA8F;AAC9F,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAUlE,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAA4B,WAAW,EAAE,CAAC;AAIpE;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAezE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACtB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAC3C,IAAI,GAAE,aAAkB,EACxB,QAAQ,SAAoB,GAC7B,QAAQ,CAcV"}
package/dist/config.js ADDED
@@ -0,0 +1,87 @@
1
+ // The settings `udoc-server` runs with: its flags, over an optional TOML
2
+ // config file, over the defaults.
3
+ //
4
+ // A config file's keys are the flags' names, in the flags' units, so there is
5
+ // one vocabulary for both: `session-timeout = 300` is `--session-timeout 300`.
6
+ // A key the file shouldn't have, or a value of the wrong type or out of range,
7
+ // is an error naming the file and the key — a typo never silently falls back
8
+ // to a default. The license stays in the environment, never in the file.
9
+ import { readFile } from "node:fs/promises";
10
+ import { dirname, resolve } from "node:path";
11
+ import { parse } from "smol-toml";
12
+ const DEFAULTS = {
13
+ port: 8080,
14
+ host: "127.0.0.1",
15
+ "data-dir": "udoc-data",
16
+ "session-timeout": 300,
17
+ "session-pool": 32,
18
+ };
19
+ /** Every setting's name. */
20
+ export const SETTING_NAMES = Object.keys(DEFAULTS);
21
+ const NAMES = new Set(SETTING_NAMES);
22
+ /**
23
+ * The settings a TOML config file at `path` gives. Its `data-dir` resolves
24
+ * against the file's own directory, so a file and the data it names can move
25
+ * together.
26
+ */
27
+ export async function readConfigFile(path) {
28
+ let table;
29
+ try {
30
+ table = parse(await readFile(path, "utf8"));
31
+ }
32
+ catch (error) {
33
+ throw new Error(`${path}: ${error instanceof Error ? error.message : String(error)}`);
34
+ }
35
+ for (const key of Object.keys(table)) {
36
+ if (!NAMES.has(key)) {
37
+ throw new Error(`${path}: unknown setting ${JSON.stringify(key)} (known: ${[...NAMES].join(", ")})`);
38
+ }
39
+ }
40
+ const given = table;
41
+ const dataDir = given["data-dir"];
42
+ return typeof dataDir === "string" ? { ...given, "data-dir": resolve(dirname(path), dataDir) } : given;
43
+ }
44
+ /**
45
+ * The settings to run with: each from `flags` when given there, else from
46
+ * `file` (read from `filePath`), else its default. Flags are text, as the
47
+ * command line gives them; a config file's values are already typed, so a
48
+ * number written as a string is refused there.
49
+ */
50
+ export function settingsOf(flags, file = {}, filePath = "the config file") {
51
+ const pick = (name) => {
52
+ const flag = flags[name];
53
+ if (flag !== undefined)
54
+ return [`--${name}`, numeric(name) ? numberOrText(flag) : flag];
55
+ if (file[name] !== undefined)
56
+ return [`${filePath}: ${name}`, file[name]];
57
+ return [`--${name}`, DEFAULTS[name]];
58
+ };
59
+ return {
60
+ port: wholeNumber(...pick("port"), 0, 65535),
61
+ host: text(...pick("host")),
62
+ dataDir: resolve(text(...pick("data-dir"))),
63
+ sessionTimeout: wholeNumber(...pick("session-timeout"), 1),
64
+ sessionPool: wholeNumber(...pick("session-pool"), 1),
65
+ };
66
+ }
67
+ function numeric(name) {
68
+ return typeof DEFAULTS[name] === "number";
69
+ }
70
+ /** A flag's text as the number it spells, or as itself when it spells none. */
71
+ function numberOrText(flag) {
72
+ return flag.trim() !== "" && Number.isFinite(Number(flag)) ? Number(flag) : flag;
73
+ }
74
+ function wholeNumber(where, value, min, max) {
75
+ if (typeof value !== "number" || !Number.isInteger(value) || value < min || (max !== undefined && value > max)) {
76
+ const range = max === undefined ? `of at least ${min}` : `from ${min} to ${max}`;
77
+ throw new Error(`${where} takes a whole number ${range}, got ${JSON.stringify(value)}`);
78
+ }
79
+ return value;
80
+ }
81
+ function text(where, value) {
82
+ if (typeof value !== "string" || value === "") {
83
+ throw new Error(`${where} takes a non-empty string, got ${JSON.stringify(value)}`);
84
+ }
85
+ return value;
86
+ }
87
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { UDocNode } from "@docmentis/udoc-node";
2
+ import type { Collaborations } from "./collaboration.ts";
3
+ import { HttpFailure } from "./http.ts";
4
+ import type { Route } from "./route.ts";
5
+ import type { SessionPool } from "./session-pool.ts";
6
+ import type { DocumentStore } from "./store.ts";
7
+ export interface DocumentRoutesOptions {
8
+ /** Opens each upload. */
9
+ udoc: Pick<UDocNode, "open">;
10
+ /** Where each document is kept. */
11
+ store: DocumentStore;
12
+ /** The sessions open over what is kept. */
13
+ sessions: SessionPool;
14
+ /** The clients editing each document together. */
15
+ collaborations: Collaborations;
16
+ /** The largest document accepted, in bytes. */
17
+ maxUploadBytes: number;
18
+ }
19
+ /**
20
+ * The document routes. A failure answers `{ error, message }`, where `error`
21
+ * is a code: a license refusal's own type (`invalidLicense`, `permitRefused`,
22
+ * `cannotVerify`), `unreadableDocument`, `passwordRequired`,
23
+ * `incorrectPassword`, `cannotImportPackage`, `pageNotFound`, `cannotSave`,
24
+ * `upgradeRequired`, `notFound`, `badRequest`, `methodNotAllowed`,
25
+ * `payloadTooLarge` or `internal`.
26
+ */
27
+ export declare function documentRoutes({ udoc, store, sessions, collaborations, maxUploadBytes, }: DocumentRoutesOptions): Route[];
28
+ export declare function noDocument(id: string): HttpFailure;
29
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAA4B,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAE5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAA+C,MAAM,WAAW,CAAC;AAIrF,OAAO,KAAK,EAAU,KAAK,EAAgB,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IAClC,yBAAyB;IACzB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7B,mCAAmC;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,EAAE,WAAW,CAAC;IACtB,kDAAkD;IAClD,cAAc,EAAE,cAAc,CAAC;IAC/B,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;CAC1B;AAWD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAC3B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,cAAc,EACd,cAAc,GACjB,EAAE,qBAAqB,GAAG,KAAK,EAAE,CA2MjC;AAYD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAElD"}
@@ -0,0 +1,308 @@
1
+ // The document routes: a document imported once and kept, then served from
2
+ // what is kept — its original and its package read from the store, its pages
3
+ // and its copies from a session over it — edited together, checkpointed, and
4
+ // forgotten.
5
+ import { randomUUID } from "node:crypto";
6
+ import { UDocError, isFileFormat } from "@docmentis/udoc-node";
7
+ import { HttpFailure, bytes, failureOf, json, noContent, notFound } from "./http.js";
8
+ import { readPackage } from "./package.js";
9
+ import { route } from "./route.js";
10
+ /** The ids this server mints — `randomUUID`'s. Nothing else names a document. */
11
+ const DOCUMENT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
12
+ /** The header an upload's password is sent in. */
13
+ const PASSWORD_HEADER = "X-UDoc-Password";
14
+ /** The strategies a copy saves by (docs/design/core-save.md). */
15
+ const SAVE_STRATEGIES = ["rewrite", "delta", "incremental"];
16
+ /**
17
+ * The document routes. A failure answers `{ error, message }`, where `error`
18
+ * is a code: a license refusal's own type (`invalidLicense`, `permitRefused`,
19
+ * `cannotVerify`), `unreadableDocument`, `passwordRequired`,
20
+ * `incorrectPassword`, `cannotImportPackage`, `pageNotFound`, `cannotSave`,
21
+ * `upgradeRequired`, `notFound`, `badRequest`, `methodNotAllowed`,
22
+ * `payloadTooLarge` or `internal`.
23
+ */
24
+ export function documentRoutes({ udoc, store, sessions, collaborations, maxUploadBytes, }) {
25
+ /** The checkpoint each document is writing now, which its next one waits for, to take the version after. */
26
+ const checkpointing = new Map();
27
+ return [
28
+ route("POST", "/documents", importDocument),
29
+ route("DELETE", "/documents/:id", deleteDocument),
30
+ route("GET", "/documents/:id/original", original),
31
+ route("GET", "/documents/:id/layout/page-count", pageCount),
32
+ route("GET", "/documents/:id/layout/pages/:index.png", page, { params: { index: /\d+/ } }),
33
+ route("GET", "/documents/:id/file.:format", file, { params: { format: /\w+/ } }),
34
+ route("POST", "/documents/:id/checkpoints", checkpoint),
35
+ route("GET", "/documents/:id/package", packageResource),
36
+ route("GET", "/documents/:id/package/*route", packageResource),
37
+ route("GET", "/documents/:id/collaboration", upgradeRequired, { upgrade: collaboration }),
38
+ ];
39
+ /**
40
+ * The body is a document's bytes: import it and keep it; `201 { id }`.
41
+ * `?format=` (`pdf`, `pptx`, …) is for bytes detection gets wrong; absent,
42
+ * the format is detected. `?delimiter=` is the character a CSV's fields
43
+ * are split by; absent, a comma, or a semicolon where the first record is
44
+ * split by more of them. A udoc package is refused: it is a document
45
+ * already imported, not one to import. A PDF encrypted with a user password
46
+ * opens with the one sent in `X-UDoc-Password`, percent-encoded
47
+ * (`encodeURIComponent`), its user or its owner password. It is asked for
48
+ * here alone: the package the document is kept as reopens without it, and
49
+ * the password itself is not kept.
50
+ */
51
+ async function importDocument({ query, incoming }) {
52
+ const format = openFormatOf(query.get("format"));
53
+ const delimiter = query.get("delimiter") ?? undefined;
54
+ const password = passwordOf(incoming);
55
+ const uploaded = await readBody(incoming, maxUploadBytes);
56
+ const session = await openUpload(uploaded, format, delimiter, password);
57
+ const created = randomUUID();
58
+ try {
59
+ await store.put(created, await keptDocumentOf(session, uploaded));
60
+ }
61
+ finally {
62
+ // Opened from the upload's bytes, it could load no opaque part an
63
+ // edit adds to the document, so a session over what is kept is
64
+ // opened when a request needs one (docs/design/core-editor-opaque-part.md).
65
+ await session.close();
66
+ }
67
+ return json(201, { id: created });
68
+ }
69
+ /** Close the document and forget it; `204`. */
70
+ async function deleteDocument({ params }) {
71
+ const id = documentId(params);
72
+ // Forgotten before its session closes, so no request in between
73
+ // can reopen what is being deleted.
74
+ const kept = await store.delete(id);
75
+ collaborations.end(id);
76
+ await sessions.close(id);
77
+ if (!kept)
78
+ throw noDocument(id);
79
+ return noContent();
80
+ }
81
+ /** The upload, byte for byte. Read from the store; no session is opened. */
82
+ async function original({ params }) {
83
+ const id = documentId(params);
84
+ const original = await store.getOriginal(id);
85
+ if (!original)
86
+ throw noDocument(id);
87
+ return bytes(original.bytes, "application/octet-stream");
88
+ }
89
+ /**
90
+ * `{ pageCount }`. Its own resource because it can be costly: the first ask
91
+ * composes the whole document, since a page is known only once composed.
92
+ */
93
+ async function pageCount({ params }) {
94
+ const pageCount = await sessions.use(documentId(params), (session) => session.pageCount());
95
+ return json(200, { pageCount });
96
+ }
97
+ /**
98
+ * Composed page `index`, counting from 0, as a PNG. `?scale=` is output
99
+ * pixels per point, `1` if absent.
100
+ */
101
+ async function page({ params, query }) {
102
+ const id = documentId(params);
103
+ const index = Number(params.index);
104
+ const scale = scaleOf(query.get("scale"));
105
+ const png = await sessions.use(id, (session) => session.exportPageToBytes(index, { png: { scale } }).catch((error) => {
106
+ // The path only matches digits and the scale is checked above,
107
+ // so `notFound` here means there is no such page — whose
108
+ // address is ours to word.
109
+ throw error instanceof UDocError && error.code === "notFound"
110
+ ? new UDocError("notFound", `page index ${index} is out of range: ${error.message}`)
111
+ : error;
112
+ }));
113
+ return bytes(png, "image/png");
114
+ }
115
+ /**
116
+ * A copy of the document, saved faithfully in its session: as `format`,
117
+ * one of its doc type's own (`pdf`, `pptx`, …), by `?strategy=` —
118
+ * `rewrite`, `delta` or `incremental` (docs/design/core-save.md), if
119
+ * absent the engine's for `format` — or as a udoc package for `udoc`,
120
+ * which takes no strategy. A CSV's
121
+ * fields are split by `?delimiter=`, or the one it was imported with, else
122
+ * a comma. Nothing of it is kept.
123
+ */
124
+ async function file({ params, query }) {
125
+ const id = documentId(params);
126
+ const format = params.format;
127
+ if (format !== "udoc" && !isFileFormat(format))
128
+ throw notFound();
129
+ const strategy = strategyOf(format, query.get("strategy"));
130
+ const delimiter = query.get("delimiter") ?? undefined;
131
+ if (format === "udoc" && delimiter !== undefined) {
132
+ throw new HttpFailure(400, "invalidRequest", "a udoc copy is a package, split by no delimiter");
133
+ }
134
+ const saved = await sessions.use(id, (session) => format === "udoc" ? session.saveToPackage() : session.saveToBytes(format, strategy, delimiter));
135
+ return bytes(saved, "application/octet-stream");
136
+ }
137
+ /**
138
+ * Checkpoint the document once the checkpoint it is writing, if any, is
139
+ * done: its session saved as baseline `v<version>`, one past the latest,
140
+ * kept beside the earlier ones, from then on the package's;
141
+ * `201 { version }`.
142
+ */
143
+ async function checkpoint({ params }) {
144
+ const id = documentId(params);
145
+ const next = (checkpointing.get(id) ?? Promise.resolve(0))
146
+ .catch(() => 0)
147
+ .then(async () => {
148
+ const description = await store.getDescription(id);
149
+ if (!description)
150
+ throw noDocument(id);
151
+ const version = description.baselineVersion + 1;
152
+ const saved = await sessions.use(id, (session) => session.saveToPackage(version));
153
+ await store.putCheckpoint(id, version, saved);
154
+ return version;
155
+ });
156
+ checkpointing.set(id, next);
157
+ const forget = () => {
158
+ if (checkpointing.get(id) === next)
159
+ checkpointing.delete(id);
160
+ };
161
+ next.then(forget, forget);
162
+ return json(201, { version: await next });
163
+ }
164
+ /**
165
+ * The package: the latest checkpoint, with the edit log and the opaque
166
+ * parts edits brought on top — its description, or one resource under it
167
+ * (see `package.ts`).
168
+ */
169
+ function packageResource({ params, query }) {
170
+ return readPackage(store, documentId(params), params.route ?? "", query);
171
+ }
172
+ /** A collaboration is a WebSocket: without the upgrade, `426`. */
173
+ async function upgradeRequired({ params }) {
174
+ documentId(params);
175
+ throw new HttpFailure(426, "upgradeRequired", "a collaboration is a WebSocket; ask for the upgrade");
176
+ }
177
+ /**
178
+ * Edit the document together with every other client connected to it
179
+ * (docs/design/node-collaboration.md). An id this server didn't mint is
180
+ * refused as every refusal of a collaboration is: the upgrade taken, and
181
+ * closed with a code.
182
+ */
183
+ async function collaboration({ params }, upgrade) {
184
+ const id = params.id;
185
+ if (!DOCUMENT_ID.test(id)) {
186
+ collaborations.refuse(upgrade, noDocument(id));
187
+ return;
188
+ }
189
+ await collaborations.join(id, upgrade);
190
+ }
191
+ /**
192
+ * Open an upload — the one open that mints the document's ids — a CSV split
193
+ * by `delimiter` if one is given, unlocked with `password` if it needs one.
194
+ */
195
+ async function openUpload(uploaded, format, delimiter, password) {
196
+ const session = await udoc.open(uploaded, format, delimiter);
197
+ // A package's ids were minted by whatever imported it, and it has no
198
+ // original to keep: it is a document already imported, not one to import.
199
+ if (session.fromPackage) {
200
+ await session.close();
201
+ throw new HttpFailure(422, "cannotImportPackage", "a udoc package is not a document to import");
202
+ }
203
+ if (session.needsPassword) {
204
+ const refusal = await unlock(session, password);
205
+ if (refusal) {
206
+ await session.close();
207
+ throw refusal;
208
+ }
209
+ }
210
+ return session;
211
+ }
212
+ }
213
+ /**
214
+ * The document `params` names. Checked before anything reaches the store,
215
+ * where an id becomes a file name: a string this server did not mint names no
216
+ * document.
217
+ */
218
+ function documentId({ id }) {
219
+ if (!DOCUMENT_ID.test(id))
220
+ throw noDocument(id);
221
+ return id;
222
+ }
223
+ export function noDocument(id) {
224
+ return new HttpFailure(404, "notFound", `no document ${JSON.stringify(id)}`);
225
+ }
226
+ /**
227
+ * What is kept of `session`'s document, just imported from `uploaded`: the
228
+ * upload itself, and its first checkpoint, `v0`, a flat baseline.
229
+ */
230
+ async function keptDocumentOf(session, uploaded) {
231
+ // Imported from a file, not opened from a package, so the format is known.
232
+ const original = { bytes: uploaded, format: session.sourceFormat };
233
+ return { original, checkpoint: await session.saveToPackage() };
234
+ }
235
+ /** Why `session`, an upload that needs a password, doesn't open with `password`; null once it does. */
236
+ async function unlock(session, password) {
237
+ if (password === undefined) {
238
+ return new HttpFailure(422, "passwordRequired", `the document needs a password: send it in ${PASSWORD_HEADER}`);
239
+ }
240
+ try {
241
+ if (await session.authenticate(password))
242
+ return null;
243
+ return new HttpFailure(422, "incorrectPassword", "the password sent doesn't open the document");
244
+ }
245
+ catch (error) {
246
+ return failureOf(error);
247
+ }
248
+ }
249
+ /** The strategy a copy as `format` saves by: the one `value` names, else none, for the engine's; none for a udoc copy. */
250
+ function strategyOf(format, value) {
251
+ if (value === null)
252
+ return undefined;
253
+ if (format === "udoc") {
254
+ throw new HttpFailure(400, "invalidRequest", "a udoc copy is a package, saved by no strategy");
255
+ }
256
+ const strategy = SAVE_STRATEGIES.find((known) => known === value);
257
+ if (strategy === undefined) {
258
+ throw new HttpFailure(400, "invalidRequest", `strategy must be one of ${SAVE_STRATEGIES.join(", ")}, got ${JSON.stringify(value)}`);
259
+ }
260
+ return strategy;
261
+ }
262
+ function openFormatOf(value) {
263
+ if (value === null)
264
+ return undefined;
265
+ if (!isFileFormat(value)) {
266
+ throw new HttpFailure(400, "invalidRequest", `format must be a file format's name, got ${JSON.stringify(value)}`);
267
+ }
268
+ return value;
269
+ }
270
+ /**
271
+ * The password `request` sends for its upload, if any. A header carries only
272
+ * Latin-1, and a PDF password may be any Unicode, so it travels percent-encoded.
273
+ */
274
+ function passwordOf(request) {
275
+ const header = request.headers[PASSWORD_HEADER.toLowerCase()];
276
+ if (typeof header !== "string")
277
+ return undefined;
278
+ try {
279
+ return decodeURIComponent(header);
280
+ }
281
+ catch {
282
+ throw new HttpFailure(400, "invalidRequest", `${PASSWORD_HEADER} must be percent-encoded UTF-8`);
283
+ }
284
+ }
285
+ function scaleOf(value) {
286
+ if (value === null)
287
+ return 1;
288
+ const scale = Number(value);
289
+ if (!Number.isFinite(scale) || scale <= 0) {
290
+ throw new HttpFailure(400, "invalidRequest", `scale must be a positive number, got ${JSON.stringify(value)}`);
291
+ }
292
+ return scale;
293
+ }
294
+ async function readBody(request, limit) {
295
+ const tooLarge = () => new HttpFailure(413, "payloadTooLarge", `a document may be at most ${limit} bytes`);
296
+ if (Number(request.headers["content-length"]) > limit)
297
+ throw tooLarge();
298
+ const chunks = [];
299
+ let size = 0;
300
+ for await (const chunk of request) {
301
+ size += chunk.byteLength;
302
+ if (size > limit)
303
+ throw tooLarge();
304
+ chunks.push(chunk);
305
+ }
306
+ return Buffer.concat(chunks);
307
+ }
308
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import type { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from "node:http";
2
+ import type { Duplex } from "node:stream";
3
+ /**
4
+ * A request answered with a failure: its status, and a code to branch on —
5
+ * the engine's (docs/design/errors.md), or one only HTTP knows:
6
+ * `methodNotAllowed`, `payloadTooLarge`, `upgradeRequired`,
7
+ * `incorrectPassword`, `cannotImportPackage`.
8
+ */
9
+ export declare class HttpFailure extends Error {
10
+ readonly status: number;
11
+ readonly code: string;
12
+ constructor(status: number, code: string, message: string, options?: ErrorOptions);
13
+ }
14
+ /** What a route answers: its status, its headers, and its body. */
15
+ export interface Reply {
16
+ status: number;
17
+ headers: OutgoingHttpHeaders;
18
+ body: Uint8Array;
19
+ }
20
+ /** A WebSocket upgrade: its request, its socket, and what was read past the request's head. */
21
+ export interface Upgrade {
22
+ request: IncomingMessage;
23
+ socket: Duplex;
24
+ head: Buffer;
25
+ }
26
+ /** `value` as JSON, written by `replacer` when it is given. */
27
+ export declare function json(status: number, value: unknown, replacer?: (key: string, value: unknown) => unknown): Reply;
28
+ /** `body`, of media type `type`, as a 200 — with `headers` beside. */
29
+ export declare function bytes(body: Uint8Array, type: string, headers?: OutgoingHttpHeaders): Reply;
30
+ /** A 204: done, and nothing to send. */
31
+ export declare function noContent(): Reply;
32
+ /** Write `reply` as `response`. */
33
+ export declare function writeReply(response: ServerResponse, { status, headers, body }: Reply): void;
34
+ /** `failure` as the JSON every failure answers: `{ error, message }`, `error` its code. */
35
+ export declare function failureReply(failure: HttpFailure): Reply;
36
+ /** Answer an upgrade the server won't take as a request would be answered, and hang up. */
37
+ export declare function refuseUpgrade(socket: Duplex, failure: HttpFailure): void;
38
+ export declare function notFound(message?: string): HttpFailure;
39
+ /** The codes a license refuses under: starting a session, or a call it isn't entitled to. */
40
+ export declare const LICENSE_CODES: ReadonlySet<string>;
41
+ /** `error`, whatever a route threw, as the failure it answers with: its own, or the engine's code at its status. */
42
+ export declare function failureOf(error: unknown): HttpFailure;
43
+ export declare function messageOf(error: unknown): string;
44
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKpF;AAED,mEAAmE;AACnE,MAAM,WAAW,KAAK;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,EAAE,UAAU,CAAC;CACpB;AAED,+FAA+F;AAC/F,MAAM,WAAW,OAAO;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,KAAK,CAM/G;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,KAAK,CAE9F;AAED,wCAAwC;AACxC,wBAAgB,SAAS,IAAI,KAAK,CAEjC;AAED,mCAAmC;AACnC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,GAAG,IAAI,CAQ3F;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAExD;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CASxE;AAED,wBAAgB,QAAQ,CAAC,OAAO,SAAqB,GAAG,WAAW,CAElE;AAmBD,6FAA6F;AAC7F,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAK5C,CAAC;AAEH,oHAAoH;AACpH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAIrD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhD"}