@ryanstark24/sfgraph-core 1.1.6 → 1.2.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/analyze/__tests__/find-nodes.test.d.ts +2 -0
- package/dist/analyze/__tests__/find-nodes.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/find-nodes.test.js +129 -0
- package/dist/analyze/__tests__/find-nodes.test.js.map +1 -0
- package/dist/analyze/__tests__/findings.test.d.ts +2 -0
- package/dist/analyze/__tests__/findings.test.d.ts.map +1 -0
- package/dist/analyze/__tests__/findings.test.js +90 -0
- package/dist/analyze/__tests__/findings.test.js.map +1 -0
- package/dist/analyze/find-nodes.d.ts +38 -0
- package/dist/analyze/find-nodes.d.ts.map +1 -0
- package/dist/analyze/find-nodes.js +51 -0
- package/dist/analyze/find-nodes.js.map +1 -0
- package/dist/analyze/findings.d.ts +86 -0
- package/dist/analyze/findings.d.ts.map +1 -0
- package/dist/analyze/findings.js +143 -0
- package/dist/analyze/findings.js.map +1 -0
- package/dist/analyze/index.d.ts +2 -0
- package/dist/analyze/index.d.ts.map +1 -1
- package/dist/analyze/index.js +2 -0
- package/dist/analyze/index.js.map +1 -1
- package/dist/analyze/test-coverage.d.ts +0 -2
- package/dist/analyze/test-coverage.d.ts.map +1 -1
- package/dist/analyze/test-coverage.js +0 -10
- package/dist/analyze/test-coverage.js.map +1 -1
- package/dist/domain/edge-fact.d.ts +25 -0
- package/dist/domain/edge-fact.d.ts.map +1 -1
- package/dist/domain/rel-types.d.ts +4 -0
- package/dist/domain/rel-types.d.ts.map +1 -1
- package/dist/domain/rel-types.js +7 -0
- package/dist/domain/rel-types.js.map +1 -1
- package/dist/embedding/__tests__/embed.test.d.ts +2 -0
- package/dist/embedding/__tests__/embed.test.d.ts.map +1 -0
- package/dist/embedding/__tests__/embed.test.js +72 -0
- package/dist/embedding/__tests__/embed.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/liveness.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/liveness.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/liveness.test.js +148 -0
- package/dist/extractors/live-org/__tests__/liveness.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.js +174 -0
- package/dist/extractors/live-org/__tests__/mcd-baseline.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js +75 -0
- package/dist/extractors/live-org/__tests__/metadata-read-batch.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js +135 -0
- package/dist/extractors/live-org/__tests__/omnistudio-retrieve.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts +2 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.d.ts.map +1 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.js +118 -0
- package/dist/extractors/live-org/__tests__/soql-rebatch.test.js.map +1 -0
- package/dist/extractors/live-org/__tests__/vlocity-runner.test.js +27 -0
- package/dist/extractors/live-org/__tests__/vlocity-runner.test.js.map +1 -1
- package/dist/extractors/live-org/bulk-retrieve.d.ts +7 -0
- package/dist/extractors/live-org/bulk-retrieve.d.ts.map +1 -1
- package/dist/extractors/live-org/bulk-retrieve.js +10 -1
- package/dist/extractors/live-org/bulk-retrieve.js.map +1 -1
- package/dist/extractors/live-org/extractors/mcd-baseline.d.ts +60 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.js +120 -0
- package/dist/extractors/live-org/extractors/mcd-baseline.js.map +1 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts +23 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.d.ts.map +1 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.js +172 -0
- package/dist/extractors/live-org/extractors/omnistudio-retrieve.js.map +1 -0
- package/dist/extractors/live-org/rate-limit.d.ts +57 -0
- package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
- package/dist/extractors/live-org/rate-limit.js +93 -8
- package/dist/extractors/live-org/rate-limit.js.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.d.ts +1 -1
- package/dist/extractors/live-org/vlocity/runner.d.ts.map +1 -1
- package/dist/extractors/live-org/vlocity/runner.js +20 -9
- package/dist/extractors/live-org/vlocity/runner.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js +3 -0
- package/dist/ingest/__tests__/multi-org-orchestrator.test.js.map +1 -1
- package/dist/ingest/live-ingest.d.ts +70 -1
- package/dist/ingest/live-ingest.d.ts.map +1 -1
- package/dist/ingest/live-ingest.js +109 -7
- package/dist/ingest/live-ingest.js.map +1 -1
- package/dist/parsers/__tests__/edge-provenance.test.d.ts +2 -0
- package/dist/parsers/__tests__/edge-provenance.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/edge-provenance.test.js +44 -0
- package/dist/parsers/__tests__/edge-provenance.test.js.map +1 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js +72 -0
- package/dist/parsers/__tests__/lwc-bindings.test.js.map +1 -1
- package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts +2 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.js +75 -0
- package/dist/parsers/__tests__/mcd-gap-fills.test.js.map +1 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts +2 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.js +163 -0
- package/dist/parsers/__tests__/omnistudio-overlap.test.js.map +1 -0
- package/dist/parsers/__tests__/omnistudio.golden.test.js +51 -3
- package/dist/parsers/__tests__/omnistudio.golden.test.js.map +1 -1
- package/dist/parsers/__tests__/reflection-walker.test.d.ts +2 -0
- package/dist/parsers/__tests__/reflection-walker.test.d.ts.map +1 -0
- package/dist/parsers/__tests__/reflection-walker.test.js +162 -0
- package/dist/parsers/__tests__/reflection-walker.test.js.map +1 -0
- package/dist/parsers/__tests__/vlocity.golden.test.js +106 -5
- package/dist/parsers/__tests__/vlocity.golden.test.js.map +1 -1
- package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.js +54 -0
- package/dist/parsers/apex/__tests__/is-test-attribute.test.js.map +1 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts +2 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.d.ts.map +1 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.js +82 -0
- package/dist/parsers/apex/__tests__/regex-arg-count.test.js.map +1 -0
- package/dist/parsers/apex/class.d.ts.map +1 -1
- package/dist/parsers/apex/class.js +103 -5
- package/dist/parsers/apex/class.js.map +1 -1
- package/dist/parsers/common.d.ts +4 -1
- package/dist/parsers/common.d.ts.map +1 -1
- package/dist/parsers/common.js +15 -2
- package/dist/parsers/common.js.map +1 -1
- package/dist/parsers/contract.d.ts +0 -2
- package/dist/parsers/contract.d.ts.map +1 -1
- package/dist/parsers/contract.js +0 -7
- package/dist/parsers/contract.js.map +1 -1
- package/dist/parsers/generic/reflection-walker.d.ts +90 -0
- package/dist/parsers/generic/reflection-walker.d.ts.map +1 -0
- package/dist/parsers/generic/reflection-walker.js +195 -0
- package/dist/parsers/generic/reflection-walker.js.map +1 -0
- package/dist/parsers/lwc/html-visitor.d.ts.map +1 -1
- package/dist/parsers/lwc/html-visitor.js +81 -3
- package/dist/parsers/lwc/html-visitor.js.map +1 -1
- package/dist/parsers/object/object.d.ts.map +1 -1
- package/dist/parsers/object/object.js +34 -0
- package/dist/parsers/object/object.js.map +1 -1
- package/dist/parsers/omnistudio/integration-procedure.d.ts.map +1 -1
- package/dist/parsers/omnistudio/integration-procedure.js +6 -3
- package/dist/parsers/omnistudio/integration-procedure.js.map +1 -1
- package/dist/parsers/omnistudio/overlap-detector.d.ts +50 -0
- package/dist/parsers/omnistudio/overlap-detector.d.ts.map +1 -0
- package/dist/parsers/omnistudio/overlap-detector.js +129 -0
- package/dist/parsers/omnistudio/overlap-detector.js.map +1 -0
- package/dist/parsers/omnistudio/process.d.ts.map +1 -1
- package/dist/parsers/omnistudio/process.js +17 -4
- package/dist/parsers/omnistudio/process.js.map +1 -1
- package/dist/parsers/omnistudio/ui-card.d.ts.map +1 -1
- package/dist/parsers/omnistudio/ui-card.js +6 -3
- package/dist/parsers/omnistudio/ui-card.js.map +1 -1
- package/dist/parsers/vlocity/common.d.ts +1 -2
- package/dist/parsers/vlocity/common.d.ts.map +1 -1
- package/dist/parsers/vlocity/common.js +0 -3
- package/dist/parsers/vlocity/common.js.map +1 -1
- package/dist/parsers/vlocity/integration-procedure.d.ts.map +1 -1
- package/dist/parsers/vlocity/integration-procedure.js +19 -3
- package/dist/parsers/vlocity/integration-procedure.js.map +1 -1
- package/dist/parsers/vlocity/omni-script.d.ts.map +1 -1
- package/dist/parsers/vlocity/omni-script.js +5 -2
- package/dist/parsers/vlocity/omni-script.js.map +1 -1
- package/dist/parsers/vlocity/vlocity-card.d.ts.map +1 -1
- package/dist/parsers/vlocity/vlocity-card.js +5 -2
- package/dist/parsers/vlocity/vlocity-card.js.map +1 -1
- package/dist/render/__tests__/sarif.test.d.ts +2 -0
- package/dist/render/__tests__/sarif.test.d.ts.map +1 -0
- package/dist/render/__tests__/sarif.test.js +129 -0
- package/dist/render/__tests__/sarif.test.js.map +1 -0
- package/dist/render/sarif.d.ts +94 -0
- package/dist/render/sarif.d.ts.map +1 -0
- package/dist/render/sarif.js +133 -0
- package/dist/render/sarif.js.map +1 -0
- package/dist/storage/__tests__/analysis-tables-migration.test.js +1 -1
- package/dist/storage/__tests__/migrations.test.js +4 -4
- package/dist/storage/__tests__/rename-stability.test.d.ts +2 -0
- package/dist/storage/__tests__/rename-stability.test.d.ts.map +1 -0
- package/dist/storage/__tests__/rename-stability.test.js +135 -0
- package/dist/storage/__tests__/rename-stability.test.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/interfaces.d.ts +3 -0
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.d.ts +6 -0
- package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
- package/dist/storage/sqlite/graph-store.js +8 -0
- package/dist/storage/sqlite/graph-store.js.map +1 -1
- package/dist/storage/sqlite/migrations.d.ts.map +1 -1
- package/dist/storage/sqlite/migrations.js +19 -0
- package/dist/storage/sqlite/migrations.js.map +1 -1
- package/dist/storage/sqlite/rename-stability.d.ts +94 -0
- package/dist/storage/sqlite/rename-stability.d.ts.map +1 -0
- package/dist/storage/sqlite/rename-stability.js +96 -0
- package/dist/storage/sqlite/rename-stability.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { asOrgId } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
import { REL_TYPES } from "../../../domain/index.js";
|
|
3
|
+
import { makeEdge, stripNs } from "../../../parsers/common.js";
|
|
4
|
+
import { scheduleQuery, soqlWithTimeout } from "../rate-limit.js";
|
|
5
|
+
/**
|
|
6
|
+
* Fast-path baseline coverage for long-tail metadata via the Tooling
|
|
7
|
+
* `MetadataComponentDependency` SObject (MCD). The platform pre-computes
|
|
8
|
+
* dependency edges for ~50 component types; sfgraph hand-rolls parsers for
|
|
9
|
+
* ~20 of them. For the rest (Layouts, FieldSets, EmailTemplates, Tabs,
|
|
10
|
+
* Groups, Queues to start) MCD is the path of least resistance — one
|
|
11
|
+
* Tooling SOQL per type-direction, zero parser code, edges immediately
|
|
12
|
+
* available.
|
|
13
|
+
*
|
|
14
|
+
* Coexistence with parsed edges: every MCD-sourced edge uses relType
|
|
15
|
+
* `REFERENCES` with `attributes.source: 'mcd'`. Real parsers emit more
|
|
16
|
+
* specific relTypes (READS_FIELD, INVOKES_FLOW, etc.) which live in
|
|
17
|
+
* different edge tables — so parsed and MCD edges coexist rather than
|
|
18
|
+
* compete. Consumers wanting MCD-only coverage filter on the source
|
|
19
|
+
* attribute; consumers wanting "all known dependencies" union both.
|
|
20
|
+
*
|
|
21
|
+
* Known caveats (from Pitfalls research):
|
|
22
|
+
* - MCD enforces a 2,000-row hard cap per query with no OFFSET — we
|
|
23
|
+
* paginate via `MetadataComponentId > '<lastId>'` ordered ascending.
|
|
24
|
+
* - MCD has async-refresh lag (minutes between metadata change and MCD
|
|
25
|
+
* reflecting it). Three documented gap classes (lookup-field → object,
|
|
26
|
+
* picklist → GlobalValueSet, dependent-picklist → controlling-field)
|
|
27
|
+
* are missing entirely; those are W2-04's job, not this baseline.
|
|
28
|
+
* - Some types (e.g. CustomLabels) show no rows on certain orgs even
|
|
29
|
+
* when usage exists — this is a platform issue, surfaced as zero
|
|
30
|
+
* edges rather than an error.
|
|
31
|
+
*/
|
|
32
|
+
/** Long-tail metadata types covered by the baseline. Each gets one query
|
|
33
|
+
* in each direction (component-as-source, component-as-target) so any
|
|
34
|
+
* edge involving a long-tail type lands in the graph. */
|
|
35
|
+
export const MCD_LONG_TAIL_TYPES = [
|
|
36
|
+
"Layout",
|
|
37
|
+
"FieldSet",
|
|
38
|
+
"EmailTemplate",
|
|
39
|
+
"CustomTab",
|
|
40
|
+
"Group",
|
|
41
|
+
"Queue",
|
|
42
|
+
];
|
|
43
|
+
function qname(type, name, ns, ctxNs) {
|
|
44
|
+
const stripped = stripNs(name, ns ?? ctxNs);
|
|
45
|
+
return `${type}:${stripped}`;
|
|
46
|
+
}
|
|
47
|
+
async function fetchPaginated(conn, baseWhereClause, label, pageSize, maxPages, onError) {
|
|
48
|
+
const rows = [];
|
|
49
|
+
let lastId = "";
|
|
50
|
+
for (let page = 0; page < maxPages; page += 1) {
|
|
51
|
+
const idFilter = lastId ? ` AND Id > '${lastId.replace(/'/g, "\\'")}'` : "";
|
|
52
|
+
const soql = "SELECT Id, MetadataComponentId, MetadataComponentType, MetadataComponentName, MetadataComponentNamespace, " +
|
|
53
|
+
"RefMetadataComponentId, RefMetadataComponentType, RefMetadataComponentName, RefMetadataComponentNamespace " +
|
|
54
|
+
`FROM MetadataComponentDependency WHERE ${baseWhereClause}${idFilter} ` +
|
|
55
|
+
`ORDER BY Id ASC LIMIT ${pageSize}`;
|
|
56
|
+
let res = null;
|
|
57
|
+
try {
|
|
58
|
+
res = (await scheduleQuery(() => soqlWithTimeout(conn.tooling.query(soql), label)));
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
onError?.(label, e);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
const page_rows = res?.records ?? [];
|
|
65
|
+
if (page_rows.length === 0)
|
|
66
|
+
break;
|
|
67
|
+
rows.push(...page_rows);
|
|
68
|
+
if (page_rows.length < pageSize)
|
|
69
|
+
break; // last page
|
|
70
|
+
const tail = page_rows[page_rows.length - 1];
|
|
71
|
+
if (!tail || tail.Id === lastId)
|
|
72
|
+
break; // defensive: no progress
|
|
73
|
+
lastId = tail.Id;
|
|
74
|
+
}
|
|
75
|
+
return rows;
|
|
76
|
+
}
|
|
77
|
+
export async function runMcdBaseline(conn, opts) {
|
|
78
|
+
const orgId = typeof opts.orgId === "string" ? asOrgId(opts.orgId) : opts.orgId;
|
|
79
|
+
const types = opts.types ?? MCD_LONG_TAIL_TYPES;
|
|
80
|
+
const pageSize = opts.pageSize ?? 2000;
|
|
81
|
+
const maxPages = opts.maxPagesPerDirection ?? 50;
|
|
82
|
+
const ctxNs = opts.ctx.namespace ?? null;
|
|
83
|
+
const edges = [];
|
|
84
|
+
const byType = {};
|
|
85
|
+
// Dedupe across the two query directions — when both A and B are long-tail
|
|
86
|
+
// types and A→B exists, both queries surface it; we want to emit one edge.
|
|
87
|
+
const seen = new Set();
|
|
88
|
+
for (const type of types) {
|
|
89
|
+
byType[type] = { asSource: 0, asTarget: 0 };
|
|
90
|
+
// Direction 1: component-as-source ("what does this Layout reference?")
|
|
91
|
+
const asSourceRows = await fetchPaginated(conn, `MetadataComponentType = '${type}'`, `mcd-baseline:${type}:as-source`, pageSize, maxPages, opts.onError);
|
|
92
|
+
byType[type].asSource = asSourceRows.length;
|
|
93
|
+
// Direction 2: component-as-target ("what references this Layout?")
|
|
94
|
+
const asTargetRows = await fetchPaginated(conn, `RefMetadataComponentType = '${type}'`, `mcd-baseline:${type}:as-target`, pageSize, maxPages, opts.onError);
|
|
95
|
+
byType[type].asTarget = asTargetRows.length;
|
|
96
|
+
for (const row of [...asSourceRows, ...asTargetRows]) {
|
|
97
|
+
const src = qname(row.MetadataComponentType, row.MetadataComponentName, row.MetadataComponentNamespace ?? null, ctxNs);
|
|
98
|
+
const dst = qname(row.RefMetadataComponentType, row.RefMetadataComponentName, row.RefMetadataComponentNamespace ?? null, ctxNs);
|
|
99
|
+
const key = `${src}|${dst}`;
|
|
100
|
+
if (seen.has(key))
|
|
101
|
+
continue;
|
|
102
|
+
seen.add(key);
|
|
103
|
+
// `isDynamicReference` heuristic (W2-04 will deepen this) — when an
|
|
104
|
+
// MCD row's MetadataComponentId equals MetadataComponentName, the
|
|
105
|
+
// platform recorded a literal Id reference (e.g. `'003xxx...'` in
|
|
106
|
+
// Apex source) rather than a name-resolved one. Flag the edge so
|
|
107
|
+
// consumers can distinguish.
|
|
108
|
+
const dynamic = row.MetadataComponentId === row.MetadataComponentName ||
|
|
109
|
+
row.RefMetadataComponentId === row.RefMetadataComponentName;
|
|
110
|
+
edges.push(makeEdge(opts.ctx, src, REL_TYPES.REFERENCES, dst, {
|
|
111
|
+
source: "mcd",
|
|
112
|
+
mcdSrcType: row.MetadataComponentType,
|
|
113
|
+
mcdDstType: row.RefMetadataComponentType,
|
|
114
|
+
...(dynamic ? { dynamic: true } : {}),
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { edges, byType };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=mcd-baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcd-baseline.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/mcd-baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RawMember } from "../../interfaces/metadata-source.js";
|
|
2
|
+
export interface OmnistudioRetrieveOpts {
|
|
3
|
+
/** Org API version, e.g. "60.0". Used in retrieve request envelope. */
|
|
4
|
+
apiVersion: string;
|
|
5
|
+
/** Called on per-type or per-zip failure. Mirrors the W1-01 onError
|
|
6
|
+
* contract used by the Vlocity runner. */
|
|
7
|
+
onError?: (label: string, err: Error) => void;
|
|
8
|
+
}
|
|
9
|
+
interface SfLimitInfo {
|
|
10
|
+
current: number;
|
|
11
|
+
limit: number;
|
|
12
|
+
}
|
|
13
|
+
/** Decide whether to skip a retrieve based on current quota utilisation.
|
|
14
|
+
* Conservative: when in doubt (no limit info available) we proceed. */
|
|
15
|
+
export declare function shouldSkipForQuota(limit: SfLimitInfo | null): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Async iterator yielding XML envelopes for OmniStudio-on-Core types via
|
|
18
|
+
* Metadata API `retrieve()`. Falls back silently (yields nothing) on
|
|
19
|
+
* orgs without the capability or when quota would be exhausted.
|
|
20
|
+
*/
|
|
21
|
+
export declare function iterOmnistudioRetrieve(conn: any, orgId: string, opts: OmnistudioRetrieveOpts): AsyncIterable<RawMember>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=omnistudio-retrieve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnistudio-retrieve.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio-retrieve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAoDrE,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB;+CAC2C;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/C;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAgBD;wEACwE;AACxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAGrE;AA4CD;;;;GAIG;AACH,wBAAuB,sBAAsB,CAC3C,IAAI,EAAE,GAAG,EACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,sBAAsB,GAC3B,aAAa,CAAC,SAAS,CAAC,CAwE1B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import JSZip from "jszip";
|
|
3
|
+
import { METADATA_CATEGORY } from "../../../domain/index.js";
|
|
4
|
+
import { withTimeout } from "../rate-limit.js";
|
|
5
|
+
/**
|
|
6
|
+
* OmniStudio-on-Core retrieval via Metadata API `retrieve()` rather than
|
|
7
|
+
* SOQL on the standard SObjects. SOQL gives you `OmniProcess.PropertySet`
|
|
8
|
+
* and `OmniProcessElement.PropertySet` as JSON blobs — useful, but the
|
|
9
|
+
* platform omits design-time XML constructs that only the Metadata API
|
|
10
|
+
* envelope carries (conditional branches inside IPs, layout config on
|
|
11
|
+
* UI cards, embedded server-script references on DataTransforms).
|
|
12
|
+
*
|
|
13
|
+
* This extractor runs **alongside** the SOQL path rather than replacing
|
|
14
|
+
* it: SOQL has lower latency for "what processes exist + their element
|
|
15
|
+
* graph"; retrieve() has higher fidelity for "what does this process
|
|
16
|
+
* actually do." Parsers can choose which input to consume per use case.
|
|
17
|
+
*
|
|
18
|
+
* Constraints, all from W2-02's research:
|
|
19
|
+
* - Metadata API has a documented org-wide quota of 10,000 retrieve
|
|
20
|
+
* calls per 24h. We track the response's `Sforce-Limit-Info` header
|
|
21
|
+
* when available and bail out at 90% utilisation rather than blow
|
|
22
|
+
* the budget on a single ingest.
|
|
23
|
+
* - retrieve() is async — call returns a locator with an async process
|
|
24
|
+
* ID; we poll via `checkRetrieveStatus`. jsforce's
|
|
25
|
+
* `RetrieveResultLocator.complete()` wraps the polling loop.
|
|
26
|
+
* - `package.xml` can list up to 5,000 components per call. Our types
|
|
27
|
+
* are wildcards (`<members>*</members>`), which DOES count against
|
|
28
|
+
* the cap if the org has 5k+ of any one type — chunk by listing
|
|
29
|
+
* first and slicing.
|
|
30
|
+
*
|
|
31
|
+
* Capability-gated by `caps.omnistudioOncore`; the caller (bulk-retrieve)
|
|
32
|
+
* additionally gates on the opt-in `enableOmnistudioRetrieve` flag from
|
|
33
|
+
* LiveIngestOpts.
|
|
34
|
+
*/
|
|
35
|
+
/** OmniStudio-on-Core Metadata API type names. These differ from the
|
|
36
|
+
* Vlocity DataPack type vocabulary — the cross-flavor resolver and
|
|
37
|
+
* overlap detector understand both. */
|
|
38
|
+
const RETRIEVE_TYPES = ["OmniUiCard", "OmniIntegrationProcedure", "OmniDataTransform"];
|
|
39
|
+
/** Polling cadence for `retrieve()` job status. Salesforce typically
|
|
40
|
+
* finishes within 5-15s for small types; aggressive polling burns
|
|
41
|
+
* rate-limit headroom for no value. */
|
|
42
|
+
const POLL_INTERVAL_MS = 3_000;
|
|
43
|
+
/** Hard ceiling on per-retrieve wall time. Large orgs (5k+ components
|
|
44
|
+
* of a single type) legitimately take 60-90s; the bisection / quota
|
|
45
|
+
* guard handles the catastrophic case. */
|
|
46
|
+
const RETRIEVE_TIMEOUT_MS = 180_000;
|
|
47
|
+
/** Conservative quota utilisation threshold. When usage exceeds this
|
|
48
|
+
* fraction of the daily 10k limit, skip remaining retrieves and
|
|
49
|
+
* surface a warning. Leaves headroom for downstream operations. */
|
|
50
|
+
const QUOTA_SKIP_THRESHOLD = 0.9;
|
|
51
|
+
/** Parse the `Sforce-Limit-Info` header which Salesforce attaches to most
|
|
52
|
+
* REST/SOAP responses: `api-usage=12345/15000`. Returns null if absent
|
|
53
|
+
* or malformed — caller assumes "enough quota" in that case rather
|
|
54
|
+
* than refusing to proceed. */
|
|
55
|
+
function parseLimitInfo(header) {
|
|
56
|
+
if (!header)
|
|
57
|
+
return null;
|
|
58
|
+
const m = header.match(/api-usage=(\d+)\/(\d+)/);
|
|
59
|
+
if (!m)
|
|
60
|
+
return null;
|
|
61
|
+
const current = Number.parseInt(m[1] ?? "", 10);
|
|
62
|
+
const limit = Number.parseInt(m[2] ?? "", 10);
|
|
63
|
+
if (!Number.isFinite(current) || !Number.isFinite(limit) || limit <= 0)
|
|
64
|
+
return null;
|
|
65
|
+
return { current, limit };
|
|
66
|
+
}
|
|
67
|
+
/** Decide whether to skip a retrieve based on current quota utilisation.
|
|
68
|
+
* Conservative: when in doubt (no limit info available) we proceed. */
|
|
69
|
+
export function shouldSkipForQuota(limit) {
|
|
70
|
+
if (!limit)
|
|
71
|
+
return false;
|
|
72
|
+
return limit.current / limit.limit >= QUOTA_SKIP_THRESHOLD;
|
|
73
|
+
}
|
|
74
|
+
/** Yield one RawMember per file extracted from the retrieve zip. The
|
|
75
|
+
* `category` is set to OMNI_PROCESS uniformly — the parser layer
|
|
76
|
+
* discriminates on the file path / XML root element. */
|
|
77
|
+
async function* yieldFromZip(zipBase64, orgId, type) {
|
|
78
|
+
const buf = Buffer.from(zipBase64, "base64");
|
|
79
|
+
const zip = await JSZip.loadAsync(buf);
|
|
80
|
+
for (const [path, file] of Object.entries(zip.files)) {
|
|
81
|
+
if (file.dir)
|
|
82
|
+
continue;
|
|
83
|
+
// Skip the manifest file — it's metadata about the retrieve, not a
|
|
84
|
+
// component definition. Path looks like `unpackaged/package.xml`.
|
|
85
|
+
if (path.endsWith("/package.xml") || path === "package.xml")
|
|
86
|
+
continue;
|
|
87
|
+
// Each file is `unpackaged/<typeFolder>/<name>.<ext>`. The parsed
|
|
88
|
+
// name is just the file basename without extension.
|
|
89
|
+
const segments = path.split("/");
|
|
90
|
+
const filename = segments[segments.length - 1] ?? path;
|
|
91
|
+
const memberName = filename.replace(/\.[^.]+$/, "");
|
|
92
|
+
const content = await file.async("string");
|
|
93
|
+
yield {
|
|
94
|
+
ref: {
|
|
95
|
+
category: METADATA_CATEGORY.OMNI_PROCESS,
|
|
96
|
+
memberType: type,
|
|
97
|
+
memberName,
|
|
98
|
+
lastModifiedAt: "",
|
|
99
|
+
sourceUri: `sf://${orgId}/${type}/${memberName}.xml`,
|
|
100
|
+
namespace: null,
|
|
101
|
+
},
|
|
102
|
+
content,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Async iterator yielding XML envelopes for OmniStudio-on-Core types via
|
|
108
|
+
* Metadata API `retrieve()`. Falls back silently (yields nothing) on
|
|
109
|
+
* orgs without the capability or when quota would be exhausted.
|
|
110
|
+
*/
|
|
111
|
+
export async function* iterOmnistudioRetrieve(conn, orgId, opts) {
|
|
112
|
+
// Check quota up-front (single call to limits endpoint via REST). If the
|
|
113
|
+
// helper isn't available we proceed and let per-call failures surface.
|
|
114
|
+
let limit = null;
|
|
115
|
+
try {
|
|
116
|
+
const limitInfo = conn._sforceLimitInfo;
|
|
117
|
+
limit = parseLimitInfo(limitInfo);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// jsforce holds the most-recent limit header on the conn after any
|
|
121
|
+
// call; if no calls have happened yet, we have no signal and proceed.
|
|
122
|
+
}
|
|
123
|
+
if (shouldSkipForQuota(limit)) {
|
|
124
|
+
opts.onError?.("omnistudio-retrieve:quota-guard", new Error(`metadata API quota at ${limit?.current}/${limit?.limit} (>=${QUOTA_SKIP_THRESHOLD * 100}%) — skipping retrieve()`));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const type of RETRIEVE_TYPES) {
|
|
128
|
+
const label = `omnistudio-retrieve:${type}`;
|
|
129
|
+
try {
|
|
130
|
+
const request = {
|
|
131
|
+
apiVersion: opts.apiVersion,
|
|
132
|
+
unpackaged: {
|
|
133
|
+
types: [{ name: type, members: ["*"] }],
|
|
134
|
+
version: opts.apiVersion,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
const locator = conn.metadata.retrieve(request);
|
|
138
|
+
const result = (await withTimeout(locator.complete({ details: false }), RETRIEVE_TIMEOUT_MS, label));
|
|
139
|
+
if (result.status && result.status !== "Succeeded") {
|
|
140
|
+
opts.onError?.(label, new Error(`retrieve() status=${result.status} ${result.errorMessage ?? ""}`));
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!result.zipFile) {
|
|
144
|
+
opts.onError?.(label, new Error("retrieve() returned no zipFile"));
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
for await (const member of yieldFromZip(result.zipFile, orgId, type)) {
|
|
148
|
+
yield member;
|
|
149
|
+
}
|
|
150
|
+
// Re-check quota between types — a single retrieve can return
|
|
151
|
+
// thousands of components and shift utilisation significantly.
|
|
152
|
+
const nextLimit = (() => {
|
|
153
|
+
try {
|
|
154
|
+
return parseLimitInfo(conn._sforceLimitInfo);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
})();
|
|
160
|
+
if (shouldSkipForQuota(nextLimit)) {
|
|
161
|
+
opts.onError?.("omnistudio-retrieve:quota-guard", new Error(`metadata API quota crossed ${QUOTA_SKIP_THRESHOLD * 100}% after ${type} — skipping remaining types`));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
opts.onError?.(label, e);
|
|
167
|
+
// continue to next type — one type failing (e.g. permission gap on
|
|
168
|
+
// OmniUiCard) shouldn't disable retrieval of the other two.
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=omnistudio-retrieve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnistudio-retrieve.js","sourceRoot":"","sources":["../../../../src/extractors/live-org/extractors/omnistudio-retrieve.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,20 @@ export declare const METADATA_DESCRIBE_TIMEOUT_MS = 60000;
|
|
|
36
36
|
* callers don't drift; centralizes the label format so failures are
|
|
37
37
|
* greppable. */
|
|
38
38
|
export declare function soqlWithTimeout<T>(p: Promise<T>, label: string, ms?: number): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Maximum items per `metadata.read` Salesforce SOAP call. The platform docs
|
|
41
|
+
* cap this at 10 — passing more makes jsforce either error or silently
|
|
42
|
+
* truncate depending on version. Most callers already hand-chunk at 10
|
|
43
|
+
* (see extractors/generic-metadata, flow, integration); this constant
|
|
44
|
+
* centralises that value and lets readMetadataBatchAdaptive enforce it
|
|
45
|
+
* defensively for callers that don't.
|
|
46
|
+
*
|
|
47
|
+
* NOTE: The Salesforce Composite REST API allows 25 subrequests per call,
|
|
48
|
+
* but that's a different API (REST, not SOAP Metadata) which sfgraph does
|
|
49
|
+
* not currently use. Don't conflate the two — bumping this to 25 against
|
|
50
|
+
* the Metadata SOAP path is silently broken on real orgs.
|
|
51
|
+
*/
|
|
52
|
+
export declare const METADATA_READ_BATCH_SIZE: number;
|
|
39
53
|
export declare function readMetadataBatchAdaptive<TItem extends {
|
|
40
54
|
fullName: string;
|
|
41
55
|
}>(conn: {
|
|
@@ -113,6 +127,49 @@ export declare function scheduleData<T>(fn: () => Promise<T>): Promise<T>;
|
|
|
113
127
|
* Returns the concurrency caps actually applied (after merging defaults +
|
|
114
128
|
* env vars + overrides), so callers can log what the user got.
|
|
115
129
|
*/
|
|
130
|
+
export interface SoqlRebatchOpts<TRecord> {
|
|
131
|
+
/** Quoted, comma-joined ID list. The caller has already escaped each id. */
|
|
132
|
+
ids: string[];
|
|
133
|
+
/** SOQL template containing `${IDS}` exactly once — replaced with the
|
|
134
|
+
* quoted, comma-joined list at execution time. */
|
|
135
|
+
template: string;
|
|
136
|
+
/** Greppable label for timeouts + warning messages. */
|
|
137
|
+
label: string;
|
|
138
|
+
/** Maximum IDs per request before the helper pre-splits. Default 300 —
|
|
139
|
+
* conservative below the documented SOQL `IN()` 4000 cap but above the
|
|
140
|
+
* 200 most extractors hand-chunked at. */
|
|
141
|
+
rebatchAt?: number;
|
|
142
|
+
/** Maximum recursive split depth before giving up on a slice. Default 6 —
|
|
143
|
+
* enough to cover (300 × 2^6 = 19200) IDs in a single starting batch. */
|
|
144
|
+
maxDepth?: number;
|
|
145
|
+
/**
|
|
146
|
+
* Pool to schedule each individual SOQL call through. Defaults to the
|
|
147
|
+
* Tooling pool; pass `scheduleQuery`/`scheduleData` for non-Tooling
|
|
148
|
+
* paths. The helper does NOT pick a pool based on the SOQL itself —
|
|
149
|
+
* staying explicit avoids "this call went to the wrong pool, why is
|
|
150
|
+
* Tooling starved" surprises.
|
|
151
|
+
*/
|
|
152
|
+
scheduler?: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
153
|
+
/** Per-call timeout label override. Defaults to SOQL_TIMEOUT_MS. */
|
|
154
|
+
timeoutMs?: number;
|
|
155
|
+
/** Function that runs the actual SOQL on the right API surface
|
|
156
|
+
* (`conn.tooling.query` or `conn.query`). Returning a value with a
|
|
157
|
+
* `records` array is required. */
|
|
158
|
+
runner: (soql: string) => Promise<{
|
|
159
|
+
records?: TRecord[];
|
|
160
|
+
}>;
|
|
161
|
+
}
|
|
162
|
+
/** Detect errors that should trigger a smaller-batch retry rather than
|
|
163
|
+
* failing the whole call. Tries the canonical jsforce error shape first
|
|
164
|
+
* (`statusCode` / `errorCode`) then falls back to message matching. */
|
|
165
|
+
export declare function isRebatchableSoqlError(err: unknown): boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Execute `template` against `ids`, splitting the ID set on a rebatchable
|
|
168
|
+
* error or when it exceeds `rebatchAt`. Returns the merged record set.
|
|
169
|
+
* Throws only on non-rebatchable errors (the caller's existing failSoft /
|
|
170
|
+
* onError plumbing handles those).
|
|
171
|
+
*/
|
|
172
|
+
export declare function runSoqlInRebatchable<TRecord>(opts: SoqlRebatchOpts<TRecord>): Promise<TRecord[]>;
|
|
116
173
|
export declare function configureDefaultPools(overrides?: PoolConcurrencyOverrides): Promise<{
|
|
117
174
|
tooling: number;
|
|
118
175
|
metadata: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,wEAAwE;AACxE,eAAO,MAAM,UAAU,iCAAY,CAAC;AAEpC;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAcnF;AAED;;;;;;gCAMgC;AAChC,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAChD;;;;;;uCAMuC;AACvC,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC;gEACgE;AAChE,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD;;;iBAGiB;AACjB,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjG;AAqBD,wBAAsB,yBAAyB,CAAC,KAAK,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAChF,IAAI,EAAE;IAAE,QAAQ,EAAE;QAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,EACjF,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EAAE,EACd,KAAK,SAAI,GACR,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,9 +68,39 @@ const MAX_BISECT_DEPTH = (() => {
|
|
|
68
68
|
const env = Number.parseInt(process.env.SFGRAPH_BISECT_MAX_DEPTH ?? "", 10);
|
|
69
69
|
return Number.isFinite(env) && env > 0 ? env : 6;
|
|
70
70
|
})();
|
|
71
|
+
/**
|
|
72
|
+
* Maximum items per `metadata.read` Salesforce SOAP call. The platform docs
|
|
73
|
+
* cap this at 10 — passing more makes jsforce either error or silently
|
|
74
|
+
* truncate depending on version. Most callers already hand-chunk at 10
|
|
75
|
+
* (see extractors/generic-metadata, flow, integration); this constant
|
|
76
|
+
* centralises that value and lets readMetadataBatchAdaptive enforce it
|
|
77
|
+
* defensively for callers that don't.
|
|
78
|
+
*
|
|
79
|
+
* NOTE: The Salesforce Composite REST API allows 25 subrequests per call,
|
|
80
|
+
* but that's a different API (REST, not SOAP Metadata) which sfgraph does
|
|
81
|
+
* not currently use. Don't conflate the two — bumping this to 25 against
|
|
82
|
+
* the Metadata SOAP path is silently broken on real orgs.
|
|
83
|
+
*/
|
|
84
|
+
export const METADATA_READ_BATCH_SIZE = (() => {
|
|
85
|
+
const env = Number.parseInt(process.env.SFGRAPH_METADATA_READ_CHUNK_SIZE ?? "", 10);
|
|
86
|
+
return Number.isFinite(env) && env > 0 && env <= 10 ? env : 10;
|
|
87
|
+
})();
|
|
71
88
|
export async function readMetadataBatchAdaptive(conn, type, items, depth = 0) {
|
|
72
89
|
if (items.length === 0)
|
|
73
90
|
return [];
|
|
91
|
+
// Pre-chunk to the platform's per-call ceiling before doing anything else.
|
|
92
|
+
// When the caller passes >10 items, run them as independent scheduled
|
|
93
|
+
// calls (the Bottleneck metadata pool bounds concurrency); on failure
|
|
94
|
+
// only the failing sub-chunk bisects, so an oversized happy-path batch
|
|
95
|
+
// doesn't drag healthy peers into the bisection cascade.
|
|
96
|
+
if (depth === 0 && items.length > METADATA_READ_BATCH_SIZE) {
|
|
97
|
+
const chunks = [];
|
|
98
|
+
for (let i = 0; i < items.length; i += METADATA_READ_BATCH_SIZE) {
|
|
99
|
+
chunks.push(items.slice(i, i + METADATA_READ_BATCH_SIZE));
|
|
100
|
+
}
|
|
101
|
+
const partials = await Promise.all(chunks.map((c) => readMetadataBatchAdaptive(conn, type, c, 0)));
|
|
102
|
+
return partials.flat();
|
|
103
|
+
}
|
|
74
104
|
try {
|
|
75
105
|
const raw = await scheduleMetadata(() => withTimeout(conn.metadata.read(type, items.map((i) => i.fullName)), METADATA_READ_TIMEOUT_MS, `metadata.read ${type}`));
|
|
76
106
|
const arr = Array.isArray(raw) ? raw : raw ? [raw] : [];
|
|
@@ -256,16 +286,71 @@ export function scheduleMetadata(fn) {
|
|
|
256
286
|
export function scheduleData(fn) {
|
|
257
287
|
return defaultPools.scheduleData(fn);
|
|
258
288
|
}
|
|
289
|
+
/** Detect errors that should trigger a smaller-batch retry rather than
|
|
290
|
+
* failing the whole call. Tries the canonical jsforce error shape first
|
|
291
|
+
* (`statusCode` / `errorCode`) then falls back to message matching. */
|
|
292
|
+
export function isRebatchableSoqlError(err) {
|
|
293
|
+
const e = err;
|
|
294
|
+
if (e?.statusCode === 414 || e?.statusCode === 431)
|
|
295
|
+
return true;
|
|
296
|
+
if (e?.errorCode === "URI_TOO_LONG" || e?.errorCode === "REQUEST_HEADER_FIELDS_TOO_LARGE") {
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
const msg = (e?.message ?? String(err)).toLowerCase();
|
|
300
|
+
if (msg.includes("uri too long") || msg.includes("414"))
|
|
301
|
+
return true;
|
|
302
|
+
if (msg.includes("request header fields too large") || msg.includes("431"))
|
|
303
|
+
return true;
|
|
304
|
+
if (msg.includes("malformed_query") && msg.includes("characters"))
|
|
305
|
+
return true;
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
259
308
|
/**
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
* constructor. Bottleneck supports live updates via `updateSettings`.
|
|
265
|
-
*
|
|
266
|
-
* Returns the concurrency caps actually applied (after merging defaults +
|
|
267
|
-
* env vars + overrides), so callers can log what the user got.
|
|
309
|
+
* Execute `template` against `ids`, splitting the ID set on a rebatchable
|
|
310
|
+
* error or when it exceeds `rebatchAt`. Returns the merged record set.
|
|
311
|
+
* Throws only on non-rebatchable errors (the caller's existing failSoft /
|
|
312
|
+
* onError plumbing handles those).
|
|
268
313
|
*/
|
|
314
|
+
export async function runSoqlInRebatchable(opts) {
|
|
315
|
+
const rebatchAt = opts.rebatchAt ?? 300;
|
|
316
|
+
const maxDepth = opts.maxDepth ?? 6;
|
|
317
|
+
const scheduler = opts.scheduler ?? scheduleQuery;
|
|
318
|
+
const timeoutMs = opts.timeoutMs ?? SOQL_TIMEOUT_MS;
|
|
319
|
+
if (opts.ids.length === 0)
|
|
320
|
+
return [];
|
|
321
|
+
if (!opts.template.includes("${IDS}")) {
|
|
322
|
+
throw new Error(`runSoqlInRebatchable(${opts.label}): template must contain \`\${IDS}\` placeholder`);
|
|
323
|
+
}
|
|
324
|
+
const runSlice = async (slice, depth) => {
|
|
325
|
+
const idList = slice.join(",");
|
|
326
|
+
const soql = opts.template.replace("${IDS}", idList);
|
|
327
|
+
try {
|
|
328
|
+
const res = await scheduler(() => withTimeout(opts.runner(soql), timeoutMs, `soql ${opts.label}`));
|
|
329
|
+
return res?.records ?? [];
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
if (slice.length === 1 || depth >= maxDepth)
|
|
333
|
+
throw e;
|
|
334
|
+
if (!isRebatchableSoqlError(e))
|
|
335
|
+
throw e;
|
|
336
|
+
// Halve and recurse.
|
|
337
|
+
const mid = Math.ceil(slice.length / 2);
|
|
338
|
+
const [left, right] = await Promise.all([
|
|
339
|
+
runSlice(slice.slice(0, mid), depth + 1),
|
|
340
|
+
runSlice(slice.slice(mid), depth + 1),
|
|
341
|
+
]);
|
|
342
|
+
return [...left, ...right];
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
// Pre-chunk to rebatchAt. Each chunk runs through the scheduler
|
|
346
|
+
// independently so the pool's concurrency cap controls fan-out.
|
|
347
|
+
const chunks = [];
|
|
348
|
+
for (let i = 0; i < opts.ids.length; i += rebatchAt) {
|
|
349
|
+
chunks.push(opts.ids.slice(i, i + rebatchAt));
|
|
350
|
+
}
|
|
351
|
+
const results = await Promise.all(chunks.map((c) => runSlice(c, 0)));
|
|
352
|
+
return results.flat();
|
|
353
|
+
}
|
|
269
354
|
export async function configureDefaultPools(overrides = {}) {
|
|
270
355
|
const env = envOverrides();
|
|
271
356
|
const tooling = overrides.tooling ?? env.tooling ?? DEFAULT_POOL_CONCURRENCY.tooling;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/extractors/live-org/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,5 +17,5 @@ export declare function loadVlocityRegistry(): Record<string, VlocityTypeDef>;
|
|
|
17
17
|
* emit zero edges, so Vlocity nodes exist in the graph but have no
|
|
18
18
|
* relationships.
|
|
19
19
|
*/
|
|
20
|
-
export declare function iterVlocityRecords(conn: any, caps: OrgCapabilities, orgId: string): AsyncIterable<RawMember>;
|
|
20
|
+
export declare function iterVlocityRecords(conn: any, caps: OrgCapabilities, orgId: string, onError?: (label: string, err: Error) => void): AsyncIterable<RawMember>;
|
|
21
21
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/vlocity/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAYD,mEAAmE;AACnE,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAgBpE;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/extractors/live-org/vlocity/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAYD,mEAAmE;AACnE,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAgBpE;AAwKD;;;;;;;;;GASG;AACH,wBAAuB,kBAAkB,CACvC,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,GAC5C,aAAa,CAAC,SAAS,CAAC,CAkG1B"}
|