dbctx 1.4.6 → 2.0.1
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/app/assemble.d.mts +2 -2
- package/dist/app/assemble.d.mts.map +1 -1
- package/dist/app/assemble.mjs +37 -16
- package/dist/app/db.d.mts.map +1 -1
- package/dist/app/db.mjs +3 -2
- package/dist/app/detect.d.mts +1 -0
- package/dist/app/detect.d.mts.map +1 -1
- package/dist/app/detect.mjs +3 -2
- package/dist/app/list.d.mts +4 -0
- package/dist/app/list.d.mts.map +1 -0
- package/dist/app/list.mjs +93 -0
- package/dist/app/load-introspection.d.mts +26 -0
- package/dist/app/load-introspection.d.mts.map +1 -0
- package/dist/app/load-introspection.mjs +89 -0
- package/dist/app/login.d.mts +2 -0
- package/dist/app/login.d.mts.map +1 -0
- package/dist/app/login.mjs +69 -0
- package/dist/app/open-url.d.mts +2 -0
- package/dist/app/open-url.d.mts.map +1 -1
- package/dist/app/open-url.mjs +8 -3
- package/dist/app/sample.d.mts +24 -0
- package/dist/app/sample.d.mts.map +1 -0
- package/dist/app/sample.mjs +257 -0
- package/dist/app/session.d.mts +3 -2
- package/dist/app/session.d.mts.map +1 -1
- package/dist/app/session.mjs +46 -6
- package/dist/app/ssh.d.mts.map +1 -1
- package/dist/app/ssh.mjs +12 -1
- package/dist/app/tail.d.mts +13 -0
- package/dist/app/tail.d.mts.map +1 -0
- package/dist/app/tail.mjs +168 -0
- package/dist/db/check-constraints.d.mts +9 -0
- package/dist/db/check-constraints.d.mts.map +1 -0
- package/dist/db/check-constraints.mjs +17 -0
- package/dist/db/custom-types.d.mts +26 -0
- package/dist/db/custom-types.d.mts.map +1 -0
- package/dist/db/custom-types.mjs +61 -0
- package/dist/db/extensions.d.mts +8 -0
- package/dist/db/extensions.d.mts.map +1 -0
- package/dist/db/extensions.mjs +14 -0
- package/dist/db/foreign-keys.mjs +3 -3
- package/dist/db/functions.d.mts +11 -0
- package/dist/db/functions.d.mts.map +1 -0
- package/dist/db/functions.mjs +23 -0
- package/dist/db/index.d.mts +10 -1
- package/dist/db/index.d.mts.map +1 -1
- package/dist/db/index.mjs +11 -2
- package/dist/db/planner-stats.d.mts +33 -0
- package/dist/db/planner-stats.d.mts.map +1 -0
- package/dist/db/planner-stats.mjs +103 -0
- package/dist/db/relations.d.mts +1 -0
- package/dist/db/relations.d.mts.map +1 -1
- package/dist/db/relations.mjs +10 -1
- package/dist/db/rls.d.mts +21 -0
- package/dist/db/rls.d.mts.map +1 -0
- package/dist/db/rls.mjs +48 -0
- package/dist/db/sample.d.mts +16 -0
- package/dist/db/sample.d.mts.map +1 -0
- package/dist/db/sample.mjs +73 -0
- package/dist/db/sequences.d.mts +15 -0
- package/dist/db/sequences.d.mts.map +1 -0
- package/dist/db/sequences.mjs +31 -0
- package/dist/db/stats.mjs +3 -3
- package/dist/db/triggers.d.mts +11 -0
- package/dist/db/triggers.d.mts.map +1 -0
- package/dist/db/triggers.mjs +21 -0
- package/dist/flow/events.d.mts +115 -0
- package/dist/flow/events.d.mts.map +1 -0
- package/dist/flow/events.mjs +2 -0
- package/dist/flow/interpreter.d.mts +21 -0
- package/dist/flow/interpreter.d.mts.map +1 -0
- package/dist/flow/interpreter.mjs +605 -0
- package/dist/flow/projection.d.mts +17 -0
- package/dist/flow/projection.d.mts.map +1 -0
- package/dist/flow/projection.mjs +83 -0
- package/dist/flow/projection.test.d.mts +2 -0
- package/dist/flow/projection.test.d.mts.map +1 -0
- package/dist/flow/projection.test.mjs +162 -0
- package/dist/flow/reducer.d.mts +5 -0
- package/dist/flow/reducer.d.mts.map +1 -0
- package/dist/flow/reducer.mjs +306 -0
- package/dist/flow/reducer.test.d.mts +2 -0
- package/dist/flow/reducer.test.d.mts.map +1 -0
- package/dist/flow/reducer.test.mjs +479 -0
- package/dist/flow/run.d.mts +3 -0
- package/dist/flow/run.d.mts.map +1 -0
- package/dist/flow/run.mjs +89 -0
- package/dist/flow/states.d.mts +54 -0
- package/dist/flow/states.d.mts.map +1 -0
- package/dist/flow/states.mjs +39 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +135 -12
- package/dist/lib/atomic-write.d.mts +4 -0
- package/dist/lib/atomic-write.d.mts.map +1 -0
- package/dist/lib/atomic-write.mjs +75 -0
- package/dist/lib/stream-job.d.mts +19 -0
- package/dist/lib/stream-job.d.mts.map +1 -0
- package/dist/lib/stream-job.mjs +55 -0
- package/dist/lib/trpc-url.mjs +2 -2
- package/dist/lib/trpc.mjs +2 -2
- package/dist/logger.d.mts.map +1 -1
- package/dist/logger.mjs +6 -3
- package/dist/providers/TrpcProvider.js +3 -3
- package/dist/store.d.mts +113 -1
- package/dist/store.d.mts.map +1 -1
- package/dist/store.mjs +81 -2
- package/dist/ui/App.d.ts +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +32 -4
- package/dist/ui/components/Analyze.d.ts +10 -0
- package/dist/ui/components/Analyze.d.ts.map +1 -0
- package/dist/ui/components/Analyze.js +54 -0
- package/dist/ui/components/Billing.d.ts +10 -0
- package/dist/ui/components/Billing.d.ts.map +1 -0
- package/dist/ui/components/Billing.js +40 -0
- package/dist/ui/components/DB.d.ts.map +1 -1
- package/dist/ui/components/DB.js +2 -2
- package/dist/ui/components/DatabasePicker.d.ts +13 -0
- package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
- package/dist/ui/components/DatabasePicker.js +79 -0
- package/dist/ui/components/Enrich.d.ts +10 -0
- package/dist/ui/components/Enrich.d.ts.map +1 -0
- package/dist/ui/components/Enrich.js +41 -0
- package/dist/ui/components/Gate.js +2 -2
- package/dist/ui/components/Introspect.d.ts.map +1 -1
- package/dist/ui/components/Introspect.js +2 -2
- package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
- package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
- package/dist/ui/components/IntrospectionUpload.js +30 -0
- package/dist/ui/components/Login.d.ts +19 -0
- package/dist/ui/components/Login.d.ts.map +1 -0
- package/dist/ui/components/Login.js +38 -0
- package/dist/ui/components/OutputJson.d.ts +10 -0
- package/dist/ui/components/OutputJson.d.ts.map +1 -0
- package/dist/ui/components/OutputJson.js +18 -0
- package/dist/ui/components/SSH.d.ts.map +1 -1
- package/dist/ui/components/SSH.js +2 -2
- package/dist/ui/components/SamplesUpload.d.ts +10 -0
- package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
- package/dist/ui/components/SamplesUpload.js +24 -0
- package/dist/ui/components/Sampling.d.ts +10 -0
- package/dist/ui/components/Sampling.d.ts.map +1 -0
- package/dist/ui/components/Sampling.js +58 -0
- package/dist/ui/components/Session.d.ts.map +1 -1
- package/dist/ui/components/Session.js +4 -4
- package/dist/ui/components/Spinner.d.ts.map +1 -1
- package/dist/ui/components/Spinner.js +17 -5
- package/dist/ui/components/TextInput.d.ts +11 -0
- package/dist/ui/components/TextInput.d.ts.map +1 -0
- package/dist/ui/components/TextInput.js +286 -0
- package/dist/ui/components/UserExplanation.d.ts +10 -0
- package/dist/ui/components/UserExplanation.d.ts.map +1 -0
- package/dist/ui/components/UserExplanation.js +34 -0
- package/dist/validatePaths.d.mts +2 -1
- package/dist/validatePaths.d.mts.map +1 -1
- package/dist/validatePaths.mjs +6 -2
- package/package.json +7 -7
- package/dist/app/index.d.mts +0 -3
- package/dist/app/index.d.mts.map +0 -1
- package/dist/app/index.mjs +0 -82
- package/dist/schemas/index.d.mts +0 -107
- package/dist/schemas/index.d.mts.map +0 -1
- package/dist/schemas/index.mjs +0 -116
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { runInAction } from 'mobx';
|
|
3
|
+
import { databaseIntrospectionSchema } from '@dbctx/core/schemas/introspection';
|
|
4
|
+
import { fetchDatabaseIdentifier } from '../db/version.mjs';
|
|
5
|
+
const errMessage = (err) => err instanceof Error ? err.message : String(err);
|
|
6
|
+
export const loadIntrospectionFromFile = async (path, pool) => {
|
|
7
|
+
const raw = await (async () => {
|
|
8
|
+
try {
|
|
9
|
+
return { ok: true, value: await readFile(path, 'utf8') };
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
return {
|
|
13
|
+
ok: false,
|
|
14
|
+
error: {
|
|
15
|
+
kind: 'read',
|
|
16
|
+
message: `Failed to read introspection file at ${path}: ${errMessage(err)}`,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
})();
|
|
21
|
+
if (!raw.ok) {
|
|
22
|
+
return { ok: false, error: raw.error };
|
|
23
|
+
}
|
|
24
|
+
const parsed = (() => {
|
|
25
|
+
try {
|
|
26
|
+
return { ok: true, value: JSON.parse(raw.value) };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
error: {
|
|
32
|
+
kind: 'parse',
|
|
33
|
+
message: `Failed to parse introspection JSON at ${path}: ${errMessage(err)}`,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
})();
|
|
38
|
+
if (!parsed.ok) {
|
|
39
|
+
return { ok: false, error: parsed.error };
|
|
40
|
+
}
|
|
41
|
+
const validated = databaseIntrospectionSchema.safeParse(parsed.value);
|
|
42
|
+
if (!validated.success) {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: {
|
|
46
|
+
kind: 'schema',
|
|
47
|
+
message: `Introspection JSON at ${path} does not match the expected schema: ${validated.error.message}`,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const loaded = validated.data;
|
|
52
|
+
const live = await fetchDatabaseIdentifier(pool);
|
|
53
|
+
const matches = loaded.identifier.system_identifier === live.system_identifier &&
|
|
54
|
+
loaded.identifier.database_oid === live.database_oid &&
|
|
55
|
+
loaded.name === live.database_name;
|
|
56
|
+
if (!matches) {
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
error: {
|
|
60
|
+
kind: 'mismatch',
|
|
61
|
+
message: `Introspection JSON does not match the connected database.\n` +
|
|
62
|
+
` loaded: name=${loaded.name} system_identifier=${loaded.identifier.system_identifier} database_oid=${loaded.identifier.database_oid}\n` +
|
|
63
|
+
` live: name=${live.database_name} system_identifier=${live.system_identifier} database_oid=${live.database_oid}`,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, result: loaded };
|
|
68
|
+
};
|
|
69
|
+
export const populateIntrospectionCounts = (store, introspection) => {
|
|
70
|
+
const counts = store.steps.introspection.counts;
|
|
71
|
+
const relations = Object.values(introspection.relations);
|
|
72
|
+
const tables = relations.filter((r) => r.kind === 'table' || r.kind === 'partitioned_table').length;
|
|
73
|
+
const views = relations.filter((r) => r.kind === 'view').length;
|
|
74
|
+
const materializedViews = relations.filter((r) => r.kind === 'materialized_view').length;
|
|
75
|
+
const columns = relations.reduce((acc, r) => acc + Object.keys(r.attributes).length, 0);
|
|
76
|
+
const indexes = relations.reduce((acc, r) => acc + Object.keys(r.indexes).length, 0);
|
|
77
|
+
const foreignKeys = relations.reduce((acc, r) => acc + Object.keys(r.references).length, 0);
|
|
78
|
+
runInAction(() => {
|
|
79
|
+
counts.tables = tables;
|
|
80
|
+
counts.views = views;
|
|
81
|
+
counts.materializedViews = materializedViews;
|
|
82
|
+
counts.columns = columns;
|
|
83
|
+
counts.indexes = indexes;
|
|
84
|
+
counts.foreignKeys = foreignKeys;
|
|
85
|
+
counts.enums = Object.keys(introspection.enums).length;
|
|
86
|
+
counts.analyzed = 0;
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbnRyb3NwZWN0aW9uLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9sb2FkLWludHJvc3BlY3Rpb24ubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBSTlFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBWTFELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBWSxFQUFVLEVBQUUsQ0FDeEMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEtBQUssRUFDMUMsSUFBWSxFQUNaLElBQVUsRUFDdUIsRUFBRTtJQUNuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDMUIsSUFBSSxDQUFDO1lBQ0QsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBQyxDQUFDO1FBQ3BFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDSCxFQUFFLEVBQUUsS0FBYztnQkFDbEIsS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxNQUFlO29CQUNyQixPQUFPLEVBQUUsd0NBQXdDLElBQUksS0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7aUJBQzlFO2FBQ0osQ0FBQztRQUNOLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRUwsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQztZQUNELE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQVksRUFBQyxDQUFDO1FBQ3hFLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDSCxFQUFFLEVBQUUsS0FBYztnQkFDbEIsS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxPQUFnQjtvQkFDdEIsT0FBTyxFQUFFLHlDQUF5QyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2lCQUMvRTthQUNKLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTztZQUNILEVBQUUsRUFBRSxLQUFLO1lBQ1QsS0FBSyxFQUFFO2dCQUNILElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSx5QkFBeUIsSUFBSSx3Q0FBd0MsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7YUFDMUc7U0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRCxNQUFNLE9BQU8sR0FDVCxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxpQkFBaUI7UUFDOUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVk7UUFDcEQsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBRXZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNYLE9BQU87WUFDSCxFQUFFLEVBQUUsS0FBSztZQUNULEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUNILDZEQUE2RDtvQkFDN0Qsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixpQkFBaUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLElBQUk7b0JBQ3pJLGtCQUFrQixJQUFJLENBQUMsYUFBYSxzQkFBc0IsSUFBSSxDQUFDLGlCQUFpQixpQkFBaUIsSUFBSSxDQUFDLFlBQVksRUFBRTthQUMzSDtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3ZDLEtBQWEsRUFDYixhQUFxQyxFQUNqQyxFQUFFO0lBQ04sTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBRWhELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUM5RCxDQUFDLE1BQU0sQ0FBQztJQUNULE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQ3hDLENBQUMsTUFBTSxDQUFDO0lBRVQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUNsRCxDQUFDLENBQ0osQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQzVCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFDL0MsQ0FBQyxDQUNKLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUNoQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQ2xELENBQUMsQ0FDSixDQUFDO0lBRUYsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixNQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVhZEZpbGV9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuaW1wb3J0IHtkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWF9IGZyb20gJ0BkYmN0eC9jb3JlL3NjaGVtYXMvaW50cm9zcGVjdGlvbic7XG5pbXBvcnQgdHlwZSB7VERhdGFiYXNlSW50cm9zcGVjdGlvbn0gZnJvbSAnQGRiY3R4L2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHtmZXRjaERhdGFiYXNlSWRlbnRpZmllcn0gZnJvbSAnLi4vZGIvdmVyc2lvbi5tanMnO1xuXG5leHBvcnQgdHlwZSBUTG9hZEludHJvc3BlY3Rpb25FcnJvciA9XG4gICAgfCB7a2luZDogJ3JlYWQnOyBtZXNzYWdlOiBzdHJpbmd9XG4gICAgfCB7a2luZDogJ3BhcnNlJzsgbWVzc2FnZTogc3RyaW5nfVxuICAgIHwge2tpbmQ6ICdzY2hlbWEnOyBtZXNzYWdlOiBzdHJpbmd9XG4gICAgfCB7a2luZDogJ21pc21hdGNoJzsgbWVzc2FnZTogc3RyaW5nfTtcblxuZXhwb3J0IHR5cGUgVExvYWRJbnRyb3NwZWN0aW9uUmVzdWx0ID1cbiAgICB8IHtvazogdHJ1ZTsgcmVzdWx0OiBURGF0YWJhc2VJbnRyb3NwZWN0aW9ufVxuICAgIHwge29rOiBmYWxzZTsgZXJyb3I6IFRMb2FkSW50cm9zcGVjdGlvbkVycm9yfTtcblxuY29uc3QgZXJyTWVzc2FnZSA9IChlcnI6IHVua25vd24pOiBzdHJpbmcgPT5cbiAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cbmV4cG9ydCBjb25zdCBsb2FkSW50cm9zcGVjdGlvbkZyb21GaWxlID0gYXN5bmMgKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBwb29sOiBQb29sLFxuKTogUHJvbWlzZTxUTG9hZEludHJvc3BlY3Rpb25SZXN1bHQ+ID0+IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSBhcyBjb25zdCwgdmFsdWU6IGF3YWl0IHJlYWRGaWxlKHBhdGgsICd1dGY4Jyl9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdyZWFkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byByZWFkIGludHJvc3BlY3Rpb24gZmlsZSBhdCAke3BhdGh9OiAke2Vyck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoKTtcblxuICAgIGlmICghcmF3Lm9rKSB7XG4gICAgICAgIHJldHVybiB7b2s6IGZhbHNlLCBlcnJvcjogcmF3LmVycm9yfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSAoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSBhcyBjb25zdCwgdmFsdWU6IEpTT04ucGFyc2UocmF3LnZhbHVlKSBhcyB1bmtub3dufTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAncGFyc2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHBhcnNlIGludHJvc3BlY3Rpb24gSlNPTiBhdCAke3BhdGh9OiAke2Vyck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoKTtcblxuICAgIGlmICghcGFyc2VkLm9rKSB7XG4gICAgICAgIHJldHVybiB7b2s6IGZhbHNlLCBlcnJvcjogcGFyc2VkLmVycm9yfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWEuc2FmZVBhcnNlKHBhcnNlZC52YWx1ZSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlZC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdzY2hlbWEnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJbnRyb3NwZWN0aW9uIEpTT04gYXQgJHtwYXRofSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgc2NoZW1hOiAke3ZhbGlkYXRlZC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZCA9IHZhbGlkYXRlZC5kYXRhO1xuICAgIGNvbnN0IGxpdmUgPSBhd2FpdCBmZXRjaERhdGFiYXNlSWRlbnRpZmllcihwb29sKTtcblxuICAgIGNvbnN0IG1hdGNoZXMgPVxuICAgICAgICBsb2FkZWQuaWRlbnRpZmllci5zeXN0ZW1faWRlbnRpZmllciA9PT0gbGl2ZS5zeXN0ZW1faWRlbnRpZmllciAmJlxuICAgICAgICBsb2FkZWQuaWRlbnRpZmllci5kYXRhYmFzZV9vaWQgPT09IGxpdmUuZGF0YWJhc2Vfb2lkICYmXG4gICAgICAgIGxvYWRlZC5uYW1lID09PSBsaXZlLmRhdGFiYXNlX25hbWU7XG5cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAga2luZDogJ21pc21hdGNoJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICBgSW50cm9zcGVjdGlvbiBKU09OIGRvZXMgbm90IG1hdGNoIHRoZSBjb25uZWN0ZWQgZGF0YWJhc2UuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgIGxvYWRlZDogbmFtZT0ke2xvYWRlZC5uYW1lfSBzeXN0ZW1faWRlbnRpZmllcj0ke2xvYWRlZC5pZGVudGlmaWVyLnN5c3RlbV9pZGVudGlmaWVyfSBkYXRhYmFzZV9vaWQ9JHtsb2FkZWQuaWRlbnRpZmllci5kYXRhYmFzZV9vaWR9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgIGxpdmU6ICAgbmFtZT0ke2xpdmUuZGF0YWJhc2VfbmFtZX0gc3lzdGVtX2lkZW50aWZpZXI9JHtsaXZlLnN5c3RlbV9pZGVudGlmaWVyfSBkYXRhYmFzZV9vaWQ9JHtsaXZlLmRhdGFiYXNlX29pZH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge29rOiB0cnVlLCByZXN1bHQ6IGxvYWRlZH07XG59O1xuXG5leHBvcnQgY29uc3QgcG9wdWxhdGVJbnRyb3NwZWN0aW9uQ291bnRzID0gKFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgaW50cm9zcGVjdGlvbjogVERhdGFiYXNlSW50cm9zcGVjdGlvbixcbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGNvdW50cyA9IHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uY291bnRzO1xuXG4gICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LnZhbHVlcyhpbnRyb3NwZWN0aW9uLnJlbGF0aW9ucyk7XG5cbiAgICBjb25zdCB0YWJsZXMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAocikgPT4gci5raW5kID09PSAndGFibGUnIHx8IHIua2luZCA9PT0gJ3BhcnRpdGlvbmVkX3RhYmxlJyxcbiAgICApLmxlbmd0aDtcbiAgICBjb25zdCB2aWV3cyA9IHJlbGF0aW9ucy5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3ZpZXcnKS5sZW5ndGg7XG4gICAgY29uc3QgbWF0ZXJpYWxpemVkVmlld3MgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAocikgPT4gci5raW5kID09PSAnbWF0ZXJpYWxpemVkX3ZpZXcnLFxuICAgICkubGVuZ3RoO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IHJlbGF0aW9ucy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHIpID0+IGFjYyArIE9iamVjdC5rZXlzKHIuYXR0cmlidXRlcykubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICk7XG4gICAgY29uc3QgaW5kZXhlcyA9IHJlbGF0aW9ucy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHIpID0+IGFjYyArIE9iamVjdC5rZXlzKHIuaW5kZXhlcykubGVuZ3RoLFxuICAgICAgICAwLFxuICAgICk7XG4gICAgY29uc3QgZm9yZWlnbktleXMgPSByZWxhdGlvbnMucmVkdWNlKFxuICAgICAgICAoYWNjLCByKSA9PiBhY2MgKyBPYmplY3Qua2V5cyhyLnJlZmVyZW5jZXMpLmxlbmd0aCxcbiAgICAgICAgMCxcbiAgICApO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBjb3VudHMudGFibGVzID0gdGFibGVzO1xuICAgICAgICBjb3VudHMudmlld3MgPSB2aWV3cztcbiAgICAgICAgY291bnRzLm1hdGVyaWFsaXplZFZpZXdzID0gbWF0ZXJpYWxpemVkVmlld3M7XG4gICAgICAgIGNvdW50cy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgY291bnRzLmluZGV4ZXMgPSBpbmRleGVzO1xuICAgICAgICBjb3VudHMuZm9yZWlnbktleXMgPSBmb3JlaWduS2V5cztcbiAgICAgICAgY291bnRzLmVudW1zID0gT2JqZWN0LmtleXMoaW50cm9zcGVjdGlvbi5lbnVtcykubGVuZ3RoO1xuICAgICAgICBjb3VudHMuYW5hbHl6ZWQgPSAwO1xuICAgIH0pO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.mts","sourceRoot":"./src/","sources":["app/login.mts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,IAAI,CAsD7C,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { render } from 'ink';
|
|
2
|
+
import { createElement, useState, useEffect } from 'react';
|
|
3
|
+
import { trpc, createAuthenticatedTRPCClient } from '../lib/trpc.mjs';
|
|
4
|
+
import { readConfig, writeConfig } from './config.mjs';
|
|
5
|
+
import { buildConnectURL } from './open-url.mjs';
|
|
6
|
+
import { detectHostname, detectOS, detectShell, detectUsername, } from './detect.mjs';
|
|
7
|
+
import { LoginView } from '../ui/components/Login.js';
|
|
8
|
+
import { logger } from '../logger.mjs';
|
|
9
|
+
const waitForToken = (loginId) => new Promise((resolve, reject) => {
|
|
10
|
+
const sub = trpc.cliLogin.onAuthorization.subscribe({ login_id: loginId }, {
|
|
11
|
+
onData: (data) => {
|
|
12
|
+
sub.unsubscribe();
|
|
13
|
+
resolve(data.token);
|
|
14
|
+
},
|
|
15
|
+
onError: (err) => {
|
|
16
|
+
sub.unsubscribe();
|
|
17
|
+
reject(err);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
const LoginApp = ({ initialState, subscribe }) => {
|
|
22
|
+
const [state, setState] = useState(initialState);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
subscribe(setState);
|
|
25
|
+
}, [subscribe]);
|
|
26
|
+
return createElement(LoginView, { state });
|
|
27
|
+
};
|
|
28
|
+
export const runLogin = async () => {
|
|
29
|
+
let setState = () => { };
|
|
30
|
+
const subscribe = async (update) => {
|
|
31
|
+
setState = update;
|
|
32
|
+
};
|
|
33
|
+
const inkApp = render(createElement(LoginApp, {
|
|
34
|
+
initialState: { kind: 'creating' },
|
|
35
|
+
subscribe,
|
|
36
|
+
}));
|
|
37
|
+
try {
|
|
38
|
+
const config = await readConfig();
|
|
39
|
+
const { login_id } = await trpc.cliLogin.create.mutate({
|
|
40
|
+
username: detectUsername(),
|
|
41
|
+
hostname: detectHostname(),
|
|
42
|
+
os: detectOS(),
|
|
43
|
+
shell: detectShell(),
|
|
44
|
+
device_id: config.device_id,
|
|
45
|
+
});
|
|
46
|
+
const url = buildConnectURL(login_id);
|
|
47
|
+
setState({ kind: 'waiting', url });
|
|
48
|
+
const token = await waitForToken(login_id);
|
|
49
|
+
await writeConfig(token);
|
|
50
|
+
const authed = createAuthenticatedTRPCClient(() => Promise.resolve(token));
|
|
51
|
+
const account = await authed.account.getAccount.query({});
|
|
52
|
+
setState({
|
|
53
|
+
kind: 'connected',
|
|
54
|
+
email: account.emails[0] ?? null,
|
|
55
|
+
});
|
|
56
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
57
|
+
inkApp.unmount();
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
62
|
+
logger.error(`login: ${message}`);
|
|
63
|
+
setState({ kind: 'error', message });
|
|
64
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
65
|
+
inkApp.unmount();
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4ubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2xvZ2luLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUN6RCxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxjQUFjLEVBQ2QsUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEdBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxTQUFTLEVBQW1CLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWUsRUFBbUIsRUFBRSxDQUN0RCxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQy9DLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxFQUNuQjtRQUNJLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxHQUFH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LEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmVuZGVyfSBmcm9tICdpbmsnO1xuaW1wb3J0IHtjcmVhdGVFbGVtZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3RycGMsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50fSBmcm9tICcuLi9saWIvdHJwYy5tanMnO1xuaW1wb3J0IHtyZWFkQ29uZmlnLCB3cml0ZUNvbmZpZ30gZnJvbSAnLi9jb25maWcubWpzJztcbmltcG9ydCB7YnVpbGRDb25uZWN0VVJMfSBmcm9tICcuL29wZW4tdXJsLm1qcyc7XG5pbXBvcnQge1xuICAgIGRldGVjdEhvc3RuYW1lLFxuICAgIGRldGVjdE9TLFxuICAgIGRldGVjdFNoZWxsLFxuICAgIGRldGVjdFVzZXJuYW1lLFxufSBmcm9tICcuL2RldGVjdC5tanMnO1xuaW1wb3J0IHtMb2dpblZpZXcsIHR5cGUgVExvZ2luU3RhdGV9IGZyb20gJy4uL3VpL2NvbXBvbmVudHMvTG9naW4uanMnO1xuaW1wb3J0IHtsb2dnZXJ9IGZyb20gJy4uL2xvZ2dlci5tanMnO1xuXG5jb25zdCB3YWl0Rm9yVG9rZW4gPSAobG9naW5JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+XG4gICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRycGMuY2xpTG9naW4ub25BdXRob3JpemF0aW9uLnN1YnNjcmliZShcbiAgICAgICAgICAgIHtsb2dpbl9pZDogbG9naW5JZH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25EYXRhOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH0pO1xuXG50eXBlIFRMb2dpbkFwcFByb3BzID0ge1xuICAgIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogVExvZ2luU3RhdGU7XG4gICAgcmVhZG9ubHkgc3Vic2NyaWJlOiAoXG4gICAgICAgIHNldFN0YXRlOiAobmV4dDogVExvZ2luU3RhdGUpID0+IHZvaWQsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xufTtcblxuY29uc3QgTG9naW5BcHAgPSAoe2luaXRpYWxTdGF0ZSwgc3Vic2NyaWJlfTogVExvZ2luQXBwUHJvcHMpID0+IHtcbiAgICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlPFRMb2dpblN0YXRlPihpbml0aWFsU3RhdGUpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlKHNldFN0YXRlKTtcbiAgICB9LCBbc3Vic2NyaWJlXSk7XG5cbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChMb2dpblZpZXcsIHtzdGF0ZX0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJ1bkxvZ2luID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGxldCBzZXRTdGF0ZTogKG5leHQ6IFRMb2dpblN0YXRlKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBjb25zdCBzdWJzY3JpYmUgPSBhc3luYyAoXG4gICAgICAgIHVwZGF0ZTogKG5leHQ6IFRMb2dpblN0YXRlKSA9PiB2b2lkLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBzZXRTdGF0ZSA9IHVwZGF0ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5rQXBwID0gcmVuZGVyKFxuICAgICAgICBjcmVhdGVFbGVtZW50KExvZ2luQXBwLCB7XG4gICAgICAgICAgICBpbml0aWFsU3RhdGU6IHtraW5kOiAnY3JlYXRpbmcnfSxcbiAgICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlYWRDb25maWcoKTtcblxuICAgICAgICBjb25zdCB7bG9naW5faWR9ID0gYXdhaXQgdHJwYy5jbGlMb2dpbi5jcmVhdGUubXV0YXRlKHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBkZXRlY3RVc2VybmFtZSgpLFxuICAgICAgICAgICAgaG9zdG5hbWU6IGRldGVjdEhvc3RuYW1lKCksXG4gICAgICAgICAgICBvczogZGV0ZWN0T1MoKSxcbiAgICAgICAgICAgIHNoZWxsOiBkZXRlY3RTaGVsbCgpLFxuICAgICAgICAgICAgZGV2aWNlX2lkOiBjb25maWcuZGV2aWNlX2lkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1cmwgPSBidWlsZENvbm5lY3RVUkwobG9naW5faWQpO1xuICAgICAgICBzZXRTdGF0ZSh7a2luZDogJ3dhaXRpbmcnLCB1cmx9KTtcblxuICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHdhaXRGb3JUb2tlbihsb2dpbl9pZCk7XG4gICAgICAgIGF3YWl0IHdyaXRlQ29uZmlnKHRva2VuKTtcblxuICAgICAgICBjb25zdCBhdXRoZWQgPSBjcmVhdGVBdXRoZW50aWNhdGVkVFJQQ0NsaWVudCgoKSA9PlxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGF1dGhlZC5hY2NvdW50LmdldEFjY291bnQucXVlcnkoe30pO1xuXG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb25uZWN0ZWQnLFxuICAgICAgICAgICAgZW1haWw6IGFjY291bnQuZW1haWxzWzBdID8/IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDIwMCkpO1xuICAgICAgICBpbmtBcHAudW5tb3VudCgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgbG9naW46ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgc2V0U3RhdGUoe2tpbmQ6ICdlcnJvcicsIG1lc3NhZ2V9KTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMjAwKSk7XG4gICAgICAgIGlua0FwcC51bm1vdW50KCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG59O1xuIl19
|
package/dist/app/open-url.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare const shouldOpenBrowser: () => boolean;
|
|
2
2
|
export declare const buildSessionURL: (sessionId: string) => string;
|
|
3
|
+
export declare const buildConnectURL: (loginId: string) => string;
|
|
4
|
+
export declare const openURL: (url: string) => Promise<void>;
|
|
3
5
|
export declare const openSessionURL: (url: string) => Promise<void>;
|
|
4
6
|
//# sourceMappingURL=open-url.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;
|
|
1
|
+
{"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;AAUF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MACH,CAAC;AAElD,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,MACL,CAAC;AAE9C,eAAO,MAAM,OAAO,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAWvD,CAAC;AAEF,eAAO,MAAM,cAAc,QAbQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAanB,CAAC"}
|
package/dist/app/open-url.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { env } from 'process';
|
|
2
|
-
import { DBCTX_DEV } from '
|
|
2
|
+
import { DBCTX_DEV } from '../lib/env.mjs';
|
|
3
3
|
const SKIP_VALUES = new Set(['none', 'false', '0']);
|
|
4
4
|
const isDocker = () => !!(env.DOCKER || env.container || env.DOCKER_CONTAINER);
|
|
5
5
|
export const shouldOpenBrowser = () => {
|
|
@@ -12,8 +12,12 @@ export const shouldOpenBrowser = () => {
|
|
|
12
12
|
const SESSION_BASE_URL = !DBCTX_DEV
|
|
13
13
|
? 'https://dbctx.io/authorize/session'
|
|
14
14
|
: 'http://localhost:12002/authorize/session';
|
|
15
|
+
const CONNECT_BASE_URL = !DBCTX_DEV
|
|
16
|
+
? 'https://dbctx.io/connect'
|
|
17
|
+
: 'http://localhost:12002/connect';
|
|
15
18
|
export const buildSessionURL = (sessionId) => `${SESSION_BASE_URL}?session-id=${sessionId}`;
|
|
16
|
-
export const
|
|
19
|
+
export const buildConnectURL = (loginId) => `${CONNECT_BASE_URL}?login-id=${loginId}`;
|
|
20
|
+
export const openURL = async (url) => {
|
|
17
21
|
if (!shouldOpenBrowser()) {
|
|
18
22
|
return;
|
|
19
23
|
}
|
|
@@ -25,4 +29,5 @@ export const openSessionURL = async (url) => {
|
|
|
25
29
|
// Browser opening is best-effort — no-op on failure
|
|
26
30
|
}
|
|
27
31
|
};
|
|
28
|
-
|
|
32
|
+
export const openSessionURL = openURL;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi11cmwubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL29wZW4tdXJsLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVwRCxNQUFNLFFBQVEsR0FBRyxHQUFZLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUMzQyxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUUzQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsb0NBQW9DO0lBQ3RDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQztBQUVqRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsMEJBQTBCO0lBQzVCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUUsQ0FDekQsR0FBRyxnQkFBZ0IsZUFBZSxTQUFTLEVBQUUsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRSxDQUN2RCxHQUFHLGdCQUFnQixhQUFhLE9BQU8sRUFBRSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsR0FBVyxFQUFpQixFQUFFO0lBQ3hELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTztJQUNYLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCxvREFBb0Q7SUFDeEQsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQge0RCQ1RYX0RFVn0gZnJvbSAnLi4vbGliL2Vudi5tanMnO1xuXG5jb25zdCBTS0lQX1ZBTFVFUyA9IG5ldyBTZXQoWydub25lJywgJ2ZhbHNlJywgJzAnXSk7XG5cbmNvbnN0IGlzRG9ja2VyID0gKCk6IGJvb2xlYW4gPT5cbiAgICAhIShlbnYuRE9DS0VSIHx8IGVudi5jb250YWluZXIgfHwgZW52LkRPQ0tFUl9DT05UQUlORVIpO1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkT3BlbkJyb3dzZXIgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKGlzRG9ja2VyKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJyb3dzZXIgPSBlbnYuQlJPV1NFUj8udG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiAhYnJvd3NlciB8fCAhU0tJUF9WQUxVRVMuaGFzKGJyb3dzZXIpO1xufTtcblxuY29uc3QgU0VTU0lPTl9CQVNFX1VSTCA9ICFEQkNUWF9ERVZcbiAgICA/ICdodHRwczovL2RiY3R4LmlvL2F1dGhvcml6ZS9zZXNzaW9uJ1xuICAgIDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MTIwMDIvYXV0aG9yaXplL3Nlc3Npb24nO1xuXG5jb25zdCBDT05ORUNUX0JBU0VfVVJMID0gIURCQ1RYX0RFVlxuICAgID8gJ2h0dHBzOi8vZGJjdHguaW8vY29ubmVjdCdcbiAgICA6ICdodHRwOi8vbG9jYWxob3N0OjEyMDAyL2Nvbm5lY3QnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRTZXNzaW9uVVJMID0gKHNlc3Npb25JZDogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgYCR7U0VTU0lPTl9CQVNFX1VSTH0/c2Vzc2lvbi1pZD0ke3Nlc3Npb25JZH1gO1xuXG5leHBvcnQgY29uc3QgYnVpbGRDb25uZWN0VVJMID0gKGxvZ2luSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIGAke0NPTk5FQ1RfQkFTRV9VUkx9P2xvZ2luLWlkPSR7bG9naW5JZH1gO1xuXG5leHBvcnQgY29uc3Qgb3BlblVSTCA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghc2hvdWxkT3BlbkJyb3dzZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHQ6IG9wZW59ID0gYXdhaXQgaW1wb3J0KCdvcGVuJyk7XG4gICAgICAgIGF3YWl0IG9wZW4odXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQnJvd3NlciBvcGVuaW5nIGlzIGJlc3QtZWZmb3J0IOKAlCBuby1vcCBvbiBmYWlsdXJlXG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IG9wZW5TZXNzaW9uVVJMID0gb3BlblVSTDtcbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Pool } from 'pg';
|
|
2
|
+
import type { TDatabaseIntrospection } from '@dbctx/core';
|
|
3
|
+
import type { TStore } from '../store.mjs';
|
|
4
|
+
export type TSensitiveMask = Readonly<Record<string, readonly string[]>>;
|
|
5
|
+
export type TTableSampleColumn = {
|
|
6
|
+
readonly strategy: 'distinct' | 'random';
|
|
7
|
+
readonly count: number;
|
|
8
|
+
readonly values: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
export type TTableSamples = {
|
|
11
|
+
readonly table: string;
|
|
12
|
+
readonly sampled_at: string;
|
|
13
|
+
readonly columns: Readonly<Record<string, TTableSampleColumn>>;
|
|
14
|
+
readonly excluded_columns: readonly string[];
|
|
15
|
+
};
|
|
16
|
+
export type TTableSampleEvent = {
|
|
17
|
+
readonly tableName: string;
|
|
18
|
+
readonly samples: TTableSamples;
|
|
19
|
+
};
|
|
20
|
+
export declare const loadSensitiveMask: (path: string) => Promise<TSensitiveMask>;
|
|
21
|
+
export declare const prepareOutputDir: (dirPath: string, allowOverwrite: boolean, store: TStore) => Promise<boolean>;
|
|
22
|
+
export declare const persistTableSamplesToDir: (outputDir: string, event: TTableSampleEvent, indexAccumulator: Record<string, string>) => Promise<void>;
|
|
23
|
+
export declare const runSampling: (pool: Pool, introspection: TDatabaseIntrospection, store: TStore, mask: TSensitiveMask, tableFilter?: ReadonlySet<string>) => AsyncGenerator<TTableSampleEvent>;
|
|
24
|
+
//# sourceMappingURL=sample.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample.d.mts","sourceRoot":"./src/","sources":["app/sample.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAazC,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACnC,CAAC;AAkFF,eAAO,MAAM,iBAAiB,GAC1B,MAAM,MAAM,KACb,OAAO,CAAC,cAAc,CAIxB,CAAC;AAmBF,eAAO,MAAM,gBAAgB,GACzB,SAAS,MAAM,EACf,gBAAgB,OAAO,EACvB,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAsDjB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACjC,WAAW,MAAM,EACjB,OAAO,iBAAiB,EACxB,kBAAkB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACzC,OAAO,CAAC,IAAI,CAcd,CAAC;AAEF,eAAO,MAAM,WAAW,GACpB,MAAM,IAAI,EACV,eAAe,sBAAsB,EACrC,OAAO,MAAM,EACb,MAAM,cAAc,EACpB,cAAc,WAAW,CAAC,MAAM,CAAC,KAClC,cAAc,CAAC,iBAAiB,CA0LlC,CAAC"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, mkdir, readdir, stat } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import PQueue from 'p-queue';
|
|
5
|
+
import { runInAction, when } from 'mobx';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { atomicWriteFile, recoverAtomicWritesInDir, } from '../lib/atomic-write.mjs';
|
|
8
|
+
import { sampleColumn, sampleCompositeSubField, fetchCompositeSubFields, } from '../db/index.mjs';
|
|
9
|
+
const SAMPLEABLE_TYPE_PREFIXES = Object.freeze([
|
|
10
|
+
'text',
|
|
11
|
+
'character',
|
|
12
|
+
'citext',
|
|
13
|
+
'integer',
|
|
14
|
+
'bigint',
|
|
15
|
+
'smallint',
|
|
16
|
+
'numeric',
|
|
17
|
+
'decimal',
|
|
18
|
+
'real',
|
|
19
|
+
'double precision',
|
|
20
|
+
'boolean',
|
|
21
|
+
'date',
|
|
22
|
+
'timestamp',
|
|
23
|
+
'time with',
|
|
24
|
+
'time without',
|
|
25
|
+
'interval',
|
|
26
|
+
'uuid',
|
|
27
|
+
'json',
|
|
28
|
+
'money',
|
|
29
|
+
'inet',
|
|
30
|
+
'cidr',
|
|
31
|
+
]);
|
|
32
|
+
const TEXTUAL_TYPE_PREFIXES = Object.freeze([
|
|
33
|
+
'text',
|
|
34
|
+
'character',
|
|
35
|
+
'citext',
|
|
36
|
+
'json',
|
|
37
|
+
]);
|
|
38
|
+
const MAX_TEXT_LENGTH = 512;
|
|
39
|
+
const SAMPLING_CONCURRENCY = 8;
|
|
40
|
+
const sensitiveMaskSchema = z.record(z.string(), z.array(z.string()));
|
|
41
|
+
const matchesPrefix = (dataType, prefixes) => {
|
|
42
|
+
const lower = dataType.toLowerCase();
|
|
43
|
+
return prefixes.some((prefix) => lower.startsWith(prefix));
|
|
44
|
+
};
|
|
45
|
+
const isSampleableScalar = (dataType) => matchesPrefix(dataType, SAMPLEABLE_TYPE_PREFIXES);
|
|
46
|
+
const isArrayType = (dataType) => dataType.endsWith('[]') || dataType.toLowerCase().startsWith('array');
|
|
47
|
+
const getArrayElementType = (dataType) => dataType.endsWith('[]') ? dataType.slice(0, -2) : dataType;
|
|
48
|
+
const resolveEnumValues = (dataType, enums) => {
|
|
49
|
+
if (enums[dataType]) {
|
|
50
|
+
return enums[dataType].values;
|
|
51
|
+
}
|
|
52
|
+
if (isArrayType(dataType)) {
|
|
53
|
+
const el = getArrayElementType(dataType);
|
|
54
|
+
if (enums[el]) {
|
|
55
|
+
return enums[el].values;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
};
|
|
60
|
+
const isTextualType = (dataType) => matchesPrefix(dataType, TEXTUAL_TYPE_PREFIXES);
|
|
61
|
+
const truncateValue = (value, dataType) => isTextualType(dataType) && value.length > MAX_TEXT_LENGTH
|
|
62
|
+
? value.slice(0, MAX_TEXT_LENGTH) + '...'
|
|
63
|
+
: value;
|
|
64
|
+
const hashTableName = (name) => createHash('sha256').update(name).digest('hex');
|
|
65
|
+
export const loadSensitiveMask = async (path) => {
|
|
66
|
+
const raw = await readFile(path, 'utf-8');
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
return sensitiveMaskSchema.parse(parsed);
|
|
69
|
+
};
|
|
70
|
+
const isSampleableType = (dataType, enumNames) => {
|
|
71
|
+
if (isSampleableScalar(dataType)) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (enumNames.has(dataType)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (isArrayType(dataType)) {
|
|
78
|
+
const elementType = getArrayElementType(dataType);
|
|
79
|
+
return isSampleableScalar(elementType) || enumNames.has(elementType);
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
};
|
|
83
|
+
export const prepareOutputDir = async (dirPath, allowOverwrite, store) => {
|
|
84
|
+
try {
|
|
85
|
+
const dirStat = await stat(dirPath).catch(() => null);
|
|
86
|
+
if (dirStat !== null && !dirStat.isDirectory()) {
|
|
87
|
+
runInAction(() => {
|
|
88
|
+
store.steps.sampling.state = 'error';
|
|
89
|
+
store.steps.sampling.error = `--output-samples path "${dirPath}" exists but is not a directory`;
|
|
90
|
+
});
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (dirStat === null) {
|
|
94
|
+
await mkdir(dirPath, { recursive: true });
|
|
95
|
+
runInAction(() => {
|
|
96
|
+
store.steps.sampling.outputDir = dirPath;
|
|
97
|
+
});
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
await recoverAtomicWritesInDir(dirPath);
|
|
101
|
+
const entries = await readdir(dirPath);
|
|
102
|
+
if (entries.length > 0 && !allowOverwrite) {
|
|
103
|
+
runInAction(() => {
|
|
104
|
+
store.steps.sampling.state = 'prompting-overwrite';
|
|
105
|
+
store.steps.sampling.outputDir = dirPath;
|
|
106
|
+
});
|
|
107
|
+
await when(() => store.steps.sampling.confirmed !== null);
|
|
108
|
+
if (!store.steps.sampling.confirmed) {
|
|
109
|
+
runInAction(() => {
|
|
110
|
+
store.steps.sampling.state = 'done';
|
|
111
|
+
});
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
runInAction(() => {
|
|
116
|
+
store.steps.sampling.outputDir = dirPath;
|
|
117
|
+
});
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
runInAction(() => {
|
|
122
|
+
store.steps.sampling.state = 'error';
|
|
123
|
+
store.steps.sampling.error =
|
|
124
|
+
err instanceof Error
|
|
125
|
+
? `Failed to prepare output directory: ${err.message}`
|
|
126
|
+
: String(err);
|
|
127
|
+
});
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
export const persistTableSamplesToDir = async (outputDir, event, indexAccumulator) => {
|
|
132
|
+
const fileName = `${hashTableName(event.tableName)}.json`;
|
|
133
|
+
await atomicWriteFile(join(outputDir, fileName), JSON.stringify(event.samples, null, 2));
|
|
134
|
+
indexAccumulator[event.tableName] = fileName;
|
|
135
|
+
await atomicWriteFile(join(outputDir, 'index.json'), JSON.stringify(indexAccumulator, null, 2));
|
|
136
|
+
};
|
|
137
|
+
export const runSampling = async function* (pool, introspection, store, mask, tableFilter) {
|
|
138
|
+
const enumNames = new Set(Object.keys(introspection.enums));
|
|
139
|
+
const relationEntries = Object.entries(introspection.relations).filter(([name]) => (tableFilter ? tableFilter.has(name) : true));
|
|
140
|
+
runInAction(() => {
|
|
141
|
+
store.steps.sampling.state = 'fetching';
|
|
142
|
+
store.steps.sampling.counts.totalTables = relationEntries.length;
|
|
143
|
+
});
|
|
144
|
+
const queue = new PQueue({ concurrency: SAMPLING_CONCURRENCY });
|
|
145
|
+
for (const [tableName, relation] of relationEntries) {
|
|
146
|
+
const maskedColumns = mask[tableName] ?? [];
|
|
147
|
+
const maskedSet = new Set(maskedColumns);
|
|
148
|
+
const attributes = Object.values(relation.attributes);
|
|
149
|
+
const relationKind = relation.kind;
|
|
150
|
+
const estimatedRowCount = relation.estimated_row_count ?? 0;
|
|
151
|
+
const workItems = [];
|
|
152
|
+
let skipped = 0;
|
|
153
|
+
for (const attr of attributes) {
|
|
154
|
+
if (maskedSet.has(attr.name)) {
|
|
155
|
+
skipped += 1;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const dataType = attr.data_type;
|
|
159
|
+
if (isSampleableType(dataType, enumNames)) {
|
|
160
|
+
workItems.push({
|
|
161
|
+
columnName: attr.name,
|
|
162
|
+
dataType,
|
|
163
|
+
estimatedDistinct: 'estimated_distinct' in attr
|
|
164
|
+
? attr.estimated_distinct
|
|
165
|
+
: 0,
|
|
166
|
+
composite: null,
|
|
167
|
+
enumValues: resolveEnumValues(dataType, introspection.enums),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else if (!isArrayType(dataType) &&
|
|
171
|
+
!isSampleableScalar(dataType) &&
|
|
172
|
+
!enumNames.has(dataType)) {
|
|
173
|
+
// Potential composite type — introspect sub-fields
|
|
174
|
+
const subFields = await fetchCompositeSubFields(pool, dataType);
|
|
175
|
+
if (subFields.length > 0) {
|
|
176
|
+
for (const sf of subFields) {
|
|
177
|
+
if (maskedSet.has(sf.name)) {
|
|
178
|
+
skipped += 1;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (isSampleableType(sf.data_type, enumNames)) {
|
|
182
|
+
workItems.push({
|
|
183
|
+
columnName: `${attr.name}.${sf.name}`,
|
|
184
|
+
dataType: sf.data_type,
|
|
185
|
+
estimatedDistinct: 0,
|
|
186
|
+
composite: {
|
|
187
|
+
columnName: attr.name,
|
|
188
|
+
subFieldName: sf.name,
|
|
189
|
+
},
|
|
190
|
+
enumValues: resolveEnumValues(sf.data_type, introspection.enums),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
skipped += 1;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
skipped += 1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
skipped += 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
runInAction(() => {
|
|
207
|
+
store.steps.sampling.counts.totalColumns += workItems.length;
|
|
208
|
+
store.steps.sampling.counts.skippedColumns += skipped;
|
|
209
|
+
});
|
|
210
|
+
const columnResults = (await Promise.all(workItems.map((item) => {
|
|
211
|
+
if (item.enumValues) {
|
|
212
|
+
runInAction(() => {
|
|
213
|
+
store.steps.sampling.counts.sampledColumns += 1;
|
|
214
|
+
});
|
|
215
|
+
const columnName = item.composite
|
|
216
|
+
? `${item.composite.columnName}.${item.composite.subFieldName}`
|
|
217
|
+
: item.columnName;
|
|
218
|
+
return Promise.resolve({
|
|
219
|
+
column_name: columnName,
|
|
220
|
+
strategy: 'distinct',
|
|
221
|
+
values: item.enumValues,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return queue.add(async () => {
|
|
225
|
+
const result = item.composite
|
|
226
|
+
? await sampleCompositeSubField(pool, tableName, item.composite.columnName, item.composite.subFieldName, item.estimatedDistinct, estimatedRowCount, relationKind)
|
|
227
|
+
: await sampleColumn(pool, tableName, item.columnName, item.estimatedDistinct, estimatedRowCount, relationKind);
|
|
228
|
+
runInAction(() => {
|
|
229
|
+
store.steps.sampling.counts.sampledColumns += 1;
|
|
230
|
+
});
|
|
231
|
+
return result;
|
|
232
|
+
});
|
|
233
|
+
})));
|
|
234
|
+
const columns = Object.fromEntries(columnResults.map((sample) => [
|
|
235
|
+
sample.column_name,
|
|
236
|
+
{
|
|
237
|
+
strategy: sample.strategy,
|
|
238
|
+
count: sample.values.length,
|
|
239
|
+
values: sample.values.map((v) => truncateValue(v, workItems.find((w) => w.columnName === sample.column_name)?.dataType ?? '')),
|
|
240
|
+
},
|
|
241
|
+
]));
|
|
242
|
+
const tableSamples = {
|
|
243
|
+
table: tableName,
|
|
244
|
+
sampled_at: new Date().toISOString(),
|
|
245
|
+
columns,
|
|
246
|
+
excluded_columns: maskedColumns,
|
|
247
|
+
};
|
|
248
|
+
yield { tableName, samples: tableSamples };
|
|
249
|
+
runInAction(() => {
|
|
250
|
+
store.steps.sampling.counts.completedTables += 1;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
runInAction(() => {
|
|
254
|
+
store.steps.sampling.state = 'done';
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9zYW1wbGUubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFL0IsT0FBTyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxDQUFDLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFLdEIsT0FBTyxFQUNILGVBQWUsRUFDZix3QkFBd0IsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0gsWUFBWSxFQUNaLHVCQUF1QixFQUN2Qix1QkFBdUIsR0FHMUIsTUFBTSxpQkFBaUIsQ0FBQztBQXNCekIsTUFBTSx3QkFBd0IsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM5RCxNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFVBQVU7SUFDVixTQUFTO0lBQ1QsU0FBUztJQUNULE1BQU07SUFDTixrQkFBa0I7SUFDbEIsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsV0FBVztJQUNYLGNBQWM7SUFDZCxVQUFVO0lBQ1YsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07Q0FDQSxDQUFDLENBQUM7QUFFWixNQUFNLHFCQUFxQixHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNELE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtJQUNSLE1BQU07Q0FDQSxDQUFDLENBQUM7QUFFWixNQUFNLGVBQWUsR0FB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SyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtyZWFkRmlsZSwgbWtkaXIsIHJlYWRkaXIsIHN0YXR9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtqb2lufSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgUFF1ZXVlIGZyb20gJ3AtcXVldWUnO1xuaW1wb3J0IHtydW5JbkFjdGlvbiwgd2hlbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuaW1wb3J0IHR5cGUge1REYXRhYmFzZUludHJvc3BlY3Rpb259IGZyb20gJ0BkYmN0eC9jb3JlJztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB7XG4gICAgYXRvbWljV3JpdGVGaWxlLFxuICAgIHJlY292ZXJBdG9taWNXcml0ZXNJbkRpcixcbn0gZnJvbSAnLi4vbGliL2F0b21pYy13cml0ZS5tanMnO1xuaW1wb3J0IHtcbiAgICBzYW1wbGVDb2x1bW4sXG4gICAgc2FtcGxlQ29tcG9zaXRlU3ViRmllbGQsXG4gICAgZmV0Y2hDb21wb3NpdGVTdWJGaWVsZHMsXG4gICAgdHlwZSBUQ29sdW1uU2FtcGxlLFxuICAgIHR5cGUgVFJlbGF0aW9uS2luZCxcbn0gZnJvbSAnLi4vZGIvaW5kZXgubWpzJztcblxuZXhwb3J0IHR5cGUgVFNlbnNpdGl2ZU1hc2sgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xuXG5leHBvcnQgdHlwZSBUVGFibGVTYW1wbGVDb2x1bW4gPSB7XG4gICAgcmVhZG9ubHkgc3RyYXRlZ3k6ICdkaXN0aW5jdCcgfCAncmFuZG9tJztcbiAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBUVGFibGVTYW1wbGVzID0ge1xuICAgIHJlYWRvbmx5IHRhYmxlOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2FtcGxlZF9hdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFRUYWJsZVNhbXBsZUNvbHVtbj4+O1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGVkX2NvbHVtbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVFRhYmxlU2FtcGxlRXZlbnQgPSB7XG4gICAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2FtcGxlczogVFRhYmxlU2FtcGxlcztcbn07XG5cbmNvbnN0IFNBTVBMRUFCTEVfVFlQRV9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtcbiAgICAndGV4dCcsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2NpdGV4dCcsXG4gICAgJ2ludGVnZXInLFxuICAgICdiaWdpbnQnLFxuICAgICdzbWFsbGludCcsXG4gICAgJ251bWVyaWMnLFxuICAgICdkZWNpbWFsJyxcbiAgICAncmVhbCcsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdib29sZWFuJyxcbiAgICAnZGF0ZScsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWUgd2l0aCcsXG4gICAgJ3RpbWUgd2l0aG91dCcsXG4gICAgJ2ludGVydmFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdtb25leScsXG4gICAgJ2luZXQnLFxuICAgICdjaWRyJyxcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBURVhUVUFMX1RZUEVfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXG4gICAgJ3RleHQnLFxuICAgICdjaGFyYWN0ZXInLFxuICAgICdjaXRleHQnLFxuICAgICdqc29uJyxcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBNQVhfVEVYVF9MRU5HVEggPSA1MTI7XG5jb25zdCBTQU1QTElOR19DT05DVVJSRU5DWSA9IDg7XG5cbmNvbnN0IHNlbnNpdGl2ZU1hc2tTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpKTtcblxuY29uc3QgbWF0Y2hlc1ByZWZpeCA9IChcbiAgICBkYXRhVHlwZTogc3RyaW5nLFxuICAgIHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGxvd2VyID0gZGF0YVR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gcHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBsb3dlci5zdGFydHNXaXRoKHByZWZpeCkpO1xufTtcblxuY29uc3QgaXNTYW1wbGVhYmxlU2NhbGFyID0gKGRhdGFUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hlc1ByZWZpeChkYXRhVHlwZSwgU0FNUExFQUJMRV9UWVBFX1BSRUZJWEVTKTtcblxuY29uc3QgaXNBcnJheVR5cGUgPSAoZGF0YVR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBkYXRhVHlwZS5lbmRzV2l0aCgnW10nKSB8fCBkYXRhVHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2FycmF5Jyk7XG5cbmNvbnN0IGdldEFycmF5RWxlbWVudFR5cGUgPSAoZGF0YVR5cGU6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIGRhdGFUeXBlLmVuZHNXaXRoKCdbXScpID8gZGF0YVR5cGUuc2xpY2UoMCwgLTIpIDogZGF0YVR5cGU7XG5cbmNvbnN0IHJlc29sdmVFbnVtVmFsdWVzID0gKFxuICAgIGRhdGFUeXBlOiBzdHJpbmcsXG4gICAgZW51bXM6IFREYXRhYmFzZUludHJvc3BlY3Rpb25bJ2VudW1zJ10sXG4pOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgPT4ge1xuICAgIGlmIChlbnVtc1tkYXRhVHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIGVudW1zW2RhdGFUeXBlXS52YWx1ZXM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5VHlwZShkYXRhVHlwZSkpIHtcbiAgICAgICAgY29uc3QgZWwgPSBnZXRBcnJheUVsZW1lbnRUeXBlKGRhdGFUeXBlKTtcbiAgICAgICAgaWYgKGVudW1zW2VsXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudW1zW2VsXS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBpc1RleHR1YWxUeXBlID0gKGRhdGFUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hlc1ByZWZpeChkYXRhVHlwZSwgVEVYVFVBTF9UWVBFX1BSRUZJWEVTKTtcblxuY29uc3QgdHJ1bmNhdGVWYWx1ZSA9ICh2YWx1ZTogc3RyaW5nLCBkYXRhVHlwZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgaXNUZXh0dWFsVHlwZShkYXRhVHlwZSkgJiYgdmFsdWUubGVuZ3RoID4gTUFYX1RFWFRfTEVOR1RIXG4gICAgICAgID8gdmFsdWUuc2xpY2UoMCwgTUFYX1RFWFRfTEVOR1RIKSArICcuLi4nXG4gICAgICAgIDogdmFsdWU7XG5cbmNvbnN0IGhhc2hUYWJsZU5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG5hbWUpLmRpZ2VzdCgnaGV4Jyk7XG5cbmV4cG9ydCBjb25zdCBsb2FkU2Vuc2l0aXZlTWFzayA9IGFzeW5jIChcbiAgICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRTZW5zaXRpdmVNYXNrPiA9PiB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIHVua25vd247XG4gICAgcmV0dXJuIHNlbnNpdGl2ZU1hc2tTY2hlbWEucGFyc2UocGFyc2VkKTtcbn07XG5cbmNvbnN0IGlzU2FtcGxlYWJsZVR5cGUgPSAoXG4gICAgZGF0YVR5cGU6IHN0cmluZyxcbiAgICBlbnVtTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4pOiBib29sZWFuID0+IHtcbiAgICBpZiAoaXNTYW1wbGVhYmxlU2NhbGFyKGRhdGFUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVudW1OYW1lcy5oYXMoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheVR5cGUoZGF0YVR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZ2V0QXJyYXlFbGVtZW50VHlwZShkYXRhVHlwZSk7XG4gICAgICAgIHJldHVybiBpc1NhbXBsZWFibGVTY2FsYXIoZWxlbWVudFR5cGUpIHx8IGVudW1OYW1lcy5oYXMoZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgcHJlcGFyZU91dHB1dERpciA9IGFzeW5jIChcbiAgICBkaXJQYXRoOiBzdHJpbmcsXG4gICAgYWxsb3dPdmVyd3JpdGU6IGJvb2xlYW4sXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpclN0YXQgPSBhd2FpdCBzdGF0KGRpclBhdGgpLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChkaXJTdGF0ICE9PSBudWxsICYmICFkaXJTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuZXJyb3IgPSBgLS1vdXRwdXQtc2FtcGxlcyBwYXRoIFwiJHtkaXJQYXRofVwiIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5YDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpclN0YXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpclBhdGgsIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5vdXRwdXREaXIgPSBkaXJQYXRoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJlY292ZXJBdG9taWNXcml0ZXNJbkRpcihkaXJQYXRoKTtcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJQYXRoKTtcblxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmICFhbGxvd092ZXJ3cml0ZSkge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLnN0YXRlID0gJ3Byb21wdGluZy1vdmVyd3JpdGUnO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLm91dHB1dERpciA9IGRpclBhdGg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb25maXJtZWQgIT09IG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoIXN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcub3V0cHV0RGlyID0gZGlyUGF0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5lcnJvciA9XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBgRmFpbGVkIHRvIHByZXBhcmUgb3V0cHV0IGRpcmVjdG9yeTogJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBlcnNpc3RUYWJsZVNhbXBsZXNUb0RpciA9IGFzeW5jIChcbiAgICBvdXRwdXREaXI6IHN0cmluZyxcbiAgICBldmVudDogVFRhYmxlU2FtcGxlRXZlbnQsXG4gICAgaW5kZXhBY2N1bXVsYXRvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7aGFzaFRhYmxlTmFtZShldmVudC50YWJsZU5hbWUpfS5qc29uYDtcblxuICAgIGF3YWl0IGF0b21pY1dyaXRlRmlsZShcbiAgICAgICAgam9pbihvdXRwdXREaXIsIGZpbGVOYW1lKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuc2FtcGxlcywgbnVsbCwgMiksXG4gICAgKTtcblxuICAgIGluZGV4QWNjdW11bGF0b3JbZXZlbnQudGFibGVOYW1lXSA9IGZpbGVOYW1lO1xuXG4gICAgYXdhaXQgYXRvbWljV3JpdGVGaWxlKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJ2luZGV4Lmpzb24nKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5kZXhBY2N1bXVsYXRvciwgbnVsbCwgMiksXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBydW5TYW1wbGluZyA9IGFzeW5jIGZ1bmN0aW9uKiAoXG4gICAgcG9vbDogUG9vbCxcbiAgICBpbnRyb3NwZWN0aW9uOiBURGF0YWJhc2VJbnRyb3NwZWN0aW9uLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgbWFzazogVFNlbnNpdGl2ZU1hc2ssXG4gICAgdGFibGVGaWx0ZXI/OiBSZWFkb25seVNldDxzdHJpbmc+LFxuKTogQXN5bmNHZW5lcmF0b3I8VFRhYmxlU2FtcGxlRXZlbnQ+IHtcbiAgICBjb25zdCBlbnVtTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFxuICAgICAgICBPYmplY3Qua2V5cyhpbnRyb3NwZWN0aW9uLmVudW1zKSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVsYXRpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoaW50cm9zcGVjdGlvbi5yZWxhdGlvbnMpLmZpbHRlcihcbiAgICAgICAgKFtuYW1lXSkgPT4gKHRhYmxlRmlsdGVyID8gdGFibGVGaWx0ZXIuaGFzKG5hbWUpIDogdHJ1ZSksXG4gICAgKTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuc3RhdGUgPSAnZmV0Y2hpbmcnO1xuICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb3VudHMudG90YWxUYWJsZXMgPSByZWxhdGlvbkVudHJpZXMubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcXVldWUgPSBuZXcgUFF1ZXVlKHtjb25jdXJyZW5jeTogU0FNUExJTkdfQ09OQ1VSUkVOQ1l9KTtcblxuICAgIGZvciAoY29uc3QgW3RhYmxlTmFtZSwgcmVsYXRpb25dIG9mIHJlbGF0aW9uRW50cmllcykge1xuICAgICAgICBjb25zdCBtYXNrZWRDb2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSA9IG1hc2tbdGFibGVOYW1lXSA/PyBbXTtcbiAgICAgICAgY29uc3QgbWFza2VkU2V0ID0gbmV3IFNldChtYXNrZWRDb2x1bW5zKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC52YWx1ZXMocmVsYXRpb24uYXR0cmlidXRlcyk7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uS2luZCA9IHJlbGF0aW9uLmtpbmQgYXMgVFJlbGF0aW9uS2luZDtcblxuICAgICAgICBjb25zdCBlc3RpbWF0ZWRSb3dDb3VudCA9IHJlbGF0aW9uLmVzdGltYXRlZF9yb3dfY291bnQgPz8gMDtcblxuICAgICAgICB0eXBlIFRXb3JrSXRlbSA9IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGNvbHVtbk5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IGRhdGFUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBlc3RpbWF0ZWREaXN0aW5jdDogbnVtYmVyO1xuICAgICAgICAgICAgcmVhZG9ubHkgY29tcG9zaXRlOiB7XG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHN1YkZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgfSB8IG51bGw7XG4gICAgICAgICAgICByZWFkb25seSBlbnVtVmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgd29ya0l0ZW1zOiBUV29ya0l0ZW1bXSA9IFtdO1xuICAgICAgICBsZXQgc2tpcHBlZCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmIChtYXNrZWRTZXQuaGFzKGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkICs9IDE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gYXR0ci5kYXRhX3R5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc1NhbXBsZWFibGVUeXBlKGRhdGFUeXBlLCBlbnVtTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgd29ya0l0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBhdHRyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWREaXN0aW5jdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICdlc3RpbWF0ZWRfZGlzdGluY3QnIGluIGF0dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChhdHRyLmVzdGltYXRlZF9kaXN0aW5jdCBhcyBudW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZXM6IHJlc29sdmVFbnVtVmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uLmVudW1zLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNBcnJheVR5cGUoZGF0YVR5cGUpICYmXG4gICAgICAgICAgICAgICAgIWlzU2FtcGxlYWJsZVNjYWxhcihkYXRhVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAhZW51bU5hbWVzLmhhcyhkYXRhVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBvdGVudGlhbCBjb21wb3NpdGUgdHlwZSDigJQgaW50cm9zcGVjdCBzdWItZmllbGRzXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViRmllbGRzID0gYXdhaXQgZmV0Y2hDb21wb3NpdGVTdWJGaWVsZHMocG9vbCwgZGF0YVR5cGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1YkZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2Ygb2Ygc3ViRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFza2VkU2V0LmhhcyhzZi5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtcGxlYWJsZVR5cGUoc2YuZGF0YV90eXBlLCBlbnVtTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBgJHthdHRyLm5hbWV9LiR7c2YubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogc2YuZGF0YV90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWREaXN0aW5jdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBhdHRyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZE5hbWU6IHNmLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZXM6IHJlc29sdmVFbnVtVmFsdWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YuZGF0YV90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9zcGVjdGlvbi5lbnVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuY291bnRzLnRvdGFsQ29sdW1ucyArPSB3b3JrSXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuc2FtcGxpbmcuY291bnRzLnNraXBwZWRDb2x1bW5zICs9IHNraXBwZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtblJlc3VsdHM6IFRDb2x1bW5TYW1wbGVbXSA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHdvcmtJdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5lbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvdW50cy5zYW1wbGVkQ29sdW1ucyArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGl0ZW0uY29tcG9zaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tcG9zaXRlLmNvbHVtbk5hbWV9LiR7aXRlbS5jb21wb3NpdGUuc3ViRmllbGROYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFRDb2x1bW5TYW1wbGU+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl9uYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6ICdkaXN0aW5jdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGl0ZW0uZW51bVZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmFkZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW0uY29tcG9zaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHNhbXBsZUNvbXBvc2l0ZVN1YkZpZWxkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcG9zaXRlLmNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBvc2l0ZS5zdWJGaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVzdGltYXRlZERpc3RpbmN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbktpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYXdhaXQgc2FtcGxlQ29sdW1uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZXN0aW1hdGVkRGlzdGluY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uS2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5jb3VudHMuc2FtcGxlZENvbHVtbnMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApKSBhcyBUQ29sdW1uU2FtcGxlW107XG5cbiAgICAgICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgVFRhYmxlU2FtcGxlQ29sdW1uPiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGNvbHVtblJlc3VsdHMubWFwKChzYW1wbGUpID0+IFtcbiAgICAgICAgICAgICAgICBzYW1wbGUuY29sdW1uX25hbWUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogc2FtcGxlLnN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2FtcGxlLnZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogc2FtcGxlLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZVZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3KSA9PiB3LmNvbHVtbk5hbWUgPT09IHNhbXBsZS5jb2x1bW5fbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApPy5kYXRhVHlwZSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRhYmxlU2FtcGxlczogVFRhYmxlU2FtcGxlcyA9IHtcbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICBzYW1wbGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgZXhjbHVkZWRfY29sdW1uczogbWFza2VkQ29sdW1ucyxcbiAgICAgICAgfTtcblxuICAgICAgICB5aWVsZCB7dGFibGVOYW1lLCBzYW1wbGVzOiB0YWJsZVNhbXBsZXN9O1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNhbXBsaW5nLmNvdW50cy5jb21wbGV0ZWRUYWJsZXMgKz0gMTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5zYW1wbGluZy5zdGF0ZSA9ICdkb25lJztcbiAgICB9KTtcbn07XG4iXX0=
|
package/dist/app/session.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Pool } from 'pg';
|
|
2
2
|
import type { TStore } from '../store.mjs';
|
|
3
|
-
import type {
|
|
3
|
+
import type { TDatabaseIntrospection } from '@dbctx/core';
|
|
4
4
|
export declare const checkGate: (token: string, store: TStore) => Promise<boolean>;
|
|
5
|
+
export declare const checkBilling: (token: string, sessionUrl: string, store: TStore) => Promise<void>;
|
|
5
6
|
export declare const connectAccount: (token: string, store: TStore) => Promise<void>;
|
|
6
|
-
export declare const createSession: (pool: Pool, result:
|
|
7
|
+
export declare const createSession: (pool: Pool, result: TDatabaseIntrospection, store: TStore, token: string | null, device_id: string) => Promise<string>;
|
|
7
8
|
export declare const waitForAuthorization: (sessionId: string, store: TStore) => Promise<void>;
|
|
8
9
|
//# sourceMappingURL=session.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.mts","sourceRoot":"./src/","sources":["app/session.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAG7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"session.d.mts","sourceRoot":"./src/","sources":["app/session.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAG7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAqJxD,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAkBjB,CAAC;AAEF,eAAO,MAAM,YAAY,GACrB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CA+Cd,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAed,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,MAAM,IAAI,EACV,QAAQ,sBAAsB,EAC9B,OAAO,MAAM,EACb,OAAO,MAAM,GAAG,IAAI,EACpB,WAAW,MAAM,KAClB,OAAO,CAAC,MAAM,CA0BhB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,WAAW,MAAM,EACjB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAYd,CAAC"}
|