@botiverse/porthole 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/LICENSE +217 -0
  2. package/dist/bridge/bridge.d.ts +39 -0
  3. package/dist/bridge/bridge.js +198 -0
  4. package/dist/bridge/types.d.ts +83 -0
  5. package/dist/bridge/types.js +1 -0
  6. package/dist/compile/compile.d.ts +35 -0
  7. package/dist/compile/compile.js +30 -0
  8. package/dist/compile/policy.d.ts +55 -0
  9. package/dist/compile/policy.js +103 -0
  10. package/dist/config/capabilities.d.ts +154 -0
  11. package/dist/config/capabilities.js +63 -0
  12. package/dist/config/schema.d.ts +152 -0
  13. package/dist/config/schema.js +11 -0
  14. package/dist/config/validate.d.ts +22 -0
  15. package/dist/config/validate.js +261 -0
  16. package/dist/conformance/behavior.d.ts +2 -0
  17. package/dist/conformance/behavior.js +426 -0
  18. package/dist/conformance/index.d.ts +101 -0
  19. package/dist/conformance/index.js +4 -0
  20. package/dist/conformance/kit.d.ts +42 -0
  21. package/dist/conformance/kit.js +24 -0
  22. package/dist/conformance/oracles.d.ts +35 -0
  23. package/dist/conformance/oracles.js +77 -0
  24. package/dist/conformance/probes.d.ts +33 -0
  25. package/dist/conformance/probes.js +876 -0
  26. package/dist/conformance/served.d.ts +75 -0
  27. package/dist/conformance/served.js +335 -0
  28. package/dist/guide/examples.d.ts +70 -0
  29. package/dist/guide/examples.js +69 -0
  30. package/dist/guide/guide.d.ts +16 -0
  31. package/dist/guide/guide.js +265 -0
  32. package/dist/host/create-host.d.ts +8 -0
  33. package/dist/host/create-host.js +292 -0
  34. package/dist/host/locate.d.ts +8 -0
  35. package/dist/host/locate.js +16 -0
  36. package/dist/host/outcome.d.ts +24 -0
  37. package/dist/host/outcome.js +134 -0
  38. package/dist/host/types.d.ts +127 -0
  39. package/dist/host/types.js +1 -0
  40. package/dist/index.d.ts +25 -0
  41. package/dist/index.js +21 -0
  42. package/dist/isolation/served.d.ts +35 -0
  43. package/dist/isolation/served.js +117 -0
  44. package/dist/isolation/types.d.ts +96 -0
  45. package/dist/isolation/types.js +2 -0
  46. package/dist/mcp/adapter.d.ts +43 -0
  47. package/dist/mcp/adapter.js +327 -0
  48. package/dist/mcp/index.d.ts +27 -0
  49. package/dist/mcp/index.js +25 -0
  50. package/dist/mcp/proxy.d.ts +25 -0
  51. package/dist/mcp/proxy.js +106 -0
  52. package/dist/mcp/view.d.ts +31 -0
  53. package/dist/mcp/view.js +72 -0
  54. package/dist/platform/types.d.ts +51 -0
  55. package/dist/platform/types.js +1 -0
  56. package/dist/platform/web.d.ts +8 -0
  57. package/dist/platform/web.js +85 -0
  58. package/dist/presets/presets.d.ts +71 -0
  59. package/dist/presets/presets.js +140 -0
  60. package/dist/protocol/adapter.d.ts +73 -0
  61. package/dist/protocol/adapter.js +1 -0
  62. package/dist/protocol/jsonrpc.d.ts +43 -0
  63. package/dist/protocol/jsonrpc.js +50 -0
  64. package/dist/protocol/mcp-apps.d.ts +79 -0
  65. package/dist/protocol/mcp-apps.js +99 -0
  66. package/dist/protocol/shell-adapter.d.ts +5 -0
  67. package/dist/protocol/shell-adapter.js +228 -0
  68. package/dist/react/dialog.d.ts +20 -0
  69. package/dist/react/dialog.js +98 -0
  70. package/dist/react/frame.d.ts +91 -0
  71. package/dist/react/frame.js +255 -0
  72. package/dist/react/index.d.ts +13 -0
  73. package/dist/react/index.js +13 -0
  74. package/dist/react/live.d.ts +24 -0
  75. package/dist/react/live.js +57 -0
  76. package/dist/server/index.d.ts +27 -0
  77. package/dist/server/index.js +26 -0
  78. package/dist/server/keys.d.ts +19 -0
  79. package/dist/server/keys.js +78 -0
  80. package/dist/server/pages.d.ts +11 -0
  81. package/dist/server/pages.js +86 -0
  82. package/dist/server/proxy.d.ts +21 -0
  83. package/dist/server/proxy.js +107 -0
  84. package/dist/server/server.d.ts +7 -0
  85. package/dist/server/server.js +542 -0
  86. package/dist/server/tickets.d.ts +8 -0
  87. package/dist/server/tickets.js +28 -0
  88. package/dist/server/types.d.ts +97 -0
  89. package/dist/server/types.js +1 -0
  90. package/dist/shell/document.d.ts +29 -0
  91. package/dist/shell/document.js +85 -0
  92. package/dist/shell/plan.d.ts +37 -0
  93. package/dist/shell/plan.js +35 -0
  94. package/dist/shell/runtime.d.ts +28 -0
  95. package/dist/shell/runtime.js +848 -0
  96. package/dist/theme/variables.d.ts +73 -0
  97. package/dist/theme/variables.js +171 -0
  98. package/dist/transport/post-message.d.ts +9 -0
  99. package/dist/transport/post-message.js +38 -0
  100. package/dist/transport/types.d.ts +15 -0
  101. package/dist/transport/types.js +1 -0
  102. package/package.json +63 -1
  103. package/src/bridge/bridge.ts +278 -0
  104. package/src/bridge/types.ts +95 -0
  105. package/src/compile/compile.ts +68 -0
  106. package/src/compile/policy.ts +130 -0
  107. package/src/config/capabilities.ts +138 -0
  108. package/src/config/schema.ts +168 -0
  109. package/src/config/validate.ts +318 -0
  110. package/src/conformance/behavior.ts +485 -0
  111. package/src/conformance/index.ts +116 -0
  112. package/src/conformance/kit.ts +63 -0
  113. package/src/conformance/oracles.ts +126 -0
  114. package/src/conformance/probes.ts +1129 -0
  115. package/src/conformance/served.ts +501 -0
  116. package/src/guide/examples.ts +74 -0
  117. package/src/guide/guide.ts +430 -0
  118. package/src/host/create-host.ts +335 -0
  119. package/src/host/locate.ts +25 -0
  120. package/src/host/outcome.ts +159 -0
  121. package/src/host/types.ts +126 -0
  122. package/src/index.ts +128 -0
  123. package/src/isolation/served.ts +151 -0
  124. package/src/isolation/types.ts +91 -0
  125. package/src/mcp/adapter.ts +441 -0
  126. package/src/mcp/index.ts +50 -0
  127. package/src/mcp/proxy.ts +117 -0
  128. package/src/mcp/view.ts +97 -0
  129. package/src/platform/types.ts +55 -0
  130. package/src/platform/web.ts +91 -0
  131. package/src/presets/presets.ts +217 -0
  132. package/src/protocol/adapter.ts +67 -0
  133. package/src/protocol/jsonrpc.ts +83 -0
  134. package/src/protocol/mcp-apps.ts +138 -0
  135. package/src/protocol/shell-adapter.ts +261 -0
  136. package/src/react/dialog.tsx +158 -0
  137. package/src/react/frame.tsx +486 -0
  138. package/src/react/index.ts +20 -0
  139. package/src/react/live.ts +76 -0
  140. package/src/server/index.ts +37 -0
  141. package/src/server/keys.ts +100 -0
  142. package/src/server/pages.ts +117 -0
  143. package/src/server/proxy.ts +131 -0
  144. package/src/server/server.ts +657 -0
  145. package/src/server/tickets.ts +30 -0
  146. package/src/server/types.ts +104 -0
  147. package/src/shell/document.ts +121 -0
  148. package/src/shell/plan.ts +69 -0
  149. package/src/shell/runtime.ts +848 -0
  150. package/src/theme/variables.ts +190 -0
  151. package/src/transport/post-message.ts +45 -0
  152. package/src/transport/types.ts +16 -0
