oblien 2.2.36 → 2.2.38

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 (101) hide show
  1. package/README.md +53 -274
  2. package/dist/cdn.d.ts +105 -0
  3. package/dist/cdn.d.ts.map +1 -0
  4. package/dist/cdn.js +201 -0
  5. package/dist/cdn.js.map +1 -0
  6. package/dist/cli/commands/cdn.d.ts +3 -0
  7. package/dist/cli/commands/cdn.d.ts.map +1 -0
  8. package/dist/cli/commands/cdn.js +216 -0
  9. package/dist/cli/commands/cdn.js.map +1 -0
  10. package/dist/cli/commands/namespaces.js +19 -6
  11. package/dist/cli/commands/namespaces.js.map +1 -1
  12. package/dist/cli/commands/serve.d.ts +17 -0
  13. package/dist/cli/commands/serve.d.ts.map +1 -0
  14. package/dist/cli/commands/serve.js +113 -0
  15. package/dist/cli/commands/serve.js.map +1 -0
  16. package/dist/cli/commands/tunnel.d.ts +1 -0
  17. package/dist/cli/commands/tunnel.d.ts.map +1 -1
  18. package/dist/cli/commands/tunnel.js +100 -3
  19. package/dist/cli/commands/tunnel.js.map +1 -1
  20. package/dist/cli/index.js +14 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/client.d.ts +12 -1
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +16 -1
  25. package/dist/client.js.map +1 -1
  26. package/dist/domain.d.ts +20 -1
  27. package/dist/domain.d.ts.map +1 -1
  28. package/dist/domain.js +37 -0
  29. package/dist/domain.js.map +1 -1
  30. package/dist/edge-proxy.d.ts +50 -11
  31. package/dist/edge-proxy.d.ts.map +1 -1
  32. package/dist/edge-proxy.js +55 -10
  33. package/dist/edge-proxy.js.map +1 -1
  34. package/dist/index.d.ts +8 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +5 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/mcp/tools.d.ts.map +1 -1
  39. package/dist/mcp/tools.js +145 -7
  40. package/dist/mcp/tools.js.map +1 -1
  41. package/dist/namespace.d.ts +27 -5
  42. package/dist/namespace.d.ts.map +1 -1
  43. package/dist/namespace.js +30 -4
  44. package/dist/namespace.js.map +1 -1
  45. package/dist/notifications.d.ts +72 -0
  46. package/dist/notifications.d.ts.map +1 -0
  47. package/dist/notifications.js +93 -0
  48. package/dist/notifications.js.map +1 -0
  49. package/dist/runtime/proxy.d.ts +55 -0
  50. package/dist/runtime/proxy.d.ts.map +1 -0
  51. package/dist/runtime/proxy.js +79 -0
  52. package/dist/runtime/proxy.js.map +1 -0
  53. package/dist/runtime.d.ts +16 -0
  54. package/dist/runtime.d.ts.map +1 -1
  55. package/dist/runtime.js +18 -0
  56. package/dist/runtime.js.map +1 -1
  57. package/dist/server/static.d.ts +81 -0
  58. package/dist/server/static.d.ts.map +1 -0
  59. package/dist/server/static.js +465 -0
  60. package/dist/server/static.js.map +1 -0
  61. package/dist/types/cdn.d.ts +301 -0
  62. package/dist/types/cdn.d.ts.map +1 -0
  63. package/dist/types/cdn.js +10 -0
  64. package/dist/types/cdn.js.map +1 -0
  65. package/dist/types/client.d.ts +10 -0
  66. package/dist/types/client.d.ts.map +1 -1
  67. package/dist/types/edge-proxy.d.ts +50 -1
  68. package/dist/types/edge-proxy.d.ts.map +1 -1
  69. package/dist/types/index.d.ts +6 -3
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/types/namespace.d.ts +55 -9
  72. package/dist/types/namespace.d.ts.map +1 -1
  73. package/dist/types/notifications.d.ts +77 -0
  74. package/dist/types/notifications.d.ts.map +1 -0
  75. package/dist/types/notifications.js +3 -0
  76. package/dist/types/notifications.js.map +1 -0
  77. package/dist/types/webhooks.d.ts +52 -0
  78. package/dist/types/webhooks.d.ts.map +1 -0
  79. package/dist/types/webhooks.js +3 -0
  80. package/dist/types/webhooks.js.map +1 -0
  81. package/dist/types/workspace-resources.d.ts +48 -0
  82. package/dist/types/workspace-resources.d.ts.map +1 -1
  83. package/dist/webhooks.d.ts +53 -0
  84. package/dist/webhooks.d.ts.map +1 -0
  85. package/dist/webhooks.js +60 -0
  86. package/dist/webhooks.js.map +1 -0
  87. package/docs/analytics.md +36 -0
  88. package/docs/cdn.md +119 -0
  89. package/docs/domains.md +47 -0
  90. package/docs/edge-proxy.md +44 -0
  91. package/docs/edge-tunnel.md +42 -0
  92. package/docs/errors.md +34 -0
  93. package/docs/namespaces.md +69 -0
  94. package/docs/notifications.md +40 -0
  95. package/docs/pages.md +26 -0
  96. package/docs/runtime.md +83 -0
  97. package/docs/serve.md +84 -0
  98. package/docs/tokens.md +24 -0
  99. package/docs/webhooks.md +42 -0
  100. package/docs/workspaces.md +82 -0
  101. package/package.json +5 -2
