miakapi 3.0.31 → 4.0.0-alpha.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 +15 -0
- package/README.md +358 -0
- package/contracts/miakapp-v3.json +6 -0
- package/dist/access-token-provider.d.ts +8 -0
- package/dist/access-token-provider.d.ts.map +1 -0
- package/dist/access-token-provider.js +167 -0
- package/dist/access-token-provider.js.map +1 -0
- package/dist/api.d.ts +224 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +47 -0
- package/dist/api.js.map +1 -0
- package/dist/browser-api.d.ts +113 -0
- package/dist/browser-api.d.ts.map +1 -0
- package/dist/browser-api.js +2 -0
- package/dist/browser-api.js.map +1 -0
- package/dist/browser-client.d.ts +3 -0
- package/dist/browser-client.d.ts.map +1 -0
- package/dist/browser-client.js +678 -0
- package/dist/browser-client.js.map +1 -0
- package/dist/browser-relay-credential-provider.d.ts +3 -0
- package/dist/browser-relay-credential-provider.d.ts.map +1 -0
- package/dist/browser-relay-credential-provider.js +243 -0
- package/dist/browser-relay-credential-provider.js.map +1 -0
- package/dist/browser.d.ts +4 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +4 -0
- package/dist/browser.js.map +1 -0
- package/dist/coordinator.d.ts +3 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +544 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/browser-errors.d.ts +31 -0
- package/dist/internal/browser-errors.d.ts.map +1 -0
- package/dist/internal/browser-errors.js +69 -0
- package/dist/internal/browser-errors.js.map +1 -0
- package/dist/internal/browser-socket.d.ts +8 -0
- package/dist/internal/browser-socket.d.ts.map +1 -0
- package/dist/internal/browser-socket.js +204 -0
- package/dist/internal/browser-socket.js.map +1 -0
- package/dist/internal/calls.d.ts +33 -0
- package/dist/internal/calls.d.ts.map +1 -0
- package/dist/internal/calls.js +525 -0
- package/dist/internal/calls.js.map +1 -0
- package/dist/internal/control-plane-response.d.ts +10 -0
- package/dist/internal/control-plane-response.d.ts.map +1 -0
- package/dist/internal/control-plane-response.js +283 -0
- package/dist/internal/control-plane-response.js.map +1 -0
- package/dist/internal/declarations.d.ts +62 -0
- package/dist/internal/declarations.d.ts.map +1 -0
- package/dist/internal/declarations.js +427 -0
- package/dist/internal/declarations.js.map +1 -0
- package/dist/internal/errors.d.ts +31 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +72 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/events.d.ts +27 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +207 -0
- package/dist/internal/events.js.map +1 -0
- package/dist/internal/presence.d.ts +15 -0
- package/dist/internal/presence.d.ts.map +1 -0
- package/dist/internal/presence.js +99 -0
- package/dist/internal/presence.js.map +1 -0
- package/dist/internal/resources.d.ts +33 -0
- package/dist/internal/resources.d.ts.map +1 -0
- package/dist/internal/resources.js +136 -0
- package/dist/internal/resources.js.map +1 -0
- package/dist/internal/runtime.d.ts +34 -0
- package/dist/internal/runtime.d.ts.map +1 -0
- package/dist/internal/runtime.js +17 -0
- package/dist/internal/runtime.js.map +1 -0
- package/dist/internal/session.d.ts +33 -0
- package/dist/internal/session.d.ts.map +1 -0
- package/dist/internal/session.js +199 -0
- package/dist/internal/session.js.map +1 -0
- package/dist/internal/socket.d.ts +6 -0
- package/dist/internal/socket.d.ts.map +1 -0
- package/dist/internal/socket.js +176 -0
- package/dist/internal/socket.js.map +1 -0
- package/dist/internal/state.d.ts +21 -0
- package/dist/internal/state.d.ts.map +1 -0
- package/dist/internal/state.js +133 -0
- package/dist/internal/state.js.map +1 -0
- package/dist/internal/user-calls.d.ts +27 -0
- package/dist/internal/user-calls.d.ts.map +1 -0
- package/dist/internal/user-calls.js +325 -0
- package/dist/internal/user-calls.js.map +1 -0
- package/dist/internal/user-session.d.ts +36 -0
- package/dist/internal/user-session.d.ts.map +1 -0
- package/dist/internal/user-session.js +250 -0
- package/dist/internal/user-session.js.map +1 -0
- package/dist/internal/user-state.d.ts +21 -0
- package/dist/internal/user-state.d.ts.map +1 -0
- package/dist/internal/user-state.js +240 -0
- package/dist/internal/user-state.js.map +1 -0
- package/dist/internal/validation.d.ts +32 -0
- package/dist/internal/validation.d.ts.map +1 -0
- package/dist/internal/validation.js +553 -0
- package/dist/internal/validation.js.map +1 -0
- package/dist/protocol/codec.d.ts +75 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +1091 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/session.d.ts +14 -0
- package/dist/protocol/session.d.ts.map +1 -0
- package/dist/protocol/session.js +125 -0
- package/dist/protocol/session.js.map +1 -0
- package/dist/protocol/user-session.d.ts +14 -0
- package/dist/protocol/user-session.d.ts.map +1 -0
- package/dist/protocol/user-session.js +116 -0
- package/dist/protocol/user-session.js.map +1 -0
- package/package.json +57 -9
- package/.eslintrc.js +0 -16
- package/.gitattributes +0 -2
- package/main.js +0 -305
- package/miakode.js +0 -56
- package/screenshots/bigGrid.jpg +0 -0
- package/screenshots/formExample.jpg +0 -0
- package/screenshots/properties&table.jpg +0 -0
- package/test.js +0 -45
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import { LIMITS } from '../protocol/codec.js';
|
|
2
|
+
const UTF8 = new TextEncoder();
|
|
3
|
+
const CONTROL_CHARACTER = /\p{Cc}/u;
|
|
4
|
+
const FORBIDDEN_KEYS = new Set(['__proto__', 'prototype', 'constructor']);
|
|
5
|
+
const COORDINATOR_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
6
|
+
const HOME_ID = /^[a-z][a-z0-9-]{1,61}[a-z0-9]$/;
|
|
7
|
+
const BASE64URL = /^[A-Za-z0-9_-]+$/;
|
|
8
|
+
function accountValueBytes(budget, bytes, label) {
|
|
9
|
+
budget.bytes += bytes;
|
|
10
|
+
if (budget.bytes > LIMITS.frameBytes) {
|
|
11
|
+
throw new RangeError(`${label} exceeds the aggregate value byte limit`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function accountDeclarationValue(budget, valueBytes, label) {
|
|
15
|
+
budget.values += 1;
|
|
16
|
+
if (budget.values > LIMITS.values) {
|
|
17
|
+
throw new RangeError(`${label} exceeds the aggregate value count limit`);
|
|
18
|
+
}
|
|
19
|
+
accountValueBytes(budget, valueBytes + 1, label);
|
|
20
|
+
}
|
|
21
|
+
function isPlainRecord(value) {
|
|
22
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
23
|
+
return false;
|
|
24
|
+
const prototype = Object.getPrototypeOf(value);
|
|
25
|
+
return prototype === Object.prototype || prototype === null;
|
|
26
|
+
}
|
|
27
|
+
function exactObject(value, required, optional, label) {
|
|
28
|
+
if (!isPlainRecord(value))
|
|
29
|
+
throw new TypeError(`${label} must be an object`);
|
|
30
|
+
const allowed = new Set([...required, ...optional]);
|
|
31
|
+
const keys = Object.keys(value);
|
|
32
|
+
if (Reflect.ownKeys(value).length !== keys.length
|
|
33
|
+
|| keys.some((key) => !allowed.has(key))
|
|
34
|
+
|| required.some((key) => !Object.hasOwn(value, key))) {
|
|
35
|
+
throw new TypeError(`${label} has an invalid shape`);
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function hasUnpairedSurrogate(value) {
|
|
40
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
41
|
+
const unit = value.charCodeAt(index);
|
|
42
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
43
|
+
const following = value.charCodeAt(index + 1);
|
|
44
|
+
if (index + 1 >= value.length || following < 0xdc00 || following > 0xdfff)
|
|
45
|
+
return true;
|
|
46
|
+
index += 1;
|
|
47
|
+
}
|
|
48
|
+
else if (unit >= 0xdc00 && unit <= 0xdfff) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function boundedString(value, minimumBytes, maximumBytes, label, allowControlCharacters = false) {
|
|
55
|
+
if (typeof value !== 'string'
|
|
56
|
+
|| hasUnpairedSurrogate(value)
|
|
57
|
+
|| (!allowControlCharacters && CONTROL_CHARACTER.test(value))) {
|
|
58
|
+
throw new TypeError(`${label} must be a safe UTF-8 string`);
|
|
59
|
+
}
|
|
60
|
+
const bytes = UTF8.encode(value).byteLength;
|
|
61
|
+
if (bytes < minimumBytes || bytes > maximumBytes) {
|
|
62
|
+
throw new RangeError(`${label} must contain ${minimumBytes} to ${maximumBytes} UTF-8 bytes`);
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
export function validateCoordinatorName(value, label = 'coordinator name') {
|
|
67
|
+
const name = boundedString(value, 1, 64, label);
|
|
68
|
+
if (!COORDINATOR_NAME.test(name))
|
|
69
|
+
throw new TypeError(`${label} is invalid`);
|
|
70
|
+
return name;
|
|
71
|
+
}
|
|
72
|
+
export function validateStructuredName(value, label) {
|
|
73
|
+
const name = boundedString(value, 1, 256, label);
|
|
74
|
+
if (name.includes('*') || name.startsWith('.') || name.endsWith('.') || name.includes('..')) {
|
|
75
|
+
throw new TypeError(`${label} must be a dotted name without empty segments`);
|
|
76
|
+
}
|
|
77
|
+
return name;
|
|
78
|
+
}
|
|
79
|
+
export function validatePattern(value, label) {
|
|
80
|
+
const pattern = boundedString(value, 1, 256, label);
|
|
81
|
+
validateStructuredName(pattern.endsWith('.*') ? pattern.slice(0, -2) : pattern, label);
|
|
82
|
+
return pattern;
|
|
83
|
+
}
|
|
84
|
+
function cloneProtocolValue(value, label, depth, budget, ancestors) {
|
|
85
|
+
if (depth > LIMITS.depth)
|
|
86
|
+
throw new RangeError(`${label} exceeds the value depth limit`);
|
|
87
|
+
budget.values += 1;
|
|
88
|
+
if (budget.values > LIMITS.values)
|
|
89
|
+
throw new RangeError(`${label} exceeds the value count limit`);
|
|
90
|
+
accountValueBytes(budget, 1, label);
|
|
91
|
+
if (value === null || typeof value === 'boolean')
|
|
92
|
+
return value;
|
|
93
|
+
if (typeof value === 'number') {
|
|
94
|
+
if (!Number.isFinite(value)
|
|
95
|
+
|| Object.is(value, -0)
|
|
96
|
+
|| (Number.isInteger(value) && !Number.isSafeInteger(value))) {
|
|
97
|
+
throw new TypeError(`${label} contains an invalid number`);
|
|
98
|
+
}
|
|
99
|
+
accountValueBytes(budget, 8, label);
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value === 'string') {
|
|
103
|
+
const result = boundedString(value, 0, LIMITS.stringBytes, label, true);
|
|
104
|
+
accountValueBytes(budget, UTF8.encode(result).byteLength, label);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
if (value instanceof Uint8Array) {
|
|
108
|
+
if (value.byteLength > LIMITS.binaryBytes) {
|
|
109
|
+
throw new RangeError(`${label} exceeds the binary value limit`);
|
|
110
|
+
}
|
|
111
|
+
accountValueBytes(budget, value.byteLength, label);
|
|
112
|
+
return value.slice();
|
|
113
|
+
}
|
|
114
|
+
if (typeof value !== 'object')
|
|
115
|
+
throw new TypeError(`${label} is not a protocol value`);
|
|
116
|
+
if (ancestors.has(value))
|
|
117
|
+
throw new TypeError(`${label} contains a cycle`);
|
|
118
|
+
ancestors.add(value);
|
|
119
|
+
try {
|
|
120
|
+
if (Array.isArray(value)) {
|
|
121
|
+
if (value.length > LIMITS.arrayItems)
|
|
122
|
+
throw new RangeError(`${label} exceeds the array limit`);
|
|
123
|
+
accountValueBytes(budget, 4, label);
|
|
124
|
+
const output = [];
|
|
125
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
126
|
+
if (!Object.hasOwn(value, index))
|
|
127
|
+
throw new TypeError(`${label} contains a sparse array`);
|
|
128
|
+
output.push(cloneProtocolValue(value[index], `${label}[${index}]`, depth + 1, budget, ancestors));
|
|
129
|
+
}
|
|
130
|
+
Object.freeze(output);
|
|
131
|
+
return output;
|
|
132
|
+
}
|
|
133
|
+
if (!isPlainRecord(value))
|
|
134
|
+
throw new TypeError(`${label} contains a non-plain object`);
|
|
135
|
+
const keys = Object.keys(value);
|
|
136
|
+
if (Reflect.ownKeys(value).length !== keys.length) {
|
|
137
|
+
throw new TypeError(`${label} contains symbolic or non-enumerable keys`);
|
|
138
|
+
}
|
|
139
|
+
if (keys.length > LIMITS.mapEntries)
|
|
140
|
+
throw new RangeError(`${label} exceeds the map limit`);
|
|
141
|
+
accountValueBytes(budget, 4, label);
|
|
142
|
+
const output = {};
|
|
143
|
+
for (const key of keys) {
|
|
144
|
+
boundedString(key, 0, LIMITS.mapKeyBytes, `${label} key`, true);
|
|
145
|
+
if (FORBIDDEN_KEYS.has(key))
|
|
146
|
+
throw new TypeError(`${label} contains a reserved key`);
|
|
147
|
+
accountValueBytes(budget, UTF8.encode(key).byteLength + 1, label);
|
|
148
|
+
output[key] = cloneProtocolValue(value[key], `${label}.${key}`, depth + 1, budget, ancestors);
|
|
149
|
+
}
|
|
150
|
+
Object.freeze(output);
|
|
151
|
+
return output;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
ancestors.delete(value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function validateProtocolValue(value, label = 'value') {
|
|
158
|
+
return cloneProtocolValue(value, label, 1, { values: 0, bytes: 0 }, new Set());
|
|
159
|
+
}
|
|
160
|
+
function uniqueStrings(values, validator, label, budget) {
|
|
161
|
+
if (!Array.isArray(values))
|
|
162
|
+
throw new TypeError(`${label} must be an array`);
|
|
163
|
+
if (values.length > LIMITS.declarationsPerCoordinator) {
|
|
164
|
+
throw new RangeError(`${label} exceeds the declaration limit`);
|
|
165
|
+
}
|
|
166
|
+
const output = [];
|
|
167
|
+
const seen = new Set();
|
|
168
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
169
|
+
const entry = validator(values[index], `${label}[${index}]`);
|
|
170
|
+
if (seen.has(entry))
|
|
171
|
+
throw new TypeError(`${label} contains a duplicate`);
|
|
172
|
+
if (budget !== undefined) {
|
|
173
|
+
accountDeclarationValue(budget, UTF8.encode(entry).byteLength, label);
|
|
174
|
+
}
|
|
175
|
+
seen.add(entry);
|
|
176
|
+
output.push(entry);
|
|
177
|
+
}
|
|
178
|
+
return Object.freeze(output);
|
|
179
|
+
}
|
|
180
|
+
function validateOpaqueId(value, label) {
|
|
181
|
+
return boundedString(value, 1, 128, label);
|
|
182
|
+
}
|
|
183
|
+
export function validateStateEntries(value) {
|
|
184
|
+
if (!isPlainRecord(value))
|
|
185
|
+
throw new TypeError('state declaration must be an object');
|
|
186
|
+
const keys = Object.keys(value);
|
|
187
|
+
if (Reflect.ownKeys(value).length !== keys.length) {
|
|
188
|
+
throw new TypeError('state declaration contains invalid keys');
|
|
189
|
+
}
|
|
190
|
+
if (keys.length > LIMITS.statePathsPerCoordinator) {
|
|
191
|
+
throw new RangeError('state declaration exceeds the path limit');
|
|
192
|
+
}
|
|
193
|
+
const output = Object.create(null);
|
|
194
|
+
const budget = { values: 0, bytes: 0 };
|
|
195
|
+
for (const path of keys) {
|
|
196
|
+
validateStructuredName(path, `state path ${path}`);
|
|
197
|
+
accountValueBytes(budget, UTF8.encode(path).byteLength + 5, 'state declaration');
|
|
198
|
+
output[path] = cloneProtocolValue(value[path], `state.${path}`, 1, budget, new Set());
|
|
199
|
+
}
|
|
200
|
+
return Object.freeze(output);
|
|
201
|
+
}
|
|
202
|
+
export function validateStateMutations(value) {
|
|
203
|
+
if (!Array.isArray(value) || value.length === 0 || value.length > LIMITS.statePathsPerCoordinator) {
|
|
204
|
+
throw new TypeError('state mutations must be a non-empty bounded array');
|
|
205
|
+
}
|
|
206
|
+
const paths = new Set();
|
|
207
|
+
const output = [];
|
|
208
|
+
const budget = { values: 0, bytes: 0 };
|
|
209
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
210
|
+
const entry = exactObject(value[index], ['path'], ['value', 'delete'], `mutation[${index}]`);
|
|
211
|
+
const path = validateStructuredName(entry.path, `mutation[${index}].path`);
|
|
212
|
+
if (paths.has(path))
|
|
213
|
+
throw new TypeError('state mutations contain a duplicate path');
|
|
214
|
+
paths.add(path);
|
|
215
|
+
accountValueBytes(budget, UTF8.encode(path).byteLength + 6, 'state mutations');
|
|
216
|
+
if (Object.hasOwn(entry, 'value') === Object.hasOwn(entry, 'delete')) {
|
|
217
|
+
throw new TypeError(`mutation[${index}] must set or delete exactly once`);
|
|
218
|
+
}
|
|
219
|
+
if (Object.hasOwn(entry, 'value')) {
|
|
220
|
+
output.push(Object.freeze({
|
|
221
|
+
path,
|
|
222
|
+
value: cloneProtocolValue(entry.value, `mutation[${index}].value`, 1, budget, new Set()),
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
if (entry.delete !== true)
|
|
227
|
+
throw new TypeError(`mutation[${index}].delete must be true`);
|
|
228
|
+
output.push(Object.freeze({ path, delete: true }));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return Object.freeze(output);
|
|
232
|
+
}
|
|
233
|
+
export function validateStateAccess(value) {
|
|
234
|
+
if (!Array.isArray(value) || value.length > LIMITS.declarationsPerCoordinator) {
|
|
235
|
+
throw new TypeError('state access declarations must be a bounded array');
|
|
236
|
+
}
|
|
237
|
+
const users = new Set();
|
|
238
|
+
const budget = { values: 1, bytes: 5 };
|
|
239
|
+
return Object.freeze(value.map((raw, index) => {
|
|
240
|
+
const entry = exactObject(raw, ['userId', 'patterns'], [], `stateAccess[${index}]`);
|
|
241
|
+
const userId = validateOpaqueId(entry.userId, `stateAccess[${index}].userId`);
|
|
242
|
+
if (users.has(userId))
|
|
243
|
+
throw new TypeError('state access contains a duplicate user');
|
|
244
|
+
users.add(userId);
|
|
245
|
+
accountDeclarationValue(budget, UTF8.encode(userId).byteLength + 5, 'state access');
|
|
246
|
+
return Object.freeze({
|
|
247
|
+
userId,
|
|
248
|
+
patterns: uniqueStrings(entry.patterns, validatePattern, `stateAccess[${index}].patterns`, budget),
|
|
249
|
+
});
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
export function validateEventAccess(value) {
|
|
253
|
+
if (!Array.isArray(value) || value.length > LIMITS.declarationsPerCoordinator) {
|
|
254
|
+
throw new TypeError('event access declarations must be a bounded array');
|
|
255
|
+
}
|
|
256
|
+
const users = new Set();
|
|
257
|
+
const budget = { values: 1, bytes: 5 };
|
|
258
|
+
return Object.freeze(value.map((raw, index) => {
|
|
259
|
+
const entry = exactObject(raw, ['userId', 'publish', 'subscribe'], [], `eventAccess[${index}]`);
|
|
260
|
+
const userId = validateOpaqueId(entry.userId, `eventAccess[${index}].userId`);
|
|
261
|
+
if (users.has(userId))
|
|
262
|
+
throw new TypeError('event access contains a duplicate user');
|
|
263
|
+
users.add(userId);
|
|
264
|
+
accountDeclarationValue(budget, UTF8.encode(userId).byteLength + 9, 'event access');
|
|
265
|
+
return Object.freeze({
|
|
266
|
+
userId,
|
|
267
|
+
publish: uniqueStrings(entry.publish, validatePattern, `eventAccess[${index}].publish`, budget),
|
|
268
|
+
subscribe: uniqueStrings(entry.subscribe, validatePattern, `eventAccess[${index}].subscribe`, budget),
|
|
269
|
+
});
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
export function validateEventDeclarations(value) {
|
|
273
|
+
if (!Array.isArray(value) || value.length > LIMITS.declarationsPerCoordinator) {
|
|
274
|
+
throw new TypeError('event declarations must be a bounded array');
|
|
275
|
+
}
|
|
276
|
+
const topics = new Set();
|
|
277
|
+
const budget = { values: 1, bytes: 5 };
|
|
278
|
+
return Object.freeze(value.map((raw, index) => {
|
|
279
|
+
const entry = exactObject(raw, ['topic', 'directions'], [], `events[${index}]`);
|
|
280
|
+
const topic = validateStructuredName(entry.topic, `events[${index}].topic`);
|
|
281
|
+
if (topics.has(topic))
|
|
282
|
+
throw new TypeError('event declarations contain a duplicate topic');
|
|
283
|
+
topics.add(topic);
|
|
284
|
+
accountDeclarationValue(budget, UTF8.encode(topic).byteLength + 10, 'event declarations');
|
|
285
|
+
if (!Number.isInteger(entry.directions)
|
|
286
|
+
|| typeof entry.directions !== 'number'
|
|
287
|
+
|| entry.directions < 1
|
|
288
|
+
|| entry.directions > 0x0f) {
|
|
289
|
+
throw new TypeError(`events[${index}].directions is invalid`);
|
|
290
|
+
}
|
|
291
|
+
return Object.freeze({ topic, directions: entry.directions });
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
export function validateFunctions(value) {
|
|
295
|
+
if (!isPlainRecord(value))
|
|
296
|
+
throw new TypeError('function declaration must be an object');
|
|
297
|
+
const names = Object.keys(value);
|
|
298
|
+
if (Reflect.ownKeys(value).length !== names.length
|
|
299
|
+
|| names.length > LIMITS.declarationsPerCoordinator) {
|
|
300
|
+
throw new TypeError('function declaration has an invalid shape');
|
|
301
|
+
}
|
|
302
|
+
const output = Object.create(null);
|
|
303
|
+
const budget = { values: 1, bytes: 5 };
|
|
304
|
+
for (const name of names) {
|
|
305
|
+
validateStructuredName(name, `function ${name}`);
|
|
306
|
+
if (name === 'miakapp.join')
|
|
307
|
+
throw new TypeError('miakapp.join is reserved');
|
|
308
|
+
const handler = value[name];
|
|
309
|
+
if (!isFunctionHandler(handler))
|
|
310
|
+
throw new TypeError(`function ${name} has no handler`);
|
|
311
|
+
accountDeclarationValue(budget, UTF8.encode(name).byteLength + 5, 'function declaration');
|
|
312
|
+
output[name] = handler;
|
|
313
|
+
}
|
|
314
|
+
return Object.freeze(output);
|
|
315
|
+
}
|
|
316
|
+
function isFunctionHandler(value) {
|
|
317
|
+
return typeof value === 'function';
|
|
318
|
+
}
|
|
319
|
+
function isAccessTokenProvider(value) {
|
|
320
|
+
return value !== null
|
|
321
|
+
&& typeof value === 'object'
|
|
322
|
+
&& 'getAccessToken' in value
|
|
323
|
+
&& typeof value.getAccessToken === 'function';
|
|
324
|
+
}
|
|
325
|
+
function isCoordinatorLogger(value) {
|
|
326
|
+
return value !== null
|
|
327
|
+
&& typeof value === 'object'
|
|
328
|
+
&& 'write' in value
|
|
329
|
+
&& typeof value.write === 'function';
|
|
330
|
+
}
|
|
331
|
+
function isBrowserRelayCredentialProvider(value) {
|
|
332
|
+
return value !== null
|
|
333
|
+
&& typeof value === 'object'
|
|
334
|
+
&& 'getCredential' in value
|
|
335
|
+
&& typeof value.getCredential === 'function';
|
|
336
|
+
}
|
|
337
|
+
function isBrowserClientLogger(value) {
|
|
338
|
+
return value !== null
|
|
339
|
+
&& typeof value === 'object'
|
|
340
|
+
&& 'write' in value
|
|
341
|
+
&& typeof value.write === 'function';
|
|
342
|
+
}
|
|
343
|
+
export function validateConfiguration(value) {
|
|
344
|
+
const configuration = exactObject(value, ['state', 'stateAccess', 'events', 'eventAccess', 'functions'], [], 'configuration');
|
|
345
|
+
return Object.freeze({
|
|
346
|
+
state: validateStateEntries(configuration.state),
|
|
347
|
+
stateAccess: validateStateAccess(configuration.stateAccess),
|
|
348
|
+
events: validateEventDeclarations(configuration.events),
|
|
349
|
+
eventAccess: validateEventAccess(configuration.eventAccess),
|
|
350
|
+
functions: validateFunctions(configuration.functions),
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
export function validateCoordinatorOptions(value) {
|
|
354
|
+
const options = exactObject(value, ['name', 'accessTokenProvider'], ['logger'], 'options');
|
|
355
|
+
const provider = options.accessTokenProvider;
|
|
356
|
+
if (!isAccessTokenProvider(provider)) {
|
|
357
|
+
throw new TypeError('options.accessTokenProvider must implement getAccessToken');
|
|
358
|
+
}
|
|
359
|
+
const logger = options.logger;
|
|
360
|
+
if (logger !== undefined && !isCoordinatorLogger(logger)) {
|
|
361
|
+
throw new TypeError('options.logger must implement write');
|
|
362
|
+
}
|
|
363
|
+
const name = validateCoordinatorName(options.name);
|
|
364
|
+
return logger === undefined
|
|
365
|
+
? Object.freeze({ name, accessTokenProvider: provider })
|
|
366
|
+
: Object.freeze({ name, accessTokenProvider: provider, logger });
|
|
367
|
+
}
|
|
368
|
+
export function validateAccessToken(value, now) {
|
|
369
|
+
const token = exactObject(value, ['relayUrl', 'token', 'expiresAtMs'], [], 'access token');
|
|
370
|
+
const relayUrl = validateRelayUrl(token.relayUrl, 'access token relayUrl');
|
|
371
|
+
const expiresAtMs = token.expiresAtMs;
|
|
372
|
+
if (!Number.isSafeInteger(expiresAtMs)
|
|
373
|
+
|| typeof expiresAtMs !== 'number'
|
|
374
|
+
|| expiresAtMs <= now) {
|
|
375
|
+
throw new RangeError('access token expiry must be a future safe integer');
|
|
376
|
+
}
|
|
377
|
+
return Object.freeze({
|
|
378
|
+
relayUrl,
|
|
379
|
+
token: boundedString(token.token, 1, 16_384, 'access token token', true),
|
|
380
|
+
expiresAtMs,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
export function validateRelayUrl(value, label = 'relay URL') {
|
|
384
|
+
const relayUrl = boundedString(value, 1, 2_048, label);
|
|
385
|
+
let url;
|
|
386
|
+
try {
|
|
387
|
+
url = new URL(relayUrl);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
throw new TypeError(`${label} is invalid`);
|
|
391
|
+
}
|
|
392
|
+
if (url.protocol !== 'wss:'
|
|
393
|
+
|| !url.hostname
|
|
394
|
+
|| url.username
|
|
395
|
+
|| url.password
|
|
396
|
+
|| url.hash
|
|
397
|
+
|| url.search
|
|
398
|
+
|| !url.pathname.endsWith('/ws')) {
|
|
399
|
+
throw new TypeError(`${label} must be a secure WebSocket URL ending in /ws`);
|
|
400
|
+
}
|
|
401
|
+
return url.href;
|
|
402
|
+
}
|
|
403
|
+
export function validateBrowserRelayCredential(value, now) {
|
|
404
|
+
const credential = exactObject(value, ['relayUrl', 'accessToken', 'expiresAtMs'], [], 'browser relay credential');
|
|
405
|
+
const relayUrl = validateRelayUrl(credential.relayUrl, 'browser relay credential relayUrl');
|
|
406
|
+
if (relayUrl !== credential.relayUrl) {
|
|
407
|
+
throw new TypeError('browser relay credential relayUrl must be canonical');
|
|
408
|
+
}
|
|
409
|
+
const accessToken = boundedString(credential.accessToken, 1, 8_192, 'browser relay credential accessToken');
|
|
410
|
+
const segments = accessToken.split('.');
|
|
411
|
+
if (segments.length !== 3 || segments.some((segment) => !BASE64URL.test(segment))) {
|
|
412
|
+
throw new TypeError('browser relay credential accessToken must be compact');
|
|
413
|
+
}
|
|
414
|
+
const expiresAtMs = credential.expiresAtMs;
|
|
415
|
+
if (typeof expiresAtMs !== 'number'
|
|
416
|
+
|| !Number.isSafeInteger(expiresAtMs)
|
|
417
|
+
|| expiresAtMs <= now) {
|
|
418
|
+
throw new RangeError('browser relay credential expiry must be a future safe integer');
|
|
419
|
+
}
|
|
420
|
+
return Object.freeze({ relayUrl, accessToken, expiresAtMs });
|
|
421
|
+
}
|
|
422
|
+
export function validateBrowserClientOptions(value) {
|
|
423
|
+
const options = exactObject(value, ['homeId', 'credentialProvider'], ['logger'], 'options');
|
|
424
|
+
const homeId = boundedString(options.homeId, 3, 63, 'options.homeId');
|
|
425
|
+
if (!HOME_ID.test(homeId))
|
|
426
|
+
throw new TypeError('options.homeId is invalid');
|
|
427
|
+
if (!isBrowserRelayCredentialProvider(options.credentialProvider)) {
|
|
428
|
+
throw new TypeError('options.credentialProvider must implement getCredential');
|
|
429
|
+
}
|
|
430
|
+
if (options.logger !== undefined && !isBrowserClientLogger(options.logger)) {
|
|
431
|
+
throw new TypeError('options.logger must implement write');
|
|
432
|
+
}
|
|
433
|
+
const base = Object.freeze({
|
|
434
|
+
homeId,
|
|
435
|
+
credentialProvider: options.credentialProvider,
|
|
436
|
+
});
|
|
437
|
+
return options.logger === undefined
|
|
438
|
+
? base
|
|
439
|
+
: Object.freeze({ ...base, logger: options.logger });
|
|
440
|
+
}
|
|
441
|
+
export function validateBrowserCallOptions(value) {
|
|
442
|
+
const options = exactObject(value, ['function', 'arguments', 'timeoutMs'], ['idempotencyKey', 'signal'], 'call options');
|
|
443
|
+
const validated = validateStartCallOptions(options);
|
|
444
|
+
return Object.freeze({
|
|
445
|
+
function: validated.function,
|
|
446
|
+
arguments: validated.arguments,
|
|
447
|
+
timeoutMs: validated.timeoutMs,
|
|
448
|
+
...(validated.idempotencyKey === undefined ? {} : { idempotencyKey: validated.idempotencyKey }),
|
|
449
|
+
...(validated.signal === undefined ? {} : { signal: validated.signal }),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
function validateTarget(value, label) {
|
|
453
|
+
const entry = exactObject(value, ['kind'], ['id'], label);
|
|
454
|
+
if (entry.kind === 'default') {
|
|
455
|
+
if (Object.hasOwn(entry, 'id'))
|
|
456
|
+
throw new TypeError(`${label} default target has no id`);
|
|
457
|
+
return Object.freeze({ kind: 'default' });
|
|
458
|
+
}
|
|
459
|
+
if (entry.kind === 'user_session') {
|
|
460
|
+
if (!Number.isSafeInteger(entry.id) || typeof entry.id !== 'number' || entry.id < 1) {
|
|
461
|
+
throw new TypeError(`${label}.id must be a positive session identifier`);
|
|
462
|
+
}
|
|
463
|
+
return Object.freeze({ kind: 'user_session', id: entry.id });
|
|
464
|
+
}
|
|
465
|
+
if (entry.kind === 'coordinator') {
|
|
466
|
+
return Object.freeze({ kind: 'coordinator', id: validateCoordinatorName(entry.id, `${label}.id`) });
|
|
467
|
+
}
|
|
468
|
+
throw new TypeError(`${label}.kind is invalid`);
|
|
469
|
+
}
|
|
470
|
+
export function validateEventTarget(value) {
|
|
471
|
+
return validateTarget(value, 'event target');
|
|
472
|
+
}
|
|
473
|
+
export function validateStartCallOptions(value) {
|
|
474
|
+
const options = exactObject(value, ['function', 'arguments', 'timeoutMs'], ['target', 'idempotencyKey', 'signal'], 'call options');
|
|
475
|
+
if (!Number.isInteger(options.timeoutMs)
|
|
476
|
+
|| typeof options.timeoutMs !== 'number'
|
|
477
|
+
|| options.timeoutMs < 1
|
|
478
|
+
|| options.timeoutMs > LIMITS.callTimeoutMs) {
|
|
479
|
+
throw new RangeError('call options timeoutMs is out of range');
|
|
480
|
+
}
|
|
481
|
+
if (options.signal !== undefined && !(options.signal instanceof AbortSignal)) {
|
|
482
|
+
throw new TypeError('call options signal must be an AbortSignal');
|
|
483
|
+
}
|
|
484
|
+
const base = {
|
|
485
|
+
function: validateStructuredName(options.function, 'call options function'),
|
|
486
|
+
arguments: validateProtocolValue(options.arguments, 'call options arguments'),
|
|
487
|
+
timeoutMs: options.timeoutMs,
|
|
488
|
+
};
|
|
489
|
+
const target = options.target === undefined ? undefined : validateTarget(options.target, 'call target');
|
|
490
|
+
const idempotencyKey = options.idempotencyKey === undefined
|
|
491
|
+
? undefined
|
|
492
|
+
: boundedString(options.idempotencyKey, 1, 128, 'call options idempotencyKey', true);
|
|
493
|
+
if (target === undefined && idempotencyKey === undefined && options.signal === undefined) {
|
|
494
|
+
return Object.freeze(base);
|
|
495
|
+
}
|
|
496
|
+
return Object.freeze({
|
|
497
|
+
...base,
|
|
498
|
+
...(target === undefined ? {} : { target }),
|
|
499
|
+
...(idempotencyKey === undefined ? {} : { idempotencyKey }),
|
|
500
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
export function validateSignal(value, label) {
|
|
504
|
+
if (value === undefined)
|
|
505
|
+
return undefined;
|
|
506
|
+
if (!(value instanceof AbortSignal))
|
|
507
|
+
throw new TypeError(`${label} must be an AbortSignal`);
|
|
508
|
+
return value;
|
|
509
|
+
}
|
|
510
|
+
export function validateStartOptions(value) {
|
|
511
|
+
const options = exactObject(value, [], ['signal'], 'start options');
|
|
512
|
+
return validateSignal(options.signal, 'start signal');
|
|
513
|
+
}
|
|
514
|
+
export function validateStopOptions(value) {
|
|
515
|
+
const options = exactObject(value, [], ['deadlineMs'], 'stop options');
|
|
516
|
+
const deadlineMs = options.deadlineMs ?? 5_000;
|
|
517
|
+
if (!Number.isSafeInteger(deadlineMs)
|
|
518
|
+
|| typeof deadlineMs !== 'number'
|
|
519
|
+
|| deadlineMs < 0
|
|
520
|
+
|| deadlineMs > 300_000) {
|
|
521
|
+
throw new RangeError('stop deadlineMs must be between 0 and 300000');
|
|
522
|
+
}
|
|
523
|
+
return deadlineMs;
|
|
524
|
+
}
|
|
525
|
+
export function validateDeclarationOptions(value, label) {
|
|
526
|
+
const options = exactObject(value, [], ['signal'], `${label} options`);
|
|
527
|
+
return validateSignal(options.signal, `${label} signal`);
|
|
528
|
+
}
|
|
529
|
+
export function validateOperationOptions(value, label) {
|
|
530
|
+
const options = exactObject(value, [], ['signal'], `${label} options`);
|
|
531
|
+
return validateSignal(options.signal, `${label} signal`);
|
|
532
|
+
}
|
|
533
|
+
export function validateEventPublishOptions(value) {
|
|
534
|
+
const options = exactObject(value, [], ['signal', 'target'], 'event options');
|
|
535
|
+
const signal = validateSignal(options.signal, 'event signal');
|
|
536
|
+
const target = options.target === undefined ? undefined : validateEventTarget(options.target);
|
|
537
|
+
if (signal === undefined) {
|
|
538
|
+
if (target === undefined)
|
|
539
|
+
return Object.freeze({});
|
|
540
|
+
return Object.freeze({ target });
|
|
541
|
+
}
|
|
542
|
+
if (target === undefined)
|
|
543
|
+
return Object.freeze({ signal });
|
|
544
|
+
return Object.freeze({ signal, target });
|
|
545
|
+
}
|
|
546
|
+
export function targetFields(target) {
|
|
547
|
+
if (target === undefined || target.kind === 'default')
|
|
548
|
+
return [0, null];
|
|
549
|
+
if (target.kind === 'user_session')
|
|
550
|
+
return [1, target.id];
|
|
551
|
+
return [2, target.id];
|
|
552
|
+
}
|
|
553
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/internal/validation.ts"],"names":[],"mappings":"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"}
|