dbctx 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/app/assemble.d.mts +5 -0
  2. package/dist/app/assemble.d.mts.map +1 -0
  3. package/dist/app/assemble.mjs +161 -0
  4. package/dist/app/config.d.mts +9 -0
  5. package/dist/app/config.d.mts.map +1 -0
  6. package/dist/app/config.mjs +49 -0
  7. package/dist/app/db.d.mts +9 -0
  8. package/dist/app/db.d.mts.map +1 -0
  9. package/dist/app/db.mjs +157 -0
  10. package/dist/app/detect.d.mts +11 -0
  11. package/dist/app/detect.d.mts.map +1 -0
  12. package/dist/app/detect.mjs +105 -0
  13. package/dist/app/index.d.mts +3 -0
  14. package/dist/app/index.d.mts.map +1 -0
  15. package/dist/app/index.mjs +81 -0
  16. package/dist/app/open-url.d.mts +4 -0
  17. package/dist/app/open-url.d.mts.map +1 -0
  18. package/dist/app/open-url.mjs +27 -0
  19. package/dist/app/session.d.mts +8 -0
  20. package/dist/app/session.d.mts.map +1 -0
  21. package/dist/app/session.mjs +155 -0
  22. package/dist/app/ssh.d.mts +3 -0
  23. package/dist/app/ssh.d.mts.map +1 -0
  24. package/dist/app/ssh.mjs +207 -0
  25. package/dist/db/analyze.d.mts +1 -1
  26. package/dist/db/analyze.d.mts.map +1 -1
  27. package/dist/db/analyze.mjs +1 -1
  28. package/dist/db/attributes.d.mts +3 -3
  29. package/dist/db/attributes.d.mts.map +1 -1
  30. package/dist/db/attributes.mjs +2 -2
  31. package/dist/db/enums.d.mts +1 -1
  32. package/dist/db/enums.d.mts.map +1 -1
  33. package/dist/db/enums.mjs +2 -2
  34. package/dist/db/file-stats.d.mts +1 -1
  35. package/dist/db/file-stats.d.mts.map +1 -1
  36. package/dist/db/file-stats.mjs +1 -1
  37. package/dist/db/foreign-keys.d.mts +2 -2
  38. package/dist/db/foreign-keys.d.mts.map +1 -1
  39. package/dist/db/foreign-keys.mjs +1 -1
  40. package/dist/db/index.d.mts +9 -9
  41. package/dist/db/index.d.mts.map +1 -1
  42. package/dist/db/index.mjs +10 -10
  43. package/dist/db/indexes.d.mts +1 -1
  44. package/dist/db/indexes.d.mts.map +1 -1
  45. package/dist/db/indexes.mjs +1 -1
  46. package/dist/db/relations.d.mts +2 -2
  47. package/dist/db/relations.d.mts.map +1 -1
  48. package/dist/db/relations.mjs +2 -2
  49. package/dist/db/stats.d.mts +1 -1
  50. package/dist/db/stats.d.mts.map +1 -1
  51. package/dist/db/stats.mjs +2 -2
  52. package/dist/db/version.d.mts +2 -1
  53. package/dist/db/version.d.mts.map +1 -1
  54. package/dist/db/version.mjs +9 -1
  55. package/dist/index.d.mts +4 -3
  56. package/dist/index.d.mts.map +1 -1
  57. package/dist/index.mjs +50 -51
  58. package/dist/lib/trpc-url.d.mts +2 -0
  59. package/dist/lib/trpc-url.d.mts.map +1 -0
  60. package/dist/lib/trpc-url.mjs +6 -0
  61. package/dist/lib/trpc.d.mts +7 -0
  62. package/dist/lib/trpc.d.mts.map +1 -0
  63. package/dist/lib/trpc.mjs +37 -0
  64. package/dist/lib/trpc.react.d.mts +4 -0
  65. package/dist/lib/trpc.react.d.mts.map +1 -0
  66. package/dist/lib/trpc.react.mjs +3 -0
  67. package/dist/lib/version.d.mts +2 -0
  68. package/dist/lib/version.d.mts.map +1 -0
  69. package/dist/lib/version.mjs +5 -0
  70. package/dist/providers/TrpcProvider.d.ts +9 -0
  71. package/dist/providers/TrpcProvider.d.ts.map +1 -0
  72. package/dist/providers/TrpcProvider.js +41 -0
  73. package/dist/schemas/index.d.mts +106 -1
  74. package/dist/schemas/index.d.mts.map +1 -1
  75. package/dist/schemas/index.mjs +27 -2
  76. package/dist/store.d.mts +64 -0
  77. package/dist/store.d.mts.map +1 -0
  78. package/dist/store.mjs +68 -0
  79. package/dist/{App.d.ts → types/connection.d.mts} +3 -9
  80. package/dist/types/connection.d.mts.map +1 -0
  81. package/dist/types/connection.mjs +2 -0
  82. package/dist/ui/App.d.ts +10 -0
  83. package/dist/ui/App.d.ts.map +1 -0
  84. package/dist/ui/App.js +13 -0
  85. package/dist/ui/components/DB.d.ts +10 -0
  86. package/dist/ui/components/DB.d.ts.map +1 -0
  87. package/dist/ui/components/DB.js +22 -0
  88. package/dist/{components → ui/components}/Error.d.ts +1 -1
  89. package/dist/ui/components/Error.d.ts.map +1 -0
  90. package/dist/ui/components/Error.js +6 -0
  91. package/dist/ui/components/Gate.d.ts +10 -0
  92. package/dist/ui/components/Gate.d.ts.map +1 -0
  93. package/dist/ui/components/Gate.js +15 -0
  94. package/dist/ui/components/Introspect.d.ts +10 -0
  95. package/dist/ui/components/Introspect.d.ts.map +1 -0
  96. package/dist/ui/components/Introspect.js +66 -0
  97. package/dist/ui/components/PasswordInput.d.ts +7 -0
  98. package/dist/ui/components/PasswordInput.d.ts.map +1 -0
  99. package/dist/ui/components/PasswordInput.js +32 -0
  100. package/dist/ui/components/SSH.d.ts +10 -0
  101. package/dist/ui/components/SSH.d.ts.map +1 -0
  102. package/dist/ui/components/SSH.js +22 -0
  103. package/dist/ui/components/Session.d.ts +10 -0
  104. package/dist/ui/components/Session.d.ts.map +1 -0
  105. package/dist/ui/components/Session.js +47 -0
  106. package/dist/ui/components/Spinner.d.ts +3 -0
  107. package/dist/ui/components/Spinner.d.ts.map +1 -0
  108. package/dist/ui/components/Spinner.js +18 -0
  109. package/dist/ui/components/Splash.d.ts +3 -0
  110. package/dist/ui/components/Splash.d.ts.map +1 -0
  111. package/dist/ui/components/Splash.js +13 -0
  112. package/dist/validatePaths.d.mts +1 -1
  113. package/dist/validatePaths.d.mts.map +1 -1
  114. package/dist/validatePaths.mjs +17 -11
  115. package/package.json +22 -2
  116. package/dist/App.d.ts.map +0 -1
  117. package/dist/App.js +0 -9
  118. package/dist/components/Error.d.ts.map +0 -1
  119. package/dist/components/Error.js +0 -6