@@ -0,0 +1,79 @@
1
+ /**
2
+ * A handle to a single loopback port inside the workspace, obtained via
3
+ * {@link Runtime.proxy}. Requests are forwarded by the runtime's `/proxy`
4
+ * endpoint to `127.0.0.1:<port>` inside the VM — headers, streaming/SSE, and
5
+ * WebSocket upgrades pass through near-natively. Only loopback ports are
6
+ * reachable; the proxy cannot reach the VM's network or the internet.
7
+ *
8
+ * ```ts
9
+ * const rt = await client.workspaces.runtime('ws_abc');
10
+ *
11
+ * // HTTP — returns a raw fetch Response
12
+ * const res = await rt.proxy(3000).fetch('/api/users');
13
+ * const users = await res.json();
14
+ *
15
+ * // Streaming (SSE) passes through
16
+ * const stream = await rt.proxy(3000).fetch('/events');
17
+ * for await (const chunk of stream.body!) { /* ... *\/ }
18
+ *
19
+ * // WebSocket
20
+ * const ws = rt.proxy(3000).ws('/socket');
21
+ * ws.onmessage = (e) => console.log(e.data);
22
+ * ```
23
+ */
24
+ export class RuntimeProxy {
25
+ _httpBase;
26
+ _wsBase;
27
+ _token;
28
+ _target;
29
+ constructor(options, port, host) {
30
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
31
+ throw new Error(`invalid proxy port: ${port} (must be 1-65535)`);
32
+ }
33
+ const base = (options.baseUrl ?? 'https://workspace.oblien.com').replace(/\/$/, '');
34
+ this._httpBase = base;
35
+ this._wsBase = base.replace(/^http/, 'ws');
36
+ this._token = options.token;
37
+ this._target = host ? `${host}:${port}` : String(port);
38
+ }
39
+ /**
40
+ * Make an HTTP request to the loopback service and return the raw `Response`.
41
+ * The path is passed through untouched (e.g. `/api/users?limit=10`). The
42
+ * runtime connection token is sent via the `Authorization` header and is
43
+ * stripped before the request reaches the in-VM app.
44
+ */
45
+ fetch(path, init = {}) {
46
+ const headers = new Headers(init.headers);
47
+ headers.set('Authorization', `Bearer ${this._token}`);
48
+ headers.set('X-Oblien-Proxy-Target', this._target);
49
+ return fetch(this._url(this._httpBase, path), {
50
+ method: init.method ?? 'GET',
51
+ headers,
52
+ body: init.body ?? null,
53
+ signal: init.signal,
54
+ redirect: init.redirect,
55
+ });
56
+ }
57
+ /**
58
+ * Open a WebSocket to the loopback service. Auth and target are passed as
59
+ * query params (`token`, `x_oblien_target`) because the browser WebSocket API
60
+ * cannot set request headers.
61
+ */
62
+ ws(path = '/', protocols) {
63
+ const url = this._url(this._wsBase, path, {
64
+ token: this._token,
65
+ x_oblien_target: this._target,
66
+ });
67
+ return new WebSocket(url, protocols);
68
+ }
69
+ _url(base, path, extraQuery) {
70
+ const p = path.startsWith('/') ? path : `/${path}`;
71
+ const u = new URL(base + '/proxy' + p);
72
+ if (extraQuery) {
73
+ for (const [k, v] of Object.entries(extraQuery))
74
+ u.searchParams.set(k, v);
75
+ }
76
+ return u.toString();
77
+ }
78
+ }
79
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/runtime/proxy.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,YAAY;IACN,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,OAAO,CAAS;IAEjC,YAAY,OAAuB,EAAE,IAAY,EAAE,IAAa;QAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,oBAAoB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAY,EAAE,OAAuB,EAAE;QAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,EAAE,CAAC,IAAI,GAAG,GAAG,EAAE,SAA6B;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACxC,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,eAAe,EAAE,IAAI,CAAC,OAAO;SAC9B,CAAC,CAAC;QACH,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,SAAiC,CAAC,CAAC;IAC/D,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,UAAmC;QAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;gBAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;CACF"}
package/dist/runtime.d.ts CHANGED
@@ -6,6 +6,7 @@ import { TerminalResource } from './runtime/terminal.js';
6
6
  import { WatcherResource } from './runtime/watcher.js';
