dbctx 2.0.1 → 2.1.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.
Files changed (220) hide show
  1. package/dist/index.mjs +6727 -282
  2. package/package.json +12 -9
  3. package/dist/app/assemble.d.mts +0 -5
  4. package/dist/app/assemble.d.mts.map +0 -1
  5. package/dist/app/assemble.mjs +0 -182
  6. package/dist/app/config.d.mts +0 -9
  7. package/dist/app/config.d.mts.map +0 -1
  8. package/dist/app/config.mjs +0 -49
  9. package/dist/app/db.d.mts +0 -9
  10. package/dist/app/db.d.mts.map +0 -1
  11. package/dist/app/db.mjs +0 -182
  12. package/dist/app/detect.d.mts +0 -14
  13. package/dist/app/detect.d.mts.map +0 -1
  14. package/dist/app/detect.mjs +0 -108
  15. package/dist/app/list.d.mts +0 -4
  16. package/dist/app/list.d.mts.map +0 -1
  17. package/dist/app/list.mjs +0 -93
  18. package/dist/app/load-introspection.d.mts +0 -26
  19. package/dist/app/load-introspection.d.mts.map +0 -1
  20. package/dist/app/load-introspection.mjs +0 -89
  21. package/dist/app/login.d.mts +0 -2
  22. package/dist/app/login.d.mts.map +0 -1
  23. package/dist/app/login.mjs +0 -69
  24. package/dist/app/open-url.d.mts +0 -6
  25. package/dist/app/open-url.d.mts.map +0 -1
  26. package/dist/app/open-url.mjs +0 -33
  27. package/dist/app/sample.d.mts +0 -24
  28. package/dist/app/sample.d.mts.map +0 -1
  29. package/dist/app/sample.mjs +0 -257
  30. package/dist/app/session.d.mts +0 -9
  31. package/dist/app/session.d.mts.map +0 -1
  32. package/dist/app/session.mjs +0 -195
  33. package/dist/app/ssh.d.mts +0 -3
  34. package/dist/app/ssh.d.mts.map +0 -1
  35. package/dist/app/ssh.mjs +0 -218
  36. package/dist/app/tail.d.mts +0 -13
  37. package/dist/app/tail.d.mts.map +0 -1
  38. package/dist/app/tail.mjs +0 -168
  39. package/dist/db/analyze.d.mts +0 -3
  40. package/dist/db/analyze.d.mts.map +0 -1
  41. package/dist/db/analyze.mjs +0 -16
  42. package/dist/db/attributes.d.mts +0 -16
  43. package/dist/db/attributes.d.mts.map +0 -1
  44. package/dist/db/attributes.mjs +0 -37
  45. package/dist/db/check-constraints.d.mts +0 -9
  46. package/dist/db/check-constraints.d.mts.map +0 -1
  47. package/dist/db/check-constraints.mjs +0 -17
  48. package/dist/db/custom-types.d.mts +0 -26
  49. package/dist/db/custom-types.d.mts.map +0 -1
  50. package/dist/db/custom-types.mjs +0 -61
  51. package/dist/db/enums.d.mts +0 -8
  52. package/dist/db/enums.d.mts.map +0 -1
  53. package/dist/db/enums.mjs +0 -24
  54. package/dist/db/extensions.d.mts +0 -8
  55. package/dist/db/extensions.d.mts.map +0 -1
  56. package/dist/db/extensions.mjs +0 -14
  57. package/dist/db/file-stats.d.mts +0 -11
  58. package/dist/db/file-stats.d.mts.map +0 -1
  59. package/dist/db/file-stats.mjs +0 -43
  60. package/dist/db/foreign-keys.d.mts +0 -14
  61. package/dist/db/foreign-keys.d.mts.map +0 -1
  62. package/dist/db/foreign-keys.mjs +0 -44
  63. package/dist/db/functions.d.mts +0 -11
  64. package/dist/db/functions.d.mts.map +0 -1
  65. package/dist/db/functions.mjs +0 -23
  66. package/dist/db/index.d.mts +0 -19
  67. package/dist/db/index.d.mts.map +0 -1
  68. package/dist/db/index.mjs +0 -19
  69. package/dist/db/indexes.d.mts +0 -16
  70. package/dist/db/indexes.d.mts.map +0 -1
  71. package/dist/db/indexes.mjs +0 -38
  72. package/dist/db/planner-stats.d.mts +0 -33
  73. package/dist/db/planner-stats.d.mts.map +0 -1
  74. package/dist/db/planner-stats.mjs +0 -103
  75. package/dist/db/relations.d.mts +0 -11
  76. package/dist/db/relations.d.mts.map +0 -1
  77. package/dist/db/relations.mjs +0 -32
  78. package/dist/db/rls.d.mts +0 -21
  79. package/dist/db/rls.d.mts.map +0 -1
  80. package/dist/db/rls.mjs +0 -48
  81. package/dist/db/sample.d.mts +0 -16
  82. package/dist/db/sample.d.mts.map +0 -1
  83. package/dist/db/sample.mjs +0 -73
  84. package/dist/db/sequences.d.mts +0 -15
  85. package/dist/db/sequences.d.mts.map +0 -1
  86. package/dist/db/sequences.mjs +0 -31
  87. package/dist/db/stats.d.mts +0 -12
  88. package/dist/db/stats.d.mts.map +0 -1
  89. package/dist/db/stats.mjs +0 -34
  90. package/dist/db/triggers.d.mts +0 -11
  91. package/dist/db/triggers.d.mts.map +0 -1
  92. package/dist/db/triggers.mjs +0 -21
  93. package/dist/db/version.d.mts +0 -14
  94. package/dist/db/version.d.mts.map +0 -1
  95. package/dist/db/version.mjs +0 -27
  96. package/dist/flow/events.d.mts +0 -115
  97. package/dist/flow/events.d.mts.map +0 -1
  98. package/dist/flow/events.mjs +0 -2
  99. package/dist/flow/interpreter.d.mts +0 -21
  100. package/dist/flow/interpreter.d.mts.map +0 -1
  101. package/dist/flow/interpreter.mjs +0 -605
  102. package/dist/flow/projection.d.mts +0 -17
  103. package/dist/flow/projection.d.mts.map +0 -1
  104. package/dist/flow/projection.mjs +0 -83
  105. package/dist/flow/projection.test.d.mts +0 -2
  106. package/dist/flow/projection.test.d.mts.map +0 -1
  107. package/dist/flow/projection.test.mjs +0 -162
  108. package/dist/flow/reducer.d.mts +0 -5
  109. package/dist/flow/reducer.d.mts.map +0 -1
  110. package/dist/flow/reducer.mjs +0 -306
  111. package/dist/flow/reducer.test.d.mts +0 -2
  112. package/dist/flow/reducer.test.d.mts.map +0 -1
  113. package/dist/flow/reducer.test.mjs +0 -479
  114. package/dist/flow/run.d.mts +0 -3
  115. package/dist/flow/run.d.mts.map +0 -1
  116. package/dist/flow/run.mjs +0 -89
  117. package/dist/flow/states.d.mts +0 -54
  118. package/dist/flow/states.d.mts.map +0 -1
  119. package/dist/flow/states.mjs +0 -39
  120. package/dist/index.d.mts +0 -29
  121. package/dist/index.d.mts.map +0 -1
  122. package/dist/lib/atomic-write.d.mts +0 -4
  123. package/dist/lib/atomic-write.d.mts.map +0 -1
  124. package/dist/lib/atomic-write.mjs +0 -75
  125. package/dist/lib/env.d.mts +0 -2
  126. package/dist/lib/env.d.mts.map +0 -1
  127. package/dist/lib/env.mjs +0 -4
  128. package/dist/lib/stream-job.d.mts +0 -19
  129. package/dist/lib/stream-job.d.mts.map +0 -1
  130. package/dist/lib/stream-job.mjs +0 -55
  131. package/dist/lib/trpc-url.d.mts +0 -2
  132. package/dist/lib/trpc-url.d.mts.map +0 -1
  133. package/dist/lib/trpc-url.mjs +0 -5
  134. package/dist/lib/trpc.d.mts +0 -7
  135. package/dist/lib/trpc.d.mts.map +0 -1
  136. package/dist/lib/trpc.mjs +0 -37
  137. package/dist/lib/trpc.react.d.mts +0 -4
  138. package/dist/lib/trpc.react.d.mts.map +0 -1
  139. package/dist/lib/trpc.react.mjs +0 -3
  140. package/dist/lib/version.d.mts +0 -2
  141. package/dist/lib/version.d.mts.map +0 -1
  142. package/dist/lib/version.mjs +0 -5
  143. package/dist/logger.d.mts +0 -3
  144. package/dist/logger.d.mts.map +0 -1
  145. package/dist/logger.mjs +0 -11
  146. package/dist/providers/TrpcProvider.d.ts +0 -9
  147. package/dist/providers/TrpcProvider.d.ts.map +0 -1
  148. package/dist/providers/TrpcProvider.js +0 -41
  149. package/dist/store.d.mts +0 -176
  150. package/dist/store.d.mts.map +0 -1
  151. package/dist/store.mjs +0 -147
  152. package/dist/types/connection.d.mts +0 -17
  153. package/dist/types/connection.d.mts.map +0 -1
  154. package/dist/types/connection.mjs +0 -2
  155. package/dist/ui/App.d.ts +0 -10
  156. package/dist/ui/App.d.ts.map +0 -1
  157. package/dist/ui/App.js +0 -41
  158. package/dist/ui/components/Analyze.d.ts +0 -10
  159. package/dist/ui/components/Analyze.d.ts.map +0 -1
  160. package/dist/ui/components/Analyze.js +0 -54
  161. package/dist/ui/components/Billing.d.ts +0 -10
  162. package/dist/ui/components/Billing.d.ts.map +0 -1
  163. package/dist/ui/components/Billing.js +0 -40
  164. package/dist/ui/components/DB.d.ts +0 -10
  165. package/dist/ui/components/DB.d.ts.map +0 -1
  166. package/dist/ui/components/DB.js +0 -22
  167. package/dist/ui/components/DatabasePicker.d.ts +0 -13
  168. package/dist/ui/components/DatabasePicker.d.ts.map +0 -1
  169. package/dist/ui/components/DatabasePicker.js +0 -79
  170. package/dist/ui/components/Enrich.d.ts +0 -10
  171. package/dist/ui/components/Enrich.d.ts.map +0 -1
  172. package/dist/ui/components/Enrich.js +0 -41
  173. package/dist/ui/components/Error.d.ts +0 -7
  174. package/dist/ui/components/Error.d.ts.map +0 -1
  175. package/dist/ui/components/Error.js +0 -6
  176. package/dist/ui/components/Gate.d.ts +0 -10
  177. package/dist/ui/components/Gate.d.ts.map +0 -1
  178. package/dist/ui/components/Gate.js +0 -15
  179. package/dist/ui/components/Introspect.d.ts +0 -10
  180. package/dist/ui/components/Introspect.d.ts.map +0 -1
  181. package/dist/ui/components/Introspect.js +0 -66
  182. package/dist/ui/components/IntrospectionUpload.d.ts +0 -10
  183. package/dist/ui/components/IntrospectionUpload.d.ts.map +0 -1
  184. package/dist/ui/components/IntrospectionUpload.js +0 -30
  185. package/dist/ui/components/Login.d.ts +0 -19
  186. package/dist/ui/components/Login.d.ts.map +0 -1
  187. package/dist/ui/components/Login.js +0 -38
  188. package/dist/ui/components/OutputJson.d.ts +0 -10
  189. package/dist/ui/components/OutputJson.d.ts.map +0 -1
  190. package/dist/ui/components/OutputJson.js +0 -18
  191. package/dist/ui/components/PasswordInput.d.ts +0 -7
  192. package/dist/ui/components/PasswordInput.d.ts.map +0 -1
  193. package/dist/ui/components/PasswordInput.js +0 -32
  194. package/dist/ui/components/SSH.d.ts +0 -10
  195. package/dist/ui/components/SSH.d.ts.map +0 -1
  196. package/dist/ui/components/SSH.js +0 -22
  197. package/dist/ui/components/SamplesUpload.d.ts +0 -10
  198. package/dist/ui/components/SamplesUpload.d.ts.map +0 -1
  199. package/dist/ui/components/SamplesUpload.js +0 -24
  200. package/dist/ui/components/Sampling.d.ts +0 -10
  201. package/dist/ui/components/Sampling.d.ts.map +0 -1
  202. package/dist/ui/components/Sampling.js +0 -58
  203. package/dist/ui/components/Session.d.ts +0 -10
  204. package/dist/ui/components/Session.d.ts.map +0 -1
  205. package/dist/ui/components/Session.js +0 -47
  206. package/dist/ui/components/Spinner.d.ts +0 -3
  207. package/dist/ui/components/Spinner.d.ts.map +0 -1
  208. package/dist/ui/components/Spinner.js +0 -30
  209. package/dist/ui/components/Splash.d.ts +0 -3
  210. package/dist/ui/components/Splash.d.ts.map +0 -1
  211. package/dist/ui/components/Splash.js +0 -13
  212. package/dist/ui/components/TextInput.d.ts +0 -11
  213. package/dist/ui/components/TextInput.d.ts.map +0 -1
  214. package/dist/ui/components/TextInput.js +0 -286
  215. package/dist/ui/components/UserExplanation.d.ts +0 -10
  216. package/dist/ui/components/UserExplanation.d.ts.map +0 -1
  217. package/dist/ui/components/UserExplanation.js +0 -34
  218. package/dist/validatePaths.d.mts +0 -13
  219. package/dist/validatePaths.d.mts.map +0 -1
  220. package/dist/validatePaths.mjs +0 -58
