@x12i/memorix-service 3.13.0 → 3.14.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/analytics/host.d.ts +2 -2
- package/dist/analytics/host.d.ts.map +1 -1
- package/dist/analytics/host.js.map +1 -1
- package/dist/analytics/read-row.d.ts +33 -0
- package/dist/analytics/read-row.d.ts.map +1 -0
- package/dist/analytics/read-row.js +76 -0
- package/dist/analytics/read-row.js.map +1 -0
- package/dist/analytics/tracker.d.ts +14 -0
- package/dist/analytics/tracker.d.ts.map +1 -1
- package/dist/analytics/tracker.js +55 -17
- package/dist/analytics/tracker.js.map +1 -1
- package/dist/catalog-bridge.d.ts +4 -4
- package/dist/catalog-bridge.d.ts.map +1 -1
- package/dist/catalog-bridge.js +63 -34
- package/dist/catalog-bridge.js.map +1 -1
- package/dist/metadata-view.d.ts +30 -0
- package/dist/metadata-view.d.ts.map +1 -0
- package/dist/metadata-view.js +67 -0
- package/dist/metadata-view.js.map +1 -0
- package/dist/nexum-analysis/enqueue.d.ts +1 -1
- package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
- package/dist/nexum-analysis/enqueue.js +2 -1
- package/dist/nexum-analysis/enqueue.js.map +1 -1
- package/dist/openapi/openapi.json +115 -11
- package/dist/platform.d.ts +7 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +68 -29
- package/dist/platform.js.map +1 -1
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +123 -12
- package/dist/routes/data.js.map +1 -1
- package/dist/writes/content-write.d.ts +38 -1
- package/dist/writes/content-write.d.ts.map +1 -1
- package/dist/writes/content-write.js +67 -7
- package/dist/writes/content-write.js.map +1 -1
- package/dist/writes/error-shape.d.ts.map +1 -1
- package/dist/writes/error-shape.js +8 -1
- package/dist/writes/error-shape.js.map +1 -1
- package/dist/writes/queued-write.d.ts +38 -0
- package/dist/writes/queued-write.d.ts.map +1 -0
- package/dist/writes/queued-write.js +288 -0
- package/dist/writes/queued-write.js.map +1 -0
- package/dist/writes/receipt-store.d.ts +52 -2
- package/dist/writes/receipt-store.d.ts.map +1 -1
- package/dist/writes/receipt-store.js +191 -2
- package/dist/writes/receipt-store.js.map +1 -1
- package/dist/writes/worker.d.ts +21 -0
- package/dist/writes/worker.d.ts.map +1 -1
- package/dist/writes/worker.js +81 -1
- package/dist/writes/worker.js.map +1 -1
- package/openapi/openapi.json +115 -11
- package/package.json +1 -1
package/dist/analytics/host.d.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* for the `@datasources` backfill, and cell cleanup on rebuild.
|
|
4
4
|
*/
|
|
5
5
|
import type { MongoClient } from "mongodb";
|
|
6
|
-
import type {
|
|
6
|
+
import type { MetadataView } from "../metadata-view.js";
|
|
7
7
|
import { type AnalyticsMetadataView, type HeadSource } from "./tracker.js";
|
|
8
|
-
export declare function createAnalyticsMetadataViews(metadata:
|
|
8
|
+
export declare function createAnalyticsMetadataViews(metadata: MetadataView): {
|
|
9
9
|
viewFor(agentIds: string[]): AnalyticsMetadataView;
|
|
10
10
|
invalidate(): void;
|
|
11
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/analytics/host.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/analytics/host.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAsB,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ/F,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,YAAY,GAAG;IACpE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC;IACnD,UAAU,IAAI,IAAI,CAAC;CACpB,CAqFA;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CA4CrE;AAMD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/analytics/host.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAA+C,MAAM,cAAc,CAAC;AAI/F,SAAS,UAAU,CAAC,CAAU;IAC5B,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/analytics/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the analytics tracker reads one stored row, and which failures are worth retrying.
|
|
3
|
+
*/
|
|
4
|
+
import { type LogicalV2Record, type MemorixContentReader } from "@x12i/memorix-data";
|
|
5
|
+
import type { MemorixScope } from "../scope.js";
|
|
6
|
+
export type RowAddress = {
|
|
7
|
+
objectType: string;
|
|
8
|
+
contentType: string;
|
|
9
|
+
recordId: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Read the row for a record id.
|
|
13
|
+
*
|
|
14
|
+
* A discriminated content type (for example `process-manifest`, keyed by `data.kind`)
|
|
15
|
+
* holds one instance per discriminator value under the same record id, and the reader
|
|
16
|
+
* refuses an exact read that does not name one. The write events the tracker receives
|
|
17
|
+
* carry only the record id. For those types, take the most recently modified instance,
|
|
18
|
+
* found through the `recordId` index. Other types read exactly as before.
|
|
19
|
+
*
|
|
20
|
+
* Throws `READ_NOT_FOUND` when no instance exists, so callers treat the row as gone.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readRow(reader: MemorixContentReader, scope: MemorixScope, address: RowAddress): Promise<LogicalV2Record>;
|
|
23
|
+
/**
|
|
24
|
+
* True when retrying the task cannot succeed. Anything else, including storage
|
|
25
|
+
* errors and an unavailable reader, is treated as temporary.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isPermanentFailure(err: unknown): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Logs each distinct problem once per window. Repeats inside the window are counted
|
|
30
|
+
* and reported with the next line, so one bad content type cannot flood the log.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createProblemReporter(log: (message: string, detail?: Record<string, unknown>) => void, now: () => number, windowMs?: number): (key: string, message: string, detail: Record<string, unknown>) => void;
|
|
33
|
+
//# sourceMappingURL=read-row.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-row.d.ts","sourceRoot":"","sources":["../../src/analytics/read-row.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAMvF;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAeD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EAChE,GAAG,EAAE,MAAM,MAAM,EACjB,QAAQ,SAAc,GACrB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAYzE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the analytics tracker reads one stored row, and which failures are worth retrying.
|
|
3
|
+
*/
|
|
4
|
+
import { ReaderError } from "@x12i/memorix-data";
|
|
5
|
+
function codeOf(err) {
|
|
6
|
+
return err && typeof err === "object" && "code" in err ? String(err.code) : "";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Read the row for a record id.
|
|
10
|
+
*
|
|
11
|
+
* A discriminated content type (for example `process-manifest`, keyed by `data.kind`)
|
|
12
|
+
* holds one instance per discriminator value under the same record id, and the reader
|
|
13
|
+
* refuses an exact read that does not name one. The write events the tracker receives
|
|
14
|
+
* carry only the record id. For those types, take the most recently modified instance,
|
|
15
|
+
* found through the `recordId` index. Other types read exactly as before.
|
|
16
|
+
*
|
|
17
|
+
* Throws `READ_NOT_FOUND` when no instance exists, so callers treat the row as gone.
|
|
18
|
+
*/
|
|
19
|
+
export async function readRow(reader, scope, address) {
|
|
20
|
+
try {
|
|
21
|
+
return await reader.getContent(scope, address);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
if (codeOf(err) !== "READ_DISCRIMINATOR_REQUIRED")
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
const page = await reader.listContent(scope, {
|
|
28
|
+
objectType: address.objectType,
|
|
29
|
+
contentType: address.contentType,
|
|
30
|
+
filters: [{ field: "recordId", op: "eq", value: address.recordId }],
|
|
31
|
+
sort: [{ field: "_system.modifiedAt", direction: "desc" }],
|
|
32
|
+
limit: 1,
|
|
33
|
+
});
|
|
34
|
+
const row = page.items[0];
|
|
35
|
+
if (!row) {
|
|
36
|
+
throw new ReaderError("READ_NOT_FOUND", `No ${address.objectType}/${address.contentType} row for ${address.recordId}`, { recordId: address.recordId });
|
|
37
|
+
}
|
|
38
|
+
return row;
|
|
39
|
+
}
|
|
40
|
+
/** Reads that fail because the request is wrong. Retrying cannot change the answer. */
|
|
41
|
+
const PERMANENT_READ_CODES = new Set([
|
|
42
|
+
"READ_DISCRIMINATOR_REQUIRED",
|
|
43
|
+
"READ_QUERY_INVALID",
|
|
44
|
+
"READ_QUERY_INJECTION",
|
|
45
|
+
"READ_QUERY_FIELD_FORBIDDEN",
|
|
46
|
+
"READ_QUERY_NOT_PUSHDOWN",
|
|
47
|
+
"READ_ABSTRACT_UNKNOWN",
|
|
48
|
+
"ROUTE_UNKNOWN_OBJECT_TYPE",
|
|
49
|
+
"ROUTE_UNKNOWN_CONTENT_TYPE",
|
|
50
|
+
"ROUTE_CATEGORY_MISMATCH",
|
|
51
|
+
]);
|
|
52
|
+
/**
|
|
53
|
+
* True when retrying the task cannot succeed. Anything else, including storage
|
|
54
|
+
* errors and an unavailable reader, is treated as temporary.
|
|
55
|
+
*/
|
|
56
|
+
export function isPermanentFailure(err) {
|
|
57
|
+
return PERMANENT_READ_CODES.has(codeOf(err));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Logs each distinct problem once per window. Repeats inside the window are counted
|
|
61
|
+
* and reported with the next line, so one bad content type cannot flood the log.
|
|
62
|
+
*/
|
|
63
|
+
export function createProblemReporter(log, now, windowMs = 10 * 60_000) {
|
|
64
|
+
const last = new Map();
|
|
65
|
+
return (key, message, detail) => {
|
|
66
|
+
const t = now();
|
|
67
|
+
const prev = last.get(key);
|
|
68
|
+
if (prev && t - prev.at < windowMs) {
|
|
69
|
+
prev.suppressed++;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
last.set(key, { at: t, suppressed: 0 });
|
|
73
|
+
log(message, prev && prev.suppressed > 0 ? { ...detail, alsoSkippedSinceLastReport: prev.suppressed } : detail);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=read-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-row.js","sourceRoot":"","sources":["../../src/analytics/read-row.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,7 @@ export declare class AnalyticsTracker {
|
|
|
115
115
|
private readonly inflight;
|
|
116
116
|
private readonly memoryIndexes;
|
|
117
117
|
private readonly indexes;
|
|
118
|
+
private readonly reportSkipped;
|
|
118
119
|
private closed;
|
|
119
120
|
constructor(options: AnalyticsTrackerOptions);
|
|
120
121
|
private indexStore;
|
|
@@ -137,6 +138,19 @@ export declare class AnalyticsTracker {
|
|
|
137
138
|
private enqueue;
|
|
138
139
|
private scheduleDrain;
|
|
139
140
|
private drain;
|
|
141
|
+
private processGroup;
|
|
142
|
+
/**
|
|
143
|
+
* Process tasks that share a counter. A group applies nothing until every read in it
|
|
144
|
+
* has succeeded, so a failed attempt can be repeated on a smaller group without
|
|
145
|
+
* applying anything twice.
|
|
146
|
+
*
|
|
147
|
+
* - A permanent failure (the request is wrong, not the system) splits the group in
|
|
148
|
+
* half until the failing task is alone. Only that task is reported, once, and it is
|
|
149
|
+
* not retried. The rest of the group is processed normally.
|
|
150
|
+
* - A temporary failure (storage down, reader unavailable) keeps the whole group and
|
|
151
|
+
* retries it with backoff. Splitting would multiply failing calls during an outage.
|
|
152
|
+
*/
|
|
153
|
+
private runGroup;
|
|
140
154
|
private retry;
|
|
141
155
|
private applyEntries;
|
|
142
156
|
private subjectEntry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EAEpB,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ServiceError } from "../errors.js";
|
|
2
2
|
import { replaceAnalyticsContentGrants } from "./content-allow.js";
|
|
3
|
+
import { createProblemReporter, isPermanentFailure, readRow } from "./read-row.js";
|
|
3
4
|
import { abstractTypesOf, contentSelections, definitionHash, populationKey, usesDatasource, validateCounterDefinition, } from "./definition.js";
|
|
4
5
|
import { countexScope } from "./engine.js";
|
|
5
6
|
import { buildEnvelope, hasScopePlaceholder, resolveRecordIds, scopeValuesOf, summarizePair, topLeaderIds, } from "./materializer.js";
|
|
@@ -49,6 +50,7 @@ export class AnalyticsTracker {
|
|
|
49
50
|
inflight = new Set();
|
|
50
51
|
memoryIndexes = new Map();
|
|
51
52
|
indexes;
|
|
53
|
+
reportSkipped = createProblemReporter((message, extra) => this.log(message, extra), () => this.now().getTime());
|
|
52
54
|
closed = false;
|
|
53
55
|
constructor(options) {
|
|
54
56
|
this.o = {
|
|
@@ -282,22 +284,58 @@ export class AnalyticsTracker {
|
|
|
282
284
|
else
|
|
283
285
|
groups.set(g, [t]);
|
|
284
286
|
}
|
|
285
|
-
for (const tasks of groups.values())
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
287
|
+
for (const tasks of groups.values())
|
|
288
|
+
await this.runGroup(tasks);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async processGroup(tasks) {
|
|
292
|
+
if (tasks[0].kind === "abstract")
|
|
293
|
+
await this.processAbstract(tasks);
|
|
294
|
+
else if (tasks[0].kind === "content")
|
|
295
|
+
await this.processContent(tasks);
|
|
296
|
+
else
|
|
297
|
+
await this.processHeads(tasks);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Process tasks that share a counter. A group applies nothing until every read in it
|
|
301
|
+
* has succeeded, so a failed attempt can be repeated on a smaller group without
|
|
302
|
+
* applying anything twice.
|
|
303
|
+
*
|
|
304
|
+
* - A permanent failure (the request is wrong, not the system) splits the group in
|
|
305
|
+
* half until the failing task is alone. Only that task is reported, once, and it is
|
|
306
|
+
* not retried. The rest of the group is processed normally.
|
|
307
|
+
* - A temporary failure (storage down, reader unavailable) keeps the whole group and
|
|
308
|
+
* retries it with backoff. Splitting would multiply failing calls during an outage.
|
|
309
|
+
*/
|
|
310
|
+
async runGroup(tasks) {
|
|
311
|
+
if (tasks.length === 0)
|
|
312
|
+
return;
|
|
313
|
+
try {
|
|
314
|
+
await this.processGroup(tasks);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
if (!isPermanentFailure(err)) {
|
|
319
|
+
this.log("analytics: reconcile failed; retrying", { error: String(err), tasks: tasks.length });
|
|
320
|
+
for (const t of tasks)
|
|
321
|
+
this.retry(t);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (tasks.length === 1) {
|
|
325
|
+
const t = tasks[0];
|
|
326
|
+
this.reportSkipped(`${t.kind}${SEP}${"objectType" in t ? t.objectType : ""}${SEP}${"contentType" in t ? t.contentType : ""}${SEP}${errorCode(err)}`, "analytics: skipped a record it cannot read; not retrying", {
|
|
327
|
+
kind: t.kind,
|
|
328
|
+
...("objectType" in t ? { objectType: t.objectType, contentType: "contentType" in t ? t.contentType : undefined } : {}),
|
|
329
|
+
recordId: t.recordId,
|
|
330
|
+
code: errorCode(err),
|
|
331
|
+
error: String(err),
|
|
332
|
+
});
|
|
333
|
+
return;
|
|
299
334
|
}
|
|
300
335
|
}
|
|
336
|
+
const mid = Math.ceil(tasks.length / 2);
|
|
337
|
+
await this.runGroup(tasks.slice(0, mid));
|
|
338
|
+
await this.runGroup(tasks.slice(mid));
|
|
301
339
|
}
|
|
302
340
|
retry(task) {
|
|
303
341
|
const attempts = task.attempts + 1;
|
|
@@ -448,7 +486,7 @@ export class AnalyticsTracker {
|
|
|
448
486
|
let datasource = null;
|
|
449
487
|
if (usesDatasource(def)) {
|
|
450
488
|
try {
|
|
451
|
-
const record = await reader
|
|
489
|
+
const record = await readRow(reader, scope, {
|
|
452
490
|
objectType: item.objectType,
|
|
453
491
|
contentType: item.contentType,
|
|
454
492
|
recordId: item.recordId,
|
|
@@ -490,7 +528,7 @@ export class AnalyticsTracker {
|
|
|
490
528
|
async loadContentSubject(reader, scope, def, objectType, contentType, recordId) {
|
|
491
529
|
let record;
|
|
492
530
|
try {
|
|
493
|
-
record = await reader
|
|
531
|
+
record = await readRow(reader, scope, { objectType, contentType, recordId });
|
|
494
532
|
}
|
|
495
533
|
catch (err) {
|
|
496
534
|
if (isGone(err))
|
|
@@ -562,7 +600,7 @@ export class AnalyticsTracker {
|
|
|
562
600
|
const scope = { orgId, agentIds: t.agentIds };
|
|
563
601
|
let datasource;
|
|
564
602
|
try {
|
|
565
|
-
const record = await this.o.portsFor(scope).reader
|
|
603
|
+
const record = await readRow(this.o.portsFor(scope).reader, scope, {
|
|
566
604
|
objectType: t.objectType,
|
|
567
605
|
contentType: t.contentType,
|
|
568
606
|
recordId: t.recordId,
|