7
7
  import { TransferResource } from './runtime/transfer.js';
8
8
  import { RuntimeWebSocket } from './runtime/ws.js';
9
+ import { RuntimeProxy } from './runtime/proxy.js';
9
10
  import type { RuntimeOptions, WSOptions } from './types/runtime.js';
10
11
  /**
11
12
  * Workspace Runtime - the data-plane client for interacting with a
@@ -76,5 +77,20 @@ export declare class Runtime {
76
77
  * ```
77
78
  */
78
79
  ws(options?: WSOptions): RuntimeWebSocket;
80
+ /**
81
+ * Reverse-proxy HTTP/WebSocket requests to a service listening on a loopback
82
+ * port inside the workspace (e.g. a dev server on `127.0.0.1:3000`). Requests
83
+ * are forwarded near-natively — headers, streaming/SSE, and WebSocket upgrades
84
+ * pass through. Only loopback ports are reachable.
85
+ *
86
+ * ```ts
87
+ * const res = await rt.proxy(3000).fetch('/api/users');
88
+ * const ws = rt.proxy(3000).ws('/socket');
89
+ * ```
90
+ *
91
+ * @param port Loopback port inside the workspace (1-65535).
92
+ * @param host Optional loopback host override (defaults to 127.0.0.1).
93
+ */
94
+ proxy(port: number, host?: string): RuntimeProxy;
79
95
  }
80
96
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,OAAO;IAClB,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAElC,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;gBAExB,OAAO,EAAE,cAAc;IAWnC,uEAAuE;IACjE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAYhC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,gBAAgB;CAG1C"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,OAAO;IAClB,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAElC,gBAAgB;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAEhC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;gBAExB,OAAO,EAAE,cAAc;IAWnC,uEAAuE;IACjE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAYhC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,gBAAgB;IAIzC;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY;CAGjD"}
package/dist/runtime.js CHANGED
@@ -6,6 +6,7 @@ import { TerminalResource } from './runtime/terminal.js';
6
6
  import { WatcherResource } from './runtime/watcher.js';
7
7
  import { TransferResource } from './runtime/transfer.js';
8
8
  import { RuntimeWebSocket } from './runtime/ws.js';
9
+ import { RuntimeProxy } from './runtime/proxy.js';
9
10
  /**
10
11
  * Workspace Runtime - the data-plane client for interacting with a
11
12
  * running workspace's filesystem, terminal, commands, and file watchers.
@@ -97,5 +98,22 @@ export class Runtime {
97
98
  ws(options) {
98
99
  return new RuntimeWebSocket(this._options, options);
99
100
  }
101
+ /**
102
+ * Reverse-proxy HTTP/WebSocket requests to a service listening on a loopback
103
+ * port inside the workspace (e.g. a dev server on `127.0.0.1:3000`). Requests
104
+ * are forwarded near-natively — headers, streaming/SSE, and WebSocket upgrades
105
+ * pass through. Only loopback ports are reachable.
106
+ *
107
+ * ```ts
108
+ * const res = await rt.proxy(3000).fetch('/api/users');
109
+ * const ws = rt.proxy(3000).ws('/socket');
110
+ * ```
111
+ *
112
+ * @param port Loopback port inside the workspace (1-65535).
113
+ * @param host Optional loopback host override (defaults to 127.0.0.1).
114
+ */
115
+ proxy(port, host) {
116
+ return new RuntimeProxy(this._options, port, host);
117
+ }
100
118
  }
