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,60 @@
1
+ import { isNode } from "typesafecss";
2
+ import { addLocalLog } from "./ErrorLogController";
3
+ import { LogRaw, LogType } from "./ErrorLogCore";
4
+ import { red, yellow } from "socket-function/src/formatting/logColors";
5
+
6
+ // Hooks console.* functions to store errors in files
7
+ export function hookErrors() {
8
+ if (isNode()) {
9
+ process.on("unhandledRejection", async (reason: any, promise) => {
10
+ console.error(`Uncaught promise rejection: ${String(reason.stack || reason)}`);
11
+ });
12
+ process.on("uncaughtException", (error: Error) => {
13
+ console.error(`Uncaught exception: ${String(error.stack || error)}`);
14
+ });
15
+
16
+ function hookConsoleFnc(type: LogType, fncName: "log" | "warn" | "error" | "info") {
17
+ const originalFnc = console[fncName];
18
+ console[fncName] = (...args: any[]) => {
19
+ if (
20
+ typeof args[0] === "string"
21
+ && !args[0].includes("\x1b")
22
+ ) {
23
+ if (fncName === "warn") {
24
+ args = args.slice();
25
+ args[0] = yellow(args[0]);
26
+ } else if (fncName === "error") {
27
+ args = args.slice();
28
+ args[0] = red(args[0]);
29
+ }
30
+ }
31
+ if (fncName === "warn" || fncName === "error") {
32
+ // Add stack traces
33
+ if (args.length === 1 && typeof args[0] === "string" && !args[0].includes("\n")) {
34
+ args = args.slice();
35
+ args[0] = new Error(args[0]).stack || args[0];
36
+ }
37
+ }
38
+ addLocalLog({ message: args.join(" | "), time: Date.now() }, type);
39
+ originalFnc(...args);
40
+ };
41
+ }
42
+ // NOTE: Hooking log will produce too much data. If we want to know if somethin happened,
43
+ // we should use console.info OR... even better, track in it the DB, at an app level.
44
+ //hookConsoleFnc("info", "log");
45
+ hookConsoleFnc("info", "info");
46
+ hookConsoleFnc("warn", "warn");
47
+ hookConsoleFnc("error", "error");
48
+ } else {
49
+ // NOTE: We aren't going to log clientside errors serverside... just yet...
50
+ // window.onerror = window.onunhandledrejection = (...args: unknown[]) => {
51
+ // let error = args[4] as Error;
52
+ // if (!error) {
53
+ // error = (args[0] as any).reason || { message: args[0] };
54
+ // }
55
+ // // Ignore ResizeObserver errors, they are spurious
56
+ // // - https://github.com/vercel/next.js/discussions/51551
57
+ // if (error.message.startsWith("ResizeObserver loop")) return;
58
+ // };
59
+ }
60
+ }
@@ -0,0 +1,149 @@
1
+ import { URLParam, createURLSync } from "../../../src/library-components/URLParam";
2
+ import preact from "preact"; import { qreact } from "../../../src/4-dom/qreact";
3
+ import { Button } from "../../../src/library-components/Button";
4
+ import { css } from "typesafecss";
5
+ import { LogBlockInfo } from "../../../src/diagnostics/errorLogs/ErrorLogCore";
6
+ import { cache } from "socket-function/src/caching";
7
+ import { formatNumber } from "socket-function/src/formatting/format";
8
+ import { TimelineInfo } from "./LogTimeSelector";
9
+ import { getPathFromStr, getPathStr } from "../../../src/path";
10
+
11
+ // NOTE: You visit the page to see errors, so that's what we mostly show.
12
+ // - We show all values inside the top UI AND the "last" UI
13
+ // - The "top" UI helps the user discover what they can see
14
+ // - The "last" UI results in being able to see if the warning fraction is increasing
15
+ // - Also, because of the minimum size, it SHOULD allow seeing if there are any fatals
16
+ // or infos (the fraction will almost always be crushed by warnings though).
17
+ // - The rest of the UI is just based on showing when things happened, and then
18
+ // resolving recent issues.
19
+
20
+ export const showFatalURL = new URLParam("showLogs", true);
21
+ export const showErrorURL = new URLParam("showErrors", true);
22
+ export const showWarningURL = new URLParam("showWarnings", false);
23
+ export const showInfoURL = new URLParam("showInfos", false);
24
+
25
+ export const showOldestLogsFirstURL = new URLParam("logOldestFirst", false);
26
+ export const showLiveLogsURL = new URLParam("showLiveLogs", true);
27
+
28
+ // getPathStr(ids)
29
+ export const filterToClassesURL = new URLParam("filterToClasses", "");
30
+ export const filterMachineIdsURL = new URLParam("filterMachineIds", "");
31
+ export const filterThreadIdsURL = new URLParam("filterThreadIds", "");
32
+
33
+ export function getPathArrayLax(str: string) {
34
+ if (!str) return [];
35
+ let array = getPathFromStr(str);
36
+ if (!array.length) return [str];
37
+ return array;
38
+ }
39
+ export function getLogFilterClasses() {
40
+ return getPathArrayLax(filterToClassesURL.value);
41
+ }
42
+ export function getLogFilterMachineIds() {
43
+ return getPathArrayLax(filterMachineIdsURL.value);
44
+ }
45
+ export function getLogFilterThreadIds() {
46
+ return getPathArrayLax(filterThreadIdsURL.value);
47
+ }
48
+
49
+ export const fatalColor = { h: -5, s: 75, l: 75 };
50
+ export const errorColor = { h: 0, s: 50, l: 50 };
51
+ export const warnColor = { h: 50, s: 50, l: 50 };
52
+ export const infoColor = { h: 200, s: 50, l: 50 };
53
+
54
+ export const countColors = {
55
+ fatal: fatalColor,
56
+ error: errorColor,
57
+ warn: warnColor,
58
+ info: infoColor,
59
+ };
60
+
61
+ export type Counts = {
62
+ total: number;
63
+ fatal: number;
64
+ error: number;
65
+ warn: number;
66
+ info: number;
67
+ };
68
+ export let countTypes = ["fatal", "error", "warn", "info"] as const;
69
+
70
+
71
+ export class PickLogType extends qreact.Component<{
72
+ infos: TimelineInfo[] | undefined;
73
+ }> {
74
+ render() {
75
+ let counts = countTypesCache(this.props.infos);
76
+ function renderShowButton(config: {
77
+ url: URLParam<boolean>;
78
+ title: string;
79
+ color: { h: number; s: number; l: number; };
80
+ count: number;
81
+ }) {
82
+ let { url, title, color, count } = config;
83
+ color = { ...color };
84
+ if (!url.value) {
85
+ color.s -= 30;
86
+ }
87
+ return (
88
+ <Button
89
+ class={css
90
+ .hsla(color.h, color.s, color.l, 1)
91
+ .button
92
+ .color("white")
93
+ .border("1px solid hsl(0, 0%, 10%)")
94
+ .boldStyle
95
+ .pad2(30, 16)
96
+ + (!url.value ? css.opacity(0.5) : "")
97
+ }
98
+ onClick={() => url.value = !url.value}
99
+ >
100
+ {url.value ? "Hide " : "Show "} {formatNumber(count)} {title}s
101
+ </Button>
102
+ );
103
+ }
104
+ return (
105
+ <div class={css.hbox(2).center}>
106
+ {renderShowButton({
107
+ url: showFatalURL,
108
+ title: "Fatal",
109
+ color: fatalColor,
110
+ count: counts.fatalCount,
111
+ })}
112
+ {renderShowButton({
113
+ url: showErrorURL,
114
+ title: "Error",
115
+ color: errorColor,
116
+ count: counts.errorCount,
117
+ })}
118
+ {renderShowButton({
119
+ url: showWarningURL,
120
+ title: "Warning",
121
+ color: warnColor,
122
+ count: counts.warnCount,
123
+ })}
124
+ {renderShowButton({
125
+ url: showInfoURL,
126
+ title: "Info",
127
+ color: infoColor,
128
+ count: counts.infoCount,
129
+ })}
130
+ </div>
131
+ );
132
+ }
133
+ }
134
+
135
+ const countTypesCache = cache((infos: TimelineInfo[] | undefined) => {
136
+ let fatalCount = 0;
137
+ let errorCount = 0;
138
+ let warnCount = 0;
139
+ let infoCount = 0;
140
+ if (infos) {
141
+ for (let info of infos) {
142
+ fatalCount += info.fatalCount;
143
+ errorCount += info.errorCount;
144
+ warnCount += info.warnCount;
145
+ infoCount += info.infoCount;
146
+ }
147
+ }
148
+ return { fatalCount, errorCount, warnCount, infoCount };
149
+ });
@@ -0,0 +1,13 @@
1
+ import { cache } from "socket-function/src/caching";
2
+
3
+ const ENABLE_HEAP_TAGS = false;
4
+
5
+ export const heapTagObj = cache((name: string): <T>(obj: T) => T => {
6
+ let cls = eval(`(class ${name} { })`);
7
+ return (obj) => {
8
+ if (!ENABLE_HEAP_TAGS) return obj;
9
+ let taggedObj = new cls();
10
+ Object.assign(taggedObj, obj);
11
+ return taggedObj;
12
+ };
13
+ });
@@ -0,0 +1,77 @@
1
+ import { isNode } from "socket-function/src/misc";
2
+ import inspector from "inspector";
3
+ import fs from "fs";
4
+ import { getSubFolder } from "../fs";
5
+ import { SocketFunction } from "socket-function/SocketFunction";
6
+ import debugbreak from "debugbreak";
7
+
8
+ let devToolsUrl = "";
9
+
10
+ export function listenOnDebugger(name: string) {
11
+ if (devToolsUrl) return;
12
+ if (!isNode()) return;
13
+ // NOTE: Fails if we are already listening, which is fine.
14
+ try { inspector.open(); } catch { }
15
+ let url = inspector.url();
16
+ if (!url) {
17
+ url = baseGetInspectorUrl();
18
+ }
19
+
20
+ devToolsUrl = `devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&${url.replace("://", "=")}`;
21
+ devToolsUrl = devToolsUrl.replace("devtools://devtools/bundled", "https://notdevtools.com/devtools");
22
+ console.log(`Debugger listening on ${devToolsUrl}`);
23
+
24
+ const ext = ".url";
25
+ const debuggerFolder = getSubFolder("debugger");
26
+ let otherDebuggers = fs.readdirSync(debuggerFolder);
27
+ otherDebuggers = otherDebuggers.filter(x => x.endsWith(ext));
28
+ // Delete all files for processes that no longer exist
29
+ for (let other of otherDebuggers) {
30
+ let pid = +other.split("-")[0];
31
+ let ppid = +other.split("-")[1];
32
+ if (!doesProcessExist(pid) || !doesProcessExist(ppid)) {
33
+ try {
34
+ fs.unlinkSync(debuggerFolder + other);
35
+ } catch { }
36
+ }
37
+ }
38
+
39
+ // TODO: Support OSX links are well (detect the system and switch depending on that)
40
+ let linkBody = `[InternetShortcut]
41
+ URL=${devToolsUrl}
42
+ `;
43
+ fs.writeFileSync(getSubFolder("debugger") + process.pid + "-" + process.ppid + "-" + name + ext, linkBody);
44
+ setTimeout(() => {
45
+ if (SocketFunction.mountedNodeId) {
46
+ let subName = SocketFunction.mountedNodeId.replaceAll(":", "_") + "-" + name;
47
+ fs.writeFileSync(getSubFolder("debugger") + process.pid + "-" + process.ppid + "-" + subName + ext, linkBody);
48
+ }
49
+ }, 5 * 1000);
50
+ }
51
+ export function getDebuggerUrl() {
52
+ if (!devToolsUrl) throw new Error(`listenOnDebugger must be called before getDebuggerUrl`);
53
+ return devToolsUrl;
54
+ }
55
+ function doesProcessExist(pid: number) {
56
+ try {
57
+ process.kill(pid, 0);
58
+ return true;
59
+ } catch {
60
+ return false;
61
+ }
62
+ }
63
+ function baseGetInspectorUrl() {
64
+ function getNextPort() {
65
+ return 49152 + ~~((65535 - 49152) * Math.random());
66
+ }
67
+
68
+ while (true) {
69
+ let url = inspector.url();
70
+ if (url) return url;
71
+ try {
72
+ inspector.open(getNextPort());
73
+ } catch {
74
+ continue;
75
+ }
76
+ }
77
+ }