querysub 0.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 (169) hide show
  1. package/.dependency-cruiser.js +304 -0
  2. package/.eslintrc.js +51 -0
  3. package/.github/copilot-instructions.md +1 -0
  4. package/.vscode/settings.json +25 -0
  5. package/bin/deploy.js +4 -0
  6. package/bin/function.js +4 -0
  7. package/bin/server.js +4 -0
  8. package/costsBenefits.txt +112 -0
  9. package/deploy.ts +3 -0
  10. package/inject.ts +1 -0
  11. package/package.json +60 -0
  12. package/prompts.txt +54 -0
  13. package/spec.txt +820 -0
  14. package/src/-a-archives/archiveCache.ts +913 -0
  15. package/src/-a-archives/archives.ts +148 -0
  16. package/src/-a-archives/archivesBackBlaze.ts +792 -0
  17. package/src/-a-archives/archivesDisk.ts +418 -0
  18. package/src/-a-archives/copyLocalToBackblaze.ts +24 -0
  19. package/src/-a-auth/certs.ts +517 -0
  20. package/src/-a-auth/der.ts +122 -0
  21. package/src/-a-auth/ed25519.ts +1015 -0
  22. package/src/-a-auth/node-forge-ed25519.d.ts +17 -0
  23. package/src/-b-authorities/dnsAuthority.ts +203 -0
  24. package/src/-b-authorities/emailAuthority.ts +57 -0
  25. package/src/-c-identity/IdentityController.ts +200 -0
  26. package/src/-d-trust/NetworkTrust2.ts +150 -0
  27. package/src/-e-certs/EdgeCertController.ts +288 -0
  28. package/src/-e-certs/certAuthority.ts +192 -0
  29. package/src/-f-node-discovery/NodeDiscovery.ts +543 -0
  30. package/src/-g-core-values/NodeCapabilities.ts +134 -0
  31. package/src/-g-core-values/oneTimeForward.ts +91 -0
  32. package/src/-h-path-value-serialize/PathValueSerializer.ts +769 -0
  33. package/src/-h-path-value-serialize/stringSerializer.ts +176 -0
  34. package/src/0-path-value-core/LoggingClient.tsx +24 -0
  35. package/src/0-path-value-core/NodePathAuthorities.ts +978 -0
  36. package/src/0-path-value-core/PathController.ts +1 -0
  37. package/src/0-path-value-core/PathValueCommitter.ts +565 -0
  38. package/src/0-path-value-core/PathValueController.ts +231 -0
  39. package/src/0-path-value-core/archiveLocks/ArchiveLocks.ts +154 -0
  40. package/src/0-path-value-core/archiveLocks/ArchiveLocks2.ts +820 -0
  41. package/src/0-path-value-core/archiveLocks/archiveSnapshots.ts +180 -0
  42. package/src/0-path-value-core/debugLogs.ts +90 -0
  43. package/src/0-path-value-core/pathValueArchives.ts +483 -0
  44. package/src/0-path-value-core/pathValueCore.ts +2217 -0
  45. package/src/1-path-client/RemoteWatcher.ts +558 -0
  46. package/src/1-path-client/pathValueClientWatcher.ts +702 -0
  47. package/src/2-proxy/PathValueProxyWatcher.ts +1857 -0
  48. package/src/2-proxy/archiveMoveHarness.ts +376 -0
  49. package/src/2-proxy/garbageCollection.ts +753 -0
  50. package/src/2-proxy/pathDatabaseProxyBase.ts +37 -0
  51. package/src/2-proxy/pathValueProxy.ts +139 -0
  52. package/src/2-proxy/schema2.ts +518 -0
  53. package/src/3-path-functions/PathFunctionHelpers.ts +129 -0
  54. package/src/3-path-functions/PathFunctionRunner.ts +619 -0
  55. package/src/3-path-functions/PathFunctionRunnerMain.ts +67 -0
  56. package/src/3-path-functions/deployBlock.ts +10 -0
  57. package/src/3-path-functions/deployCheck.ts +7 -0
  58. package/src/3-path-functions/deployMain.ts +160 -0
  59. package/src/3-path-functions/pathFunctionLoader.ts +282 -0
  60. package/src/3-path-functions/syncSchema.ts +475 -0
  61. package/src/3-path-functions/tests/functionsTest.ts +135 -0
  62. package/src/3-path-functions/tests/rejectTest.ts +77 -0
  63. package/src/4-dom/css.tsx +29 -0
  64. package/src/4-dom/cssTypes.d.ts +212 -0
  65. package/src/4-dom/qreact.tsx +2322 -0
  66. package/src/4-dom/qreactTest.tsx +417 -0
  67. package/src/4-querysub/Querysub.ts +877 -0
  68. package/src/4-querysub/QuerysubController.ts +620 -0
  69. package/src/4-querysub/copyEvent.ts +0 -0
  70. package/src/4-querysub/permissions.ts +289 -0
  71. package/src/4-querysub/permissionsShared.ts +1 -0
  72. package/src/4-querysub/querysubPrediction.ts +525 -0
  73. package/src/5-diagnostics/FullscreenModal.tsx +67 -0
  74. package/src/5-diagnostics/GenericFormat.tsx +165 -0
  75. package/src/5-diagnostics/Modal.tsx +79 -0
  76. package/src/5-diagnostics/Table.tsx +183 -0
  77. package/src/5-diagnostics/TimeGrouper.tsx +114 -0
  78. package/src/5-diagnostics/diskValueAudit.ts +216 -0
  79. package/src/5-diagnostics/memoryValueAudit.ts +442 -0
  80. package/src/5-diagnostics/nodeMetadata.ts +135 -0
  81. package/src/5-diagnostics/qreactDebug.tsx +309 -0
  82. package/src/5-diagnostics/shared.ts +26 -0
  83. package/src/5-diagnostics/synchronousLagTracking.ts +47 -0
  84. package/src/TestController.ts +35 -0
  85. package/src/allowclient.flag +0 -0
  86. package/src/bits.ts +86 -0
  87. package/src/buffers.ts +69 -0
  88. package/src/config.ts +53 -0
  89. package/src/config2.ts +48 -0
  90. package/src/diagnostics/ActionsHistory.ts +56 -0
  91. package/src/diagnostics/NodeViewer.tsx +503 -0
  92. package/src/diagnostics/SizeLimiter.ts +62 -0
  93. package/src/diagnostics/TimeDebug.tsx +18 -0
  94. package/src/diagnostics/benchmark.ts +139 -0
  95. package/src/diagnostics/errorLogs/ErrorLogController.ts +515 -0
  96. package/src/diagnostics/errorLogs/ErrorLogCore.ts +274 -0
  97. package/src/diagnostics/errorLogs/LogClassifiers.tsx +302 -0
  98. package/src/diagnostics/errorLogs/LogFilterUI.tsx +84 -0
  99. package/src/diagnostics/errorLogs/LogNotify.tsx +101 -0
  100. package/src/diagnostics/errorLogs/LogTimeSelector.tsx +724 -0
  101. package/src/diagnostics/errorLogs/LogViewer.tsx +757 -0
  102. package/src/diagnostics/errorLogs/hookErrors.ts +60 -0
  103. package/src/diagnostics/errorLogs/logFiltering.tsx +149 -0
  104. package/src/diagnostics/heapTag.ts +13 -0
  105. package/src/diagnostics/listenOnDebugger.ts +77 -0
  106. package/src/diagnostics/logs/DiskLoggerPage.tsx +572 -0
  107. package/src/diagnostics/logs/ObjectDisplay.tsx +165 -0
  108. package/src/diagnostics/logs/ansiFormat.ts +108 -0
  109. package/src/diagnostics/logs/diskLogGlobalContext.ts +38 -0
  110. package/src/diagnostics/logs/diskLogger.ts +305 -0
  111. package/src/diagnostics/logs/diskShimConsoleLogs.ts +32 -0
  112. package/src/diagnostics/logs/injectFileLocationToConsole.ts +50 -0
  113. package/src/diagnostics/logs/logGitHashes.ts +30 -0
  114. package/src/diagnostics/managementPages.tsx +289 -0
  115. package/src/diagnostics/periodic.ts +89 -0
  116. package/src/diagnostics/runSaturationTest.ts +416 -0
  117. package/src/diagnostics/satSchema.ts +64 -0
  118. package/src/diagnostics/trackResources.ts +82 -0
  119. package/src/diagnostics/watchdog.ts +55 -0
  120. package/src/errors.ts +132 -0
  121. package/src/forceProduction.ts +3 -0
  122. package/src/fs.ts +72 -0
  123. package/src/heapDumps.ts +666 -0
  124. package/src/https.ts +2 -0
  125. package/src/inject.ts +1 -0
  126. package/src/library-components/ATag.tsx +84 -0
  127. package/src/library-components/Button.tsx +344 -0
  128. package/src/library-components/ButtonSelector.tsx +64 -0
  129. package/src/library-components/DropdownCustom.tsx +151 -0
  130. package/src/library-components/DropdownSelector.tsx +32 -0
  131. package/src/library-components/Input.tsx +334 -0
  132. package/src/library-components/InputLabel.tsx +198 -0
  133. package/src/library-components/InputPicker.tsx +125 -0
  134. package/src/library-components/LazyComponent.tsx +62 -0
  135. package/src/library-components/MeasureHeightCSS.tsx +48 -0
  136. package/src/library-components/MeasuredDiv.tsx +47 -0
  137. package/src/library-components/ShowMore.tsx +51 -0
  138. package/src/library-components/SyncedController.ts +171 -0
  139. package/src/library-components/TimeRangeSelector.tsx +407 -0
  140. package/src/library-components/URLParam.ts +263 -0
  141. package/src/library-components/colors.tsx +14 -0
  142. package/src/library-components/drag.ts +114 -0
  143. package/src/library-components/icons.tsx +692 -0
  144. package/src/library-components/niceStringify.ts +50 -0
  145. package/src/library-components/renderToString.ts +52 -0
  146. package/src/misc/PromiseRace.ts +101 -0
  147. package/src/misc/color.ts +30 -0
  148. package/src/misc/getParentProcessId.cs +53 -0
  149. package/src/misc/getParentProcessId.ts +53 -0
  150. package/src/misc/hash.ts +83 -0
  151. package/src/misc/ipPong.js +13 -0
  152. package/src/misc/networking.ts +2 -0
  153. package/src/misc/random.ts +45 -0
  154. package/src/misc.ts +19 -0
  155. package/src/noserverhotreload.flag +0 -0
  156. package/src/path.ts +226 -0
  157. package/src/persistentLocalStore.ts +37 -0
  158. package/src/promise.ts +15 -0
  159. package/src/server.ts +73 -0
  160. package/src/src.d.ts +1 -0
  161. package/src/test/heapProcess.ts +36 -0
  162. package/src/test/mongoSatTest.tsx +55 -0
  163. package/src/test/satTest.ts +193 -0
  164. package/src/test/test.tsx +552 -0
  165. package/src/zip.ts +92 -0
  166. package/src/zipThreaded.ts +106 -0
  167. package/src/zipThreadedWorker.js +19 -0
  168. package/tsconfig.json +27 -0
  169. package/yarnSpec.txt +56 -0