@@ -0,0 +1,77 @@
1
+ import { createSocket } from "node:dgram";
2
+ import { createServer } from "node:http";
3
+ const PIXEL = Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", "base64");
4
+ /** What the oracle answers, by the path's extension: real enough for each kind of load to finish. */
5
+ function body(path) {
6
+ if (/\.m?js(\?|$)/u.test(path)) {
7
+ return {
8
+ type: "text/javascript",
9
+ data: "globalThis.__portholeOracleScript = (globalThis.__portholeOracleScript || 0) + 1;",
10
+ };
11
+ }
12
+ if (/\.css(\?|$)/u.test(path)) {
13
+ return { type: "text/css", data: "html { --porthole-oracle: 1; }" };
14
+ }
15
+ if (/\.(png|gif|jpg)(\?|$)/u.test(path)) {
16
+ return { type: "image/png", data: PIXEL };
17
+ }
18
+ if (/\.html(\?|$)/u.test(path)) {
19
+ return {
20
+ type: "text/html",
21
+ data: "<!doctype html><title>oracle</title><p id=oracle>oracle</p>",
22
+ };
23
+ }
24
+ return { type: "text/plain", data: "oracle" };
25
+ }
26
+ export async function httpOracle(files = {}) {
27
+ const heard = [];
28
+ let connections = 0;
29
+ const server = createServer((request, response) => {
30
+ heard.push({
31
+ method: request.method ?? "GET",
32
+ path: request.url ?? "/",
33
+ origin: request.headers.origin,
34
+ });
35
+ const { type, data } = files[request.url ?? "/"] ?? body(request.url ?? "/");
36
+ response.writeHead(200, {
37
+ "content-type": type,
38
+ "access-control-allow-origin": "*",
39
+ "cache-control": "no-store",
40
+ });
41
+ response.end(data);
42
+ });
43
+ server.on("connection", () => {
44
+ connections += 1;
45
+ });
46
+ server.on("upgrade", (request, socket) => {
47
+ heard.push({ method: "UPGRADE", path: request.url ?? "/", origin: request.headers.origin });
48
+ socket.destroy();
49
+ });
50
+ await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
51
+ const { port } = server.address();
52
+ return {
53
+ origin: `http://127.0.0.1:${port}`,
54
+ requests: () => [...heard],
55
+ connections: () => connections,
56
+ close: () => new Promise((resolve) => {
57
+ server.closeAllConnections();
58
+ server.close(() => resolve());
59
+ }),
60
+ };
61
+ }
62
+ export async function udpOracle() {
63
+ let packets = 0;
64
+ const socket = createSocket("udp4");
65
+ socket.on("message", () => {
66
+ packets += 1;
67
+ });
68
+ await new Promise((resolve) => socket.bind(0, "127.0.0.1", resolve));
69
+ const { port } = socket.address();
70
+ return {
71
+ stun: `stun:127.0.0.1:${port}`,
72
+ packets: () => packets,
73
+ close: () => new Promise((resolve) => socket.close(() => resolve())),
74
+ };
75
+ }
76
+ /** Waits `ms`, so a request that was going to leave has time to arrive. */
77
+ export const settle = (ms = 800) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -0,0 +1,33 @@
1
+ import { type PlaywrightTestArgs, type PlaywrightTestOptions, type PlaywrightWorkerArgs, type PlaywrightWorkerOptions, type Page, type TestInfo, type TestType } from "@playwright/test";
2
+ import type { ConformanceHost, LeakSuiteOptions } from "./index.ts";
3
+ import { type Probe } from "./kit.ts";
4
+ export type { Probe, ProbeContext } from "./kit.ts";
5
+ export { attack } from "./kit.ts";
6
+ export declare const PROBES: readonly Probe[];
7
+ type AnyTest = TestType<PlaywrightTestArgs & PlaywrightTestOptions, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;
8
+ /** The fixtures a conformance test uses. */
9
+ export interface ConformanceFixtures {
10
+ readonly page: Page;
11
+ readonly browserName: string;
12
+ }
13
+ /**
14
+ * One conformance test, for a host's own spec file to register: its tests are then located in that
15
+ * file, so `playwright test my-conformance.spec.ts` (or `--grep "\[1\.connect\]"`) finds them.
16
+ *
17
+ * for (const each of leakTests(myHost)) {
18
+ * test(each.title, ({ page, browserName }, info) => each.run({ page, browserName }, info));
19
+ * }
20
+ */
21
+ export interface ConformanceTest {
22
+ readonly id: string;
23
+ /** `[<id>] <what it proves>`: the probe id is greppable. */
24
+ readonly title: string;
25
+ run(fixtures: ConformanceFixtures, info: TestInfo): Promise<void>;
26
+ }
27
+ /** Every probe as a test entry (see `ConformanceTest`). */
28
+ export declare function leakTests(host: ConformanceHost, options?: LeakSuiteOptions): ConformanceTest[];
29
+ /**
30
+ * Registers every probe as a test. Its tests are located in Porthole's own files; a host that
31
+ * wants to select them by its spec file registers `leakTests` itself instead.
32
+ */
33
+ export declare function defineLeakSuite(test: AnyTest, host: ConformanceHost, options?: LeakSuiteOptions): void;