build-raptor 0.131.0 → 0.133.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/deps/brand/brand.d.ts +5 -0
- package/dist/deps/brand/brand.js +3 -0
- package/dist/deps/brand/index.d.ts +1 -0
- package/dist/deps/brand/index.js +18 -0
- package/dist/deps/build-failed-error/build-failed-error.d.ts +14 -0
- package/dist/deps/build-failed-error/build-failed-error.js +13 -0
- package/dist/deps/build-failed-error/index.d.ts +1 -0
- package/dist/deps/build-failed-error/index.js +18 -0
- package/dist/deps/build-raptor-api/build-raptor-api.d.ts +351 -0
- package/dist/deps/build-raptor-api/build-raptor-api.js +132 -0
- package/dist/deps/build-raptor-api/index.d.ts +2 -0
- package/dist/deps/build-raptor-api/index.js +19 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.d.ts +35 -0
- package/dist/deps/build-raptor-api/step-by-step-processor.js +3 -0
- package/dist/deps/build-raptor-core/breakdown.d.ts +18 -0
- package/dist/deps/build-raptor-core/breakdown.js +99 -0
- package/dist/deps/build-raptor-core/build-raptor-config.d.ts +21 -0
- package/dist/deps/build-raptor-core/build-raptor-config.js +25 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.d.ts +10 -0
- package/dist/deps/build-raptor-core/default-asset-publisher.js +16 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.d.ts +50 -0
- package/dist/deps/build-raptor-core/engine-bootstrapper.js +200 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.d.ts +20 -0
- package/dist/deps/build-raptor-core/engine-event-scheme.js +3 -0
- package/dist/deps/build-raptor-core/engine.d.ts +66 -0
- package/dist/deps/build-raptor-core/engine.js +285 -0
- package/dist/deps/build-raptor-core/examplify-zod.d.ts +93 -0
- package/dist/deps/build-raptor-core/examplify-zod.js +257 -0
- package/dist/deps/build-raptor-core/execution-plan.d.ts +20 -0
- package/dist/deps/build-raptor-core/execution-plan.js +66 -0
- package/dist/deps/build-raptor-core/execution-record.d.ts +17 -0
- package/dist/deps/build-raptor-core/execution-record.js +3 -0
- package/dist/deps/build-raptor-core/execution-type.d.ts +2 -0
- package/dist/deps/build-raptor-core/execution-type.js +3 -0
- package/dist/deps/build-raptor-core/find-repo-dir.d.ts +1 -0
- package/dist/deps/build-raptor-core/find-repo-dir.js +27 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.d.ts +33 -0
- package/dist/deps/build-raptor-core/fingerprint-ledger.js +164 -0
- package/dist/deps/build-raptor-core/fingerprint.d.ts +3 -0
- package/dist/deps/build-raptor-core/fingerprint.js +13 -0
- package/dist/deps/build-raptor-core/fingerprinter.d.ts +15 -0
- package/dist/deps/build-raptor-core/fingerprinter.js +122 -0
- package/dist/deps/build-raptor-core/hasher.d.ts +21 -0
- package/dist/deps/build-raptor-core/hasher.js +93 -0
- package/dist/deps/build-raptor-core/index.d.ts +9 -0
- package/dist/deps/build-raptor-core/index.js +26 -0
- package/dist/deps/build-raptor-core/model.d.ts +17 -0
- package/dist/deps/build-raptor-core/model.js +40 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.d.ts +6 -0
- package/dist/deps/build-raptor-core/nop-asset-publisher.js +12 -0
- package/dist/deps/build-raptor-core/performance-report.d.ts +5 -0
- package/dist/deps/build-raptor-core/performance-report.js +3 -0
- package/dist/deps/build-raptor-core/phase.d.ts +1 -0
- package/dist/deps/build-raptor-core/phase.js +3 -0
- package/dist/deps/build-raptor-core/planner.d.ts +12 -0
- package/dist/deps/build-raptor-core/planner.js +43 -0
- package/dist/deps/build-raptor-core/purger.d.ts +11 -0
- package/dist/deps/build-raptor-core/purger.js +65 -0
- package/dist/deps/build-raptor-core/slot-index.d.ts +6 -0
- package/dist/deps/build-raptor-core/slot-index.js +17 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.d.ts +15 -0
- package/dist/deps/build-raptor-core/step-by-step-transmitter.js +94 -0
- package/dist/deps/build-raptor-core/tar-stream.d.ts +20 -0
- package/dist/deps/build-raptor-core/tar-stream.js +194 -0
- package/dist/deps/build-raptor-core/task-executor.d.ts +32 -0
- package/dist/deps/build-raptor-core/task-executor.js +321 -0
- package/dist/deps/build-raptor-core/task-store-cli.d.ts +1 -0
- package/dist/deps/build-raptor-core/task-store-cli.js +61 -0
- package/dist/deps/build-raptor-core/task-store-event.d.ts +17 -0
- package/dist/deps/build-raptor-core/task-store-event.js +3 -0
- package/dist/deps/build-raptor-core/task-store.d.ts +41 -0
- package/dist/deps/build-raptor-core/task-store.js +302 -0
- package/dist/deps/build-raptor-core/task-summary.d.ts +12 -0
- package/dist/deps/build-raptor-core/task-summary.js +3 -0
- package/dist/deps/build-raptor-core/task-tracker.d.ts +23 -0
- package/dist/deps/build-raptor-core/task-tracker.js +97 -0
- package/dist/deps/build-raptor-core/task.d.ts +30 -0
- package/dist/deps/build-raptor-core/task.js +90 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.d.ts +13 -0
- package/dist/deps/build-raptor-core/updatable-task-output-registry.js +75 -0
- package/dist/deps/build-raptor-core/validate-task-infos.d.ts +3 -0
- package/dist/deps/build-raptor-core/validate-task-infos.js +53 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.d.ts +1 -0
- package/dist/deps/build-raptor-core-testkit/build-raptor-core-testkit.js +18 -0
- package/dist/deps/build-raptor-core-testkit/driver.d.ts +119 -0
- package/dist/deps/build-raptor-core-testkit/driver.js +305 -0
- package/dist/deps/build-raptor-core-testkit/index.d.ts +3 -0
- package/dist/deps/build-raptor-core-testkit/index.js +20 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.d.ts +35 -0
- package/dist/deps/build-raptor-core-testkit/repo-protocol-testkit.js +226 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.d.ts +27 -0
- package/dist/deps/build-raptor-core-testkit/simple-node-repo-protocol.js +140 -0
- package/dist/deps/build-run-id/build-run-id.d.ts +3 -0
- package/dist/deps/build-run-id/build-run-id.js +13 -0
- package/dist/deps/build-run-id/index.d.ts +1 -0
- package/dist/deps/build-run-id/index.js +18 -0
- package/dist/deps/core-types/core-types.d.ts +29 -0
- package/dist/deps/core-types/core-types.js +81 -0
- package/dist/deps/core-types/index.d.ts +1 -0
- package/dist/deps/core-types/index.js +18 -0
- package/dist/deps/logger/index.d.ts +1 -0
- package/dist/deps/logger/index.js +18 -0
- package/dist/deps/logger/logger.d.ts +26 -0
- package/dist/deps/logger/logger.js +152 -0
- package/dist/deps/misc/arrays.d.ts +7 -0
- package/dist/deps/misc/arrays.js +67 -0
- package/dist/deps/misc/camelize-record.d.ts +6 -0
- package/dist/deps/misc/camelize-record.js +16 -0
- package/dist/deps/misc/clean-directory.d.ts +4 -0
- package/dist/deps/misc/clean-directory.js +80 -0
- package/dist/deps/misc/constructs.d.ts +106 -0
- package/dist/deps/misc/constructs.js +131 -0
- package/dist/deps/misc/directory-scanner.d.ts +49 -0
- package/dist/deps/misc/directory-scanner.js +165 -0
- package/dist/deps/misc/executor.d.ts +39 -0
- package/dist/deps/misc/executor.js +59 -0
- package/dist/deps/misc/file-system-storage-client.d.ts +23 -0
- package/dist/deps/misc/file-system-storage-client.js +93 -0
- package/dist/deps/misc/folderify.d.ts +8 -0
- package/dist/deps/misc/folderify.js +86 -0
- package/dist/deps/misc/graph.d.ts +29 -0
- package/dist/deps/misc/graph.js +200 -0
- package/dist/deps/misc/in-memory-storage-client.d.ts +21 -0
- package/dist/deps/misc/in-memory-storage-client.js +75 -0
- package/dist/deps/misc/index.d.ts +20 -0
- package/dist/deps/misc/index.js +37 -0
- package/dist/deps/misc/int.d.ts +10 -0
- package/dist/deps/misc/int.js +29 -0
- package/dist/deps/misc/internal/graph-executor.d.ts +15 -0
- package/dist/deps/misc/internal/graph-executor.js +93 -0
- package/dist/deps/misc/maps.d.ts +29 -0
- package/dist/deps/misc/maps.js +47 -0
- package/dist/deps/misc/misc.d.ts +23 -0
- package/dist/deps/misc/misc.js +94 -0
- package/dist/deps/misc/object-map.d.ts +10 -0
- package/dist/deps/misc/object-map.js +26 -0
- package/dist/deps/misc/promises.d.ts +39 -0
- package/dist/deps/misc/promises.js +78 -0
- package/dist/deps/misc/records.d.ts +11 -0
- package/dist/deps/misc/records.js +40 -0
- package/dist/deps/misc/slurp-dir.d.ts +1 -0
- package/dist/deps/misc/slurp-dir.js +14 -0
- package/dist/deps/misc/storage-client.d.ts +12 -0
- package/dist/deps/misc/storage-client.js +3 -0
- package/dist/deps/misc/stream-to-buffer.d.ts +2 -0
- package/dist/deps/misc/stream-to-buffer.js +26 -0
- package/dist/deps/misc/strings.d.ts +12 -0
- package/dist/deps/misc/strings.js +68 -0
- package/dist/deps/misc/typed-publisher.d.ts +17 -0
- package/dist/deps/misc/typed-publisher.js +65 -0
- package/dist/deps/repo-protocol/index.d.ts +3 -0
- package/dist/deps/repo-protocol/index.js +20 -0
- package/dist/deps/repo-protocol/repo-protocol.d.ts +49 -0
- package/dist/deps/repo-protocol/repo-protocol.js +3 -0
- package/dist/deps/repo-protocol/task-info.d.ts +18 -0
- package/dist/deps/repo-protocol/task-info.js +3 -0
- package/dist/deps/repo-protocol/test-run-summary.d.ts +54 -0
- package/dist/deps/repo-protocol/test-run-summary.js +32 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.d.ts +5 -0
- package/dist/deps/repo-protocol-toolbox/generate-task-infos.js +26 -0
- package/dist/deps/repo-protocol-toolbox/index.d.ts +3 -0
- package/dist/deps/repo-protocol-toolbox/index.js +20 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.d.ts +10 -0
- package/dist/deps/repo-protocol-toolbox/repo-protocol-toolbox.js +90 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.d.ts +14 -0
- package/dist/deps/repo-protocol-toolbox/task-definition.js +3 -0
- package/dist/deps/reporter-output/index.d.ts +1 -0
- package/dist/deps/reporter-output/index.js +18 -0
- package/dist/deps/reporter-output/reporter-output.d.ts +49 -0
- package/dist/deps/reporter-output/reporter-output.js +25 -0
- package/dist/deps/s3-storage-client/creds.d.ts +4 -0
- package/dist/deps/s3-storage-client/creds.js +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.d.ts +3 -0
- package/dist/deps/s3-storage-client/get-s3-storage-client-factory.js +45 -0
- package/dist/deps/s3-storage-client/index.d.ts +2 -0
- package/dist/deps/s3-storage-client/index.js +19 -0
- package/dist/deps/s3-storage-client/main.d.ts +1 -0
- package/dist/deps/s3-storage-client/main.js +20 -0
- package/dist/deps/s3-storage-client/s3-storage-client.d.ts +25 -0
- package/dist/deps/s3-storage-client/s3-storage-client.js +134 -0
- package/dist/deps/task-name/index.d.ts +1 -0
- package/dist/deps/task-name/index.js +18 -0
- package/dist/deps/task-name/task-name.d.ts +17 -0
- package/dist/deps/task-name/task-name.js +44 -0
- package/dist/deps/unit-metadata/index.d.ts +1 -0
- package/dist/deps/unit-metadata/index.js +18 -0
- package/dist/deps/unit-metadata/unit-metadata.d.ts +14 -0
- package/dist/deps/unit-metadata/unit-metadata.js +32 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.d.ts +61 -0
- package/dist/deps/yarn-repo-protocol/build-task-record.js +29 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.d.ts +4 -0
- package/dist/deps/yarn-repo-protocol/generate-test-run-summary.js +26 -0
- package/dist/deps/yarn-repo-protocol/index.d.ts +2 -0
- package/dist/deps/yarn-repo-protocol/index.js +19 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.d.ts +12 -0
- package/dist/deps/yarn-repo-protocol/rerun-list.js +6 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.d.ts +24 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol-config.js +34 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.d.ts +82 -0
- package/dist/deps/yarn-repo-protocol/yarn-repo-protocol.js +1036 -0
- package/dist/src/build-raptor-cli.d.ts +60 -0
- package/dist/src/build-raptor-cli.js +514 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.js +23 -0
- package/dist/src/register-asset-request.d.ts +18 -0
- package/dist/src/register-asset-request.js +11 -0
- package/dist/src/task-execution-visualizer.d.ts +17 -0
- package/dist/src/task-execution-visualizer.js +116 -0
- package/package.json +17 -14
- package/build-raptor.js +0 -7259
- package/index.d.ts +0 -22
- package/index.js +0 -7231
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Graph = void 0;
|
|
7
|
+
const p_queue_1 = __importDefault(require("p-queue"));
|
|
8
|
+
const arrays_1 = require("./arrays");
|
|
9
|
+
const constructs_1 = require("./constructs");
|
|
10
|
+
const executor_1 = require("./executor");
|
|
11
|
+
const graph_executor_1 = require("./internal/graph-executor");
|
|
12
|
+
const maps_1 = require("./maps");
|
|
13
|
+
const object_map_1 = require("./object-map");
|
|
14
|
+
class Vertex {
|
|
15
|
+
constructor(id, payload) {
|
|
16
|
+
this.id = id;
|
|
17
|
+
this.payload = payload;
|
|
18
|
+
this.neighbors_ = [];
|
|
19
|
+
this.backNeighbors_ = [];
|
|
20
|
+
}
|
|
21
|
+
addNeighbor(v) {
|
|
22
|
+
this.neighbors_.push(v);
|
|
23
|
+
}
|
|
24
|
+
addBackNeighbor(v) {
|
|
25
|
+
this.backNeighbors_.push(v);
|
|
26
|
+
}
|
|
27
|
+
remove(v) {
|
|
28
|
+
const index = this.neighbors_.indexOf(v);
|
|
29
|
+
if (index >= 0) {
|
|
30
|
+
this.neighbors_.splice(index, 1);
|
|
31
|
+
}
|
|
32
|
+
const index2 = this.backNeighbors_.indexOf(v);
|
|
33
|
+
if (index2 >= 0) {
|
|
34
|
+
this.backNeighbors_.splice(index2, 1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
get neighbors() {
|
|
38
|
+
return (0, arrays_1.sortBy)(this.neighbors_, v => v.id);
|
|
39
|
+
}
|
|
40
|
+
get backNeighbors() {
|
|
41
|
+
return (0, arrays_1.sortBy)(this.backNeighbors_, v => v.id);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
class Graph {
|
|
45
|
+
constructor(vToId) {
|
|
46
|
+
this.vToId = vToId;
|
|
47
|
+
this.vertexMap = new object_map_1.ObjectMap(vToId);
|
|
48
|
+
}
|
|
49
|
+
// TODO(imaman): cover
|
|
50
|
+
copy() {
|
|
51
|
+
const ret = new Graph(this.vToId);
|
|
52
|
+
const vs = (0, arrays_1.sortBy)(this.vertexMap.values(), v => v.id);
|
|
53
|
+
for (const v of vs) {
|
|
54
|
+
ret.vertex(v.payload);
|
|
55
|
+
for (const u of v.neighbors) {
|
|
56
|
+
ret.edge(v.payload, u.payload);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return ret;
|
|
60
|
+
}
|
|
61
|
+
edge(from, to) {
|
|
62
|
+
this.vertex(from);
|
|
63
|
+
this.vertex(to);
|
|
64
|
+
const f = this.toVertex(from);
|
|
65
|
+
const t = this.toVertex(to);
|
|
66
|
+
f.addNeighbor(t);
|
|
67
|
+
t.addBackNeighbor(f);
|
|
68
|
+
}
|
|
69
|
+
toVertex(v) {
|
|
70
|
+
return (0, maps_1.hardGet)(this.vertexMap, v);
|
|
71
|
+
}
|
|
72
|
+
vertex(v) {
|
|
73
|
+
const existing = this.vertexMap.get(v);
|
|
74
|
+
if (!existing) {
|
|
75
|
+
const id = this.vToId(v);
|
|
76
|
+
this.vertexMap.set(v, new Vertex(id, v));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
remove(v) {
|
|
80
|
+
const existing = this.vertexMap.get(v);
|
|
81
|
+
if (!existing) {
|
|
82
|
+
throw new Error(`Cannot remove non-existing vertex: <${v}>`);
|
|
83
|
+
}
|
|
84
|
+
this.vertexMap.delete(v);
|
|
85
|
+
for (const n of existing.backNeighbors) {
|
|
86
|
+
n.remove(existing);
|
|
87
|
+
}
|
|
88
|
+
for (const n of existing.neighbors) {
|
|
89
|
+
n.remove(existing);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
vertices() {
|
|
93
|
+
return (0, arrays_1.sortBy)(this.vertexMap.values(), v => v.id).map(v => v.payload);
|
|
94
|
+
}
|
|
95
|
+
outDegree(v) {
|
|
96
|
+
return this.neighborsOf(v).length;
|
|
97
|
+
}
|
|
98
|
+
neighborsOf(v) {
|
|
99
|
+
return this.toVertex(v).neighbors.map(v => v.payload);
|
|
100
|
+
}
|
|
101
|
+
backNeighborsOf(v) {
|
|
102
|
+
return this.toVertex(v).backNeighbors.map(v => v.payload);
|
|
103
|
+
}
|
|
104
|
+
roots() {
|
|
105
|
+
return this.vertices().filter(v => this.toVertex(v).backNeighbors.length === 0);
|
|
106
|
+
}
|
|
107
|
+
traverseFrom(arg, options) {
|
|
108
|
+
const direction = options?.direction ?? 'forward';
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
const visited = [];
|
|
111
|
+
const traverse = (v) => {
|
|
112
|
+
if (seen.has(v.id)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
seen.add(v.id);
|
|
116
|
+
const ns = direction === 'forward'
|
|
117
|
+
? v.neighbors
|
|
118
|
+
: direction === 'backwards'
|
|
119
|
+
? v.backNeighbors
|
|
120
|
+
: (0, constructs_1.shouldNeverHappen)(direction);
|
|
121
|
+
for (let i = ns.length - 1; i >= 0; --i) {
|
|
122
|
+
traverse(ns[i]);
|
|
123
|
+
}
|
|
124
|
+
visited.push(v);
|
|
125
|
+
};
|
|
126
|
+
const arr = Array.isArray(arg) ? arg : [arg];
|
|
127
|
+
const startingPoints = (0, arrays_1.sortBy)(arr.map(v => this.toVertex(v)), v => v.id);
|
|
128
|
+
for (const at of startingPoints) {
|
|
129
|
+
traverse(at);
|
|
130
|
+
}
|
|
131
|
+
return visited.map(v => v.payload);
|
|
132
|
+
}
|
|
133
|
+
toJSON() {
|
|
134
|
+
const vs = (0, arrays_1.sortBy)(this.vertexMap.values(), v => v.id);
|
|
135
|
+
const ret = {};
|
|
136
|
+
for (const v of vs) {
|
|
137
|
+
ret[v.id] = v.neighbors.map(n => n.id);
|
|
138
|
+
}
|
|
139
|
+
return ret;
|
|
140
|
+
}
|
|
141
|
+
toString() {
|
|
142
|
+
const vs = (0, arrays_1.sortBy)(this.vertexMap.values(), v => v.id);
|
|
143
|
+
if (vs.length === 0) {
|
|
144
|
+
return '<EMPTY>';
|
|
145
|
+
}
|
|
146
|
+
return vs.map(v => `${v.id} -> ${v.neighbors.map(n => n.id).join(', ')}`.trim()).join('\n');
|
|
147
|
+
}
|
|
148
|
+
static fromJSON(json) {
|
|
149
|
+
const ret = new Graph(x => x);
|
|
150
|
+
for (const [v, neighbors] of Object.entries(json)) {
|
|
151
|
+
ret.vertex(v);
|
|
152
|
+
for (const n of neighbors) {
|
|
153
|
+
ret.edge(v, n);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return ret;
|
|
157
|
+
}
|
|
158
|
+
isCyclic() {
|
|
159
|
+
const vs = this.vertices().map(v => this.toVertex(v));
|
|
160
|
+
// TODO(imaman): use a proper impl. of LIFO (and also introduce a FIFO arrays.ts)
|
|
161
|
+
const lifo = [];
|
|
162
|
+
const map = new Map();
|
|
163
|
+
for (const v of vs) {
|
|
164
|
+
const deg = v.neighbors.length;
|
|
165
|
+
map.set(v.id, deg);
|
|
166
|
+
if (deg === 0) {
|
|
167
|
+
lifo.push(v);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const seen = new Set();
|
|
171
|
+
while (true) {
|
|
172
|
+
const v = lifo.pop();
|
|
173
|
+
if (!v) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
if (seen.has(v.id)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
seen.add(v.id);
|
|
180
|
+
for (const n of v.backNeighbors) {
|
|
181
|
+
const deg = (0, maps_1.mapIncrement)(map, n.id, -1);
|
|
182
|
+
if (deg === 0) {
|
|
183
|
+
lifo.push(n);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return seen.size !== vs.length;
|
|
188
|
+
}
|
|
189
|
+
async execute(concurrency, workToDo, batchScheduler) {
|
|
190
|
+
const queue = new p_queue_1.default({ concurrency });
|
|
191
|
+
const executor = new executor_1.Executor(queue, workToDo);
|
|
192
|
+
const ge = new graph_executor_1.GraphExecutor(this, executor, batchScheduler ?? (() => undefined));
|
|
193
|
+
await ge.execute();
|
|
194
|
+
}
|
|
195
|
+
makeVertexMap() {
|
|
196
|
+
return new object_map_1.ObjectMap(this.vToId);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.Graph = Graph;
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsc0RBQTRCO0FBRTVCLHFDQUFpQztBQUNqQyw2Q0FBZ0Q7QUFDaEQseUNBQXFDO0FBQ3JDLDhEQUF5RDtBQUN6RCxpQ0FBOEM7QUFDOUMsNkNBQXdDO0FBTXhDLE1BQU0sTUFBTTtJQUdWLFlBQXFCLEVBQVUsRUFBVyxPQUFVO1FBQS9CLE9BQUUsR0FBRixFQUFFLENBQVE7UUFBVyxZQUFPLEdBQVAsT0FBTyxDQUFHO1FBRm5DLGVBQVUsR0FBZ0IsRUFBRSxDQUFBO1FBQzVCLG1CQUFjLEdBQWdCLEVBQUUsQ0FBQTtJQUNNLENBQUM7SUFFeEQsV0FBVyxDQUFDLENBQVk7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVELGVBQWUsQ0FBQyxDQUFZO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBWTtRQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDN0MsSUFBSSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Int } from '.';
|
|
2
|
+
import { Key, StorageClient } from './storage-client';
|
|
3
|
+
export declare class InMemoryStorageClient implements StorageClient {
|
|
4
|
+
private readonly sizeLimitInBytes;
|
|
5
|
+
private byteCount_;
|
|
6
|
+
constructor(sizeLimitInBytes?: Int);
|
|
7
|
+
private readonly store;
|
|
8
|
+
putObject(key: Key, content: string | Buffer): Promise<void>;
|
|
9
|
+
private putObjectImpl;
|
|
10
|
+
putContentAddressable(content: string | Buffer): Promise<string>;
|
|
11
|
+
getContentAddressable(hash: string): Promise<Buffer>;
|
|
12
|
+
get byteCount(): Int;
|
|
13
|
+
getObject(key: Key): Promise<string>;
|
|
14
|
+
getObject(key: Key, type: 'string'): Promise<string>;
|
|
15
|
+
getObject(key: Key, type: 'buffer'): Promise<Buffer>;
|
|
16
|
+
private getObjectImpl;
|
|
17
|
+
objectExists(key: Key): Promise<boolean>;
|
|
18
|
+
private keyToString;
|
|
19
|
+
toJSON(): [Key, string][];
|
|
20
|
+
load(u: unknown): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryStorageClient = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
const constructs_1 = require("./constructs");
|
|
6
|
+
const misc_1 = require("./misc");
|
|
7
|
+
class InMemoryStorageClient {
|
|
8
|
+
constructor(sizeLimitInBytes = (0, _1.Int)(-1)) {
|
|
9
|
+
this.sizeLimitInBytes = sizeLimitInBytes;
|
|
10
|
+
this.byteCount_ = (0, _1.Int)(0);
|
|
11
|
+
this.store = new Map();
|
|
12
|
+
}
|
|
13
|
+
async putObject(key, content) {
|
|
14
|
+
this.putObjectImpl(this.keyToString(key), content);
|
|
15
|
+
}
|
|
16
|
+
putObjectImpl(s, content) {
|
|
17
|
+
const existing = Buffer.from(this.store.get(s) ?? '', 'base64');
|
|
18
|
+
const bufferToStore = Buffer.from(content).toString('base64');
|
|
19
|
+
const newCount = this.byteCount_ + bufferToStore.length - existing.length;
|
|
20
|
+
if (this.sizeLimitInBytes >= 0 && newCount > this.sizeLimitInBytes) {
|
|
21
|
+
throw new Error(`size limit (${this.sizeLimitInBytes} bytes) will be exceeded.`);
|
|
22
|
+
}
|
|
23
|
+
this.store.set(s, bufferToStore);
|
|
24
|
+
this.byteCount_ = (0, _1.Int)(newCount);
|
|
25
|
+
}
|
|
26
|
+
async putContentAddressable(content) {
|
|
27
|
+
const ret = (0, misc_1.computeHash)(content);
|
|
28
|
+
const p = `cas/${ret}`;
|
|
29
|
+
this.putObjectImpl(p, content);
|
|
30
|
+
return ret;
|
|
31
|
+
}
|
|
32
|
+
async getContentAddressable(hash) {
|
|
33
|
+
return await this.getObjectImpl(`cas/${hash}`);
|
|
34
|
+
}
|
|
35
|
+
get byteCount() {
|
|
36
|
+
return this.byteCount_;
|
|
37
|
+
}
|
|
38
|
+
async getObject(key, type = 'string') {
|
|
39
|
+
const buf = await this.getObjectImpl(this.keyToString(key));
|
|
40
|
+
return type === 'string' ? buf.toString('utf-8') : type === 'buffer' ? buf : (0, constructs_1.shouldNeverHappen)(type);
|
|
41
|
+
}
|
|
42
|
+
async getObjectImpl(p) {
|
|
43
|
+
const encoded = this.store.get(p);
|
|
44
|
+
if (encoded === undefined) {
|
|
45
|
+
throw new Error(`No object with key ${JSON.stringify(p)}`);
|
|
46
|
+
}
|
|
47
|
+
return Buffer.from(encoded, 'base64');
|
|
48
|
+
}
|
|
49
|
+
async objectExists(key) {
|
|
50
|
+
return this.store.has(this.keyToString(key));
|
|
51
|
+
}
|
|
52
|
+
keyToString(key) {
|
|
53
|
+
return `std/${(0, misc_1.computeObjectHash)({ key })}`;
|
|
54
|
+
}
|
|
55
|
+
toJSON() {
|
|
56
|
+
return [...this.store];
|
|
57
|
+
}
|
|
58
|
+
load(u) {
|
|
59
|
+
if (!Array.isArray(u)) {
|
|
60
|
+
throw new Error(`not an array`);
|
|
61
|
+
}
|
|
62
|
+
u.forEach((at, i) => {
|
|
63
|
+
if (!Array.isArray(at)) {
|
|
64
|
+
throw new Error(`entry ${i} is not a pair (got: ${typeof at})`);
|
|
65
|
+
}
|
|
66
|
+
if (at.length !== 2) {
|
|
67
|
+
throw new Error(`entry ${i} is not a pair (length: ${at.length})`);
|
|
68
|
+
}
|
|
69
|
+
const strings = at.map(x => typeof x === 'string' ? x : (0, constructs_1.failMe)(`expected a pair of strings but found a ${typeof x} at pair ${i}`));
|
|
70
|
+
this.putObjectImpl(strings[0], Buffer.from(strings[1], 'base64'));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.InMemoryStorageClient = InMemoryStorageClient;
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tbWVtb3J5LXN0b3JhZ2UtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luLW1lbW9yeS1zdG9yYWdlLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3QkFBdUI7QUFDdkIsNkNBQXdEO0FBQ3hELGlDQUF1RDtBQUd2RCxNQUFhLHFCQUFxQjtJQUVoQyxZQUE2QixtQkFBd0IsSUFBQSxNQUFHLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFBL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFlO1FBRHBELGVBQVUsR0FBUSxJQUFBLE1BQUcsRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUdmLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFBO0lBRmdCLENBQUM7SUFJaEUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFRLEVBQUUsT0FBd0I7UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFTyxhQUFhLENBQUMsQ0FBUyxFQUFFLE9BQXdCO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRS9ELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFBO1FBQ3pFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDbkUsTUFBTSxJQUFJ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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from './arrays';
|
|
2
|
+
export * from './camelize-record';
|
|
3
|
+
export * from './constructs';
|
|
4
|
+
export * from './directory-scanner';
|
|
5
|
+
export * from './executor';
|
|
6
|
+
export * from './file-system-storage-client';
|
|
7
|
+
export * from './folderify';
|
|
8
|
+
export * from './graph';
|
|
9
|
+
export * from './in-memory-storage-client';
|
|
10
|
+
export * from './int';
|
|
11
|
+
export * from './maps';
|
|
12
|
+
export * from './misc';
|
|
13
|
+
export * from './object-map';
|
|
14
|
+
export * from './promises';
|
|
15
|
+
export * from './records';
|
|
16
|
+
export * from './slurp-dir';
|
|
17
|
+
export * from './storage-client';
|
|
18
|
+
export * from './stream-to-buffer';
|
|
19
|
+
export * from './strings';
|
|
20
|
+
export * from './typed-publisher';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./arrays"), exports);
|
|
18
|
+
__exportStar(require("./camelize-record"), exports);
|
|
19
|
+
__exportStar(require("./constructs"), exports);
|
|
20
|
+
__exportStar(require("./directory-scanner"), exports);
|
|
21
|
+
__exportStar(require("./executor"), exports);
|
|
22
|
+
__exportStar(require("./file-system-storage-client"), exports);
|
|
23
|
+
__exportStar(require("./folderify"), exports);
|
|
24
|
+
__exportStar(require("./graph"), exports);
|
|
25
|
+
__exportStar(require("./in-memory-storage-client"), exports);
|
|
26
|
+
__exportStar(require("./int"), exports);
|
|
27
|
+
__exportStar(require("./maps"), exports);
|
|
28
|
+
__exportStar(require("./misc"), exports);
|
|
29
|
+
__exportStar(require("./object-map"), exports);
|
|
30
|
+
__exportStar(require("./promises"), exports);
|
|
31
|
+
__exportStar(require("./records"), exports);
|
|
32
|
+
__exportStar(require("./slurp-dir"), exports);
|
|
33
|
+
__exportStar(require("./storage-client"), exports);
|
|
34
|
+
__exportStar(require("./stream-to-buffer"), exports);
|
|
35
|
+
__exportStar(require("./strings"), exports);
|
|
36
|
+
__exportStar(require("./typed-publisher"), exports);
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF3QjtBQUN4QixvREFBaUM7QUFDakMsK0NBQTRCO0FBQzVCLHNEQUFtQztBQUNuQyw2Q0FBMEI7QUFDMUIsK0RBQTRDO0FBQzVDLDhDQUEyQjtBQUMzQiwwQ0FBdUI7QUFDdkIsNkRBQTBDO0FBQzFDLHdDQUFxQjtBQUNyQix5Q0FBc0I7QUFDdEIseUNBQXNCO0FBQ3RCLCtDQUE0QjtBQUM1Qiw2Q0FBMEI7QUFDMUIsNENBQXlCO0FBQ3pCLDhDQUEyQjtBQUMzQixtREFBZ0M7QUFDaEMscURBQWtDO0FBQ2xDLDRDQUF5QjtBQUN6QixvREFBaUMifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Brand } from 'brand';
|
|
2
|
+
export type Int = Brand<number, 'Int'>;
|
|
3
|
+
declare class IntUtils {
|
|
4
|
+
parse(s: string): Int;
|
|
5
|
+
product(lhs: Int, rhs: number): Int;
|
|
6
|
+
sum(lhs: Int, rhs: number): Int;
|
|
7
|
+
}
|
|
8
|
+
export declare function Int(): IntUtils;
|
|
9
|
+
export declare function Int(value: number): Int;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Int = Int;
|
|
4
|
+
class IntUtils {
|
|
5
|
+
parse(s) {
|
|
6
|
+
return intify(s);
|
|
7
|
+
}
|
|
8
|
+
product(lhs, rhs) {
|
|
9
|
+
return intify(lhs * Int(rhs));
|
|
10
|
+
}
|
|
11
|
+
sum(lhs, rhs) {
|
|
12
|
+
return intify(lhs + Int(rhs));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function Int(value) {
|
|
16
|
+
if (value === undefined) {
|
|
17
|
+
return new IntUtils();
|
|
18
|
+
}
|
|
19
|
+
return intify(value);
|
|
20
|
+
}
|
|
21
|
+
function intify(input) {
|
|
22
|
+
const ret = Number(input);
|
|
23
|
+
if (Number.isInteger(ret)) {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
25
|
+
return ret;
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`<${input}> is not an integer`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSxrQkFNQztBQXJCRCxNQUFNLFFBQVE7SUFDWixLQUFLLENBQUMsQ0FBUztRQUNiLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUSxFQUFFLEdBQVc7UUFDM0IsT0FBTyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFDRCxHQUFHLENBQUMsR0FBUSxFQUFFLEdBQVc7UUFDdkIsT0FBTyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQy9CLENBQUM7Q0FDRjtBQUlELFNBQWdCLEdBQUcsQ0FBQyxLQUFjO0lBQ2hDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQTtJQUN2QixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDdEIsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQXNCO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQix5RUFBeUU7UUFDekUsT0FBTyxHQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLENBQUE7QUFDakQsQ0FBQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Executor } from '../executor';
|
|
2
|
+
import { BatchScheduler, Graph } from '../graph';
|
|
3
|
+
export declare class GraphExecutor<V> {
|
|
4
|
+
private readonly graph;
|
|
5
|
+
private readonly executor;
|
|
6
|
+
private readonly batchScheduler;
|
|
7
|
+
private readonly map;
|
|
8
|
+
private numLeft;
|
|
9
|
+
private started;
|
|
10
|
+
constructor(graph: Graph<V>, executor: Executor<V>, batchScheduler: BatchScheduler<V>);
|
|
11
|
+
private start;
|
|
12
|
+
private scheduleBatch;
|
|
13
|
+
private vertexExecuted;
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphExecutor = void 0;
|
|
4
|
+
const maps_1 = require("../maps");
|
|
5
|
+
class GraphExecutor {
|
|
6
|
+
constructor(graph, executor, batchScheduler) {
|
|
7
|
+
this.graph = graph;
|
|
8
|
+
this.executor = executor;
|
|
9
|
+
this.batchScheduler = batchScheduler;
|
|
10
|
+
this.started = false;
|
|
11
|
+
if (graph.isCyclic()) {
|
|
12
|
+
throw new Error(`Cannot execute a cyclic graph`);
|
|
13
|
+
}
|
|
14
|
+
this.numLeft = graph.vertices().length;
|
|
15
|
+
this.map = graph.makeVertexMap();
|
|
16
|
+
}
|
|
17
|
+
start() {
|
|
18
|
+
if (this.started) {
|
|
19
|
+
throw new Error(`A GraphExecutor object can only be started once`);
|
|
20
|
+
}
|
|
21
|
+
this.started = true;
|
|
22
|
+
const initialBatch = [];
|
|
23
|
+
for (const v of this.graph.vertices()) {
|
|
24
|
+
const count = this.graph.neighborsOf(v).length;
|
|
25
|
+
this.map.set(v, count);
|
|
26
|
+
if (count === 0) {
|
|
27
|
+
initialBatch.push(v);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
this.executor.subscribe(({ lastSettled }) => {
|
|
31
|
+
if (this.map.has(lastSettled)) {
|
|
32
|
+
this.vertexExecuted(lastSettled);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
this.scheduleBatch(initialBatch);
|
|
36
|
+
}
|
|
37
|
+
scheduleBatch(batch) {
|
|
38
|
+
const subGraph = this.batchScheduler(batch);
|
|
39
|
+
if (!subGraph) {
|
|
40
|
+
for (const v of batch) {
|
|
41
|
+
this.executor.schedule(v);
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (subGraph.isCyclic()) {
|
|
46
|
+
throw new Error(`batch scheduler returned a cyclic graph`);
|
|
47
|
+
}
|
|
48
|
+
const set = subGraph.makeVertexMap();
|
|
49
|
+
for (const v of batch) {
|
|
50
|
+
set.set(v, {});
|
|
51
|
+
}
|
|
52
|
+
const subVertices = subGraph.vertices();
|
|
53
|
+
const outOfBatch = subVertices.filter(v => !set.has(v));
|
|
54
|
+
if (outOfBatch.length > 0) {
|
|
55
|
+
throw new Error(`batch scheduler returned out-of-batch vertices: ${outOfBatch.join(', ')}`);
|
|
56
|
+
}
|
|
57
|
+
if (subVertices.length !== batch.length) {
|
|
58
|
+
throw new Error(`batch scheduler returned a bad grap: number of vertices is ${subVertices.length} (but it should be ${batch.length})`);
|
|
59
|
+
}
|
|
60
|
+
const subExecutor = new GraphExecutor(subGraph, this.executor, () => undefined);
|
|
61
|
+
subExecutor.start();
|
|
62
|
+
}
|
|
63
|
+
vertexExecuted(v) {
|
|
64
|
+
const nextBatch = [];
|
|
65
|
+
for (const n of this.graph.backNeighborsOf(v)) {
|
|
66
|
+
const count = (0, maps_1.mapIncrement)(this.map, n, -1);
|
|
67
|
+
if (count === 0) {
|
|
68
|
+
nextBatch.push(n);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.scheduleBatch(nextBatch);
|
|
72
|
+
}
|
|
73
|
+
async execute() {
|
|
74
|
+
const ret = new Promise((resolve, reject) => {
|
|
75
|
+
this.executor.subscribe(({ error }) => {
|
|
76
|
+
--this.numLeft;
|
|
77
|
+
if (this.numLeft > 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (error) {
|
|
81
|
+
reject(error);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
resolve();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
this.start();
|
|
88
|
+
});
|
|
89
|
+
return ret;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.GraphExecutor = GraphExecutor;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50ZXJuYWwvZ3JhcGgtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0NBQXNDO0FBRXRDLE1BQWEsYUFBYTtJQUt4QixZQUNtQixLQUFlLEVBQ2YsUUFBcUIsRUFDckIsY0FBaUM7UUFGakMsVUFBSyxHQUFMLEtBQUssQ0FBVTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDckIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBTDVDLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFPckIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQTtRQUN0QyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQVUsQ0FBQTtJQUMxQyxDQUFDO0lBRU8sS0FBSztRQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQTtRQUNwRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDbkIsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFBO1FBRTVCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDdEIs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
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface MapLike<K, V> {
|
|
2
|
+
get(k: K): V | undefined;
|
|
3
|
+
set(k: K, v: V): void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Returns a value from a map, or throws an error if not found.
|
|
7
|
+
* @param map the map to fetch from
|
|
8
|
+
* @param key a key to look up
|
|
9
|
+
* @returns the value assoicated with `key` in `map`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function hardGet<K, V>(map: MapLike<K, V>, key: K): V;
|
|
12
|
+
/**
|
|
13
|
+
* Increment the value associated with `key` in `map` by `inc`.
|
|
14
|
+
* @param map a map to increment one of its values
|
|
15
|
+
* @param key the key to increment
|
|
16
|
+
* @param inc the amount to increment by
|
|
17
|
+
* @returns the incremented value
|
|
18
|
+
*/
|
|
19
|
+
export declare function mapIncrement<K>(map: MapLike<K, number>, key: K, inc: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* Returns the value with `key` in `map`. If not found, set it to the value returned by the given supplier function
|
|
22
|
+
* and returns it.
|
|
23
|
+
* @param map a map to get a value from
|
|
24
|
+
* @param key the key to get
|
|
25
|
+
* @param supplier a zero-arguments callback to provide a value if `key` is not found in `map`
|
|
26
|
+
* @returns the value associated with `key` in `map`
|
|
27
|
+
*/
|
|
28
|
+
export declare function assigningGet<K, V>(map: MapLike<K, V>, key: K, supplier: () => V): V;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hardGet = hardGet;
|
|
4
|
+
exports.mapIncrement = mapIncrement;
|
|
5
|
+
exports.assigningGet = assigningGet;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a value from a map, or throws an error if not found.
|
|
8
|
+
* @param map the map to fetch from
|
|
9
|
+
* @param key a key to look up
|
|
10
|
+
* @returns the value assoicated with `key` in `map`.
|
|
11
|
+
*/
|
|
12
|
+
function hardGet(map, key) {
|
|
13
|
+
const ret = map.get(key);
|
|
14
|
+
if (ret === undefined) {
|
|
15
|
+
throw new Error(`Could not find <${key}> in the given map`);
|
|
16
|
+
}
|
|
17
|
+
return ret;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Increment the value associated with `key` in `map` by `inc`.
|
|
21
|
+
* @param map a map to increment one of its values
|
|
22
|
+
* @param key the key to increment
|
|
23
|
+
* @param inc the amount to increment by
|
|
24
|
+
* @returns the incremented value
|
|
25
|
+
*/
|
|
26
|
+
function mapIncrement(map, key, inc) {
|
|
27
|
+
const ret = assigningGet(map, key, () => 0) + inc;
|
|
28
|
+
map.set(key, ret);
|
|
29
|
+
return ret;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns the value with `key` in `map`. If not found, set it to the value returned by the given supplier function
|
|
33
|
+
* and returns it.
|
|
34
|
+
* @param map a map to get a value from
|
|
35
|
+
* @param key the key to get
|
|
36
|
+
* @param supplier a zero-arguments callback to provide a value if `key` is not found in `map`
|
|
37
|
+
* @returns the value associated with `key` in `map`
|
|
38
|
+
*/
|
|
39
|
+
function assigningGet(map, key, supplier) {
|
|
40
|
+
let v = map.get(key);
|
|
41
|
+
if (v === undefined) {
|
|
42
|
+
v = supplier();
|
|
43
|
+
map.set(key, v);
|
|
44
|
+
}
|
|
45
|
+
return v;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsMEJBTUM7QUFTRCxvQ0FJQztBQVVELG9DQU9DO0FBMUNEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFPLEdBQWtCLEVBQUUsR0FBTTtJQUN0RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsb0JBQW9CLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsWUFBWSxDQUFJLEdBQXVCLEVBQUUsR0FBTSxFQUFFLEdBQVc7SUFDMUUsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFBO0lBQ2pELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixZQUFZLENBQU8sR0FBa0IsRUFBRSxHQUFNLEVBQUUsUUFBaUI7SUFDOUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQixDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUE7UUFDZCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUE7QUFDVixDQUFDIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type Jsonable = string | number | boolean | null | readonly Jsonable[] | {
|
|
2
|
+
readonly [key: string]: Jsonable;
|
|
3
|
+
};
|
|
4
|
+
export declare function computeObjectHash(input: Record<string, Jsonable>): string;
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param input buffer or string to hash
|
|
8
|
+
* @returns a hash, in "hex" encoding.
|
|
9
|
+
*/
|
|
10
|
+
export declare function computeHash(input: Buffer | string, algo?: 'sha224' | 'sha256'): string;
|
|
11
|
+
/**
|
|
12
|
+
* Represents an event that should happen at some point in the future.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Timeout {
|
|
15
|
+
private readonly promise;
|
|
16
|
+
constructor(promise: Promise<void>);
|
|
17
|
+
/**
|
|
18
|
+
* Returns a promise that is resvoled when the timeout expires.
|
|
19
|
+
*/
|
|
20
|
+
hasPassed(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare function aTimeoutOf(ms: number): Timeout;
|
|
23
|
+
export declare function dumpFile(inputPath: string, output: NodeJS.WritableStream): Promise<void>;
|