@@ -0,0 +1,81 @@
1
+ import { connectSSH } from './ssh.mjs';
2
+ import { connectDB } from './db.mjs';
3
+ import { assembleDatabase } from './assemble.mjs';
4
+ import { createSession, waitForAuthorization, connectAccount, checkGate, } from './session.mjs';
5
+ import { readConfig, flushConfig } from './config.mjs';
6
+ import { TRPCClientError } from '@trpc/client';
7
+ import { when, runInAction } from 'mobx';
8
+ import { env } from 'process';
9
+ export async function run(store) {
10
+ try {
11
+ const cleanupSSH = await connectSSH(store);
12
+ if (store.steps.sshConnection.enabled) {
13
+ await when(() => ['connected', 'error'].includes(store.steps.sshConnection.state));
14
+ if (store.steps.sshConnection.state === 'error') {
15
+ cleanupSSH?.();
16
+ return;
17
+ }
18
+ }
19
+ const db = await connectDB(store);
20
+ await when(() => ['connected', 'error'].includes(store.steps.databaseConnection.state));
21
+ if (store.steps.databaseConnection.state === 'error') {
22
+ db?.cleanup();
23
+ cleanupSSH?.();
24
+ return;
25
+ }
26
+ if (db) {
27
+ const result = await assembleDatabase(db.pool, store);
28
+ const config = await readConfig();
29
+ try {
30
+ const sessionId = await createSession(db.pool, result, store, config.token ?? null, config.device_id);
31
+ if (config.token) {
32
+ try {
33
+ await connectAccount(config.token, store);
34
+ const canContinue = await checkGate(config.token, store);
35
+ if (!canContinue) {
36
+ db.pool.end();
37
+ return;
38
+ }
39
+ db.pool.end();
40
+ return;
41
+ }
42
+ catch (err) {
43
+ if (err instanceof TRPCClientError &&
44
+ (err.data?.code === 'UNAUTHORIZED' ||
45
+ err.data?.code === 'NOT_FOUND')) {
46
+ await flushConfig();
47
+ }
48
+ else {
49
+ throw err;
50
+ }
51
+ }
52
+ }
53
+ await waitForAuthorization(sessionId, store);
54
+ const freshToken = (await readConfig()).token;
55
+ if (freshToken) {
56
+ const canContinue = await checkGate(freshToken, store);
57
+ if (!canContinue) {
58
+ db.pool.end();
59
+ return;
60
+ }
61
+ }
62
+ }
63
+ catch (err) {
64
+ runInAction(() => {
65
+ store.steps.account.state = 'error';
66
+ store.steps.account.error =
67
+ err instanceof Error
68
+ ? err.message
69
+ : 'Session creation failed';
70
+ });
71
+ }
72
+ db.pool.end();
73
+ }
74
+ }
75
+ catch (err) {
76
+ if (env.NODE_ENV !== 'production') {
77
+ console.error(err);
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2luZGV4Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUNILGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFNUIsTUFBTSxDQUFDLEtBQUssVUFBVSxHQUFHLENBQUMsS0FBYTtJQUNuQyxJQUFJLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNaLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUNsQyxDQUNKLENBQUM7WUFFRixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDOUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDZixPQUFPO1lBQ1gsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDWixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUN2QyxDQUNKLENBQUM7UUFFRixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ25ELEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNkLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDZixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksRUFBRSxFQUFFLENBQUM7WUFDTCxNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUVsQyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQ2pDLEVBQUUsQ0FBQyxJQUFJLEVBQ1AsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksRUFDcEIsTUFBTSxDQUFDLFNBQVMsQ0FDbkIsQ0FBQztnQkFFRixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUM7d0JBQ0QsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxTQUFTLENBQy9CLE1BQU0sQ0FBQyxLQUFLLEVBQ1osS0FBSyxDQUNSLENBQUM7d0JBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNmLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQ2QsT0FBTzt3QkFDWCxDQUFDO3dCQUNELEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2QsT0FBTztvQkFDWCxDQUFDO29CQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7d0JBQ1gsSUFDSSxHQUFHLFlBQVksZUFBZTs0QkFDOUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxjQUFjO2dDQUM5QixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxXQUFXLENBQUMsRUFDckMsQ0FBQzs0QkFDQyxNQUFNLFdBQVcsRUFBRSxDQUFDO3dCQUN4QixDQUFDOzZCQUFNLENBQUM7NEJBQ0osTUFBTSxHQUFHLENBQUM7d0JBQ2QsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsTUFBTSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTdDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDYixNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDZixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNkLE9BQU87b0JBQ1gsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ1gsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO29CQUNwQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLO3dCQUNyQixHQUFHLFlBQVksS0FBSzs0QkFDaEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPOzRCQUNiLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1lBRUQsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDWCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB7Y29ubmVjdFNTSH0gZnJvbSAnLi9zc2gubWpzJztcbmltcG9ydCB7Y29ubmVjdERCfSBmcm9tICcuL2RiLm1qcyc7XG5pbXBvcnQge2Fzc2VtYmxlRGF0YWJhc2V9IGZyb20gJy4vYXNzZW1ibGUubWpzJztcbmltcG9ydCB7XG4gICAgY3JlYXRlU2Vzc2lvbixcbiAgICB3YWl0Rm9yQXV0aG9yaXphdGlvbixcbiAgICBjb25uZWN0QWNjb3VudCxcbiAgICBjaGVja0dhdGUsXG59IGZyb20gJy4vc2Vzc2lvbi5tanMnO1xuaW1wb3J0IHtyZWFkQ29uZmlnLCBmbHVzaENvbmZpZ30gZnJvbSAnLi9jb25maWcubWpzJztcbmltcG9ydCB7VFJQQ0NsaWVudEVycm9yfSBmcm9tICdAdHJwYy9jbGllbnQnO1xuaW1wb3J0IHt3aGVuLCBydW5JbkFjdGlvbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW4oc3RvcmU6IFRTdG9yZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBTU0ggPSBhd2FpdCBjb25uZWN0U1NIKHN0b3JlKTtcblxuICAgICAgICBpZiAoc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB3aGVuKCgpID0+XG4gICAgICAgICAgICAgICAgWydjb25uZWN0ZWQnLCAnZXJyb3InXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5zdGF0ZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwU1NIPy4oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IGNvbm5lY3REQihzdG9yZSk7XG5cbiAgICAgICAgYXdhaXQgd2hlbigoKSA9PlxuICAgICAgICAgICAgWydjb25uZWN0ZWQnLCAnZXJyb3InXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUsXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24uc3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGRiPy5jbGVhbnVwKCk7XG4gICAgICAgICAgICBjbGVhbnVwU1NIPy4oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXNzZW1ibGVEYXRhYmFzZShkYi5wb29sLCBzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gYXdhaXQgY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgZGIucG9vbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRva2VuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5kZXZpY2VfaWQsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RBY2NvdW50KGNvbmZpZy50b2tlbiwgc3RvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuQ29udGludWUgPSBhd2FpdCBjaGVja0dhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuQ29udGludWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5wb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLnBvb2wuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRSUENDbGllbnRFcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIuZGF0YT8uY29kZSA9PT0gJ1VOQVVUSE9SSVpFRCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmRhdGE/LmNvZGUgPT09ICdOT1RfRk9VTkQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmx1c2hDb25maWcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdEZvckF1dGhvcml6YXRpb24oc2Vzc2lvbklkLCBzdG9yZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcmVzaFRva2VuID0gKGF3YWl0IHJlYWRDb25maWcoKSkudG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuQ29udGludWUgPSBhd2FpdCBjaGVja0dhdGUoZnJlc2hUb2tlbiwgc3RvcmUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbkNvbnRpbnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5wb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LnN0YXRlID0gJ2Vycm9yJztcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5lcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdTZXNzaW9uIGNyZWF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRiLnBvb2wuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export declare const shouldOpenBrowser: () => boolean;
2
+ export declare const buildSessionURL: (sessionId: string) => string;
3
+ export declare const openSessionURL: (url: string) => Promise<void>;
4
+ //# sourceMappingURL=open-url.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;AAOF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MACH,CAAC;AAElD,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAW9D,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { env } from 'process';
2
+ const SKIP_VALUES = new Set(['none', 'false', '0']);
3
+ const isDocker = () => !!(env.DOCKER || env.container || env.DOCKER_CONTAINER);
4
+ export const shouldOpenBrowser = () => {
5
+ if (isDocker()) {
6
+ return false;
7
+ }
8
+ const browser = env.BROWSER?.toLowerCase();
9
+ return !browser || !SKIP_VALUES.has(browser);
10
+ };
11
+ const SESSION_BASE_URL = env.NODE_ENV === 'production'
12
+ ? 'https://dbctx.io/authorize/session'
13
+ : 'http://localhost:12002/authorize/session';
14
+ export const buildSessionURL = (sessionId) => `${SESSION_BASE_URL}?session-id=${sessionId}`;
15
+ export const openSessionURL = async (url) => {
16
+ if (!shouldOpenBrowser()) {
17
+ return;
18
+ }
19
+ try {
20
+ const { default: open } = await import('open');
21
+ await open(url);
22
+ }
23
+ catch {
24
+ // Browser opening is best-effort — no-op on failure
25
+ }
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi11cmwubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL29wZW4tdXJsLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTVCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXBELE1BQU0sUUFBUSxHQUFHLEdBQVksRUFBRSxDQUMzQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsR0FBWSxFQUFFO0lBQzNDLElBQUksUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNiLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRTNDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQ2xCLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWTtJQUN6QixDQUFDLENBQUMsb0NBQW9DO0lBQ3RDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUUsQ0FDekQsR0FBRyxnQkFBZ0IsZUFBZSxTQUFTLEVBQUUsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBaUIsRUFBRTtJQUMvRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDWCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsb0RBQW9EO0lBQ3hELENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5cbmNvbnN0IFNLSVBfVkFMVUVTID0gbmV3IFNldChbJ25vbmUnLCAnZmFsc2UnLCAnMCddKTtcblxuY29uc3QgaXNEb2NrZXIgPSAoKTogYm9vbGVhbiA9PlxuICAgICEhKGVudi5ET0NLRVIgfHwgZW52LmNvbnRhaW5lciB8fCBlbnYuRE9DS0VSX0NPTlRBSU5FUik7XG5cbmV4cG9ydCBjb25zdCBzaG91bGRPcGVuQnJvd3NlciA9ICgpOiBib29sZWFuID0+IHtcbiAgICBpZiAoaXNEb2NrZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYnJvd3NlciA9IGVudi5CUk9XU0VSPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuICFicm93c2VyIHx8ICFTS0lQX1ZBTFVFUy5oYXMoYnJvd3Nlcik7XG59O1xuXG5jb25zdCBTRVNTSU9OX0JBU0VfVVJMID1cbiAgICBlbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICA/ICdodHRwczovL2RiY3R4LmlvL2F1dGhvcml6ZS9zZXNzaW9uJ1xuICAgICAgICA6ICdodHRwOi8vbG9jYWxob3N0OjEyMDAyL2F1dGhvcml6ZS9zZXNzaW9uJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2Vzc2lvblVSTCA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIGAke1NFU1NJT05fQkFTRV9VUkx9P3Nlc3Npb24taWQ9JHtzZXNzaW9uSWR9YDtcblxuZXhwb3J0IGNvbnN0IG9wZW5TZXNzaW9uVVJMID0gYXN5bmMgKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFzaG91bGRPcGVuQnJvd3NlcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB7ZGVmYXVsdDogb3Blbn0gPSBhd2FpdCBpbXBvcnQoJ29wZW4nKTtcbiAgICAgICAgYXdhaXQgb3Blbih1cmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCcm93c2VyIG9wZW5pbmcgaXMgYmVzdC1lZmZvcnQg4oCUIG5vLW9wIG9uIGZhaWx1cmVcbiAgICB9XG59O1xuIl19
@@ -0,0 +1,8 @@
1
+ import type { Pool } from 'pg';
2
+ import type { TStore } from '../store.mjs';
3
+ import type { TDatabase } from '../schemas/index.mjs';
4
+ export declare const checkGate: (token: string, store: TStore) => Promise<boolean>;
5
+ export declare const connectAccount: (token: string, store: TStore) => Promise<void>;
6
+ export declare const createSession: (pool: Pool, result: TDatabase, store: TStore, token: string | null, device_id: string) => Promise<string>;
7
+ export declare const waitForAuthorization: (sessionId: string, store: TStore) => Promise<void>;
8
+ //# sourceMappingURL=session.d.mts.map
@@ -0,0 +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,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAmJpD,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAkBjB,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,SAAS,EACjB,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"}
@@ -0,0 +1,155 @@
1
+ import { runInAction } from 'mobx';
2
+ import { fetchRelationFileStats } from '../db/index.mjs';
3
+ import { trpc, createAuthenticatedTRPCClient } from '#client/lib/trpc.mjs';
4
+ import { detectAIAssistants, detectDocker, detectOS, detectShell, detectWSL, detectSystemMemory, detectPackageManager, detectProvider, isLocalhost, } from './detect.mjs';
5
+ import { buildSessionURL } from './open-url.mjs';
6
+ import { writeConfig } from './config.mjs';
7
+ import { CLIENT_VERSION } from '#client/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: store.steps.databaseConnection.pickedUsername,
81
+ hostname: store.steps.databaseConnection.pickedHostname,
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 connectAccount = async (token, store) => {
112
+ runInAction(() => {
113
+ store.steps.account.state = 'fetching-account';
114
+ });
115
+ const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
116
+ const account = await authClient.account.getAccount.query({});
117
+ runInAction(() => {
118
+ store.steps.account.state = 'connected';
119
+ store.steps.account.email = account.emails[0] ?? null;
120
+ store.steps.account.name = account.name;
121
+ });
122
+ };
123
+ export const createSession = async (pool, result, store, token, device_id) => {
124
+ runInAction(() => {
125
+ store.steps.account.state = 'creating-session';
126
+ });
127
+ const tableNames = Object.values(result.relations)
128
+ .filter((r) => r.kind === 'table' || r.kind === 'partitioned_table')
129
+ .map((r) => r.name);
130
+ const [isReplica, medianFileAge] = await Promise.all([
131
+ checkIsReplica(pool),
132
+ collectMedianFileAge(pool, tableNames, store),
133
+ ]);
134
+ const input = {
135
+ ...buildSessionInput(result, store, isReplica, medianFileAge),
136
+ device_id,
137
+ };
138
+ const client = token
139
+ ? createAuthenticatedTRPCClient(() => Promise.resolve(token))
140
+ : trpc;
141
+ const session = await client.session.create.mutate(input);
142
+ return session.id;
143
+ };
144
+ export const waitForAuthorization = async (sessionId, store) => {
145
+ const url = buildSessionURL(sessionId);
146
+ runInAction(() => {
147
+ store.steps.account.state = 'waiting';
148
+ store.steps.account.url = url;
149
+ store.steps.account.sessionId = sessionId;
150
+ });
151
+ const token = await waitForToken(sessionId);
152
+ await writeConfig(token);
153
+ await connectAccount(token, store);
154
+ };
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJhcHAvc2Vzc2lvbi5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUlqQyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixZQUFZLEVBQ1osUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsV0FBVyxHQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQUUsSUFBVSxFQUFvQixFQUFFO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDM0IsMENBQTBDLENBQzdDLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUM5QixJQUFVLEVBQ1YsVUFBNkIsRUFDN0IsS0FBYSxFQUNTLEVBQUU7SUFDeEIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLHNCQUFzQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQVcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVoRCxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQy9CLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixJQUFJLElBQUksQ0FBQztZQUM1QyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNMLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FDUixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FDSixDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUMxRDtZQUNILENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEIsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUN0QixNQUFpQixFQUNqQixLQUFhLEVBQ2IsU0FBa0IsRUFDbEIsYUFBNEIsRUFDOUIsRUFBRTtJQUNBLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRWxELE9BQU87UUFDSCxhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDMUIsMEJBQTBCLEVBQUU7WUFDeEIsYUFBYSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUN4QyxDQUFDLE1BQU07WUFDUixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxNQUFNO1lBQzFELEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLE1BQU07WUFDeEQsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQ3hDLENBQUMsTUFBTTtZQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUM3QyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDakQsc0JBQXNCLEVBQ2xCLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXO1NBQ25EO1FBQ0QsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixxQkFBcUIsRUFBRSxhQUFhO1FBQ3BDLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSTtRQUMxQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7UUFDMUQsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjO1FBQ3RELGlCQUFpQixFQUFFLGNBQWMsQ0FDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxjQUFlLENBQ2pEO1FBQ0QsUUFBUSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQWUsQ0FBQztRQUNyRSxTQUFTLEVBQUUsWUFBWSxFQUFFO1FBQ3pCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU87UUFDdkQsS0FBSyxFQUFFLFdBQVcsRUFBRTtRQUNwQixFQUFFLEVBQUUsUUFBUSxFQUFFO1FBQ2QsTUFBTSxFQUFFLFNBQVMsRUFBRTtRQUNuQixhQUFhLEVBQUUsa0JBQWtCLEVBQUU7UUFDbkMsZUFBZSxFQUFFLG9CQUFvQixFQUFFO1FBQ3ZDLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQWU7UUFDeEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsY0FBZTtRQUN4RCxhQUFhLEVBQUUsa0JBQWtCLEVBQUU7S0FDN0IsQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBaUIsRUFBbUIsRUFBRSxDQUN4RCxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzlDLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBQyxFQUN2QjtRQUNJLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDO0tBQ0osQ0FDSixDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFUCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUMxQixLQUFhLEVBQ2IsS0FBYSxFQUNHLEVBQUU7SUFDbEIsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsQ0FDbEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FDekIsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQ3pELGNBQWMsRUFBRSxjQUFjO0tBQ2pDLENBQUMsQ0FBQztJQUVILFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssRUFDL0IsS0FBYSxFQUNiLEtBQWEsRUFDQSxFQUFFO0lBQ2YsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxDQUNsRCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUN6QixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFOUQsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ3RELEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFDOUIsSUFBVSxFQUNWLE1BQWlCLEVBQ2pCLEtBQWEsRUFDYixLQUFvQixFQUNwQixTQUFpQixFQUNGLEVBQUU7SUFDakIsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUM3QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUM7U0FDbkUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEIsTUFBTSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDakQsY0FBYyxDQUFDLElBQUksQ0FBQztRQUNwQixvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQztLQUNoRCxDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRztRQUNWLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDO1FBQzdELFNBQVM7S0FDWixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSztRQUNoQixDQUFDLENBQUMsNkJBQTZCLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRVgsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUQsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFDckMsU0FBaUIsRUFDakIsS0FBYSxFQUNBLEVBQUU7SUFDZixNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdkMsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUM5QixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQb29sfSBmcm9tICdwZyc7XG5pbXBvcnQge3J1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcblxuaW1wb3J0IHR5cGUge1RTdG9yZX0gZnJvbSAnLi4vc3RvcmUubWpzJztcbmltcG9ydCB0eXBlIHtURGF0YWJhc2V9IGZyb20gJy4uL3NjaGVtYXMvaW5kZXgubWpzJztcbmltcG9ydCB7ZmV0Y2hSZWxhdGlvbkZpbGVTdGF0c30gZnJvbSAnLi4vZGIvaW5kZXgubWpzJztcbmltcG9ydCB7dHJwYywgY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnR9IGZyb20gJyNjbGllbnQvbGliL3RycGMubWpzJztcbmltcG9ydCB7XG4gICAgZGV0ZWN0QUlBc3Npc3RhbnRzLFxuICAgIGRldGVjdERvY2tlcixcbiAgICBkZXRlY3RPUyxcbiAgICBkZXRlY3RTaGVsbCxcbiAgICBkZXRlY3RXU0wsXG4gICAgZGV0ZWN0U3lzdGVtTWVtb3J5LFxuICAgIGRldGVjdFBhY2thZ2VNYW5hZ2VyLFxuICAgIGRldGVjdFByb3ZpZGVyLFxuICAgIGlzTG9jYWxob3N0LFxufSBmcm9tICcuL2RldGVjdC5tanMnO1xuaW1wb3J0IHtidWlsZFNlc3Npb25VUkx9IGZyb20gJy4vb3Blbi11cmwubWpzJztcbmltcG9ydCB7d3JpdGVDb25maWd9IGZyb20gJy4vY29uZmlnLm1qcyc7XG5pbXBvcnQge0NMSUVOVF9WRVJTSU9OfSBmcm9tICcjY2xpZW50L2xpYi92ZXJzaW9uLm1qcyc7XG5cbmNvbnN0IGNoZWNrSXNSZXBsaWNhID0gYXN5bmMgKHBvb2w6IFBvb2wpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PHtpc19yZXBsaWNhOiBib29sZWFufT4oXG4gICAgICAgICdTRUxFQ1QgcGdfaXNfaW5fcmVjb3ZlcnkoKSBBUyBpc19yZXBsaWNhJyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdLmlzX3JlcGxpY2E7XG59O1xuXG5jb25zdCBjb2xsZWN0TWVkaWFuRmlsZUFnZSA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuICAgIHRhYmxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICBpZiAodGFibGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCBmZXRjaFJlbGF0aW9uRmlsZVN0YXRzKHBvb2wsIHRhYmxlTmFtZXNbMF0pO1xuXG4gICAgICAgIGlmICghZmlyc3Q/Lm1vZGlmaWNhdGlvbl90aW1lKSB7XG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5maWxlU3RhdHNTa2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzOiBEYXRlW10gPSBbZmlyc3QubW9kaWZpY2F0aW9uX3RpbWVdO1xuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGFibGVOYW1lcy5zbGljZSgxKS5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZldGNoUmVsYXRpb25GaWxlU3RhdHMocG9vbCwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cz8ubW9kaWZpY2F0aW9uX3RpbWUgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVtYWluaW5nLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgdGltZXMucHVzaCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRpbWVzXS5zb3J0KChhLCBiKSA9PiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpKTtcbiAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcihzb3J0ZWQubGVuZ3RoIC8gMik7XG4gICAgICAgIGNvbnN0IG1lZGlhbiA9XG4gICAgICAgICAgICBzb3J0ZWQubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgKHNvcnRlZFttaWQgLSAxXS5nZXRUaW1lKCkgKyBzb3J0ZWRbbWlkXS5nZXRUaW1lKCkpIC8gMixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHNvcnRlZFttaWRdO1xuXG4gICAgICAgIHJldHVybiBtZWRpYW4udG9JU09TdHJpbmcoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5maWxlU3RhdHNTa2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcblxuY29uc3QgYnVpbGRTZXNzaW9uSW5wdXQgPSAoXG4gICAgcmVzdWx0OiBURGF0YWJhc2UsXG4gICAgc3RvcmU6IFRTdG9yZSxcbiAgICBpc1JlcGxpY2E6IGJvb2xlYW4sXG4gICAgbWVkaWFuRmlsZUFnZTogc3RyaW5nIHwgbnVsbCxcbikgPT4ge1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IE9iamVjdC52YWx1ZXMocmVzdWx0LnJlbGF0aW9ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhYmFzZV9uYW1lOiByZXN1bHQubmFtZSxcbiAgICAgICAgZGF0YWJhc2Vfb2JqZWN0X3N0YXRpc3RpY3M6IHtcbiAgICAgICAgICAgIHBhcmVudF90YWJsZXM6IHJlbGF0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHIpID0+IHIua2luZCA9PT0gJ3BhcnRpdGlvbmVkX3RhYmxlJyxcbiAgICAgICAgICAgICkubGVuZ3RoLFxuICAgICAgICAgICAgdGFibGVzOiByZWxhdGlvbnMuZmlsdGVyKChyKSA9PiByLmtpbmQgPT09ICd0YWJsZScpLmxlbmd0aCxcbiAgICAgICAgICAgIHZpZXdzOiByZWxhdGlvbnMuZmlsdGVyKChyKSA9PiByLmtpbmQgPT09ICd2aWV3JykubGVuZ3RoLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkX3ZpZXdzOiByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChyKSA9PiByLmtpbmQgPT09ICdtYXRlcmlhbGl6ZWRfdmlldycsXG4gICAgICAgICAgICApLmxlbmd0aCxcbiAgICAgICAgICAgIGVudW1zOiBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLmNvdW50cy5lbnVtcyxcbiAgICAgICAgICAgIGluZGV4ZXM6IHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uY291bnRzLmluZGV4ZXMsXG4gICAgICAgICAgICBmb3JlaWduX2tleV9yZWZlcmVuY2VzOlxuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmludHJvc3BlY3Rpb24uY291bnRzLmZvcmVpZ25LZXlzLFxuICAgICAgICB9LFxuICAgICAgICBpc19kYXRhYmFzZV9yZXBsaWNhOiBpc1JlcGxpY2EsXG4gICAgICAgIG1lZGlhbl90YWJsZV9maWxlX2FnZTogbWVkaWFuRmlsZUFnZSxcbiAgICAgICAgZGF0YWJhc2VfdHlwZTogcmVzdWx0LnR5cGUsXG4gICAgICAgIGRhdGFiYXNlX3ZlcnNpb246IHJlc3VsdC52ZXJzaW9uLnZlcnNpb25fbnVtYmVyLnRvU3RyaW5nKCksXG4gICAgICAgIGRhdGFiYXNlX3ZlcnNpb25fc3RyaW5nOiByZXN1bHQudmVyc2lvbi52ZXJzaW9uX3N0cmluZyxcbiAgICAgICAgZGF0YWJhc2VfcHJvdmlkZXI6IGRldGVjdFByb3ZpZGVyKFxuICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZEhvc3RuYW1lISxcbiAgICAgICAgKSxcbiAgICAgICAgaXNfbG9jYWw6IGlzTG9jYWxob3N0KHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRIb3N0bmFtZSEpLFxuICAgICAgICBpc19kb2NrZXI6IGRldGVjdERvY2tlcigpLFxuICAgICAgICBpc19hY2Nlc3NlZF9vdmVyX3NzaDogc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5lbmFibGVkLFxuICAgICAgICBzaGVsbDogZGV0ZWN0U2hlbGwoKSxcbiAgICAgICAgb3M6IGRldGVjdE9TKCksXG4gICAgICAgIGlzX3dzbDogZGV0ZWN0V1NMKCksXG4gICAgICAgIHN5c3RlbV9tZW1vcnk6IGRldGVjdFN5c3RlbU1lbW9yeSgpLFxuICAgICAgICBwYWNrYWdlX21hbmFnZXI6IGRldGVjdFBhY2thZ2VNYW5hZ2VyKCksXG4gICAgICAgIHVzZXJuYW1lOiBzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkVXNlcm5hbWUhLFxuICAgICAgICBob3N0bmFtZTogc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnBpY2tlZEhvc3RuYW1lISxcbiAgICAgICAgYWlfYXNzaXN0YW50czogZGV0ZWN0QUlBc3Npc3RhbnRzKCksXG4gICAgfSBhcyBjb25zdDtcbn07XG5cbmNvbnN0IHdhaXRGb3JUb2tlbiA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PlxuICAgIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBzdWIgPSB0cnBjLnNlc3Npb24ub25BdXRob3JpemF0aW9uLnN1YnNjcmliZShcbiAgICAgICAgICAgIHtzZXNzaW9uX2lkOiBzZXNzaW9uSWR9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9uRGF0YTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YS50b2tlbik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrR2F0ZSA9IGFzeW5jIChcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmdhdGUuc3RhdGUgPSAnY2hlY2tpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aENsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50KCgpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh0b2tlbiksXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRoQ2xpZW50LnNlc3Npb24uc2hvdWxkQ29udGludWUucXVlcnkoe1xuICAgICAgICBjbGllbnRfdmVyc2lvbjogQ0xJRU5UX1ZFUlNJT04sXG4gICAgfSk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmdhdGUuc3RhdGUgPSByZXN1bHQuY29udGludWUgPyAncGFzc2VkJyA6ICdibG9ja2VkJztcbiAgICAgICAgc3RvcmUuc3RlcHMuZ2F0ZS5tZXNzYWdlID0gcmVzdWx0Lm1lc3NhZ2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LmNvbnRpbnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RBY2NvdW50ID0gYXN5bmMgKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSA9ICdmZXRjaGluZy1hY2NvdW50JztcbiAgICB9KTtcblxuICAgIGNvbnN0IGF1dGhDbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkVFJQQ0NsaWVudCgoKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUodG9rZW4pLFxuICAgICk7XG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGF1dGhDbGllbnQuYWNjb3VudC5nZXRBY2NvdW50LnF1ZXJ5KHt9KTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSA9ICdjb25uZWN0ZWQnO1xuICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LmVtYWlsID0gYWNjb3VudC5lbWFpbHNbMF0gPz8gbnVsbDtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5uYW1lID0gYWNjb3VudC5uYW1lO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlc3Npb24gPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICByZXN1bHQ6IFREYXRhYmFzZSxcbiAgICBzdG9yZTogVFN0b3JlLFxuICAgIHRva2VuOiBzdHJpbmcgfCBudWxsLFxuICAgIGRldmljZV9pZDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnY3JlYXRpbmctc2Vzc2lvbic7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0YWJsZU5hbWVzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQucmVsYXRpb25zKVxuICAgICAgICAuZmlsdGVyKChyKSA9PiByLmtpbmQgPT09ICd0YWJsZScgfHwgci5raW5kID09PSAncGFydGl0aW9uZWRfdGFibGUnKVxuICAgICAgICAubWFwKChyKSA9PiByLm5hbWUpO1xuXG4gICAgY29uc3QgW2lzUmVwbGljYSwgbWVkaWFuRmlsZUFnZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGNoZWNrSXNSZXBsaWNhKHBvb2wpLFxuICAgICAgICBjb2xsZWN0TWVkaWFuRmlsZUFnZShwb29sLCB0YWJsZU5hbWVzLCBzdG9yZSksXG4gICAgXSk7XG5cbiAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgICAgLi4uYnVpbGRTZXNzaW9uSW5wdXQocmVzdWx0LCBzdG9yZSwgaXNSZXBsaWNhLCBtZWRpYW5GaWxlQWdlKSxcbiAgICAgICAgZGV2aWNlX2lkLFxuICAgIH07XG5cbiAgICBjb25zdCBjbGllbnQgPSB0b2tlblxuICAgICAgICA/IGNyZWF0ZUF1dGhlbnRpY2F0ZWRUUlBDQ2xpZW50KCgpID0+IFByb21pc2UucmVzb2x2ZSh0b2tlbikpXG4gICAgICAgIDogdHJwYztcblxuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjbGllbnQuc2Vzc2lvbi5jcmVhdGUubXV0YXRlKGlucHV0KTtcblxuICAgIHJldHVybiBzZXNzaW9uLmlkO1xufTtcblxuZXhwb3J0IGNvbnN0IHdhaXRGb3JBdXRob3JpemF0aW9uID0gYXN5bmMgKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB1cmwgPSBidWlsZFNlc3Npb25VUkwoc2Vzc2lvbklkKTtcblxuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSA9ICd3YWl0aW5nJztcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC51cmwgPSB1cmw7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB3YWl0Rm9yVG9rZW4oc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB3cml0ZUNvbmZpZyh0b2tlbik7XG4gICAgYXdhaXQgY29ubmVjdEFjY291bnQodG9rZW4sIHN0b3JlKTtcbn07XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import type { TStore } from '../store.mjs';
2
+ export declare const connectSSH: (store: TStore) => Promise<(() => void) | undefined>;
3
+ //# sourceMappingURL=ssh.d.mts.map
@@ -0,0 +1 @@
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,CAgMlC,CAAC"}
@@ -0,0 +1,207 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { homedir, userInfo } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import net from 'node:net';
5
+ import ssh2 from 'ssh2';
6
+ const { Client, utils } = ssh2;
7
+ import SSHConfig from 'ssh-config';
8
+ import { runInAction, when } from 'mobx';
9
+ import { scope } from 'scope-utilities';
10
+ const SSH_KEY_ORDER = [
11
+ 'id_ed25519_sk',
12
+ 'id_ed25519',
13
+ 'id_ecdsa_sk',
14
+ 'id_ecdsa',
15
+ 'id_rsa',
16
+ 'id_dsa',
17
+ ];
18
+ const resolveSSHConfig = (store) => {
19
+ const sshDir = join(homedir(), '.ssh');
20
+ const configPath = join(sshDir, 'config');
21
+ return scope({
22
+ host: store.config.sshHost,
23
+ port: 22,
24
+ username: userInfo().username,
25
+ privateKeyPath: undefined,
26
+ })
27
+ .let((config) => {
28
+ if (!existsSync(configPath)) {
29
+ return config;
30
+ }
31
+ const configText = readFileSync(configPath, 'utf-8');
32
+ const computed = SSHConfig.parse(configText).compute(config.host);
33
+ const identityFile = computed['IdentityFile']
34
+ ? (Array.isArray(computed['IdentityFile'])
35
+ ? computed['IdentityFile'][0]
36
+ : computed['IdentityFile']).replace(/^~/, homedir())
37
+ : config.privateKeyPath;
38
+ return {
39
+ host: computed['HostName'] ?? config.host,
40
+ port: computed['Port']
41
+ ? parseInt(computed['Port'], 10)
42
+ : config.port,
43
+ username: computed['User'] ?? config.username,
44
+ privateKeyPath: identityFile,
45
+ };
46
+ })
47
+ .let((config) => ({
48
+ ...config,
49
+ privateKeyPath: config.privateKeyPath ??
50
+ SSH_KEY_ORDER.map((name) => join(sshDir, name)).find((path) => existsSync(path)),
51
+ }))
52
+ .let((config) => ({
53
+ host: config.host,
54
+ port: store.config.sshPort ?? config.port,
55
+ username: store.config.sshUsername ?? config.username,
56
+ privateKeyPath: store.config.sshKey ?? config.privateKeyPath,
57
+ }))
58
+ .value();
59
+ };
60
+ export const connectSSH = async (store) => {
61
+ if (!store.steps.sshConnection.enabled) {
62
+ return undefined;
63
+ }
64
+ const config = resolveSSHConfig(store);
65
+ const privateKey = config.privateKeyPath && existsSync(config.privateKeyPath)
66
+ ? readFileSync(config.privateKeyPath)
67
+ : undefined;
68
+ const keyIsEncrypted = privateKey !== undefined && utils.parseKey(privateKey) instanceof Error;
69
+ let publicKeyAttempted = false;
70
+ const promptForInput = (type, finish) => {
71
+ runInAction(() => {
72
+ store.steps.sshConnection.wrongAttempt =
73
+ store.steps.sshConnection.passwordPromptType === type;
74
+ store.steps.sshConnection.password = null;
75
+ store.steps.sshConnection.needPassword = true;
76
+ store.steps.sshConnection.passwordPromptType = type;
77
+ store.steps.sshConnection.promptCount += 1;
78
+ store.steps.sshConnection.state = 'need-password';
79
+ });
80
+ when(() => store.steps.sshConnection.password !== null).then(() => {
81
+ runInAction(() => {
82
+ store.steps.sshConnection.needPassword = false;
83
+ store.steps.sshConnection.state = 'connecting';
84
+ });
85
+ finish([store.steps.sshConnection.password]);
86
+ });
87
+ };
88
+ const promptForPassphrase = (finish) => {
89
+ promptForInput('passphrase', (responses) => {
90
+ const tryPassphrase = responses[0];
91
+ utils.parseKey(privateKey, tryPassphrase) instanceof Error
92
+ ? promptForPassphrase(finish)
93
+ : finish(tryPassphrase);
94
+ });
95
+ };
96
+ const authHandler = (methodsLeft, _partialSuccess, next) => {
97
+ const { username } = config;
98
+ // First call: methodsLeft is null — send 'none' to discover available methods
99
+ !methodsLeft
100
+ ? next({ type: 'none', username })
101
+ : methodsLeft.includes('publickey') &&
102
+ privateKey &&
103
+ keyIsEncrypted &&
104
+ !publicKeyAttempted
105
+ ? promptForPassphrase((validPassphrase) => {
106
+ publicKeyAttempted = true;
107
+ next({
108
+ type: 'publickey',
109
+ username,
110
+ key: privateKey,
111
+ passphrase: validPassphrase,
112
+ });
113
+ })
114
+ : methodsLeft.includes('publickey') &&
115
+ privateKey &&
116
+ !publicKeyAttempted
117
+ ? (() => {
118
+ publicKeyAttempted = true;
119
+ next({ type: 'publickey', username, key: privateKey });
120
+ })()
121
+ : methodsLeft.includes('keyboard-interactive')
122
+ ? next({
123
+ type: 'keyboard-interactive',
124
+ username,
125
+ prompt: (_name, _instructions, _lang, _prompts, finish) => {
126
+ promptForInput('password', finish);
127
+ },
128
+ })
129
+ : methodsLeft.includes('password')
130
+ ? promptForInput('password', (responses) => {
131
+ next({
132
+ type: 'password',
133
+ username,
134
+ password: responses[0],
135
+ });
136
+ })
137
+ : next('none');
138
+ };
139
+ const connectConfig = {
140
+ host: config.host,
141
+ port: config.port,
142
+ username: config.username,
143
+ readyTimeout: 0,
144
+ keepaliveInterval: 10_000,
145
+ keepaliveCountMax: 3,
146
+ authHandler: authHandler,
147
+ };
148
+ runInAction(() => {
149
+ store.steps.sshConnection.pickedHostname = config.host;
150
+ store.steps.sshConnection.pickedPort = config.port;
151
+ store.steps.sshConnection.pickedUsername = config.username;
152
+ store.steps.sshConnection.pickedKeyPath = config.privateKeyPath ?? null;
153
+ store.steps.sshConnection.state = 'connecting';
154
+ });
155
+ const client = new Client();
156
+ return new Promise((resolve, reject) => {
157
+ client.on('ready', () => {
158
+ runInAction(() => {
159
+ store.steps.sshConnection.state = 'connected';
160
+ store.steps.sshConnection.needPassword = false;
161
+ });
162
+ const remoteHost = store.config.hostname ?? 'localhost';
163
+ const remotePort = store.config.port ?? 5432;
164
+ const server = net.createServer((socket) => {
165
+ const localPort = server.address().port;
166
+ client.forwardOut('127.0.0.1', localPort, remoteHost, remotePort, (err, stream) => {
167
+ if (err) {
168
+ socket.end();
169
+ return;
170
+ }
171
+ socket.pipe(stream).pipe(socket);
172
+ });
173
+ });
174
+ server.listen(0, '127.0.0.1', () => {
175
+ const localPort = server.address().port;
176
+ runInAction(() => {
177
+ store.steps.sshConnection.localPort = localPort;
178
+ });
179
+ resolve(() => {
180
+ server.close();
181
+ client.end();
182
+ runInAction(() => {
183
+ store.steps.sshConnection.state = 'idle';
184
+ store.steps.sshConnection.localPort = null;
185
+ });
186
+ });
187
+ });
188
+ });
189
+ client.on('error', (err) => {
190
+ runInAction(() => {
191
+ store.steps.sshConnection.state = 'error';
192
+ store.steps.sshConnection.error = err.message;
193
+ });
194
+ reject(err);
195
+ });
196
+ client.on('close', () => {
197
+ runInAction(() => {
198
+ if (store.steps.sshConnection.state !== 'error') {
199
+ store.steps.sshConnection.state = 'closed';
200
+ }
201
+ store.steps.sshConnection.localPort = null;
202
+ });
203
+ });
204
+ client.connect(connectConfig);
205
+ });
206
+ };
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NoLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9zc2gubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUd4QixNQUFNLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztBQUM3QixPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sYUFBYSxHQUFHO0lBQ2xCLGVBQWU7SUFDZixZQUFZO0lBQ1osYUFBYTtJQUNiLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtDQUNGLENBQUM7QUFFWCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFMUMsT0FBTyxLQUFLLENBQUM7UUFDVCxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFRO1FBQzNCLElBQUksRUFBRSxFQUFFO1FBQ1IsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVE7UUFDN0IsY0FBYyxFQUFFLFNBQStCO0tBQ2xELENBQUM7U0FDRyxHQUFHLENBQUMsQ0FB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S0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNwQixXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUMvQyxDQUFDO2dCQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luY30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge2hvbWVkaXIsIHVzZXJJbmZvfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7am9pbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBuZXQgZnJvbSAnbm9kZTpuZXQnO1xuaW1wb3J0IHNzaDIgZnJvbSAnc3NoMic7XG5pbXBvcnQgdHlwZSB7QXV0aEhhbmRsZXJNaWRkbGV3YXJlLCBDb25uZWN0Q29uZmlnfSBmcm9tICdzc2gyJztcblxuY29uc3Qge0NsaWVudCwgdXRpbHN9ID0gc3NoMjtcbmltcG9ydCBTU0hDb25maWcgZnJvbSAnc3NoLWNvbmZpZyc7XG5pbXBvcnQge3J1bkluQWN0aW9uLCB3aGVufSBmcm9tICdtb2J4JztcbmltcG9ydCB7c2NvcGV9IGZyb20gJ3Njb3BlLXV0aWxpdGllcyc7XG5cbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5cbmNvbnN0IFNTSF9LRVlfT1JERVIgPSBbXG4gICAgJ2lkX2VkMjU1MTlfc2snLFxuICAgICdpZF9lZDI1NTE5JyxcbiAgICAnaWRfZWNkc2Ffc2snLFxuICAgICdpZF9lY2RzYScsXG4gICAgJ2lkX3JzYScsXG4gICAgJ2lkX2RzYScsXG5dIGFzIGNvbnN0O1xuXG5jb25zdCByZXNvbHZlU1NIQ29uZmlnID0gKHN0b3JlOiBUU3RvcmUpID0+IHtcbiAgICBjb25zdCBzc2hEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5zc2gnKTtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihzc2hEaXIsICdjb25maWcnKTtcblxuICAgIHJldHVybiBzY29wZSh7XG4gICAgICAgIGhvc3Q6IHN0b3JlLmNvbmZpZy5zc2hIb3N0ISxcbiAgICAgICAgcG9ydDogMjIsXG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mbygpLnVzZXJuYW1lLFxuICAgICAgICBwcml2YXRlS2V5UGF0aDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgICAgICAubGV0KChjb25maWcpID0+IHtcbiAgICAgICAgICAgIGlmICghZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1RleHQgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IFNTSENvbmZpZy5wYXJzZShjb25maWdUZXh0KS5jb21wdXRlKGNvbmZpZy5ob3N0KTtcblxuICAgICAgICAgICAgY29uc3QgaWRlbnRpdHlGaWxlID0gY29tcHV0ZWRbJ0lkZW50aXR5RmlsZSddXG4gICAgICAgICAgICAgICAgPyAoQXJyYXkuaXNBcnJheShjb21wdXRlZFsnSWRlbnRpdHlGaWxlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb21wdXRlZFsnSWRlbnRpdHlGaWxlJ11bMF1cbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbXB1dGVkWydJZGVudGl0eUZpbGUnXVxuICAgICAgICAgICAgICAgICAgKS5yZXBsYWNlKC9efi8sIGhvbWVkaXIoKSlcbiAgICAgICAgICAgICAgICA6IGNvbmZpZy5wcml2YXRlS2V5UGF0aDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBob3N0OiAoY29tcHV0ZWRbJ0hvc3ROYW1lJ10gYXMgc3RyaW5nKSA/PyBjb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiBjb21wdXRlZFsnUG9ydCddXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29tcHV0ZWRbJ1BvcnQnXSBhcyBzdHJpbmcsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5wb3J0LFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiAoY29tcHV0ZWRbJ1VzZXInXSBhcyBzdHJpbmcpID8/IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlS2V5UGF0aDogaWRlbnRpdHlGaWxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgcHJpdmF0ZUtleVBhdGg6XG4gICAgICAgICAgICAgICAgY29uZmlnLnByaXZhdGVLZXlQYXRoID8/XG4gICAgICAgICAgICAgICAgU1NIX0tFWV9PUkRFUi5tYXAoKG5hbWUpID0+IGpvaW4oc3NoRGlyLCBuYW1lKSkuZmluZCgocGF0aCkgPT5cbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzU3luYyhwYXRoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9KSlcbiAgICAgICAgLmxldCgoY29uZmlnKSA9PiAoe1xuICAgICAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgICAgICBwb3J0OiBzdG9yZS5jb25maWcuc3NoUG9ydCA/PyBjb25maWcucG9ydCxcbiAgICAgICAgICAgIHVzZXJuYW1lOiBzdG9yZS5jb25maWcuc3NoVXNlcm5hbWUgPz8gY29uZmlnLnVzZXJuYW1lLFxuICAgICAgICAgICAgcHJpdmF0ZUtleVBhdGg6IHN0b3JlLmNvbmZpZy5zc2hLZXkgPz8gY29uZmlnLnByaXZhdGVLZXlQYXRoLFxuICAgICAgICB9KSlcbiAgICAgICAgLnZhbHVlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29ubmVjdFNTSCA9IGFzeW5jIChcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBpZiAoIXN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTU0hDb25maWcoc3RvcmUpO1xuXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgICAgIGNvbmZpZy5wcml2YXRlS2V5UGF0aCAmJiBleGlzdHNTeW5jKGNvbmZpZy5wcml2YXRlS2V5UGF0aClcbiAgICAgICAgICAgID8gcmVhZEZpbGVTeW5jKGNvbmZpZy5wcml2YXRlS2V5UGF0aClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qga2V5SXNFbmNyeXB0ZWQgPVxuICAgICAgICBwcml2YXRlS2V5ICE9PSB1bmRlZmluZWQgJiYgdXRpbHMucGFyc2VLZXkocHJpdmF0ZUtleSkgaW5zdGFuY2VvZiBFcnJvcjtcblxuICAgIGxldCBwdWJsaWNLZXlBdHRlbXB0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHByb21wdEZvcklucHV0ID0gKFxuICAgICAgICB0eXBlOiAncGFzc3BocmFzZScgfCAncGFzc3dvcmQnLFxuICAgICAgICBmaW5pc2g6IChyZXNwb25zZXM6IHN0cmluZ1tdKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLndyb25nQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZFByb21wdFR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnBhc3N3b3JkID0gbnVsbDtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ubmVlZFBhc3N3b3JkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGFzc3dvcmRQcm9tcHRUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucHJvbXB0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnbmVlZC1wYXNzd29yZCc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoZW4oKCkgPT4gc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZCAhPT0gbnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5uZWVkUGFzc3dvcmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZpbmlzaChbc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5wYXNzd29yZCFdKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByb21wdEZvclBhc3NwaHJhc2UgPSAoZmluaXNoOiAodmFsaWRQYXNzcGhyYXNlOiBzdHJpbmcpID0+IHZvaWQpID0+IHtcbiAgICAgICAgcHJvbXB0Rm9ySW5wdXQoJ3Bhc3NwaHJhc2UnLCAocmVzcG9uc2VzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0cnlQYXNzcGhyYXNlID0gcmVzcG9uc2VzWzBdITtcbiAgICAgICAgICAgIHV0aWxzLnBhcnNlS2V5KHByaXZhdGVLZXkhLCB0cnlQYXNzcGhyYXNlKSBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgPyBwcm9tcHRGb3JQYXNzcGhyYXNlKGZpbmlzaClcbiAgICAgICAgICAgICAgICA6IGZpbmlzaCh0cnlQYXNzcGhyYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGF1dGhIYW5kbGVyOiBBdXRoSGFuZGxlck1pZGRsZXdhcmUgPSAoXG4gICAgICAgIG1ldGhvZHNMZWZ0LFxuICAgICAgICBfcGFydGlhbFN1Y2Nlc3MsXG4gICAgICAgIG5leHQsXG4gICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IHt1c2VybmFtZX0gPSBjb25maWc7XG5cbiAgICAgICAgLy8gRmlyc3QgY2FsbDogbWV0aG9kc0xlZnQgaXMgbnVsbCDigJQgc2VuZCAnbm9uZScgdG8gZGlzY292ZXIgYXZhaWxhYmxlIG1ldGhvZHNcbiAgICAgICAgIW1ldGhvZHNMZWZ0XG4gICAgICAgICAgICA/IG5leHQoe3R5cGU6ICdub25lJywgdXNlcm5hbWV9KVxuICAgICAgICAgICAgOiBtZXRob2RzTGVmdC5pbmNsdWRlcygncHVibGlja2V5JykgJiZcbiAgICAgICAgICAgICAgICBwcml2YXRlS2V5ICYmXG4gICAgICAgICAgICAgICAga2V5SXNFbmNyeXB0ZWQgJiZcbiAgICAgICAgICAgICAgICAhcHVibGljS2V5QXR0ZW1wdGVkXG4gICAgICAgICAgICAgID8gcHJvbXB0Rm9yUGFzc3BocmFzZSgodmFsaWRQYXNzcGhyYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3B1YmxpY2tleScsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NwaHJhc2U6IHZhbGlkUGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBtZXRob2RzTGVmdC5pbmNsdWRlcygncHVibGlja2V5JykgJiZcbiAgICAgICAgICAgICAgICAgIHByaXZhdGVLZXkgJiZcbiAgICAgICAgICAgICAgICAgICFwdWJsaWNLZXlBdHRlbXB0ZWRcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5QXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0KHt0eXBlOiAncHVibGlja2V5JywgdXNlcm5hbWUsIGtleTogcHJpdmF0ZUtleX0pO1xuICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgICAgIDogbWV0aG9kc0xlZnQuaW5jbHVkZXMoJ2tleWJvYXJkLWludGVyYWN0aXZlJylcbiAgICAgICAgICAgICAgICAgID8gbmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAna2V5Ym9hcmQtaW50ZXJhY3RpdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm9tcHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdEZvcklucHV0KCdwYXNzd29yZCcsIGZpbmlzaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiBtZXRob2RzTGVmdC5pbmNsdWRlcygncGFzc3dvcmQnKVxuICAgICAgICAgICAgICAgICAgICA/IHByb21wdEZvcklucHV0KCdwYXNzd29yZCcsIChyZXNwb25zZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogcmVzcG9uc2VzWzBdISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBuZXh0KCdub25lJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbm5lY3RDb25maWc6IENvbm5lY3RDb25maWcgPSB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgdXNlcm5hbWU6IGNvbmZpZy51c2VybmFtZSxcbiAgICAgICAgcmVhZHlUaW1lb3V0OiAwLFxuICAgICAgICBrZWVwYWxpdmVJbnRlcnZhbDogMTBfMDAwLFxuICAgICAgICBrZWVwYWxpdmVDb3VudE1heDogMyxcbiAgICAgICAgYXV0aEhhbmRsZXI6IGF1dGhIYW5kbGVyLFxuICAgIH07XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGlja2VkSG9zdG5hbWUgPSBjb25maWcuaG9zdDtcbiAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5waWNrZWRQb3J0ID0gY29uZmlnLnBvcnQ7XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGlja2VkVXNlcm5hbWUgPSBjb25maWcudXNlcm5hbWU7XG4gICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24ucGlja2VkS2V5UGF0aCA9IGNvbmZpZy5wcml2YXRlS2V5UGF0aCA/PyBudWxsO1xuICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RpbmcnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPCgpID0+IHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY2xpZW50Lm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2Nvbm5lY3RlZCc7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5uZWVkUGFzc3dvcmQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZW1vdGVIb3N0ID0gc3RvcmUuY29uZmlnLmhvc3RuYW1lID8/ICdsb2NhbGhvc3QnO1xuICAgICAgICAgICAgY29uc3QgcmVtb3RlUG9ydCA9IHN0b3JlLmNvbmZpZy5wb3J0ID8/IDU0MzI7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlcnZlciA9IG5ldC5jcmVhdGVTZXJ2ZXIoKHNvY2tldCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsUG9ydCA9IChzZXJ2ZXIuYWRkcmVzcygpIGFzIG5ldC5BZGRyZXNzSW5mbykucG9ydDtcblxuICAgICAgICAgICAgICAgIGNsaWVudC5mb3J3YXJkT3V0KFxuICAgICAgICAgICAgICAgICAgICAnMTI3LjAuMC4xJyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxQb3J0LFxuICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0LFxuICAgICAgICAgICAgICAgICAgICByZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICAoZXJyLCBzdHJlYW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LnBpcGUoc3RyZWFtKS5waXBlKHNvY2tldCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKDAsICcxMjcuMC4wLjEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxQb3J0ID0gKHNlcnZlci5hZGRyZXNzKCkgYXMgbmV0LkFkZHJlc3NJbmZvKS5wb3J0O1xuXG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmxvY2FsUG9ydCA9IGxvY2FsUG9ydDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50LmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2lkbGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjbGllbnQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2xpZW50Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5zdGF0ZSAhPT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5sb2NhbFBvcnQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNsaWVudC5jb25uZWN0KGNvbm5lY3RDb25maWcpO1xuICAgIH0pO1xufTtcbiJdfQ==
@@ -1,3 +1,3 @@
1
- import type { Pool } from "pg";
1
+ import type { Pool } from 'pg';
2
2
  export declare const analyzeRelation: (pool: Pool, relationName: string) => Promise<void>;
3
3
  //# sourceMappingURL=analyze.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.mts","sourceRoot":"./src/","sources":["db/analyze.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,eAAO,MAAM,eAAe,GAAU,MAAM,IAAI,EAAE,cAAc,MAAM,KAAG,OAAO,CAAC,IAAI,CAmBpF,CAAC"}
1
+ {"version":3,"file":"analyze.d.mts","sourceRoot":"./src/","sources":["db/analyze.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,eAAO,MAAM,eAAe,GACxB,MAAM,IAAI,EACV,cAAc,MAAM,KACrB,OAAO,CAAC,IAAI,CAqBd,CAAC"}
@@ -13,4 +13,4 @@ export const analyzeRelation = async (pool, relationName) => {
13
13
  }
14
14
  await pool.query(`ANALYZE public.${validation.rows[0].quoted_name}`);
15
15
  };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZS5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9hbmFseXplLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLElBQVUsRUFBRSxZQUFvQixFQUFpQixFQUFFO0lBQ3JGLGlGQUFpRjtJQUNqRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQy9COzs7Ozs7O1NBT0MsRUFDRCxDQUFDLFlBQVksQ0FBQyxDQUNqQixDQUFDO0lBRUYsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsWUFBWSw4QkFBOEIsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBvb2wgfSBmcm9tIFwicGdcIjtcblxuZXhwb3J0IGNvbnN0IGFuYWx5emVSZWxhdGlvbiA9IGFzeW5jIChwb29sOiBQb29sLCByZWxhdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlbGF0aW9uIGV4aXN0cyBhbmQgZ2V0IHByb3Blcmx5IHF1b3RlZCBuYW1lIHRvIHByZXZlbnQgU1FMIGluamVjdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCBwb29sLnF1ZXJ5PHsgcXVvdGVkX25hbWU6IHN0cmluZyB9PihcbiAgICAgICAgYFxuICAgICAgICBTRUxFQ1QgZm9ybWF0KCclSScsIGMucmVsbmFtZSkgQVMgcXVvdGVkX25hbWVcbiAgICAgICAgRlJPTSBwZ19jYXRhbG9nLnBnX2NsYXNzIGNcbiAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgICAgV0hFUkUgbi5uc3BuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgICAgIEFORCBjLnJlbG5hbWUgPSAkMVxuICAgICAgICAgICAgQU5EIGMucmVsa2luZCBJTiAoJ3InLCAncCcsICdtJylcbiAgICAgICAgYCxcbiAgICAgICAgW3JlbGF0aW9uTmFtZV1cbiAgICApO1xuXG4gICAgaWYgKHZhbGlkYXRpb24ucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiBcIiR7cmVsYXRpb25OYW1lfVwiIG5vdCBmb3VuZCBpbiBwdWJsaWMgc2NoZW1hYCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcG9vbC5xdWVyeShgQU5BTFlaRSBwdWJsaWMuJHt2YWxpZGF0aW9uLnJvd3NbMF0ucXVvdGVkX25hbWV9YCk7XG59O1xuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl6ZS5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9hbmFseXplLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUNoQyxJQUFVLEVBQ1YsWUFBb0IsRUFDUCxFQUFFO0lBQ2YsaUZBQWlGO0lBQ2pGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDL0I7Ozs7Ozs7U0FPQyxFQUNELENBQUMsWUFBWSxDQUFDLENBQ2pCLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQ1gsYUFBYSxZQUFZLDhCQUE4QixDQUMxRCxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQb29sfSBmcm9tICdwZyc7XG5cbmV4cG9ydCBjb25zdCBhbmFseXplUmVsYXRpb24gPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlbGF0aW9uIGV4aXN0cyBhbmQgZ2V0IHByb3Blcmx5IHF1b3RlZCBuYW1lIHRvIHByZXZlbnQgU1FMIGluamVjdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCBwb29sLnF1ZXJ5PHtxdW90ZWRfbmFtZTogc3RyaW5nfT4oXG4gICAgICAgIGBcbiAgICAgICAgU0VMRUNUIGZvcm1hdCgnJUknLCBjLnJlbG5hbWUpIEFTIHF1b3RlZF9uYW1lXG4gICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgYy5yZWxuYW1lID0gJDFcbiAgICAgICAgICAgIEFORCBjLnJlbGtpbmQgSU4gKCdyJywgJ3AnLCAnbScpXG4gICAgICAgIGAsXG4gICAgICAgIFtyZWxhdGlvbk5hbWVdLFxuICAgICk7XG5cbiAgICBpZiAodmFsaWRhdGlvbi5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgUmVsYXRpb24gXCIke3JlbGF0aW9uTmFtZX1cIiBub3QgZm91bmQgaW4gcHVibGljIHNjaGVtYWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgcG9vbC5xdWVyeShgQU5BTFlaRSBwdWJsaWMuJHt2YWxpZGF0aW9uLnJvd3NbMF0ucXVvdGVkX25hbWV9YCk7XG59O1xuIl19