@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.
- package/LICENSE-APACHE +202 -0
- package/LICENSE-MIT +21 -0
- package/README.md +41 -2
- package/config.example.toml +26 -0
- package/dist/collaboration.d.ts +25 -0
- package/dist/collaboration.d.ts.map +1 -0
- package/dist/collaboration.js +348 -0
- package/dist/collaboration.js.map +1 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +87 -0
- package/dist/config.js.map +1 -0
- package/dist/document.d.ts +29 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +308 -0
- package/dist/document.js.map +1 -0
- package/dist/http.d.ts +44 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +96 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +105 -0
- package/dist/main.js.map +1 -0
- package/dist/package.d.ts +5 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +116 -0
- package/dist/package.js.map +1 -0
- package/dist/route.d.ts +56 -0
- package/dist/route.d.ts.map +1 -0
- package/dist/route.js +126 -0
- package/dist/route.js.map +1 -0
- package/dist/server.d.ts +45 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +103 -0
- package/dist/server.js.map +1 -0
- package/dist/session-pool.d.ts +19 -0
- package/dist/session-pool.d.ts.map +1 -0
- package/dist/session-pool.js +95 -0
- package/dist/session-pool.js.map +1 -0
- package/dist/store.d.ts +115 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +441 -0
- package/dist/store.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/document.js
ADDED
|
@@ -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"}
|