@@ -0,0 +1,180 @@
1
+ import { sha256 } from "js-sha256";
2
+ import { getArchives } from "../../-a-archives/archives";
3
+ import { getAllNodeIds, getOwnThreadId } from "../../-f-node-discovery/NodeDiscovery";
4
+ import { pathValueArchives } from "../pathValueArchives";
5
+ import { ignoreErrors, logErrors, timeoutToUndefinedSilent } from "../../errors";
6
+ import { green, magenta } from "socket-function/src/formatting/logColors";
7
+
8
+ const snapshots = getArchives("snapshots");
9
+
10
+ export type ArchiveSnapshotOverview = {
11
+ // If live, it isn't a real file that can be loaded
12
+ file: string | "live";
13
+ hash: string;
14
+
15
+ time: number;
16
+ fileCount: number;
17
+ valueCount: number;
18
+ byteCount: number;
19
+ };
20
+ export interface ArchiveSnapshotRead {
21
+ files: {
22
+ file: string;
23
+ state: "live" | "zombie" | "recycled" | "missing";
24
+ time: number;
25
+ valueCount: number;
26
+ byteCount: number;
27
+ source: string;
28
+ }[];
29
+ }
30
+
31
+ function getSnapshotOverview(files: string[]) {
32
+ let overview: ArchiveSnapshotOverview = {
33
+ file: "",
34
+ hash: sha256(files.join("")),
35
+ time: Date.now(),
36
+ fileCount: 0,
37
+ valueCount: 0,
38
+ byteCount: 0,
39
+ };
40
+ for (let file of files) {
41
+ let obj = pathValueArchives.decodeDataPath(file);
42
+ overview.fileCount++;
43
+ overview.valueCount += obj.valueCount;
44
+ overview.byteCount += obj.byteCount;
45
+ }
46
+ overview.file = overviewToFileName(overview);
47
+ return overview;
48
+ }
49
+
50
+ export async function saveSnapshot(config: {
51
+ files: string[],
52
+ }) {
53
+ let { files } = config;
54
+ let overview = getSnapshotOverview(files);
55
+ await snapshots.set(overview.file, Buffer.from(files.join("\n")));
56
+ }
57
+ function overviewToFileName(overview: Omit<ArchiveSnapshotOverview, "file">): string {
58
+ return Object.entries({
59
+ fileCount: overview.fileCount,
60
+ valueCount: overview.valueCount,
61
+ byteCount: overview.byteCount,
62
+ time: overview.time,
63
+ hash: overview.hash,
64
+ }).map(([key, value]) => `${key}=${value}`).join(" ");
65
+ }
66
+ function fileNameToOverview(fileName: string): ArchiveSnapshotOverview {
67
+ let parts = fileName.split(" ");
68
+ let obj = Object.fromEntries(parts.map(part => {
69
+ let [key, value] = part.split("=");
70
+ return [key, value];
71
+ }));
72
+ return {
73
+ file: fileName,
74
+ hash: obj.hash,
75
+
76
+ time: +obj.time,
77
+ fileCount: +obj.fileCount,
78
+ valueCount: +obj.valueCount,
79
+ byteCount: +obj.byteCount,
80
+ };
81
+ }
82
+
83
+ // pathValueArchives.decodeDataPath
84
+ export async function getSnapshotList(): Promise<ArchiveSnapshotOverview[]> {
85
+ let snapshotFiles = await snapshots.find("");
86
+
87
+ let overview: ArchiveSnapshotOverview[] = [];
88
+ let locker = await pathValueArchives.getArchiveLocker();
89
+ let allFiles = await locker.getAllValidFiles();
90
+
91
+ let liveOverview = getSnapshotOverview(allFiles.map(x => x.file));
92
+ liveOverview.file = "live";
93
+ overview.push(liveOverview);
94
+
95
+ overview.push(...snapshotFiles.map(file => fileNameToOverview(file)));
96
+
97
+ return overview;
98
+ }
99
+
100
+ export async function getSnapshot(snapshotFile: string | "live"): Promise<ArchiveSnapshotRead> {
101
+ let snapshot = await getSnapshotBase(snapshotFile);
102
+ let locker = await pathValueArchives.getArchiveLocker();
103
+ let read: ArchiveSnapshotRead = {
104
+ files: await Promise.all(snapshot.files.map(async file => {
105
+ let decoded = pathValueArchives.decodeDataPath(file);
106
+ return {
107
+ file,
108
+ state: await locker.unsafeGetFileLocation(file),
109
+ time: decoded.time,
110
+ valueCount: decoded.valueCount,
111
+ byteCount: decoded.byteCount,
112
+ source: decoded.sourceType,
113
+ };
114
+ })),
115
+ };
116
+ return read;
117
+ }
118
+ async function getSnapshotBase(snapshotFile: string | "live") {
119
+ if (snapshotFile === "live") {
120
+ let locker = await pathValueArchives.getArchiveLocker();
121
+ let allFiles = await locker.getAllValidFiles();
122
+ return {
123
+ time: Date.now(),
124
+ files: allFiles.map(x => x.file),
125
+ };
126
+ }
127
+ let data = await snapshots.get(snapshotFile);
128
+ if (!data) {
129
+ throw new Error(`Snapshot not found: ${snapshotFile}`);
130
+ }
131
+ let files = data.toString().split("\n");
132
+ return {
133
+ files,
134
+ };
135
+ }
136
+
137
+ // EXTREME DANGEROUS! Should only be done when all servers are down (except one, which
138
+ // is run on a developers machine). Worse case scenario, where everything is broken,
139
+ // and you need to just go back to a previous state.
140
+ // - Servers might not be notified, so they will continue to run the wrong data, until
141
+ // they audit the disk.
142
+ // - This means new writes SHOULD be rejected, but probably won't, at least on
143
+ // some servers, which will caused a mixed state.
144
+ // - Non-atomic, so genesis writes may happen while this is happening. BUT,
145
+ // you can always just keep applying the snapshot until this doesn't happen.
146
+ // - DOES save the previous live data as a snapshot, so... is somewhat undoable,
147
+ // although you will still have to take most of the servers down to get back
148
+ // to a consistent server state.
149
+ export async function loadSnapshot(config: {
150
+ overview: ArchiveSnapshotOverview;
151
+ audit?: (nodeId: string) => Promise<void>;
152
+ }): Promise<void> {
153
+ let { overview, audit } = config;
154
+ console.log(magenta(`Loading snapshot: ${overview.file}`));
155
+ let locker = await pathValueArchives.getArchiveLocker();
156
+
157
+ let snapshotData = await snapshots.get(overview.file);
158
+ if (!snapshotData) {
159
+ throw new Error(`Snapshot not found: ${overview.file}`);
160
+ }
161
+ let files = snapshotData.toString().split("\n");
162
+
163
+ console.log(magenta(`Unsafe setting snapshot files: ${overview.file}`));
164
+ await locker.unsafeSetFiles(files);
165
+ console.log(magenta(`Finished unsafe setting snapshot files: ${overview.file}`));
166
+
167
+ let allNodes = await getAllNodeIds();
168
+
169
+ // Logging the errors, not ignoring them
170
+ if (audit) {
171
+ await timeoutToUndefinedSilent(10_000, Promise.all(allNodes.map(async nodeId => {
172
+ if (!audit) return;
173
+ await audit(nodeId);
174
+ })));
175
+ }
176
+
177
+ for (let i = 0; i < 10; i++) {
178
+ console.log(green(`!!!Finished loading snapshot!!!`));
179
+ }
180
+ }
@@ -0,0 +1,90 @@
1
+ import { SocketFunction } from "socket-function/SocketFunction";
2
+ import { requiresNetworkTrustHook } from "../-d-trust/NetworkTrust2";
3
+ import { isDevDebugbreak } from "../config";
4
+ import { measureWrap } from "socket-function/src/profiling/measure";
5
+
6
+ export interface DebugLog {
7
+ type: string;
8
+ time: number;
9
+ values: { [key: string]: unknown };
10
+ }
11
+
12
+ const MAX_LOG_HISTORY = 1000 * 1000 * 10;
13
+ let ENABLED_LOGGING = isDevDebugbreak();
14
+ export function enableDebugLogging() {
15
+ ENABLED_LOGGING = true;
16
+ debugLogFnc = debugLogBase;
17
+ }
18
+ export function disableDebugLogging() {
19
+ ENABLED_LOGGING = false;
20
+ debugLogFnc = NOOP;
21
+ }
22
+ export function isDebugLogEnabled() {
23
+ return ENABLED_LOGGING;
24
+ }
25
+
26
+ let logHistory: DebugLog[] = [];
27
+ let nextIndex = 0;
28
+ export function getFullLogHistory() {
29
+ return logHistory;
30
+ }
31
+ export function getLogHistoryIncludes(includes: string) {
32
+ return logHistory.filter(x => {
33
+ return Object.values(x.values).some(y => String(y).includes(includes));
34
+ });
35
+ }
36
+ export function getLogHistoryEquals(value: string) {
37
+ return logHistory.filter(x => {
38
+ return Object.values(x.values).some(y => y === value);
39
+ });
40
+ }
41
+
42
+ export function debugLog(type: string, values: { [key: string]: unknown }) {
43
+ debugLogFnc(type, values);
44
+ }
45
+ let debugLogFnc = debugLogBase;
46
+ let NOOP = () => { };
47
+ function debugLogBase(type: string, values: { [key: string]: unknown }) {
48
+ if (!ENABLED_LOGGING) {
49
+ disableDebugLogging();
50
+ return;
51
+ }
52
+ let newEntry: DebugLog = { type, time: Date.now(), values };
53
+ // NOTE: Use a rolling index. We don't promise our results are sorted, so this is fine.
54
+ // ALSO, .shift to make a queue lags (it was making this function profile 90% of the time,
55
+ // taking multiple seconds).
56
+ if (logHistory.length < MAX_LOG_HISTORY) {
57
+ logHistory.push(newEntry);
58
+ } else {
59
+ logHistory[nextIndex] = newEntry;
60
+ nextIndex = (nextIndex + 1) % MAX_LOG_HISTORY;
61
+ }
62
+ };
63
+
64
+ class DebugLogControllerBase {
65
+ public async getLogHistoryIncludes(includes: string) {
66
+ return getLogHistoryIncludes(includes);
67
+ }
68
+ public async getLogHistoryEquals(value: string) {
69
+ return getLogHistoryEquals(value);
70
+ }
71
+ public async getLogHistorySize() {
72
+ return {
73
+ "logHistory.length": logHistory.length,
74
+ };
75
+ }
76
+ }
77
+
78
+ export const DebugLogController = SocketFunction.register(
79
+ "DebugLogController-169e9f30-2958-48a9-b5f3-06bcaebdb8e0",
80
+ new DebugLogControllerBase(),
81
+ () => ({
82
+ getLogHistoryIncludes: {},
83
+ getLogHistoryEquals: {},
84
+ getLogHistorySize: {},
85
+ }),
86
+ () => ({
87
+ hooks: [requiresNetworkTrustHook],
88
+ })
89
+ );
90
+