101
119
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,OAAO;IAClB,gBAAgB;IACP,KAAK,CAAoB;IAElC,gBAAgB;IACC,QAAQ,CAAiB;IAE1C,wEAAwE;IAC/D,KAAK,CAAgB;IAE9B,oDAAoD;IAC3C,MAAM,CAAiB;IAEhC,0DAA0D;IACjD,IAAI,CAAe;IAE5B,uEAAuE;IAC9D,QAAQ,CAAmB;IAEpC,4CAA4C;IACnC,OAAO,CAAkB;IAElC,iEAAiE;IACxD,QAAQ,CAAmB;IAEpC,YAAY,OAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB;gBACvD,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,CAAC,OAAmB;QACpB,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,OAAO;IAClB,gBAAgB;IACP,KAAK,CAAoB;IAElC,gBAAgB;IACC,QAAQ,CAAiB;IAE1C,wEAAwE;IAC/D,KAAK,CAAgB;IAE9B,oDAAoD;IAC3C,MAAM,CAAiB;IAEhC,0DAA0D;IACjD,IAAI,CAAe;IAE5B,uEAAuE;IAC9D,QAAQ,CAAmB;IAEpC,4CAA4C;IACnC,OAAO,CAAkB;IAElC,iEAAiE;IACxD,QAAQ,CAAmB;IAEpC,YAAY,OAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB;gBACvD,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,EAAE,CAAC,OAAmB;QACpB,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,IAAY,EAAE,IAAa;QAC/B,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Static file server — a small, dependency-free HTTP server for a folder.
3
+ *
4
+ * Built entirely on Node's `http`/`fs`/`path`, so it adds nothing to the SDK's
5
+ * dependency tree. Pair it with the {@link TunnelClient} (or `oblien serve`) to
6
+ * put a folder on the public internet in one step.
7
+ *
8
+ * ```ts
9
+ * import { startStaticServer } from 'oblien';
10
+ *
11
+ * const site = await startStaticServer({ root: './public', spa: true });
12
+ * console.log(`serving on ${site.url}`);
13
+ * // ... later
14
+ * await site.close();
15
+ * ```
16
+ *
17
+ * Features: streamed responses (memory-safe for large files), correct MIME
18
+ * types, `Range` requests (media seeking), `ETag`/`Last-Modified` revalidation
19
+ * (`304`), directory `index.html`, optional directory listings, optional SPA
20
+ * fallback, and strict path-traversal protection.
21
+ */
22
+ import { type Server, type IncomingMessage, type ServerResponse } from 'node:http';
23
+ export interface StaticServerOptions {
24
+ /** Directory to serve. Resolved against the current working directory. */
25
+ root: string;
26
+ /** Interface to bind. Defaults to `127.0.0.1` (loopback only). */
27
+ host?: string;
28
+ /** Port to listen on. Defaults to `0` — the OS picks a free port. */
29
+ port?: number;
30
+ /** Filename served for directory requests. Defaults to `index.html`. */
31
+ index?: string;
32
+ /** Render an auto-generated listing when a directory has no index. Defaults to `true`. */
33
+ listing?: boolean;
34
+ /**
35
+ * Single-page-app mode: serve the root `index` for any path that doesn't map
36
+ * to a real file, so client-side routing works. Defaults to `false`.
37
+ */
38
+ spa?: boolean;
39
+ /**
40
+ * Serve dotfiles and dot-directories (`.git`, `.env`, …). Defaults to `false`
41
+ * — they're denied with `404`, since this server is often exposed publicly and
42
+ * such files (git internals, secrets) are rarely meant to be shared. The
43
+ * `.well-known/` directory is always allowed.
44
+ */
45
+ allowDotfiles?: boolean;
46
+ /** Called for each served request (after the response status is known). */
47
+ onRequest?: (info: {
48
+ method: string;
49
+ path: string;
50
+ status: number;
51
+ }) => void;
52
+ }
53
+ export interface StaticServerHandle {
54
+ /** The port the server is actually listening on (resolved even when `port: 0`). */
55
+ port: number;
56
+ /** The host the server is bound to. */
57
+ host: string;
58
+ /** Convenience `http://host:port` origin. */
59
+ url: string;
60
+ /** The underlying Node HTTP server. */
61
+ server: Server;
62
+ /** Stop accepting connections and resolve once fully closed. */
63
+ close(): Promise<void>;
64
+ }
65
+ /**
66
+ * Build the request handler for a static root. Exposed so callers can mount it
67
+ * on an existing server if they prefer; most callers want {@link startStaticServer}.
68
+ */
69
+ export declare function createStaticHandler(options: StaticServerOptions): (req: IncomingMessage, res: ServerResponse) => void;
70
+ /**
71
+ * Create (but do not start) a static HTTP server for `options.root`.
72
+ * Call `.listen()` yourself, or use {@link startStaticServer} to listen and get
73
+ * a resolved {@link StaticServerHandle}.
74
+ */
75
+ export declare function createStaticServer(options: StaticServerOptions): Server;
76
+ /**
77
+ * Start a static server and resolve once it's listening. When `port` is omitted
78
+ * or `0`, the OS assigns a free port and the resolved handle reports it.
79
+ */
80
+ export declare function startStaticServer(options: StaticServerOptions): Promise<StaticServerHandle>;
81
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/server/static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAgB,KAAK,MAAM,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAMjG,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAmJD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,GAC3B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAmFrD;AA+MD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8B3F"}