@@ -1,257 +0,0 @@
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=
@@ -1,9 +0,0 @@
1
- import type { Pool } from 'pg';
2
- import type { TStore } from '../store.mjs';
3
- import type { TDatabaseIntrospection } from '@dbctx/core';
4
- export declare const checkGate: (token: string, store: TStore) => Promise<boolean>;
5
- export declare const checkBilling: (token: string, sessionUrl: string, store: TStore) => Promise<void>;
6
- export declare const connectAccount: (token: string, store: TStore) => Promise<void>;
7
- export declare const createSession: (pool: Pool, result: TDatabaseIntrospection, store: TStore, token: string | null, device_id: string) => Promise<string>;
8
- export declare const waitForAuthorization: (sessionId: string, store: TStore) => Promise<void>;
9
- //# sourceMappingURL=session.d.mts.map
@@ -1 +0,0 @@
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"}
@@ -1,195 +0,0 @@
1
- import { runInAction } from 'mobx';
2
- import { fetchRelationFileStats } from '../db/index.mjs';
3
- import { trpc, createAuthenticatedTRPCClient } from '../lib/trpc.mjs';
4
- import { detectAIAssistants, detectDocker, detectOS, detectShell, detectHostname, detectUsername, detectWSL, detectSystemMemory, detectPackageManager, detectProvider, isLocalhost, } from './detect.mjs';
5
- import { buildSessionURL, openSessionURL } from './open-url.mjs';
6
- import { writeConfig } from './config.mjs';
7
- import { CLIENT_VERSION } from '../lib/version.mjs';
8
- const checkIsReplica = async (pool) => {
9
- const result = await pool.query('SELECT pg_is_in_recovery() AS is_replica');
10
- return result.rows[0].is_replica;
11
- };
12
- const collectMedianFileAge = async (pool, tableNames, store) => {
13
- if (tableNames.length === 0) {
14
- return null;
15
- }
16
- try {
17
- const first = await fetchRelationFileStats(pool, tableNames[0]);
18
- if (!first?.modification_time) {
19
- runInAction(() => {
20
- store.steps.introspection.fileStatsSkipped = true;
21
- });
22
- return null;
23
- }
24
- const times = [first.modification_time];
25
- const remaining = await Promise.all(tableNames.slice(1).map(async (name) => {
26
- try {
27
- const stats = await fetchRelationFileStats(pool, name);
28
- return stats?.modification_time ?? null;
29
- }
30
- catch {
31
- return null;
32
- }
33
- }));
34
- remaining.forEach((t) => {
35
- if (t) {
36
- times.push(t);
37
- }
38
- });
39
- const sorted = [...times].sort((a, b) => a.getTime() - b.getTime());
40
- const mid = Math.floor(sorted.length / 2);
41
- const median = sorted.length % 2 === 0
42
- ? new Date((sorted[mid - 1].getTime() + sorted[mid].getTime()) / 2)
43
- : sorted[mid];
44
- return median.toISOString();
45
- }
46
- catch {
47
- runInAction(() => {
48
- store.steps.introspection.fileStatsSkipped = true;
49
- });
50
- return null;
51
- }
52
- };
53
- const buildSessionInput = (result, store, isReplica, medianFileAge) => {
54
- const relations = Object.values(result.relations);
55
- return {
56
- database_name: result.name,
57
- database_object_statistics: {
58
- parent_tables: relations.filter((r) => r.kind === 'partitioned_table').length,
59
- tables: relations.filter((r) => r.kind === 'table').length,
60
- views: relations.filter((r) => r.kind === 'view').length,
61
- materialized_views: relations.filter((r) => r.kind === 'materialized_view').length,
62
- enums: store.steps.introspection.counts.enums,
63
- indexes: store.steps.introspection.counts.indexes,
64
- foreign_key_references: store.steps.introspection.counts.foreignKeys,
65
- },
66
- is_database_replica: isReplica,
67
- median_table_file_age: medianFileAge,
68
- database_type: result.type,
69
- database_version: result.version.version_number.toString(),
70
- database_version_string: result.version.version_string,
71
- database_provider: detectProvider(store.steps.databaseConnection.pickedHostname),
72
- is_local: isLocalhost(store.steps.databaseConnection.pickedHostname),
73
- is_docker: detectDocker(),
74
- is_accessed_over_ssh: store.steps.sshConnection.enabled,
75
- shell: detectShell(),
76
- os: detectOS(),
77
- is_wsl: detectWSL(),
78
- system_memory: detectSystemMemory(),
79
- package_manager: detectPackageManager(),
80
- username: detectUsername(),
81
- hostname: detectHostname(),
82
- ai_assistants: detectAIAssistants(),
83
- };
84
- };
85
- const waitForToken = (sessionId) => new Promise((resolve, reject) => {
86
- const sub = trpc.session.onAuthorization.subscribe({ session_id: sessionId }, {
87
- onData: (data) => {
88
- sub.unsubscribe();
89
- resolve(data.token);
90
- },
91
- onError: (err) => {
92
- sub.unsubscribe();
93
- reject(err);
94
- },
95
- });
96
- });
97
- export const checkGate = async (token, store) => {
98
- runInAction(() => {
99
- store.steps.gate.state = 'checking';
100
- });
101
- const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
102
- const result = await authClient.session.shouldContinue.query({
103
- client_version: CLIENT_VERSION,
104
- });
105
- runInAction(() => {
106
- store.steps.gate.state = result.continue ? 'passed' : 'blocked';
107
- store.steps.gate.message = result.message;
108
- });
109
- return result.continue;
110
- };
111
- export const checkBilling = async (token, sessionUrl, store) => {
112
- runInAction(() => {
113
- store.steps.billing.state = 'checking';
114
- });
115
- const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
116
- const initial = await authClient.billing.hasBillingForClient.query({});
117
- // Trial-eligible users (no invoices yet) skip the card-on-file step. The
118
- // first revision will mint an invoice with a 7-day grace, billed via
119
- // Stripe's hosted-invoice email rather than an immediate charge.
120
- if (initial.hasBilling || initial.isTrialEligible) {
121
- runInAction(() => {
122
- store.steps.billing.state = 'connected';
123
- });
124
- return;
125
- }
126
- runInAction(() => {
127
- store.steps.billing.state = 'waiting';
128
- store.steps.billing.url = sessionUrl;
129
- });
130
- await openSessionURL(sessionUrl);
131
- await new Promise((resolve, reject) => {
132
- const tick = async () => {
133
- try {
134
- const result = await authClient.billing.hasBillingForClient.query({});
135
- if (result.hasBilling || result.isTrialEligible) {
136
- runInAction(() => {
137
- store.steps.billing.state = 'connected';
138
- });
139
- resolve();
140
- return;
141
- }
142
- setTimeout(tick, 2000);
143
- }
144
- catch (err) {
145
- reject(err);
146
- }
147
- };
148
- setTimeout(tick, 2000);
149
- });
150
- };
151
- export const connectAccount = async (token, store) => {
152
- runInAction(() => {
153
- store.steps.account.state = 'fetching-account';
154
- });
155
- const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
156
- const account = await authClient.account.getAccount.query({});
157
- runInAction(() => {
158
- store.steps.account.state = 'connected';
159
- store.steps.account.email = account.emails[0] ?? null;
160
- store.steps.account.name = account.name;
161
- });
162
- };
163
- export const createSession = async (pool, result, store, token, device_id) => {
164
- runInAction(() => {
165
- store.steps.account.state = 'creating-session';
166
- });
167
- const tableNames = Object.values(result.relations)
168
- .filter((r) => r.kind === 'table' || r.kind === 'partitioned_table')
169
- .map((r) => r.name);
170
- const [isReplica, medianFileAge] = await Promise.all([
171
- checkIsReplica(pool),
172
- collectMedianFileAge(pool, tableNames, store),
173
- ]);
174
- const input = {
175
- ...buildSessionInput(result, store, isReplica, medianFileAge),
176
- device_id,
177
- };
178
- const client = token
179
- ? createAuthenticatedTRPCClient(() => Promise.resolve(token))
180
- : trpc;
181
- const session = await client.session.create.mutate(input);
182
- return session.id;
183
- };
184
- export const waitForAuthorization = async (sessionId, store) => {
185
- const url = buildSessionURL(sessionId);
186
- runInAction(() => {
187
- store.steps.account.state = 'waiting';
188
- store.steps.account.url = url;
189
- store.steps.account.sessionId = sessionId;
190
- });
191
- const token = await waitForToken(sessionId);
192
- await writeConfig(token);
193
- await connectAccount(token, store);
194
- };
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJhcHAvc2Vzc2lvbi5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUlqQyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixZQUFZLEVBQ1osUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEVBQ2QsY0FBYyxFQUNkLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxXQUFXLEdBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQUUsSUFBVSxFQUFvQixFQUFFO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDM0IsMENBQTBDLENBQzdDLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUM5QixJQUFVLEVBQ1YsVUFBNkIsRUFDN0IsS0FBYSxFQUNTLEVBQUU7SUFDeEIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLEtBQUssR0FB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QUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQb29sfSBmcm9tICdwZyc7XG5pbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB0eXBlIHtURGF0YWJhc2VJbnRyb3NwZWN0aW9ufSBmcm9tICdAZGJjdHgvY29yZSc7XG5pbXBvcnQge2ZldGNoUmVsYXRpb25GaWxlU3RhdHN9IGZyb20gJy4uL2RiL2luZGV4Lm1qcyc7XG5pbXBvcnQge3RycGMsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50fSBmcm9tICcuLi9saWIvdHJwYy5tanMnO1xuaW1wb3J0IHtcbiAgICBkZXRlY3RBSUFzc2lzdGFudHMsXG4gICAgZGV0ZWN0RG9ja2VyLFxuICAgIGRldGVjdE9TLFxuICAgIGRldGVjdFNoZWxsLFxuICAgIGRldGVjdEhvc3RuYW1lLFxuICAgIGRldGVjdFVzZXJuYW1lLFxuICAgIGRldGVjdFdTTCxcbiAgICBkZXRlY3RTeXN0ZW1NZW1vcnksXG4gICAgZGV0ZWN0UGFja2FnZU1hbmFnZXIsXG4gICAgZGV0ZWN0UHJvdmlkZXIsXG4gICAgaXNMb2NhbGhvc3QsXG59IGZyb20gJy4vZGV0ZWN0Lm1qcyc7XG5pbXBvcnQge2J1aWxkU2Vzc2lvblVSTCwgb3BlblNlc3Npb25VUkx9IGZyb20gJy4vb3Blbi11cmwubWpzJztcbmltcG9ydCB7d3JpdGVDb25maWd9IGZyb20gJy4vY29uZmlnLm1qcyc7XG5pbXBvcnQge0NMSUVOVF9WRVJTSU9OfSBmcm9tICcuLi9saWIvdmVyc2lvbi5tanMnO1xuXG5jb25zdCBjaGVja0lzUmVwbGljYSA9IGFzeW5jIChwb29sOiBQb29sKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9vbC5xdWVyeTx7aXNfcmVwbGljYTogYm9vbGVhbn0+KFxuICAgICAgICAnU0VMRUNUIHBnX2lzX2luX3JlY292ZXJ5KCkgQVMgaXNfcmVwbGljYScsXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHQucm93c1swXS5pc19yZXBsaWNhO1xufTtcblxuY29uc3QgY29sbGVjdE1lZGlhbkZpbGVBZ2UgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICB0YWJsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgaWYgKHRhYmxlTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gYXdhaXQgZmV0Y2hSZWxhdGlvbkZpbGVTdGF0cyhwb29sLCB0YWJsZU5hbWVzWzBdKTtcblxuICAgICAgICBpZiAoIWZpcnN0Py5tb2RpZmljYXRpb25fdGltZSkge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uZmlsZVN0YXRzU2tpcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lczogRGF0ZVtdID0gW2ZpcnN0Lm1vZGlmaWNhdGlvbl90aW1lXTtcblxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRhYmxlTmFtZXMuc2xpY2UoMSkubWFwKGFzeW5jIChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmZXRjaFJlbGF0aW9uRmlsZVN0YXRzKHBvb2wsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHM/Lm1vZGlmaWNhdGlvbl90aW1lID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlbWFpbmluZy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIHRpbWVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aW1lc10uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3Ioc29ydGVkLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBtZWRpYW4gPVxuICAgICAgICAgICAgc29ydGVkLmxlbmd0aCAlIDIgPT09IDBcbiAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIChzb3J0ZWRbbWlkIC0gMV0uZ2V0VGltZSgpICsgc29ydGVkW21pZF0uZ2V0VGltZSgpKSAvIDIsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBzb3J0ZWRbbWlkXTtcblxuICAgICAgICByZXR1cm4gbWVkaWFuLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uZmlsZVN0YXRzU2tpcHBlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbmNvbnN0IGJ1aWxkU2Vzc2lvbklucHV0ID0gKFxuICAgIHJlc3VsdDogVERhdGFiYXNlSW50cm9zcGVjdGlvbixcbiAgICBzdG9yZTogVFN0b3JlLFxuICAgIGlzUmVwbGljYTogYm9vbGVhbixcbiAgICBtZWRpYW5GaWxlQWdlOiBzdHJpbmcgfCBudWxsLFxuKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQucmVsYXRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGFiYXNlX25hbWU6IHJlc3VsdC5uYW1lLFxuICAgICAgICBkYXRhYmFzZV9vYmplY3Rfc3RhdGlzdGljczoge1xuICAgICAgICAgICAgcGFyZW50X3RhYmxlczogcmVsYXRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocikgPT4gci5raW5kID09PSAncGFydGl0aW9uZWRfdGFibGUnLFxuICAgICAgICAgICAgKS5sZW5ndGgsXG4gICAgICAgICAgICB0YWJsZXM6IHJlbGF0aW9ucy5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3RhYmxlJykubGVuZ3RoLFxuICAgICAgICAgICAgdmlld3M6IHJlbGF0aW9ucy5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3ZpZXcnKS5sZW5ndGgsXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWRfdmlld3M6IHJlbGF0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHIpID0+IHIua2luZCA9PT0gJ21hdGVyaWFsaXplZF92aWV3JyxcbiAgICAgICAgICAgICkubGVuZ3RoLFxuICAgICAgICAgICAgZW51bXM6IHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uY291bnRzLmVudW1zLFxuICAgICAgICAgICAgaW5kZXhlczogc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5jb3VudHMuaW5kZXhlcyxcbiAgICAgICAgICAgIGZvcmVpZ25fa2V5X3JlZmVyZW5jZXM6XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5jb3VudHMuZm9yZWlnbktleXMsXG4gICAgICAgIH0sXG4gICAgICAgIGlzX2RhdGFiYXNlX3JlcGxpY2E6IGlzUmVwbGljYSxcbiAgICAgICAgbWVkaWFuX3RhYmxlX2ZpbGVfYWdlOiBtZWRpYW5GaWxlQWdlLFxuICAgICAgICBkYXRhYmFzZV90eXBlOiByZXN1bHQudHlwZSxcbiAgICAgICAgZGF0YWJhc2VfdmVyc2lvbjogcmVzdWx0LnZlcnNpb24udmVyc2lvbl9udW1iZXIudG9TdHJpbmcoKSxcbiAgICAgICAgZGF0YWJhc2VfdmVyc2lvbl9zdHJpbmc6IHJlc3VsdC52ZXJzaW9uLnZlcnNpb25fc3RyaW5nLFxuICAgICAgICBkYXRhYmFzZV9wcm92aWRlcjogZGV0ZWN0UHJvdmlkZXIoXG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkSG9zdG5hbWUhLFxuICAgICAgICApLFxuICAgICAgICBpc19sb2NhbDogaXNMb2NhbGhvc3Qoc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZEhvc3RuYW1lISksXG4gICAgICAgIGlzX2RvY2tlcjogZGV0ZWN0RG9ja2VyKCksXG4gICAgICAgIGlzX2FjY2Vzc2VkX292ZXJfc3NoOiBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmVuYWJsZWQsXG4gICAgICAgIHNoZWxsOiBkZXRlY3RTaGVsbCgpLFxuICAgICAgICBvczogZGV0ZWN0T1MoKSxcbiAgICAgICAgaXNfd3NsOiBkZXRlY3RXU0woKSxcbiAgICAgICAgc3lzdGVtX21lbW9yeTogZGV0ZWN0U3lzdGVtTWVtb3J5KCksXG4gICAgICAgIHBhY2thZ2VfbWFuYWdlcjogZGV0ZWN0UGFja2FnZU1hbmFnZXIoKSxcbiAgICAgICAgdXNlcm5hbWU6IGRldGVjdFVzZXJuYW1lKCksXG4gICAgICAgIGhvc3RuYW1lOiBkZXRlY3RIb3N0bmFtZSgpLFxuICAgICAgICBhaV9hc3Npc3RhbnRzOiBkZXRlY3RBSUFzc2lzdGFudHMoKSxcbiAgICB9IGFzIGNvbnN0O1xufTtcblxuY29uc3Qgd2FpdEZvclRva2VuID0gKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+XG4gICAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRycGMuc2Vzc2lvbi5vbkF1dGhvcml6YXRpb24uc3Vic2NyaWJlKFxuICAgICAgICAgICAge3Nlc3Npb25faWQ6IHNlc3Npb25JZH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25EYXRhOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnRva2VuKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH0pO1xuXG5leHBvcnQgY29uc3QgY2hlY2tHYXRlID0gYXN5bmMgKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuZ2F0ZS5zdGF0ZSA9ICdjaGVja2luZyc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdXRoQ2xpZW50ID0gY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnQoKCkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGhDbGllbnQuc2Vzc2lvbi5zaG91bGRDb250aW51ZS5xdWVyeSh7XG4gICAgICAgIGNsaWVudF92ZXJzaW9uOiBDTElFTlRfVkVSU0lPTixcbiAgICB9KTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuZ2F0ZS5zdGF0ZSA9IHJlc3VsdC5jb250aW51ZSA/ICdwYXNzZWQnIDogJ2Jsb2NrZWQnO1xuICAgICAgICBzdG9yZS5zdGVwcy5nYXRlLm1lc3NhZ2UgPSByZXN1bHQubWVzc2FnZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQuY29udGludWU7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tCaWxsaW5nID0gYXN5bmMgKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgc2Vzc2lvblVybDogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmJpbGxpbmcuc3RhdGUgPSAnY2hlY2tpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aENsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50KCgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0b2tlbiksXG4gICAgKTtcblxuICAgIGNvbnN0IGluaXRpYWwgPSBhd2FpdCBhdXRoQ2xpZW50LmJpbGxpbmcuaGFzQmlsbGluZ0ZvckNsaWVudC5xdWVyeSh7fSk7XG5cbiAgICAvLyBUcmlhbC1lbGlnaWJsZSB1c2VycyAobm8gaW52b2ljZXMgeWV0KSBza2lwIHRoZSBjYXJkLW9uLWZpbGUgc3RlcC4gVGhlXG4gICAgLy8gZmlyc3QgcmV2aXNpb24gd2lsbCBtaW50IGFuIGludm9pY2Ugd2l0aCBhIDctZGF5IGdyYWNlLCBiaWxsZWQgdmlhXG4gICAgLy8gU3RyaXBlJ3MgaG9zdGVkLWludm9pY2UgZW1haWwgcmF0aGVyIHRoYW4gYW4gaW1tZWRpYXRlIGNoYXJnZS5cbiAgICBpZiAoaW5pdGlhbC5oYXNCaWxsaW5nIHx8IGluaXRpYWwuaXNUcmlhbEVsaWdpYmxlKSB7XG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmJpbGxpbmcuc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmJpbGxpbmcuc3RhdGUgPSAnd2FpdGluZyc7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmJpbGxpbmcudXJsID0gc2Vzc2lvblVybDtcbiAgICB9KTtcblxuICAgIGF3YWl0IG9wZW5TZXNzaW9uVVJMKHNlc3Npb25VcmwpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0aWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhdXRoQ2xpZW50LmJpbGxpbmcuaGFzQmlsbGluZ0ZvckNsaWVudC5xdWVyeSh7fSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNCaWxsaW5nIHx8IHJlc3VsdC5pc1RyaWFsRWxpZ2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuYmlsbGluZy5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodGljaywgMjAwMCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2V0VGltZW91dCh0aWNrLCAyMDAwKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0QWNjb3VudCA9IGFzeW5jIChcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnZmV0Y2hpbmctYWNjb3VudCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdXRoQ2xpZW50ID0gY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnQoKCkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICApO1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBhdXRoQ2xpZW50LmFjY291bnQuZ2V0QWNjb3VudC5xdWVyeSh7fSk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5lbWFpbCA9IGFjY291bnQuZW1haWxzWzBdID8/IG51bGw7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQubmFtZSA9IGFjY291bnQubmFtZTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTZXNzaW9uID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgcmVzdWx0OiBURGF0YWJhc2VJbnRyb3NwZWN0aW9uLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgdG9rZW46IHN0cmluZyB8IG51bGwsXG4gICAgZGV2aWNlX2lkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSA9ICdjcmVhdGluZy1zZXNzaW9uJztcbiAgICB9KTtcblxuICAgIGNvbnN0IHRhYmxlTmFtZXMgPSBPYmplY3QudmFsdWVzKHJlc3VsdC5yZWxhdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3RhYmxlJyB8fCByLmtpbmQgPT09ICdwYXJ0aXRpb25lZF90YWJsZScpXG4gICAgICAgIC5tYXAoKHIpID0+IHIubmFtZSk7XG5cbiAgICBjb25zdCBbaXNSZXBsaWNhLCBtZWRpYW5GaWxlQWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY2hlY2tJc1JlcGxpY2EocG9vbCksXG4gICAgICAgIGNvbGxlY3RNZWRpYW5GaWxlQWdlKHBvb2wsIHRhYmxlTmFtZXMsIHN0b3JlKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAuLi5idWlsZFNlc3Npb25JbnB1dChyZXN1bHQsIHN0b3JlLCBpc1JlcGxpY2EsIG1lZGlhbkZpbGVBZ2UpLFxuICAgICAgICBkZXZpY2VfaWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGNsaWVudCA9IHRva2VuXG4gICAgICAgID8gY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRva2VuKSlcbiAgICAgICAgOiB0cnBjO1xuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNsaWVudC5zZXNzaW9uLmNyZWF0ZS5tdXRhdGUoaW5wdXQpO1xuXG4gICAgcmV0dXJuIHNlc3Npb24uaWQ7XG59O1xuXG5leHBvcnQgY29uc3Qgd2FpdEZvckF1dGhvcml6YXRpb24gPSBhc3luYyAoXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHVybCA9IGJ1aWxkU2Vzc2lvblVSTChzZXNzaW9uSWQpO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LnN0YXRlID0gJ3dhaXRpbmcnO1xuICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LnVybCA9IHVybDtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHdhaXRGb3JUb2tlbihzZXNzaW9uSWQpO1xuICAgIGF3YWl0IHdyaXRlQ29uZmlnKHRva2VuKTtcbiAgICBhd2FpdCBjb25uZWN0QWNjb3VudCh0b2tlbiwgc3RvcmUpO1xufTtcbiJdfQ==
@@ -1,3 +0,0 @@
1
- import type { TStore } from '../store.mjs';
2
- export declare const connectSSH: (store: TStore) => Promise<(() => void) | undefined>;
3
- //# sourceMappingURL=ssh.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssh.d.mts","sourceRoot":"./src/","sources":["app/ssh.mts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AA8DzC,eAAO,MAAM,UAAU,GACnB,OAAO,MAAM,KACd,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CA+MlC,CAAC"}