@opengeni/contracts 0.40.0 → 0.50.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/dist/atlassian.d.ts +278 -0
- package/dist/atlassian.js +57 -0
- package/dist/atlassian.js.map +1 -0
- package/dist/canonical-human-identities.d.ts +157 -0
- package/dist/canonical-human-identities.js +23 -0
- package/dist/canonical-human-identities.js.map +1 -0
- package/dist/{chunk-7JZMI22I.js → chunk-5UDNP7AO.js} +34 -2
- package/dist/chunk-5UDNP7AO.js.map +1 -0
- package/dist/chunk-BVGIYW7D.js +11 -0
- package/dist/chunk-BVGIYW7D.js.map +1 -0
- package/dist/chunk-CADSX6UN.js +1145 -0
- package/dist/chunk-CADSX6UN.js.map +1 -0
- package/dist/chunk-CM6BMECR.js +24 -0
- package/dist/chunk-CM6BMECR.js.map +1 -0
- package/dist/chunk-D2HKF2EF.js +1460 -0
- package/dist/chunk-D2HKF2EF.js.map +1 -0
- package/dist/chunk-JBCIY7QD.js +194 -0
- package/dist/chunk-JBCIY7QD.js.map +1 -0
- package/dist/chunk-JUFK3T4Q.js +80 -0
- package/dist/chunk-JUFK3T4Q.js.map +1 -0
- package/dist/chunk-LSB7GRLG.js +779 -0
- package/dist/chunk-LSB7GRLG.js.map +1 -0
- package/dist/chunk-LW7OH6CS.js +382 -0
- package/dist/chunk-LW7OH6CS.js.map +1 -0
- package/dist/chunk-M5ZGRVIQ.js +719 -0
- package/dist/chunk-M5ZGRVIQ.js.map +1 -0
- package/dist/chunk-MYBZRDTY.js +340 -0
- package/dist/chunk-MYBZRDTY.js.map +1 -0
- package/dist/chunk-Q6A7XT2N.js +16734 -0
- package/dist/chunk-Q6A7XT2N.js.map +1 -0
- package/dist/chunk-RIY7GYQS.js +1204 -0
- package/dist/chunk-RIY7GYQS.js.map +1 -0
- package/dist/chunk-TZ6YEYN4.js +386 -0
- package/dist/chunk-TZ6YEYN4.js.map +1 -0
- package/dist/chunk-Y3MLSLB4.js +392 -0
- package/dist/chunk-Y3MLSLB4.js.map +1 -0
- package/dist/chunk-YRKRZ6OF.js +134 -0
- package/dist/chunk-YRKRZ6OF.js.map +1 -0
- package/dist/codex-provider-account-authority.d.ts +23 -0
- package/dist/codex-provider-account-authority.js +23 -0
- package/dist/codex-provider-account-authority.js.map +1 -0
- package/dist/company-profile.d.ts +629 -0
- package/dist/document-artifact-commands.d.ts +282 -0
- package/dist/document-artifact-commands.js +54 -0
- package/dist/document-artifact-commands.js.map +1 -0
- package/dist/document-artifact-query.d.ts +2 -0
- package/dist/document-artifact-query.js +54 -0
- package/dist/document-artifact-query.js.map +1 -0
- package/dist/editable-artifact-binary.d.ts +56 -0
- package/dist/editable-artifact-causal-frontier.d.ts +12 -0
- package/dist/editable-artifact-causal-frontier.js +18 -0
- package/dist/editable-artifact-causal-frontier.js.map +1 -0
- package/dist/editable-artifact-codec-registry.d.ts +48 -0
- package/dist/editable-artifact-codec-registry.js +20 -0
- package/dist/editable-artifact-codec-registry.js.map +1 -0
- package/dist/editable-artifact-committed-transaction.d.ts +35 -0
- package/dist/editable-artifact-committed-transaction.js +19 -0
- package/dist/editable-artifact-committed-transaction.js.map +1 -0
- package/dist/editable-artifact-live.d.ts +276 -0
- package/dist/editable-artifact-live.js +907 -0
- package/dist/editable-artifact-live.js.map +1 -0
- package/dist/editable-artifact-serialized-commit.d.ts +53 -0
- package/dist/editable-artifact-serialized-commit.js +26 -0
- package/dist/editable-artifact-serialized-commit.js.map +1 -0
- package/dist/editable-artifact-versions.d.ts +6 -0
- package/dist/editable-artifact-versions.js +11 -0
- package/dist/editable-artifact-versions.js.map +1 -0
- package/dist/editable-artifacts.d.ts +46 -0
- package/dist/editable-artifacts.js +236 -0
- package/dist/editable-artifacts.js.map +1 -0
- package/dist/event-preview.d.ts +1 -1
- package/dist/google-drive.d.ts +114 -2
- package/dist/google-drive.js +72 -14
- package/dist/google-drive.js.map +1 -1
- package/dist/image-generation.d.ts +70 -0
- package/dist/index.d.ts +5661 -166
- package/dist/index.js +1438 -21
- package/dist/interaction.d.ts +8290 -0
- package/dist/knowledge.d.ts +543 -0
- package/dist/memory-slack-delivery.d.ts +397 -0
- package/dist/presentation-artifact-commands.d.ts +349 -0
- package/dist/presentation-artifact-commands.js +66 -0
- package/dist/presentation-artifact-commands.js.map +1 -0
- package/dist/presentation-artifact-query.d.ts +2 -0
- package/dist/presentation-artifact-query.js +66 -0
- package/dist/presentation-artifact-query.js.map +1 -0
- package/dist/retained-output.d.ts +24 -0
- package/dist/sandbox-snapshots.d.ts +9 -0
- package/dist/scoped-knowledge.d.ts +14 -13
- package/dist/slack-bot-scopes.d.ts +4 -0
- package/dist/slack-bot-scopes.js +3 -1
- package/dist/slack-task-policy.d.ts +294 -0
- package/dist/spreadsheet-artifact-commands.d.ts +101 -0
- package/dist/spreadsheet-artifact-commands.js +27 -0
- package/dist/spreadsheet-artifact-commands.js.map +1 -0
- package/dist/spreadsheet-artifact-date.d.ts +4 -0
- package/dist/spreadsheet-artifact-query.d.ts +120 -0
- package/dist/spreadsheet-artifact-query.js +48 -0
- package/dist/spreadsheet-artifact-query.js.map +1 -0
- package/dist/task-notes.d.ts +128 -0
- package/dist/tool-catalog.d.ts +576 -0
- package/dist/video-generation.d.ts +580 -0
- package/dist/video-generation.js +59 -0
- package/dist/video-generation.js.map +1 -0
- package/dist/workspace-learning-policy.d.ts +208 -0
- package/dist/xai-provider-account-authority.d.ts +23 -0
- package/dist/xai-provider-account-authority.js +9 -0
- package/dist/xai-provider-account-authority.js.map +1 -0
- package/package.json +73 -1
- package/src/artifacts.ts +1 -1
- package/src/atlassian.ts +160 -0
- package/src/canonical-human-identities.ts +93 -0
- package/src/codex-provider-account-authority.ts +37 -0
- package/src/company-profile.ts +306 -0
- package/src/document-artifact-commands.ts +1709 -0
- package/src/document-artifact-query.ts +2 -0
- package/src/editable-artifact-binary.ts +396 -0
- package/src/editable-artifact-causal-frontier.ts +154 -0
- package/src/editable-artifact-codec-registry.ts +261 -0
- package/src/editable-artifact-committed-transaction.ts +478 -0
- package/src/editable-artifact-live.ts +1379 -0
- package/src/editable-artifact-serialized-commit.ts +494 -0
- package/src/editable-artifact-versions.ts +8 -0
- package/src/editable-artifacts.ts +473 -0
- package/src/google-drive.ts +68 -15
- package/src/image-generation.ts +106 -0
- package/src/index.ts +2920 -326
- package/src/interaction.ts +3173 -0
- package/src/knowledge.ts +207 -0
- package/src/memory-slack-delivery.ts +183 -0
- package/src/presentation-artifact-commands.ts +2035 -0
- package/src/presentation-artifact-query.ts +2 -0
- package/src/retained-output.ts +149 -2
- package/src/sandbox-snapshots.ts +28 -1
- package/src/scoped-knowledge.ts +18 -4
- package/src/slack-bot-scopes.ts +34 -1
- package/src/slack-task-policy.ts +215 -0
- package/src/spreadsheet-artifact-commands.ts +999 -0
- package/src/spreadsheet-artifact-date.ts +21 -0
- package/src/spreadsheet-artifact-query.ts +1411 -0
- package/src/task-notes.ts +92 -0
- package/src/tool-catalog.ts +334 -0
- package/src/video-generation.ts +431 -0
- package/src/workspace-learning-policy.ts +233 -0
- package/src/xai-provider-account-authority.ts +37 -0
- package/dist/chunk-5HR2GPSC.js +0 -11031
- package/dist/chunk-5HR2GPSC.js.map +0 -1
- package/dist/chunk-7JZMI22I.js.map +0 -1
|
@@ -0,0 +1,1204 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ArtifactBinaryReader,
|
|
3
|
+
ArtifactBinaryWriter,
|
|
4
|
+
decodeCountedEnvelope,
|
|
5
|
+
encodeCountedEnvelope,
|
|
6
|
+
equalBytes,
|
|
7
|
+
strictUtf8
|
|
8
|
+
} from "./chunk-MYBZRDTY.js";
|
|
9
|
+
|
|
10
|
+
// src/document-artifact-commands.ts
|
|
11
|
+
var DOCUMENT_ARTIFACT_COMMAND_VERSION = 1;
|
|
12
|
+
var DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES = 4 * 1024 * 1024;
|
|
13
|
+
var DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS = 4096;
|
|
14
|
+
var DOCUMENT_ARTIFACT_COMMAND_MAX_STRING_BYTES = 4 * 1024 * 1024;
|
|
15
|
+
var DOCUMENT_ARTIFACT_MAX_TEXT_UTF16 = 1e7;
|
|
16
|
+
var DOCUMENT_ARTIFACT_MAX_TEXT_RUNS = 25e4;
|
|
17
|
+
var DOCUMENT_ARTIFACT_MAX_TABLE_CELLS = 1e6;
|
|
18
|
+
var DOCUMENT_ARTIFACT_MAX_STRUCTURAL_COUNTER = 2 ** 53 - 2;
|
|
19
|
+
var DOCUMENT_ARTIFACT_QUERY_VERSION = 1;
|
|
20
|
+
var DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION = 1;
|
|
21
|
+
var DOCUMENT_ARTIFACT_QUERY_MAX_BYTES = 256;
|
|
22
|
+
var DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES = 8 * 1024 * 1024;
|
|
23
|
+
var DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS = 4096;
|
|
24
|
+
var DOCUMENT_ARTIFACT_QUERY_MAX_TEXT_UTF16 = 1e6;
|
|
25
|
+
var DOCUMENT_ARTIFACT_QUERY_MAX_TABLE_CELLS = 1e5;
|
|
26
|
+
var MAGIC = "OGADC001";
|
|
27
|
+
var QUERY_MAGIC = "OGADQ001";
|
|
28
|
+
var QUERY_RESPONSE_MAGIC = "OGADP001";
|
|
29
|
+
var QUERY_RESPONSE_EXTENSION_MARKER = 255;
|
|
30
|
+
var PAGE_EXTRAS_EXTENSION_VERSION = 1;
|
|
31
|
+
function encodeDocumentArtifactCommandBatch(input) {
|
|
32
|
+
if (input?.version !== DOCUMENT_ARTIFACT_COMMAND_VERSION || !Array.isArray(input.commands)) {
|
|
33
|
+
throw new TypeError("document command batch is invalid");
|
|
34
|
+
}
|
|
35
|
+
if (input.commands.length > DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS) {
|
|
36
|
+
throw new RangeError("document command count exceeds its limit");
|
|
37
|
+
}
|
|
38
|
+
const payload = new ArtifactBinaryWriter(DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES - 32);
|
|
39
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
40
|
+
for (const command of input.commands) encodeCommand(payload, command, state);
|
|
41
|
+
return encodeCountedEnvelope(
|
|
42
|
+
MAGIC,
|
|
43
|
+
DOCUMENT_ARTIFACT_COMMAND_VERSION,
|
|
44
|
+
input.commands.length,
|
|
45
|
+
payload.finish(),
|
|
46
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
function decodeDocumentArtifactCommandBatch(bytes) {
|
|
50
|
+
const { count, payload } = decodeCountedEnvelope(
|
|
51
|
+
bytes,
|
|
52
|
+
MAGIC,
|
|
53
|
+
DOCUMENT_ARTIFACT_COMMAND_VERSION,
|
|
54
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES,
|
|
55
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS
|
|
56
|
+
);
|
|
57
|
+
const reader = new ArtifactBinaryReader(payload);
|
|
58
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
59
|
+
const commands = [];
|
|
60
|
+
for (let index = 0; index < count; index += 1) commands.push(decodeCommand(reader, state));
|
|
61
|
+
reader.done("document command payload contains trailing bytes");
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
version: DOCUMENT_ARTIFACT_COMMAND_VERSION,
|
|
64
|
+
commands: Object.freeze(commands)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function assertCanonicalDocumentArtifactCommandBytes(bytes) {
|
|
68
|
+
if (!equalBytes(
|
|
69
|
+
bytes,
|
|
70
|
+
encodeDocumentArtifactCommandBatch(decodeDocumentArtifactCommandBatch(bytes))
|
|
71
|
+
)) {
|
|
72
|
+
throw new TypeError("document command batch is not canonically encoded");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function encodeCommand(writer, command, state) {
|
|
76
|
+
switch (command.kind) {
|
|
77
|
+
case "document.flags.set":
|
|
78
|
+
writer.u8(0);
|
|
79
|
+
writePatchBool(writer, command.evenAndOddHeaders);
|
|
80
|
+
writePatchBool(writer, command.trackRevisions);
|
|
81
|
+
return;
|
|
82
|
+
case "paragraph.add":
|
|
83
|
+
writer.u8(1);
|
|
84
|
+
writeTarget(writer, command.target);
|
|
85
|
+
writeDocumentId(writer, command.id, "paragraph");
|
|
86
|
+
writeRuns(writer, command.runs, state);
|
|
87
|
+
writeParagraphStyle(writer, command.style);
|
|
88
|
+
return;
|
|
89
|
+
case "paragraph.edit":
|
|
90
|
+
writer.u8(2);
|
|
91
|
+
writeDocumentId(writer, command.id, "paragraph");
|
|
92
|
+
writeRange(writer, command.range);
|
|
93
|
+
writeDocumentString(writer, command.replacement, state, true);
|
|
94
|
+
writer.bool(command.style !== null);
|
|
95
|
+
if (command.style !== null) writeTextStyle(writer, command.style);
|
|
96
|
+
return;
|
|
97
|
+
case "paragraph.format":
|
|
98
|
+
writer.u8(3);
|
|
99
|
+
writeDocumentId(writer, command.id, "paragraph");
|
|
100
|
+
writeRange(writer, command.range);
|
|
101
|
+
writeTextStylePatch(writer, command.style);
|
|
102
|
+
return;
|
|
103
|
+
case "paragraph.style.set":
|
|
104
|
+
writer.u8(4);
|
|
105
|
+
writeDocumentId(writer, command.id, "paragraph");
|
|
106
|
+
writeParagraphStyle(writer, command.style);
|
|
107
|
+
return;
|
|
108
|
+
case "table.add":
|
|
109
|
+
writer.u8(5);
|
|
110
|
+
writeTarget(writer, command.target);
|
|
111
|
+
writeDocumentId(writer, command.id, "table");
|
|
112
|
+
writeTableRows(writer, command.rows, state);
|
|
113
|
+
writeTableStyle(writer, command.style);
|
|
114
|
+
return;
|
|
115
|
+
case "table.style.set":
|
|
116
|
+
writer.u8(6);
|
|
117
|
+
writeDocumentId(writer, command.id, "table");
|
|
118
|
+
writeTableStyle(writer, command.style);
|
|
119
|
+
return;
|
|
120
|
+
case "page-break.add":
|
|
121
|
+
writer.u8(7);
|
|
122
|
+
writeDocumentId(writer, command.id, "page-break");
|
|
123
|
+
return;
|
|
124
|
+
case "section.add": {
|
|
125
|
+
assertDefaultPageExtras(command.page);
|
|
126
|
+
writer.u8(8);
|
|
127
|
+
const ordered = [
|
|
128
|
+
[command.ids.section, "section"],
|
|
129
|
+
[command.ids.headerDefault, "header"],
|
|
130
|
+
[command.ids.headerFirst, "header"],
|
|
131
|
+
[command.ids.headerEven, "header"],
|
|
132
|
+
[command.ids.footerDefault, "footer"],
|
|
133
|
+
[command.ids.footerFirst, "footer"],
|
|
134
|
+
[command.ids.footerEven, "footer"]
|
|
135
|
+
];
|
|
136
|
+
for (const [id, kind] of ordered) writeDocumentId(writer, id, kind);
|
|
137
|
+
writePage(writer, command.page);
|
|
138
|
+
writeOptionalBool(writer, command.titlePage);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
case "section.title-page.set":
|
|
142
|
+
writer.u8(9);
|
|
143
|
+
writeDocumentId(writer, command.id, "section");
|
|
144
|
+
writeOptionalBool(writer, command.titlePage);
|
|
145
|
+
return;
|
|
146
|
+
case "comment.add":
|
|
147
|
+
writer.u8(10);
|
|
148
|
+
writeDocumentId(writer, command.id, "comment");
|
|
149
|
+
writeDocumentId(writer, command.paragraphId, "paragraph");
|
|
150
|
+
writeRange(writer, command.range);
|
|
151
|
+
writer.bool(command.resolved);
|
|
152
|
+
writeCommentReply(writer, command.root, state);
|
|
153
|
+
return;
|
|
154
|
+
case "comment.reply.add":
|
|
155
|
+
writer.u8(11);
|
|
156
|
+
writeDocumentId(writer, command.id, "comment");
|
|
157
|
+
writeCommentReply(writer, command.reply, state);
|
|
158
|
+
return;
|
|
159
|
+
case "comment.resolved.set":
|
|
160
|
+
writer.u8(12);
|
|
161
|
+
writeDocumentId(writer, command.id, "comment");
|
|
162
|
+
writer.bool(command.resolved);
|
|
163
|
+
return;
|
|
164
|
+
case "tracked-change.add":
|
|
165
|
+
writer.u8(13);
|
|
166
|
+
writeDocumentId(writer, command.id, "tracked-change");
|
|
167
|
+
writeDocumentId(writer, command.paragraphId, "paragraph");
|
|
168
|
+
writeRange(writer, command.range);
|
|
169
|
+
writer.u8(
|
|
170
|
+
command.changeKind === "insert" ? 1 : command.changeKind === "delete" ? 2 : invalidTag("tracked change kind")
|
|
171
|
+
);
|
|
172
|
+
writeDocumentString(writer, command.author, state, false);
|
|
173
|
+
writeDocumentString(writer, command.createdAt, state, false);
|
|
174
|
+
return;
|
|
175
|
+
case "section.page.set":
|
|
176
|
+
writer.u8(14);
|
|
177
|
+
writeDocumentId(writer, command.id, "section");
|
|
178
|
+
writePageWithExtras(writer, command.page);
|
|
179
|
+
return;
|
|
180
|
+
default:
|
|
181
|
+
throw new TypeError("invalid document command kind");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function decodeCommand(reader, state) {
|
|
185
|
+
switch (reader.u8()) {
|
|
186
|
+
case 0: {
|
|
187
|
+
const evenAndOddHeaders = readPatchBool(reader);
|
|
188
|
+
const trackRevisions = readPatchBool(reader);
|
|
189
|
+
return freezeOptional(
|
|
190
|
+
{ kind: "document.flags.set" },
|
|
191
|
+
{ evenAndOddHeaders, trackRevisions }
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
case 1:
|
|
195
|
+
return Object.freeze({
|
|
196
|
+
kind: "paragraph.add",
|
|
197
|
+
target: readTarget(reader),
|
|
198
|
+
id: readDocumentId(reader, "paragraph"),
|
|
199
|
+
runs: readRuns(reader, state),
|
|
200
|
+
style: readParagraphStyle(reader)
|
|
201
|
+
});
|
|
202
|
+
case 2:
|
|
203
|
+
return Object.freeze({
|
|
204
|
+
kind: "paragraph.edit",
|
|
205
|
+
id: readDocumentId(reader, "paragraph"),
|
|
206
|
+
range: readRange(reader),
|
|
207
|
+
replacement: readDocumentString(reader, state, true),
|
|
208
|
+
style: reader.bool("optional document text style") ? readTextStyle(reader) : null
|
|
209
|
+
});
|
|
210
|
+
case 3:
|
|
211
|
+
return Object.freeze({
|
|
212
|
+
kind: "paragraph.format",
|
|
213
|
+
id: readDocumentId(reader, "paragraph"),
|
|
214
|
+
range: readRange(reader),
|
|
215
|
+
style: readTextStylePatch(reader)
|
|
216
|
+
});
|
|
217
|
+
case 4:
|
|
218
|
+
return Object.freeze({
|
|
219
|
+
kind: "paragraph.style.set",
|
|
220
|
+
id: readDocumentId(reader, "paragraph"),
|
|
221
|
+
style: readParagraphStyle(reader)
|
|
222
|
+
});
|
|
223
|
+
case 5:
|
|
224
|
+
return Object.freeze({
|
|
225
|
+
kind: "table.add",
|
|
226
|
+
target: readTarget(reader),
|
|
227
|
+
id: readDocumentId(reader, "table"),
|
|
228
|
+
rows: readTableRows(reader, state),
|
|
229
|
+
style: readTableStyle(reader)
|
|
230
|
+
});
|
|
231
|
+
case 6:
|
|
232
|
+
return Object.freeze({
|
|
233
|
+
kind: "table.style.set",
|
|
234
|
+
id: readDocumentId(reader, "table"),
|
|
235
|
+
style: readTableStyle(reader)
|
|
236
|
+
});
|
|
237
|
+
case 7:
|
|
238
|
+
return Object.freeze({ kind: "page-break.add", id: readDocumentId(reader, "page-break") });
|
|
239
|
+
case 8:
|
|
240
|
+
return Object.freeze({
|
|
241
|
+
kind: "section.add",
|
|
242
|
+
ids: Object.freeze({
|
|
243
|
+
section: readDocumentId(reader, "section"),
|
|
244
|
+
headerDefault: readDocumentId(reader, "header"),
|
|
245
|
+
headerFirst: readDocumentId(reader, "header"),
|
|
246
|
+
headerEven: readDocumentId(reader, "header"),
|
|
247
|
+
footerDefault: readDocumentId(reader, "footer"),
|
|
248
|
+
footerFirst: readDocumentId(reader, "footer"),
|
|
249
|
+
footerEven: readDocumentId(reader, "footer")
|
|
250
|
+
}),
|
|
251
|
+
page: readPage(reader),
|
|
252
|
+
titlePage: readOptionalBool(reader)
|
|
253
|
+
});
|
|
254
|
+
case 9:
|
|
255
|
+
return Object.freeze({
|
|
256
|
+
kind: "section.title-page.set",
|
|
257
|
+
id: readDocumentId(reader, "section"),
|
|
258
|
+
titlePage: readOptionalBool(reader)
|
|
259
|
+
});
|
|
260
|
+
case 10:
|
|
261
|
+
return Object.freeze({
|
|
262
|
+
kind: "comment.add",
|
|
263
|
+
id: readDocumentId(reader, "comment"),
|
|
264
|
+
paragraphId: readDocumentId(reader, "paragraph"),
|
|
265
|
+
range: readRange(reader),
|
|
266
|
+
resolved: reader.bool("document boolean"),
|
|
267
|
+
root: readCommentReply(reader, state)
|
|
268
|
+
});
|
|
269
|
+
case 11:
|
|
270
|
+
return Object.freeze({
|
|
271
|
+
kind: "comment.reply.add",
|
|
272
|
+
id: readDocumentId(reader, "comment"),
|
|
273
|
+
reply: readCommentReply(reader, state)
|
|
274
|
+
});
|
|
275
|
+
case 12:
|
|
276
|
+
return Object.freeze({
|
|
277
|
+
kind: "comment.resolved.set",
|
|
278
|
+
id: readDocumentId(reader, "comment"),
|
|
279
|
+
resolved: reader.bool("document boolean")
|
|
280
|
+
});
|
|
281
|
+
case 13: {
|
|
282
|
+
const id = readDocumentId(reader, "tracked-change");
|
|
283
|
+
const paragraphId = readDocumentId(reader, "paragraph");
|
|
284
|
+
const range = readRange(reader);
|
|
285
|
+
const tag = reader.u8();
|
|
286
|
+
if (tag !== 1 && tag !== 2) throw new TypeError("invalid tracked change kind");
|
|
287
|
+
return Object.freeze({
|
|
288
|
+
kind: "tracked-change.add",
|
|
289
|
+
id,
|
|
290
|
+
paragraphId,
|
|
291
|
+
range,
|
|
292
|
+
changeKind: tag === 1 ? "insert" : "delete",
|
|
293
|
+
author: readDocumentString(reader, state, false),
|
|
294
|
+
createdAt: readDocumentString(reader, state, false)
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
case 14:
|
|
298
|
+
return Object.freeze({
|
|
299
|
+
kind: "section.page.set",
|
|
300
|
+
id: readDocumentId(reader, "section"),
|
|
301
|
+
page: readPageWithExtras(reader)
|
|
302
|
+
});
|
|
303
|
+
default:
|
|
304
|
+
throw new TypeError("invalid document command tag");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
var ID_PREFIX = {
|
|
308
|
+
paragraph: { prefix: "p", tag: 1 },
|
|
309
|
+
table: { prefix: "dt", tag: 2 },
|
|
310
|
+
"page-break": { prefix: "pb", tag: 3 },
|
|
311
|
+
section: { prefix: "sec", tag: 4 },
|
|
312
|
+
header: { prefix: "hdr", tag: 5 },
|
|
313
|
+
footer: { prefix: "ftr", tag: 6 },
|
|
314
|
+
comment: { prefix: "dc", tag: 7 },
|
|
315
|
+
"tracked-change": { prefix: "chg", tag: 8 }
|
|
316
|
+
};
|
|
317
|
+
function writeDocumentId(writer, id, kind) {
|
|
318
|
+
const expected = ID_PREFIX[kind];
|
|
319
|
+
const match = new RegExp(`^${expected.prefix}/([0-9a-f]{16})([0-9a-f]{16})$`, "u").exec(id);
|
|
320
|
+
if (!match) throw new TypeError(`document ${kind} id is invalid`);
|
|
321
|
+
const counter = BigInt(`0x${match[2]}`);
|
|
322
|
+
if (counter === 0n || counter > BigInt(DOCUMENT_ARTIFACT_MAX_STRUCTURAL_COUNTER)) {
|
|
323
|
+
throw new TypeError(`document ${kind} id counter is invalid`);
|
|
324
|
+
}
|
|
325
|
+
writer.u8(expected.tag);
|
|
326
|
+
writer.u64(BigInt(`0x${match[1]}`));
|
|
327
|
+
writer.u64(counter);
|
|
328
|
+
}
|
|
329
|
+
function readDocumentId(reader, kind) {
|
|
330
|
+
const expected = ID_PREFIX[kind];
|
|
331
|
+
if (reader.u8() !== expected.tag) throw new TypeError("document id kind mismatch");
|
|
332
|
+
const namespace = reader.u64BigInt().toString(16).padStart(16, "0");
|
|
333
|
+
const counterValue = reader.u64BigInt();
|
|
334
|
+
if (counterValue === 0n || counterValue > BigInt(DOCUMENT_ARTIFACT_MAX_STRUCTURAL_COUNTER)) {
|
|
335
|
+
throw new TypeError("document id counter is invalid");
|
|
336
|
+
}
|
|
337
|
+
return `${expected.prefix}/${namespace}${counterValue.toString(16).padStart(16, "0")}`;
|
|
338
|
+
}
|
|
339
|
+
function writeDocumentString(writer, value, state, content) {
|
|
340
|
+
const bytes = strictUtf8(value, "document string");
|
|
341
|
+
const utf16 = value.length;
|
|
342
|
+
if (bytes.byteLength > DOCUMENT_ARTIFACT_COMMAND_MAX_STRING_BYTES || utf16 > DOCUMENT_ARTIFACT_MAX_TEXT_UTF16) {
|
|
343
|
+
throw new RangeError("document string exceeds its limit");
|
|
344
|
+
}
|
|
345
|
+
if (content) {
|
|
346
|
+
state.textUtf16 += utf16;
|
|
347
|
+
if (state.textUtf16 > DOCUMENT_ARTIFACT_MAX_TEXT_UTF16)
|
|
348
|
+
throw new RangeError("document text exceeds its UTF-16 limit");
|
|
349
|
+
}
|
|
350
|
+
writer.u32(bytes.byteLength);
|
|
351
|
+
writer.bytes(bytes);
|
|
352
|
+
}
|
|
353
|
+
function readDocumentString(reader, state, content) {
|
|
354
|
+
const value = reader.string(DOCUMENT_ARTIFACT_COMMAND_MAX_STRING_BYTES, "document string");
|
|
355
|
+
if (value.length > DOCUMENT_ARTIFACT_MAX_TEXT_UTF16)
|
|
356
|
+
throw new RangeError("document string exceeds its UTF-16 limit");
|
|
357
|
+
if (content) {
|
|
358
|
+
state.textUtf16 += value.length;
|
|
359
|
+
if (state.textUtf16 > DOCUMENT_ARTIFACT_MAX_TEXT_UTF16)
|
|
360
|
+
throw new RangeError("document text exceeds its UTF-16 limit");
|
|
361
|
+
}
|
|
362
|
+
return value;
|
|
363
|
+
}
|
|
364
|
+
function writeRuns(writer, runs, state) {
|
|
365
|
+
if (!Array.isArray(runs)) throw new TypeError("document runs must be an array");
|
|
366
|
+
state.runs += runs.length;
|
|
367
|
+
if (state.runs > DOCUMENT_ARTIFACT_MAX_TEXT_RUNS)
|
|
368
|
+
throw new RangeError("document text runs exceed their limit");
|
|
369
|
+
writer.count(runs.length, DOCUMENT_ARTIFACT_MAX_TEXT_RUNS, "document runs");
|
|
370
|
+
for (const run of runs) {
|
|
371
|
+
writeDocumentString(writer, run.text, state, true);
|
|
372
|
+
writeTextStyle(writer, run.style);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
function readRuns(reader, state) {
|
|
376
|
+
const count = reader.count(DOCUMENT_ARTIFACT_MAX_TEXT_RUNS, "document runs");
|
|
377
|
+
state.runs += count;
|
|
378
|
+
if (state.runs > DOCUMENT_ARTIFACT_MAX_TEXT_RUNS)
|
|
379
|
+
throw new RangeError("document text runs exceed their limit");
|
|
380
|
+
const runs = [];
|
|
381
|
+
for (let index = 0; index < count; index += 1)
|
|
382
|
+
runs.push(
|
|
383
|
+
Object.freeze({
|
|
384
|
+
text: readDocumentString(reader, state, true),
|
|
385
|
+
style: readTextStyle(reader)
|
|
386
|
+
})
|
|
387
|
+
);
|
|
388
|
+
return Object.freeze(runs);
|
|
389
|
+
}
|
|
390
|
+
function writeTextStyle(writer, style) {
|
|
391
|
+
const mask = Number(style.fontFamily !== void 0) | Number(style.fontSizePt !== void 0) << 1 | Number(style.color !== void 0) << 2 | Number(style.bold !== void 0) << 3 | Number(style.italic !== void 0) << 4 | Number(style.underline !== void 0) << 5 | Number(style.strike !== void 0) << 6;
|
|
392
|
+
writer.u8(mask);
|
|
393
|
+
const dummy = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
394
|
+
if (style.fontFamily !== void 0) writeDocumentString(writer, style.fontFamily, dummy, false);
|
|
395
|
+
if (style.fontSizePt !== void 0) writer.f64(style.fontSizePt, "document font size");
|
|
396
|
+
if (style.color !== void 0) writeDocumentString(writer, style.color, dummy, false);
|
|
397
|
+
for (const value of [style.bold, style.italic, style.underline, style.strike])
|
|
398
|
+
if (value !== void 0) writer.bool(value);
|
|
399
|
+
}
|
|
400
|
+
function readTextStyle(reader) {
|
|
401
|
+
const mask = reader.u8();
|
|
402
|
+
if ((mask & ~127) !== 0) throw new TypeError("unknown document text-style bits");
|
|
403
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
404
|
+
return Object.freeze({
|
|
405
|
+
...mask & 1 ? { fontFamily: readDocumentString(reader, state, false) } : {},
|
|
406
|
+
...mask & 2 ? { fontSizePt: reader.f64("document font size") } : {},
|
|
407
|
+
...mask & 4 ? { color: readDocumentString(reader, state, false) } : {},
|
|
408
|
+
...mask & 8 ? { bold: reader.bool("document boolean") } : {},
|
|
409
|
+
...mask & 16 ? { italic: reader.bool("document boolean") } : {},
|
|
410
|
+
...mask & 32 ? { underline: reader.bool("document boolean") } : {},
|
|
411
|
+
...mask & 64 ? { strike: reader.bool("document boolean") } : {}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
function writeTextStylePatch(writer, patch) {
|
|
415
|
+
writePatchString(writer, patch.fontFamily);
|
|
416
|
+
writePatchNumber(writer, patch.fontSizePt);
|
|
417
|
+
writePatchString(writer, patch.color);
|
|
418
|
+
writePatchBool(writer, patch.bold);
|
|
419
|
+
writePatchBool(writer, patch.italic);
|
|
420
|
+
writePatchBool(writer, patch.underline);
|
|
421
|
+
writePatchBool(writer, patch.strike);
|
|
422
|
+
}
|
|
423
|
+
function readTextStylePatch(reader) {
|
|
424
|
+
const fontFamily = readPatchString(reader);
|
|
425
|
+
const fontSizePt = readPatchNumber(reader);
|
|
426
|
+
const color = readPatchString(reader);
|
|
427
|
+
const bold = readPatchBool(reader);
|
|
428
|
+
const italic = readPatchBool(reader);
|
|
429
|
+
const underline = readPatchBool(reader);
|
|
430
|
+
const strike = readPatchBool(reader);
|
|
431
|
+
return freezeOptional(
|
|
432
|
+
{},
|
|
433
|
+
{ fontFamily, fontSizePt, color, bold, italic, underline, strike }
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
function writePatchString(writer, value) {
|
|
437
|
+
if (value === void 0) writer.u8(0);
|
|
438
|
+
else if (value === null) writer.u8(1);
|
|
439
|
+
else {
|
|
440
|
+
writer.u8(2);
|
|
441
|
+
writeDocumentString(writer, value, { runs: 0, textUtf16: 0, tableCells: 0 }, false);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function readPatchString(reader) {
|
|
445
|
+
const tag = reader.u8();
|
|
446
|
+
if (tag === 0) return void 0;
|
|
447
|
+
if (tag === 1) return null;
|
|
448
|
+
if (tag === 2) return readDocumentString(reader, { runs: 0, textUtf16: 0, tableCells: 0 }, false);
|
|
449
|
+
throw new TypeError("invalid document string patch");
|
|
450
|
+
}
|
|
451
|
+
function writePatchNumber(writer, value) {
|
|
452
|
+
if (value === void 0) writer.u8(0);
|
|
453
|
+
else if (value === null) writer.u8(1);
|
|
454
|
+
else {
|
|
455
|
+
writer.u8(2);
|
|
456
|
+
writer.f64(value, "document number patch");
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
function readPatchNumber(reader) {
|
|
460
|
+
const tag = reader.u8();
|
|
461
|
+
if (tag === 0) return void 0;
|
|
462
|
+
if (tag === 1) return null;
|
|
463
|
+
if (tag === 2) return reader.f64("document number patch");
|
|
464
|
+
throw new TypeError("invalid document number patch");
|
|
465
|
+
}
|
|
466
|
+
function writePatchBool(writer, value) {
|
|
467
|
+
writer.u8(value === void 0 ? 0 : value === null ? 1 : value ? 3 : 2);
|
|
468
|
+
}
|
|
469
|
+
function readPatchBool(reader) {
|
|
470
|
+
const tag = reader.u8();
|
|
471
|
+
if (tag === 0) return void 0;
|
|
472
|
+
if (tag === 1) return null;
|
|
473
|
+
if (tag === 2) return false;
|
|
474
|
+
if (tag === 3) return true;
|
|
475
|
+
throw new TypeError("invalid document boolean patch");
|
|
476
|
+
}
|
|
477
|
+
function writeOptionalBool(writer, value) {
|
|
478
|
+
writer.u8(value === null ? 0 : value ? 2 : 1);
|
|
479
|
+
}
|
|
480
|
+
function readOptionalBool(reader) {
|
|
481
|
+
const tag = reader.u8();
|
|
482
|
+
if (tag === 0) return null;
|
|
483
|
+
if (tag === 1) return false;
|
|
484
|
+
if (tag === 2) return true;
|
|
485
|
+
throw new TypeError("invalid optional document boolean");
|
|
486
|
+
}
|
|
487
|
+
function writeParagraphStyle(writer, style) {
|
|
488
|
+
const mask = Number(style.headingLevel !== void 0) | Number(style.alignment !== void 0) << 1 | Number(style.spaceBeforePt !== void 0) << 2 | Number(style.spaceAfterPt !== void 0) << 3 | Number(style.lineHeight !== void 0) << 4 | Number(style.keepNext !== void 0) << 5 | Number(style.pageBreakBefore !== void 0) << 6 | Number(style.list !== void 0) << 7;
|
|
489
|
+
writer.u16(mask);
|
|
490
|
+
if (style.headingLevel !== void 0) writer.u8(style.headingLevel);
|
|
491
|
+
if (style.alignment !== void 0)
|
|
492
|
+
writer.u8(
|
|
493
|
+
{ left: 1, center: 2, right: 3, justify: 4 }[style.alignment] ?? invalidTag("paragraph alignment")
|
|
494
|
+
);
|
|
495
|
+
if (style.spaceBeforePt !== void 0)
|
|
496
|
+
writer.f64(style.spaceBeforePt, "document paragraph spacing");
|
|
497
|
+
if (style.spaceAfterPt !== void 0)
|
|
498
|
+
writer.f64(style.spaceAfterPt, "document paragraph spacing");
|
|
499
|
+
if (style.lineHeight !== void 0) writer.f64(style.lineHeight, "document line height");
|
|
500
|
+
if (style.keepNext !== void 0) writer.bool(style.keepNext);
|
|
501
|
+
if (style.pageBreakBefore !== void 0) writer.bool(style.pageBreakBefore);
|
|
502
|
+
if (style.list !== void 0) {
|
|
503
|
+
writer.u8(
|
|
504
|
+
style.list.kind === "bullet" ? 1 : style.list.kind === "number" ? 2 : invalidTag("list kind")
|
|
505
|
+
);
|
|
506
|
+
writer.bool(style.list.level !== null);
|
|
507
|
+
if (style.list.level !== null) writer.u8(style.list.level);
|
|
508
|
+
writer.bool(style.list.instanceId !== null);
|
|
509
|
+
if (style.list.instanceId !== null)
|
|
510
|
+
writeDocumentString(
|
|
511
|
+
writer,
|
|
512
|
+
style.list.instanceId,
|
|
513
|
+
{ runs: 0, textUtf16: 0, tableCells: 0 },
|
|
514
|
+
false
|
|
515
|
+
);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
function readParagraphStyle(reader) {
|
|
519
|
+
const mask = reader.u16();
|
|
520
|
+
if ((mask & ~255) !== 0) throw new TypeError("unknown paragraph-style bits");
|
|
521
|
+
const headingLevel = mask & 1 ? reader.u8() : void 0;
|
|
522
|
+
let alignment;
|
|
523
|
+
if (mask & 2) {
|
|
524
|
+
const tag = reader.u8();
|
|
525
|
+
alignment = tag === 1 ? "left" : tag === 2 ? "center" : tag === 3 ? "right" : tag === 4 ? "justify" : invalidTag("paragraph alignment");
|
|
526
|
+
}
|
|
527
|
+
const spaceBeforePt = mask & 4 ? reader.f64("document paragraph spacing") : void 0;
|
|
528
|
+
const spaceAfterPt = mask & 8 ? reader.f64("document paragraph spacing") : void 0;
|
|
529
|
+
const lineHeight = mask & 16 ? reader.f64("document line height") : void 0;
|
|
530
|
+
const keepNext = mask & 32 ? reader.bool("document boolean") : void 0;
|
|
531
|
+
const pageBreakBefore = mask & 64 ? reader.bool("document boolean") : void 0;
|
|
532
|
+
let list;
|
|
533
|
+
if (mask & 128) {
|
|
534
|
+
const tag = reader.u8();
|
|
535
|
+
const kind = tag === 1 ? "bullet" : tag === 2 ? "number" : invalidTag("list kind");
|
|
536
|
+
list = Object.freeze({
|
|
537
|
+
kind,
|
|
538
|
+
level: reader.bool("document list level presence") ? reader.u8() : null,
|
|
539
|
+
instanceId: reader.bool("optional document string") ? readDocumentString(reader, { runs: 0, textUtf16: 0, tableCells: 0 }, false) : null
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
return Object.freeze({
|
|
543
|
+
...headingLevel !== void 0 ? { headingLevel } : {},
|
|
544
|
+
...alignment !== void 0 ? { alignment } : {},
|
|
545
|
+
...spaceBeforePt !== void 0 ? { spaceBeforePt } : {},
|
|
546
|
+
...spaceAfterPt !== void 0 ? { spaceAfterPt } : {},
|
|
547
|
+
...lineHeight !== void 0 ? { lineHeight } : {},
|
|
548
|
+
...keepNext !== void 0 ? { keepNext } : {},
|
|
549
|
+
...pageBreakBefore !== void 0 ? { pageBreakBefore } : {},
|
|
550
|
+
...list !== void 0 ? { list } : {}
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
function writeTableStyle(writer, style) {
|
|
554
|
+
const mask = Number(style.widthPt !== void 0) | Number(style.columnWidthsPt !== void 0) << 1 | Number(style.headerRows !== void 0) << 2 | Number(style.cellPaddingPt !== void 0) << 3 | Number(style.borderColor !== void 0) << 4 | Number(style.headerFill !== void 0) << 5 | Number(style.allowRowSplit !== void 0) << 6;
|
|
555
|
+
writer.u8(mask);
|
|
556
|
+
if (style.widthPt !== void 0) writer.f64(style.widthPt, "document table width");
|
|
557
|
+
if (style.columnWidthsPt !== void 0) {
|
|
558
|
+
writer.count(
|
|
559
|
+
style.columnWidthsPt.length,
|
|
560
|
+
DOCUMENT_ARTIFACT_MAX_TABLE_CELLS,
|
|
561
|
+
"document table widths"
|
|
562
|
+
);
|
|
563
|
+
for (const width of style.columnWidthsPt) writer.f64(width, "document column width");
|
|
564
|
+
}
|
|
565
|
+
if (style.headerRows !== void 0) writer.u32(style.headerRows);
|
|
566
|
+
if (style.cellPaddingPt !== void 0) writer.f64(style.cellPaddingPt, "document cell padding");
|
|
567
|
+
if (style.borderColor !== void 0)
|
|
568
|
+
writeDocumentString(writer, style.borderColor, { runs: 0, textUtf16: 0, tableCells: 0 }, false);
|
|
569
|
+
if (style.headerFill !== void 0)
|
|
570
|
+
writeDocumentString(writer, style.headerFill, { runs: 0, textUtf16: 0, tableCells: 0 }, false);
|
|
571
|
+
if (style.allowRowSplit !== void 0) writer.bool(style.allowRowSplit);
|
|
572
|
+
}
|
|
573
|
+
function readTableStyle(reader) {
|
|
574
|
+
const mask = reader.u8();
|
|
575
|
+
if ((mask & ~127) !== 0) throw new TypeError("unknown document table-style bits");
|
|
576
|
+
const widthPt = mask & 1 ? reader.f64("document table width") : void 0;
|
|
577
|
+
let columnWidthsPt;
|
|
578
|
+
if (mask & 2) {
|
|
579
|
+
const count = reader.count(DOCUMENT_ARTIFACT_MAX_TABLE_CELLS, "document table widths");
|
|
580
|
+
const widths = [];
|
|
581
|
+
for (let index = 0; index < count; index += 1) widths.push(reader.f64("document column width"));
|
|
582
|
+
columnWidthsPt = Object.freeze(widths);
|
|
583
|
+
}
|
|
584
|
+
const headerRows = mask & 4 ? reader.u32() : void 0;
|
|
585
|
+
const cellPaddingPt = mask & 8 ? reader.f64("document cell padding") : void 0;
|
|
586
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
587
|
+
const borderColor = mask & 16 ? readDocumentString(reader, state, false) : void 0;
|
|
588
|
+
const headerFill = mask & 32 ? readDocumentString(reader, state, false) : void 0;
|
|
589
|
+
const allowRowSplit = mask & 64 ? reader.bool("document boolean") : void 0;
|
|
590
|
+
return Object.freeze({
|
|
591
|
+
...widthPt !== void 0 ? { widthPt } : {},
|
|
592
|
+
...columnWidthsPt ? { columnWidthsPt } : {},
|
|
593
|
+
...headerRows !== void 0 ? { headerRows } : {},
|
|
594
|
+
...cellPaddingPt !== void 0 ? { cellPaddingPt } : {},
|
|
595
|
+
...borderColor !== void 0 ? { borderColor } : {},
|
|
596
|
+
...headerFill !== void 0 ? { headerFill } : {},
|
|
597
|
+
...allowRowSplit !== void 0 ? { allowRowSplit } : {}
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
function writeTableRows(writer, rows, state) {
|
|
601
|
+
writer.count(rows.length, DOCUMENT_ARTIFACT_MAX_TABLE_CELLS, "document table rows");
|
|
602
|
+
for (const row of rows) {
|
|
603
|
+
state.tableCells += row.length;
|
|
604
|
+
if (state.tableCells > DOCUMENT_ARTIFACT_MAX_TABLE_CELLS)
|
|
605
|
+
throw new RangeError("document table cells exceed their limit");
|
|
606
|
+
writer.count(row.length, DOCUMENT_ARTIFACT_MAX_TABLE_CELLS, "document table cells");
|
|
607
|
+
for (const cell of row) writeRuns(writer, cell, state);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
function readTableRows(reader, state) {
|
|
611
|
+
const rowCount = reader.count(DOCUMENT_ARTIFACT_MAX_TABLE_CELLS, "document table rows");
|
|
612
|
+
const rows = [];
|
|
613
|
+
for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
|
|
614
|
+
const columnCount = reader.count(DOCUMENT_ARTIFACT_MAX_TABLE_CELLS, "document table cells");
|
|
615
|
+
state.tableCells += columnCount;
|
|
616
|
+
if (state.tableCells > DOCUMENT_ARTIFACT_MAX_TABLE_CELLS)
|
|
617
|
+
throw new RangeError("document table cells exceed their limit");
|
|
618
|
+
const row = [];
|
|
619
|
+
for (let columnIndex = 0; columnIndex < columnCount; columnIndex += 1)
|
|
620
|
+
row.push(readRuns(reader, state));
|
|
621
|
+
rows.push(Object.freeze(row));
|
|
622
|
+
}
|
|
623
|
+
return Object.freeze(rows);
|
|
624
|
+
}
|
|
625
|
+
function writeTarget(writer, target) {
|
|
626
|
+
if (target.kind === "body") {
|
|
627
|
+
writer.u8(0);
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
if (target.kind !== "section") throw new TypeError("invalid document story target");
|
|
631
|
+
writer.u8(1);
|
|
632
|
+
writeDocumentId(writer, target.sectionId, "section");
|
|
633
|
+
writer.u8(
|
|
634
|
+
target.storyKind === "header" ? 1 : target.storyKind === "footer" ? 2 : invalidTag("story kind")
|
|
635
|
+
);
|
|
636
|
+
writer.u8(
|
|
637
|
+
target.variant === "default" ? 1 : target.variant === "first" ? 2 : target.variant === "even" ? 3 : invalidTag("story variant")
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
function readTarget(reader) {
|
|
641
|
+
const tag = reader.u8();
|
|
642
|
+
if (tag === 0) return Object.freeze({ kind: "body" });
|
|
643
|
+
if (tag !== 1) throw new TypeError("invalid document story target");
|
|
644
|
+
const sectionId = readDocumentId(reader, "section");
|
|
645
|
+
const kindTag = reader.u8();
|
|
646
|
+
const storyKind = kindTag === 1 ? "header" : kindTag === 2 ? "footer" : invalidTag("story kind");
|
|
647
|
+
const variantTag = reader.u8();
|
|
648
|
+
const variant = variantTag === 1 ? "default" : variantTag === 2 ? "first" : variantTag === 3 ? "even" : invalidTag("story variant");
|
|
649
|
+
return Object.freeze({ kind: "section", sectionId, storyKind, variant });
|
|
650
|
+
}
|
|
651
|
+
function writeRange(writer, range) {
|
|
652
|
+
if (range.end < range.start) throw new TypeError("document text range is invalid");
|
|
653
|
+
writer.u32(range.start);
|
|
654
|
+
writer.u32(range.end);
|
|
655
|
+
}
|
|
656
|
+
function readRange(reader) {
|
|
657
|
+
const start = reader.u32();
|
|
658
|
+
const end = reader.u32();
|
|
659
|
+
if (end < start) throw new TypeError("document text range is invalid");
|
|
660
|
+
return Object.freeze({ start, end });
|
|
661
|
+
}
|
|
662
|
+
function writePage(writer, page) {
|
|
663
|
+
for (const [value, label] of [
|
|
664
|
+
[page.widthPt, "width"],
|
|
665
|
+
[page.heightPt, "height"],
|
|
666
|
+
[page.marginTopPt, "top margin"],
|
|
667
|
+
[page.marginRightPt, "right margin"],
|
|
668
|
+
[page.marginBottomPt, "bottom margin"],
|
|
669
|
+
[page.marginLeftPt, "left margin"]
|
|
670
|
+
])
|
|
671
|
+
writer.f64(value, `document ${label}`);
|
|
672
|
+
}
|
|
673
|
+
function writePageWithExtras(writer, page) {
|
|
674
|
+
writePage(writer, page);
|
|
675
|
+
writer.f64(page.headerPt ?? 36, "document header distance");
|
|
676
|
+
writer.f64(page.footerPt ?? 36, "document footer distance");
|
|
677
|
+
writer.f64(page.gutterPt ?? 0, "document gutter");
|
|
678
|
+
}
|
|
679
|
+
function assertDefaultPageExtras(page) {
|
|
680
|
+
if ((page.headerPt ?? 36) !== 36 || (page.footerPt ?? 36) !== 36 || (page.gutterPt ?? 0) !== 0) {
|
|
681
|
+
throw new TypeError("section.add page extras require section.page.set");
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
function readPage(reader) {
|
|
685
|
+
return Object.freeze({
|
|
686
|
+
widthPt: reader.f64("document width"),
|
|
687
|
+
heightPt: reader.f64("document height"),
|
|
688
|
+
marginTopPt: reader.f64("document top margin"),
|
|
689
|
+
marginRightPt: reader.f64("document right margin"),
|
|
690
|
+
marginBottomPt: reader.f64("document bottom margin"),
|
|
691
|
+
marginLeftPt: reader.f64("document left margin")
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
function readPageWithExtras(reader) {
|
|
695
|
+
return Object.freeze({
|
|
696
|
+
...readPage(reader),
|
|
697
|
+
headerPt: reader.f64("document header distance"),
|
|
698
|
+
footerPt: reader.f64("document footer distance"),
|
|
699
|
+
gutterPt: reader.f64("document gutter")
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
function writeCommentReply(writer, reply, state) {
|
|
703
|
+
writeDocumentString(writer, reply.author, state, false);
|
|
704
|
+
writeDocumentString(writer, reply.text, state, true);
|
|
705
|
+
writeDocumentString(writer, reply.createdAt, state, false);
|
|
706
|
+
}
|
|
707
|
+
function readCommentReply(reader, state) {
|
|
708
|
+
return Object.freeze({
|
|
709
|
+
author: readDocumentString(reader, state, false),
|
|
710
|
+
text: readDocumentString(reader, state, true),
|
|
711
|
+
createdAt: readDocumentString(reader, state, false)
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
function encodeDocumentArtifactQuery(query) {
|
|
715
|
+
const payload = new ArtifactBinaryWriter(DOCUMENT_ARTIFACT_QUERY_MAX_BYTES - 32);
|
|
716
|
+
switch (query.kind) {
|
|
717
|
+
case "summary":
|
|
718
|
+
payload.u8(0);
|
|
719
|
+
break;
|
|
720
|
+
case "body":
|
|
721
|
+
validateDocumentQueryLimits(query.limits);
|
|
722
|
+
payload.u8(1);
|
|
723
|
+
payload.u64(query.startBlock);
|
|
724
|
+
writeQueryLimits(payload, query.limits);
|
|
725
|
+
break;
|
|
726
|
+
case "story":
|
|
727
|
+
validateDocumentQueryLimits(query.limits);
|
|
728
|
+
payload.u8(2);
|
|
729
|
+
writeDocumentId(payload, query.sectionId, "section");
|
|
730
|
+
payload.u8(
|
|
731
|
+
query.storyKind === "header" ? 1 : query.storyKind === "footer" ? 2 : invalidTag("story kind")
|
|
732
|
+
);
|
|
733
|
+
payload.u8(
|
|
734
|
+
query.variant === "default" ? 1 : query.variant === "first" ? 2 : query.variant === "even" ? 3 : invalidTag("story variant")
|
|
735
|
+
);
|
|
736
|
+
payload.u64(query.startBlock);
|
|
737
|
+
writeQueryLimits(payload, query.limits);
|
|
738
|
+
break;
|
|
739
|
+
case "sections":
|
|
740
|
+
validateDocumentQueryLimits(query.limits);
|
|
741
|
+
payload.u8(3);
|
|
742
|
+
payload.u64(query.startSection);
|
|
743
|
+
writeQueryLimits(payload, query.limits);
|
|
744
|
+
break;
|
|
745
|
+
case "review":
|
|
746
|
+
validateDocumentQueryLimits(query.limits);
|
|
747
|
+
payload.u8(4);
|
|
748
|
+
payload.u64(query.startItem);
|
|
749
|
+
writeQueryLimits(payload, query.limits);
|
|
750
|
+
break;
|
|
751
|
+
default:
|
|
752
|
+
throw new TypeError("invalid document query kind");
|
|
753
|
+
}
|
|
754
|
+
return encodeCountedEnvelope(
|
|
755
|
+
QUERY_MAGIC,
|
|
756
|
+
DOCUMENT_ARTIFACT_QUERY_VERSION,
|
|
757
|
+
1,
|
|
758
|
+
payload.finish(),
|
|
759
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_BYTES
|
|
760
|
+
);
|
|
761
|
+
}
|
|
762
|
+
function decodeDocumentArtifactQuery(bytes) {
|
|
763
|
+
const { count, payload } = decodeCountedEnvelope(
|
|
764
|
+
bytes,
|
|
765
|
+
QUERY_MAGIC,
|
|
766
|
+
DOCUMENT_ARTIFACT_QUERY_VERSION,
|
|
767
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_BYTES,
|
|
768
|
+
1
|
|
769
|
+
);
|
|
770
|
+
if (count !== 1) throw new TypeError("document query envelope must contain exactly one query");
|
|
771
|
+
const reader = new ArtifactBinaryReader(payload);
|
|
772
|
+
const tag = reader.u8();
|
|
773
|
+
let query;
|
|
774
|
+
if (tag === 0) query = Object.freeze({ kind: "summary" });
|
|
775
|
+
else if (tag === 1)
|
|
776
|
+
query = Object.freeze({
|
|
777
|
+
kind: "body",
|
|
778
|
+
startBlock: reader.u64Safe("document body cursor"),
|
|
779
|
+
limits: readQueryLimits(reader)
|
|
780
|
+
});
|
|
781
|
+
else if (tag === 2) {
|
|
782
|
+
const sectionId = readDocumentId(reader, "section");
|
|
783
|
+
const storyKindTag = reader.u8();
|
|
784
|
+
const variantTag = reader.u8();
|
|
785
|
+
query = Object.freeze({
|
|
786
|
+
kind: "story",
|
|
787
|
+
sectionId,
|
|
788
|
+
storyKind: storyKindTag === 1 ? "header" : storyKindTag === 2 ? "footer" : invalidTag("story kind"),
|
|
789
|
+
variant: variantTag === 1 ? "default" : variantTag === 2 ? "first" : variantTag === 3 ? "even" : invalidTag("story variant"),
|
|
790
|
+
startBlock: reader.u64Safe("document story cursor"),
|
|
791
|
+
limits: readQueryLimits(reader)
|
|
792
|
+
});
|
|
793
|
+
} else if (tag === 3)
|
|
794
|
+
query = Object.freeze({
|
|
795
|
+
kind: "sections",
|
|
796
|
+
startSection: reader.u64Safe("document section cursor"),
|
|
797
|
+
limits: readQueryLimits(reader)
|
|
798
|
+
});
|
|
799
|
+
else if (tag === 4)
|
|
800
|
+
query = Object.freeze({
|
|
801
|
+
kind: "review",
|
|
802
|
+
startItem: reader.u64Safe("document review cursor"),
|
|
803
|
+
limits: readQueryLimits(reader)
|
|
804
|
+
});
|
|
805
|
+
else throw new TypeError("invalid document query tag");
|
|
806
|
+
reader.done("document query contains trailing bytes");
|
|
807
|
+
return query;
|
|
808
|
+
}
|
|
809
|
+
function assertCanonicalDocumentArtifactQueryBytes(bytes) {
|
|
810
|
+
if (!equalBytes(bytes, encodeDocumentArtifactQuery(decodeDocumentArtifactQuery(bytes)))) {
|
|
811
|
+
throw new TypeError("document query is not canonically encoded");
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
function encodeDocumentArtifactQueryResponse(projection) {
|
|
815
|
+
if (projection.items.length > DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS)
|
|
816
|
+
throw new RangeError("document query response has too many items");
|
|
817
|
+
if (projection.truncated !== (projection.nextCursor !== null))
|
|
818
|
+
throw new TypeError("document query cursor and truncation flag disagree");
|
|
819
|
+
const metrics = measureProjection(projection.items);
|
|
820
|
+
if (metrics.text !== projection.projectedTextUtf16 || metrics.cells !== projection.projectedTableCells) {
|
|
821
|
+
throw new TypeError("document query response metrics do not match its items");
|
|
822
|
+
}
|
|
823
|
+
const payload = new ArtifactBinaryWriter(DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES - 32);
|
|
824
|
+
payload.u64(projection.revision);
|
|
825
|
+
payload.bool(projection.nextCursor !== null);
|
|
826
|
+
if (projection.nextCursor !== null) payload.u64(projection.nextCursor);
|
|
827
|
+
payload.bool(projection.truncated);
|
|
828
|
+
payload.u64(projection.projectedTextUtf16);
|
|
829
|
+
payload.u64(projection.projectedTableCells);
|
|
830
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
831
|
+
for (const item of projection.items) writeProjectionItem(payload, item, state);
|
|
832
|
+
const pageExtras = projection.items.map((item, index) => ({ index, page: projectionPage(item) })).filter(
|
|
833
|
+
(entry) => entry.page !== null && hasNonDefaultProjectionPageExtras(entry.page)
|
|
834
|
+
);
|
|
835
|
+
if (pageExtras.length > 0) {
|
|
836
|
+
payload.u8(QUERY_RESPONSE_EXTENSION_MARKER);
|
|
837
|
+
payload.u8(PAGE_EXTRAS_EXTENSION_VERSION);
|
|
838
|
+
payload.count(pageExtras.length, DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS, "document page extras");
|
|
839
|
+
for (const { index, page } of pageExtras) {
|
|
840
|
+
payload.count(index, DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS - 1, "document page item index");
|
|
841
|
+
payload.i64(page.headerMillipoints);
|
|
842
|
+
payload.i64(page.footerMillipoints);
|
|
843
|
+
payload.i64(page.gutterMillipoints);
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
return encodeCountedEnvelope(
|
|
847
|
+
QUERY_RESPONSE_MAGIC,
|
|
848
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION,
|
|
849
|
+
projection.items.length,
|
|
850
|
+
payload.finish(),
|
|
851
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES
|
|
852
|
+
);
|
|
853
|
+
}
|
|
854
|
+
function decodeDocumentArtifactQueryResponse(bytes) {
|
|
855
|
+
const { count, payload } = decodeCountedEnvelope(
|
|
856
|
+
bytes,
|
|
857
|
+
QUERY_RESPONSE_MAGIC,
|
|
858
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION,
|
|
859
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,
|
|
860
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS
|
|
861
|
+
);
|
|
862
|
+
const reader = new ArtifactBinaryReader(payload);
|
|
863
|
+
const revision = reader.u64BigInt();
|
|
864
|
+
const nextCursor = reader.bool("optional document cursor") ? reader.u64Safe("document query cursor") : null;
|
|
865
|
+
const truncated = reader.bool("document truncation flag");
|
|
866
|
+
if (truncated !== (nextCursor !== null))
|
|
867
|
+
throw new TypeError("document query cursor and truncation flag disagree");
|
|
868
|
+
const projectedTextUtf16 = reader.u64Safe("document projected text");
|
|
869
|
+
const projectedTableCells = reader.u64Safe("document projected table cells");
|
|
870
|
+
if (projectedTextUtf16 > DOCUMENT_ARTIFACT_QUERY_MAX_TEXT_UTF16 || projectedTableCells > DOCUMENT_ARTIFACT_QUERY_MAX_TABLE_CELLS) {
|
|
871
|
+
throw new RangeError("document query response metrics exceed their limits");
|
|
872
|
+
}
|
|
873
|
+
const state = { runs: 0, textUtf16: 0, tableCells: 0 };
|
|
874
|
+
let items = [];
|
|
875
|
+
for (let index = 0; index < count; index += 1) items.push(readProjectionItem(reader, state));
|
|
876
|
+
if (reader.remaining > 0) items = readProjectionPageExtras(reader, items);
|
|
877
|
+
reader.done("document query response contains trailing bytes");
|
|
878
|
+
const measured = measureProjection(items);
|
|
879
|
+
if (measured.text !== projectedTextUtf16 || measured.cells !== projectedTableCells) {
|
|
880
|
+
throw new TypeError("document query response metrics do not match its items");
|
|
881
|
+
}
|
|
882
|
+
const projection = Object.freeze({
|
|
883
|
+
revision,
|
|
884
|
+
items: Object.freeze(items),
|
|
885
|
+
nextCursor,
|
|
886
|
+
truncated,
|
|
887
|
+
projectedTextUtf16,
|
|
888
|
+
projectedTableCells
|
|
889
|
+
});
|
|
890
|
+
if (!equalBytes(bytes, encodeDocumentArtifactQueryResponse(projection))) {
|
|
891
|
+
throw new TypeError("document query response is not canonically encoded");
|
|
892
|
+
}
|
|
893
|
+
return projection;
|
|
894
|
+
}
|
|
895
|
+
function assertCanonicalDocumentArtifactQueryResponseBytes(bytes) {
|
|
896
|
+
decodeDocumentArtifactQueryResponse(bytes);
|
|
897
|
+
}
|
|
898
|
+
function writeQueryLimits(writer, limits) {
|
|
899
|
+
validateDocumentQueryLimits(limits);
|
|
900
|
+
writer.u32(limits.maxItems);
|
|
901
|
+
writer.u32(limits.maxTextUtf16);
|
|
902
|
+
writer.u32(limits.maxTableCells);
|
|
903
|
+
}
|
|
904
|
+
function readQueryLimits(reader) {
|
|
905
|
+
const limits = Object.freeze({
|
|
906
|
+
maxItems: reader.u32(),
|
|
907
|
+
maxTextUtf16: reader.u32(),
|
|
908
|
+
maxTableCells: reader.u32()
|
|
909
|
+
});
|
|
910
|
+
validateDocumentQueryLimits(limits);
|
|
911
|
+
return limits;
|
|
912
|
+
}
|
|
913
|
+
function validateDocumentQueryLimits(limits) {
|
|
914
|
+
if (!Number.isInteger(limits.maxItems) || limits.maxItems < 1 || limits.maxItems > DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS || !Number.isInteger(limits.maxTextUtf16) || limits.maxTextUtf16 < 1 || limits.maxTextUtf16 > DOCUMENT_ARTIFACT_QUERY_MAX_TEXT_UTF16 || !Number.isInteger(limits.maxTableCells) || limits.maxTableCells < 1 || limits.maxTableCells > DOCUMENT_ARTIFACT_QUERY_MAX_TABLE_CELLS) {
|
|
915
|
+
throw new RangeError("invalid document query limits");
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
function writePageProjection(writer, page) {
|
|
919
|
+
writer.i64(page.widthMillipoints);
|
|
920
|
+
writer.i64(page.heightMillipoints);
|
|
921
|
+
writer.i64(page.marginTopMillipoints);
|
|
922
|
+
writer.i64(page.marginRightMillipoints);
|
|
923
|
+
writer.i64(page.marginBottomMillipoints);
|
|
924
|
+
writer.i64(page.marginLeftMillipoints);
|
|
925
|
+
}
|
|
926
|
+
function projectionPage(item) {
|
|
927
|
+
return item.kind === "summary" || item.kind === "section" ? item.page : null;
|
|
928
|
+
}
|
|
929
|
+
function hasNonDefaultProjectionPageExtras(page) {
|
|
930
|
+
return page.headerMillipoints !== 36000n || page.footerMillipoints !== 36000n || page.gutterMillipoints !== 0n;
|
|
931
|
+
}
|
|
932
|
+
function readPageProjection(reader) {
|
|
933
|
+
return Object.freeze({
|
|
934
|
+
widthMillipoints: reader.i64BigInt(),
|
|
935
|
+
heightMillipoints: reader.i64BigInt(),
|
|
936
|
+
marginTopMillipoints: reader.i64BigInt(),
|
|
937
|
+
marginRightMillipoints: reader.i64BigInt(),
|
|
938
|
+
marginBottomMillipoints: reader.i64BigInt(),
|
|
939
|
+
marginLeftMillipoints: reader.i64BigInt(),
|
|
940
|
+
headerMillipoints: 36000n,
|
|
941
|
+
footerMillipoints: 36000n,
|
|
942
|
+
gutterMillipoints: 0n
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
function readProjectionPageExtras(reader, source) {
|
|
946
|
+
if (source.length === 0) throw new TypeError("document page extras require a page item");
|
|
947
|
+
if (reader.u8() !== QUERY_RESPONSE_EXTENSION_MARKER) {
|
|
948
|
+
throw new TypeError("unknown document query response extension");
|
|
949
|
+
}
|
|
950
|
+
if (reader.u8() !== PAGE_EXTRAS_EXTENSION_VERSION) {
|
|
951
|
+
throw new TypeError("unsupported document page extras extension version");
|
|
952
|
+
}
|
|
953
|
+
const count = reader.count(source.length, "document page extras", 28);
|
|
954
|
+
if (count === 0) throw new TypeError("empty document page extras extension");
|
|
955
|
+
const items = [...source];
|
|
956
|
+
let previousIndex = -1;
|
|
957
|
+
for (let offset = 0; offset < count; offset += 1) {
|
|
958
|
+
const index = reader.count(source.length - 1, "document page item index", 24);
|
|
959
|
+
if (index <= previousIndex)
|
|
960
|
+
throw new TypeError("document page extras are not strictly ordered");
|
|
961
|
+
previousIndex = index;
|
|
962
|
+
const item = items[index];
|
|
963
|
+
if (!item || item.kind !== "summary" && item.kind !== "section") {
|
|
964
|
+
throw new TypeError("document page extras reference a non-page item");
|
|
965
|
+
}
|
|
966
|
+
const page = Object.freeze({
|
|
967
|
+
...item.page,
|
|
968
|
+
headerMillipoints: reader.i64BigInt(),
|
|
969
|
+
footerMillipoints: reader.i64BigInt(),
|
|
970
|
+
gutterMillipoints: reader.i64BigInt()
|
|
971
|
+
});
|
|
972
|
+
if (!hasNonDefaultProjectionPageExtras(page)) {
|
|
973
|
+
throw new TypeError("redundant document page extras");
|
|
974
|
+
}
|
|
975
|
+
items[index] = Object.freeze({ ...item, page });
|
|
976
|
+
}
|
|
977
|
+
return items;
|
|
978
|
+
}
|
|
979
|
+
function writeProjectionItem(writer, item, state) {
|
|
980
|
+
switch (item.kind) {
|
|
981
|
+
case "summary":
|
|
982
|
+
writer.u8(0);
|
|
983
|
+
writer.u64(item.idNamespace);
|
|
984
|
+
writer.u64(item.revision);
|
|
985
|
+
writer.u64(item.nextIdCounter);
|
|
986
|
+
writer.u64(item.blockCount);
|
|
987
|
+
writer.u64(item.sectionCount);
|
|
988
|
+
writer.u64(item.commentCount);
|
|
989
|
+
writer.u64(item.trackedChangeCount);
|
|
990
|
+
writer.bool(item.evenAndOddHeaders);
|
|
991
|
+
writer.bool(item.trackRevisions);
|
|
992
|
+
writePageProjection(writer, item.page);
|
|
993
|
+
return;
|
|
994
|
+
case "section":
|
|
995
|
+
writer.u8(1);
|
|
996
|
+
writeDocumentId(writer, item.id, "section");
|
|
997
|
+
writer.u64(item.startBlockIndex);
|
|
998
|
+
writer.bool(item.titlePage);
|
|
999
|
+
writePageProjection(writer, item.page);
|
|
1000
|
+
for (const count of item.headerBlockCounts) writer.u64(count);
|
|
1001
|
+
for (const count of item.footerBlockCounts) writer.u64(count);
|
|
1002
|
+
return;
|
|
1003
|
+
case "paragraph":
|
|
1004
|
+
writer.u8(2);
|
|
1005
|
+
writeDocumentId(writer, item.id, "paragraph");
|
|
1006
|
+
writeRuns(writer, item.runs, state);
|
|
1007
|
+
writeParagraphStyle(writer, item.style);
|
|
1008
|
+
return;
|
|
1009
|
+
case "table":
|
|
1010
|
+
writer.u8(3);
|
|
1011
|
+
writeDocumentId(writer, item.id, "table");
|
|
1012
|
+
writeTableRows(writer, item.rows, state);
|
|
1013
|
+
writeTableStyle(writer, item.style);
|
|
1014
|
+
return;
|
|
1015
|
+
case "page-break":
|
|
1016
|
+
writer.u8(4);
|
|
1017
|
+
writeDocumentId(writer, item.id, "page-break");
|
|
1018
|
+
return;
|
|
1019
|
+
case "comment":
|
|
1020
|
+
writer.u8(5);
|
|
1021
|
+
writeDocumentId(writer, item.id, "comment");
|
|
1022
|
+
writeDocumentId(writer, item.paragraphId, "paragraph");
|
|
1023
|
+
writeRange(writer, item.range);
|
|
1024
|
+
writer.bool(item.resolved);
|
|
1025
|
+
writer.count(item.replies.length, 1e5, "document comment replies");
|
|
1026
|
+
for (const reply of item.replies) writeCommentReply(writer, reply, state);
|
|
1027
|
+
return;
|
|
1028
|
+
case "tracked-change":
|
|
1029
|
+
writer.u8(6);
|
|
1030
|
+
writeDocumentId(writer, item.id, "tracked-change");
|
|
1031
|
+
writeDocumentId(writer, item.paragraphId, "paragraph");
|
|
1032
|
+
writer.u8(
|
|
1033
|
+
item.changeKind === "insert" ? 1 : item.changeKind === "delete" ? 2 : invalidTag("tracked change kind")
|
|
1034
|
+
);
|
|
1035
|
+
writeRange(writer, item.range);
|
|
1036
|
+
writeDocumentString(writer, item.author, state, false);
|
|
1037
|
+
writeDocumentString(writer, item.createdAt, state, false);
|
|
1038
|
+
return;
|
|
1039
|
+
default:
|
|
1040
|
+
throw new TypeError("invalid document projection item kind");
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
function readProjectionItem(reader, state) {
|
|
1044
|
+
const tag = reader.u8();
|
|
1045
|
+
if (tag === 0) {
|
|
1046
|
+
const item = Object.freeze({
|
|
1047
|
+
kind: "summary",
|
|
1048
|
+
idNamespace: reader.u64BigInt(),
|
|
1049
|
+
revision: reader.u64BigInt(),
|
|
1050
|
+
nextIdCounter: reader.u64BigInt(),
|
|
1051
|
+
blockCount: boundedProjectionCount(reader, 1e5, "document block count"),
|
|
1052
|
+
sectionCount: boundedProjectionCount(reader, 1e4, "document section count"),
|
|
1053
|
+
commentCount: boundedProjectionCount(reader, 1e5, "document comment count"),
|
|
1054
|
+
trackedChangeCount: boundedProjectionCount(reader, 1e5, "document tracked-change count"),
|
|
1055
|
+
evenAndOddHeaders: reader.bool("document boolean"),
|
|
1056
|
+
trackRevisions: reader.bool("document boolean"),
|
|
1057
|
+
page: readPageProjection(reader)
|
|
1058
|
+
});
|
|
1059
|
+
return item;
|
|
1060
|
+
}
|
|
1061
|
+
if (tag === 1) {
|
|
1062
|
+
const id = readDocumentId(reader, "section");
|
|
1063
|
+
const startBlockIndex = boundedProjectionCount(reader, 1e5, "document section block index");
|
|
1064
|
+
const titlePage = reader.bool("document boolean");
|
|
1065
|
+
const page = readPageProjection(reader);
|
|
1066
|
+
const headerBlockCounts = Object.freeze([
|
|
1067
|
+
boundedProjectionCount(reader, 1e5, "document header blocks"),
|
|
1068
|
+
boundedProjectionCount(reader, 1e5, "document header blocks"),
|
|
1069
|
+
boundedProjectionCount(reader, 1e5, "document header blocks")
|
|
1070
|
+
]);
|
|
1071
|
+
const footerBlockCounts = Object.freeze([
|
|
1072
|
+
boundedProjectionCount(reader, 1e5, "document footer blocks"),
|
|
1073
|
+
boundedProjectionCount(reader, 1e5, "document footer blocks"),
|
|
1074
|
+
boundedProjectionCount(reader, 1e5, "document footer blocks")
|
|
1075
|
+
]);
|
|
1076
|
+
return Object.freeze({
|
|
1077
|
+
kind: "section",
|
|
1078
|
+
id,
|
|
1079
|
+
startBlockIndex,
|
|
1080
|
+
titlePage,
|
|
1081
|
+
page,
|
|
1082
|
+
headerBlockCounts,
|
|
1083
|
+
footerBlockCounts
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
if (tag === 2)
|
|
1087
|
+
return Object.freeze({
|
|
1088
|
+
kind: "paragraph",
|
|
1089
|
+
id: readDocumentId(reader, "paragraph"),
|
|
1090
|
+
runs: readRuns(reader, state),
|
|
1091
|
+
style: readParagraphStyle(reader)
|
|
1092
|
+
});
|
|
1093
|
+
if (tag === 3)
|
|
1094
|
+
return Object.freeze({
|
|
1095
|
+
kind: "table",
|
|
1096
|
+
id: readDocumentId(reader, "table"),
|
|
1097
|
+
rows: readTableRows(reader, state),
|
|
1098
|
+
style: readTableStyle(reader)
|
|
1099
|
+
});
|
|
1100
|
+
if (tag === 4)
|
|
1101
|
+
return Object.freeze({ kind: "page-break", id: readDocumentId(reader, "page-break") });
|
|
1102
|
+
if (tag === 5) {
|
|
1103
|
+
const id = readDocumentId(reader, "comment");
|
|
1104
|
+
const paragraphId = readDocumentId(reader, "paragraph");
|
|
1105
|
+
const range = readRange(reader);
|
|
1106
|
+
const resolved = reader.bool("document boolean");
|
|
1107
|
+
const count = reader.count(1e5, "document comment replies");
|
|
1108
|
+
const replies = [];
|
|
1109
|
+
for (let index = 0; index < count; index += 1) replies.push(readCommentReply(reader, state));
|
|
1110
|
+
return Object.freeze({
|
|
1111
|
+
kind: "comment",
|
|
1112
|
+
id,
|
|
1113
|
+
paragraphId,
|
|
1114
|
+
range,
|
|
1115
|
+
resolved,
|
|
1116
|
+
replies: Object.freeze(replies)
|
|
1117
|
+
});
|
|
1118
|
+
}
|
|
1119
|
+
if (tag === 6) {
|
|
1120
|
+
const id = readDocumentId(reader, "tracked-change");
|
|
1121
|
+
const paragraphId = readDocumentId(reader, "paragraph");
|
|
1122
|
+
const kindTag = reader.u8();
|
|
1123
|
+
if (kindTag !== 1 && kindTag !== 2) throw new TypeError("invalid tracked change kind");
|
|
1124
|
+
return Object.freeze({
|
|
1125
|
+
kind: "tracked-change",
|
|
1126
|
+
id,
|
|
1127
|
+
paragraphId,
|
|
1128
|
+
changeKind: kindTag === 1 ? "insert" : "delete",
|
|
1129
|
+
range: readRange(reader),
|
|
1130
|
+
author: readDocumentString(reader, state, false),
|
|
1131
|
+
createdAt: readDocumentString(reader, state, false)
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
throw new TypeError("invalid document projection item tag");
|
|
1135
|
+
}
|
|
1136
|
+
function boundedProjectionCount(reader, maximum, label) {
|
|
1137
|
+
const value = reader.u64Safe(label);
|
|
1138
|
+
if (value > maximum) throw new RangeError(`${label} exceeds its limit`);
|
|
1139
|
+
return value;
|
|
1140
|
+
}
|
|
1141
|
+
function measureProjection(items) {
|
|
1142
|
+
let text = 0;
|
|
1143
|
+
let cells = 0;
|
|
1144
|
+
const add = (value) => {
|
|
1145
|
+
text += value.length;
|
|
1146
|
+
};
|
|
1147
|
+
for (const item of items) {
|
|
1148
|
+
if (item.kind === "paragraph") for (const run of item.runs) add(run.text);
|
|
1149
|
+
else if (item.kind === "table")
|
|
1150
|
+
for (const row of item.rows) {
|
|
1151
|
+
cells += row.length;
|
|
1152
|
+
for (const cell of row) for (const run of cell) add(run.text);
|
|
1153
|
+
}
|
|
1154
|
+
else if (item.kind === "comment")
|
|
1155
|
+
for (const reply of item.replies) {
|
|
1156
|
+
add(reply.author);
|
|
1157
|
+
add(reply.text);
|
|
1158
|
+
add(reply.createdAt);
|
|
1159
|
+
}
|
|
1160
|
+
else if (item.kind === "tracked-change") {
|
|
1161
|
+
add(item.author);
|
|
1162
|
+
add(item.createdAt);
|
|
1163
|
+
}
|
|
1164
|
+
if (text > DOCUMENT_ARTIFACT_QUERY_MAX_TEXT_UTF16 || cells > DOCUMENT_ARTIFACT_QUERY_MAX_TABLE_CELLS)
|
|
1165
|
+
throw new RangeError("document query response metrics exceed their limits");
|
|
1166
|
+
}
|
|
1167
|
+
return { text, cells };
|
|
1168
|
+
}
|
|
1169
|
+
function freezeOptional(base, values) {
|
|
1170
|
+
const output = { ...base };
|
|
1171
|
+
for (const [key, value] of Object.entries(values)) if (value !== void 0) output[key] = value;
|
|
1172
|
+
return Object.freeze(output);
|
|
1173
|
+
}
|
|
1174
|
+
function invalidTag(label) {
|
|
1175
|
+
throw new TypeError(`invalid ${label}`);
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
export {
|
|
1179
|
+
DOCUMENT_ARTIFACT_COMMAND_VERSION,
|
|
1180
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES,
|
|
1181
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS,
|
|
1182
|
+
DOCUMENT_ARTIFACT_COMMAND_MAX_STRING_BYTES,
|
|
1183
|
+
DOCUMENT_ARTIFACT_MAX_TEXT_UTF16,
|
|
1184
|
+
DOCUMENT_ARTIFACT_MAX_TEXT_RUNS,
|
|
1185
|
+
DOCUMENT_ARTIFACT_MAX_TABLE_CELLS,
|
|
1186
|
+
DOCUMENT_ARTIFACT_MAX_STRUCTURAL_COUNTER,
|
|
1187
|
+
DOCUMENT_ARTIFACT_QUERY_VERSION,
|
|
1188
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION,
|
|
1189
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_BYTES,
|
|
1190
|
+
DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,
|
|
1191
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_ITEMS,
|
|
1192
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_TEXT_UTF16,
|
|
1193
|
+
DOCUMENT_ARTIFACT_QUERY_MAX_TABLE_CELLS,
|
|
1194
|
+
encodeDocumentArtifactCommandBatch,
|
|
1195
|
+
decodeDocumentArtifactCommandBatch,
|
|
1196
|
+
assertCanonicalDocumentArtifactCommandBytes,
|
|
1197
|
+
encodeDocumentArtifactQuery,
|
|
1198
|
+
decodeDocumentArtifactQuery,
|
|
1199
|
+
assertCanonicalDocumentArtifactQueryBytes,
|
|
1200
|
+
encodeDocumentArtifactQueryResponse,
|
|
1201
|
+
decodeDocumentArtifactQueryResponse,
|
|
1202
|
+
assertCanonicalDocumentArtifactQueryResponseBytes
|
|
1203
|
+
};
|
|
1204
|
+
//# sourceMappingURL=chunk-RIY7GYQS.js.map
|