@onkernel/sdk 0.49.0 → 0.52.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 (99) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/client.d.mts +5 -2
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +5 -2
  5. package/client.d.ts.map +1 -1
  6. package/client.js +26 -2
  7. package/client.js.map +1 -1
  8. package/client.mjs +26 -2
  9. package/client.mjs.map +1 -1
  10. package/index.d.mts +2 -0
  11. package/index.d.mts.map +1 -1
  12. package/index.d.ts +2 -0
  13. package/index.d.ts.map +1 -1
  14. package/index.js +3 -1
  15. package/index.js.map +1 -1
  16. package/index.mjs +1 -0
  17. package/index.mjs.map +1 -1
  18. package/internal/types.d.mts +6 -6
  19. package/internal/types.d.mts.map +1 -1
  20. package/internal/types.d.ts +6 -6
  21. package/internal/types.d.ts.map +1 -1
  22. package/lib/browser-fetch.d.mts +7 -0
  23. package/lib/browser-fetch.d.mts.map +1 -0
  24. package/lib/browser-fetch.d.ts +7 -0
  25. package/lib/browser-fetch.d.ts.map +1 -0
  26. package/lib/browser-fetch.js +128 -0
  27. package/lib/browser-fetch.js.map +1 -0
  28. package/lib/browser-fetch.mjs +125 -0
  29. package/lib/browser-fetch.mjs.map +1 -0
  30. package/lib/browser-routing.d.mts +20 -0
  31. package/lib/browser-routing.d.mts.map +1 -0
  32. package/lib/browser-routing.d.ts +20 -0
  33. package/lib/browser-routing.d.ts.map +1 -0
  34. package/lib/browser-routing.js +246 -0
  35. package/lib/browser-routing.js.map +1 -0
  36. package/lib/browser-routing.mjs +240 -0
  37. package/lib/browser-routing.mjs.map +1 -0
  38. package/lib/join-url.d.mts +2 -0
  39. package/lib/join-url.d.mts.map +1 -0
  40. package/lib/join-url.d.ts +2 -0
  41. package/lib/join-url.d.ts.map +1 -0
  42. package/lib/join-url.js +7 -0
  43. package/lib/join-url.js.map +1 -0
  44. package/lib/join-url.mjs +4 -0
  45. package/lib/join-url.mjs.map +1 -0
  46. package/package.json +11 -1
  47. package/resources/auth/connections.d.mts +31 -2
  48. package/resources/auth/connections.d.mts.map +1 -1
  49. package/resources/auth/connections.d.ts +31 -2
  50. package/resources/auth/connections.d.ts.map +1 -1
  51. package/resources/browsers/browsers.d.mts +72 -1
  52. package/resources/browsers/browsers.d.mts.map +1 -1
  53. package/resources/browsers/browsers.d.ts +72 -1
  54. package/resources/browsers/browsers.d.ts.map +1 -1
  55. package/resources/browsers/browsers.js +23 -0
  56. package/resources/browsers/browsers.js.map +1 -1
  57. package/resources/browsers/browsers.mjs +23 -0
  58. package/resources/browsers/browsers.mjs.map +1 -1
  59. package/resources/browsers/index.d.mts +1 -1
  60. package/resources/browsers/index.d.mts.map +1 -1
  61. package/resources/browsers/index.d.ts +1 -1
  62. package/resources/browsers/index.d.ts.map +1 -1
  63. package/resources/browsers/index.js.map +1 -1
  64. package/resources/browsers/index.mjs.map +1 -1
  65. package/resources/index.d.mts +1 -1
  66. package/resources/index.d.mts.map +1 -1
  67. package/resources/index.d.ts +1 -1
  68. package/resources/index.d.ts.map +1 -1
  69. package/resources/index.js.map +1 -1
  70. package/resources/index.mjs.map +1 -1
  71. package/resources/profiles.d.mts +1 -2
  72. package/resources/profiles.d.mts.map +1 -1
  73. package/resources/profiles.d.ts +1 -2
  74. package/resources/profiles.d.ts.map +1 -1
  75. package/resources/profiles.js +1 -2
  76. package/resources/profiles.js.map +1 -1
  77. package/resources/profiles.mjs +1 -2
  78. package/resources/profiles.mjs.map +1 -1
  79. package/resources/projects/projects.d.mts +2 -2
  80. package/resources/projects/projects.d.ts +2 -2
  81. package/resources/projects/projects.js +2 -2
  82. package/resources/projects/projects.mjs +2 -2
  83. package/src/client.ts +37 -2
  84. package/src/index.ts +2 -0
  85. package/src/internal/types.ts +6 -8
  86. package/src/lib/browser-fetch.ts +180 -0
  87. package/src/lib/browser-routing.ts +329 -0
  88. package/src/lib/join-url.ts +3 -0
  89. package/src/resources/auth/connections.ts +35 -2
  90. package/src/resources/browsers/browsers.ts +85 -0
  91. package/src/resources/browsers/index.ts +2 -0
  92. package/src/resources/index.ts +2 -0
  93. package/src/resources/profiles.ts +1 -2
  94. package/src/resources/projects/projects.ts +2 -2
  95. package/src/version.ts +1 -1
  96. package/version.d.mts +1 -1
  97. package/version.d.ts +1 -1
  98. package/version.js +1 -1
  99. package/version.mjs +1 -1
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrowserRouteCache = void 0;
4
+ exports.browserRoutingSubresourcesFromEnv = browserRoutingSubresourcesFromEnv;
5
+ exports.createRoutingFetch = createRoutingFetch;
6
+ const join_url_1 = require("./join-url.js");
7
+ class BrowserRouteCache {
8
+ constructor() {
9
+ this.entries = new Map();
10
+ }
11
+ get(sessionId) {
12
+ return this.entries.get(sessionId);
13
+ }
14
+ set(route) {
15
+ this.entries.set(route.sessionId, route);
16
+ }
17
+ delete(sessionId) {
18
+ this.entries.delete(sessionId);
19
+ }
20
+ clear() {
21
+ this.entries.clear();
22
+ }
23
+ }
24
+ exports.BrowserRouteCache = BrowserRouteCache;
25
+ const BROWSER_ROUTING_SUBRESOURCES_ENV = 'KERNEL_BROWSER_ROUTING_SUBRESOURCES';
26
+ const DEFAULT_BROWSER_ROUTING_SUBRESOURCES = ['curl'];
27
+ const BROWSER_ROUTE_CACHEABLE_PATH = /^\/(?:v\d+\/)?browsers(?:\/[^/]+)?\/?$/;
28
+ const BROWSER_POOL_ACQUIRE_PATH = /^\/(?:v\d+\/)?browser_pools\/[^/]+\/acquire\/?$/;
29
+ const BROWSER_DELETE_BY_ID_PATH = /^\/(?:v\d+\/)?browsers\/([^/]+)\/?$/;
30
+ const BROWSER_POOL_RELEASE_PATH = /^\/(?:v\d+\/)?browser_pools\/[^/]+\/release\/?$/;
31
+ function browserRoutingSubresourcesFromEnv() {
32
+ const raw = readBrowserRoutingSubresourcesEnv();
33
+ if (raw === undefined) {
34
+ return [...DEFAULT_BROWSER_ROUTING_SUBRESOURCES];
35
+ }
36
+ if (raw.trim() === '') {
37
+ return [];
38
+ }
39
+ return raw
40
+ .split(',')
41
+ .map((value) => value.trim())
42
+ .filter(Boolean);
43
+ }
44
+ function createRoutingFetch(innerFetch, { apiBaseURL, subresources, cache, }) {
45
+ const allowed = new Set([...subresources].map((value) => value.trim()).filter(Boolean));
46
+ const apiOrigin = new URL(apiBaseURL).origin;
47
+ return async (input, init) => {
48
+ const request = new Request(input, init);
49
+ const shouldSniff = shouldSniffAndPopulateCache(request, apiOrigin);
50
+ const response = await routeRequest(innerFetch, { input, init, request }, apiOrigin, allowed, cache);
51
+ if (shouldSniff) {
52
+ await sniffAndPopulateCache(response, cache);
53
+ }
54
+ await maybeEvictBrowserRoute(request, response, apiOrigin, cache);
55
+ return response;
56
+ };
57
+ }
58
+ function shouldSniffAndPopulateCache(request, apiOrigin) {
59
+ const url = new URL(request.url);
60
+ return (url.origin === apiOrigin &&
61
+ (BROWSER_ROUTE_CACHEABLE_PATH.test(url.pathname) || BROWSER_POOL_ACQUIRE_PATH.test(url.pathname)));
62
+ }
63
+ async function maybeEvictBrowserRoute(request, response, apiOrigin, cache) {
64
+ if (!response.ok) {
65
+ return;
66
+ }
67
+ const url = new URL(request.url);
68
+ if (url.origin !== apiOrigin) {
69
+ return;
70
+ }
71
+ const sessionId = deletedSessionIdFromPath(request, url.pathname) ??
72
+ (await releasedSessionIdFromRequest(request, url.pathname));
73
+ if (sessionId) {
74
+ cache.delete(sessionId);
75
+ }
76
+ }
77
+ function deletedSessionIdFromPath(request, pathname) {
78
+ if (request.method.toUpperCase() !== 'DELETE') {
79
+ return undefined;
80
+ }
81
+ const match = pathname.match(BROWSER_DELETE_BY_ID_PATH);
82
+ if (!match) {
83
+ return undefined;
84
+ }
85
+ const sessionId = decodeURIComponent(match[1] ?? '');
86
+ return sessionId || undefined;
87
+ }
88
+ async function releasedSessionIdFromRequest(request, pathname) {
89
+ if (request.method.toUpperCase() !== 'POST' || !BROWSER_POOL_RELEASE_PATH.test(pathname)) {
90
+ return undefined;
91
+ }
92
+ try {
93
+ const body = await request.clone().json();
94
+ if (!body || typeof body !== 'object') {
95
+ return undefined;
96
+ }
97
+ const sessionId = body['session_id'];
98
+ return typeof sessionId === 'string' && sessionId.trim() ? sessionId.trim() : undefined;
99
+ }
100
+ catch {
101
+ return undefined;
102
+ }
103
+ }
104
+ function browserRouteFromValue(value) {
105
+ if (!value || typeof value !== 'object') {
106
+ return undefined;
107
+ }
108
+ const record = value;
109
+ const sessionId = typeof record['session_id'] === 'string' ? record['session_id'].trim() : '';
110
+ const baseURL = typeof record['base_url'] === 'string' ? record['base_url'].trim() : '';
111
+ if (!sessionId || !baseURL) {
112
+ return undefined;
113
+ }
114
+ const explicitJWT = typeof record['jwt'] === 'string' ? record['jwt'].trim() : '';
115
+ const cdpWsURL = typeof record['cdp_ws_url'] === 'string' ? record['cdp_ws_url'] : undefined;
116
+ const jwt = explicitJWT || parseJwtFromCdpWsUrl(cdpWsURL) || '';
117
+ if (!jwt) {
118
+ return undefined;
119
+ }
120
+ return {
121
+ sessionId,
122
+ baseURL,
123
+ jwt,
124
+ };
125
+ }
126
+ async function sniffAndPopulateCache(response, cache) {
127
+ const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
128
+ if (!contentType.includes('application/json')) {
129
+ return;
130
+ }
131
+ try {
132
+ populateCache(await response.clone().json(), cache);
133
+ }
134
+ catch {
135
+ // Ignore malformed JSON in routing cache population.
136
+ }
137
+ }
138
+ function populateCache(value, cache) {
139
+ const route = browserRouteFromValue(value);
140
+ if (route) {
141
+ cache.set(route);
142
+ }
143
+ if (Array.isArray(value)) {
144
+ for (const item of value) {
145
+ populateCache(item, cache);
146
+ }
147
+ return;
148
+ }
149
+ if (!value || typeof value !== 'object') {
150
+ return;
151
+ }
152
+ for (const child of Object.values(value)) {
153
+ if (typeof child === 'object' && child !== null) {
154
+ populateCache(child, cache);
155
+ }
156
+ }
157
+ }
158
+ async function routeRequest(innerFetch, { input, init, request, }, apiOrigin, allowed, cache) {
159
+ const url = new URL(request.url);
160
+ if (url.origin !== apiOrigin) {
161
+ return innerFetch(input, init);
162
+ }
163
+ const match = url.pathname.match(/^\/(?:v\d+\/)?browsers\/([^/]+)\/([^/]+)(\/.*)?$/);
164
+ if (!match) {
165
+ return innerFetch(input, init);
166
+ }
167
+ const sessionId = decodeURIComponent(match[1] ?? '');
168
+ const subresource = match[2] ?? '';
169
+ if (!sessionId || !allowed.has(subresource)) {
170
+ return innerFetch(input, init);
171
+ }
172
+ const route = cache.get(sessionId);
173
+ if (route === undefined) {
174
+ return innerFetch(input, init);
175
+ }
176
+ const target = new URL((0, join_url_1.joinURL)(route.baseURL, `/${subresource}${match[3] ?? ''}`));
177
+ url.searchParams.forEach((value, key) => {
178
+ if (key !== 'jwt') {
179
+ target.searchParams.append(key, value);
180
+ }
181
+ });
182
+ if (!target.searchParams.get('jwt')) {
183
+ target.searchParams.set('jwt', route.jwt);
184
+ }
185
+ const headers = new Headers(request.headers);
186
+ headers.delete('authorization');
187
+ return innerFetch(target.toString(), buildRoutedInit(request, init, headers));
188
+ }
189
+ function buildRoutedInit(request, originalInit, headers) {
190
+ const method = request.method.toUpperCase();
191
+ const routedInit = {
192
+ ...(originalInit ?? {}),
193
+ method,
194
+ headers,
195
+ redirect: request.redirect,
196
+ signal: request.signal,
197
+ };
198
+ delete routedInit['body'];
199
+ delete routedInit['duplex'];
200
+ if (method !== 'GET' && method !== 'HEAD') {
201
+ const body = requestBodyForFetch(request, originalInit);
202
+ if (body !== undefined) {
203
+ routedInit.body = body;
204
+ }
205
+ if (originalInit?.duplex !== undefined) {
206
+ routedInit.duplex = originalInit.duplex;
207
+ }
208
+ else if (requiresHalfDuplex(body)) {
209
+ routedInit.duplex = 'half';
210
+ }
211
+ }
212
+ return routedInit;
213
+ }
214
+ function requestBodyForFetch(request, originalInit) {
215
+ if (originalInit?.body !== undefined && originalInit.body !== null) {
216
+ return originalInit.body;
217
+ }
218
+ return request.body ?? undefined;
219
+ }
220
+ function requiresHalfDuplex(body) {
221
+ return ((globalThis.ReadableStream && body instanceof globalThis.ReadableStream) ||
222
+ (typeof body === 'object' && body !== null && Symbol.asyncIterator in body));
223
+ }
224
+ function parseJwtFromCdpWsUrl(cdpWsUrl) {
225
+ if (!cdpWsUrl) {
226
+ return undefined;
227
+ }
228
+ try {
229
+ return new URL(cdpWsUrl).searchParams.get('jwt') ?? undefined;
230
+ }
231
+ catch {
232
+ return undefined;
233
+ }
234
+ }
235
+ function readBrowserRoutingSubresourcesEnv() {
236
+ if (typeof globalThis.process !== 'undefined') {
237
+ const value = globalThis.process.env?.[BROWSER_ROUTING_SUBRESOURCES_ENV];
238
+ return typeof value === 'string' ? value : undefined;
239
+ }
240
+ if (typeof globalThis.Deno !== 'undefined') {
241
+ const value = globalThis.Deno.env?.get?.(BROWSER_ROUTING_SUBRESOURCES_ENV);
242
+ return typeof value === 'string' ? value : undefined;
243
+ }
244
+ return undefined;
245
+ }
246
+ //# sourceMappingURL=browser-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-routing.js","sourceRoot":"","sources":["../src/lib/browser-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,240 @@
1
+ import { joinURL } from "./join-url.mjs";
2
+ export class BrowserRouteCache {
3
+ constructor() {
4
+ this.entries = new Map();
5
+ }
6
+ get(sessionId) {
7
+ return this.entries.get(sessionId);
8
+ }
9
+ set(route) {
10
+ this.entries.set(route.sessionId, route);
11
+ }
12
+ delete(sessionId) {
13
+ this.entries.delete(sessionId);
14
+ }
15
+ clear() {
16
+ this.entries.clear();
17
+ }
18
+ }
19
+ const BROWSER_ROUTING_SUBRESOURCES_ENV = 'KERNEL_BROWSER_ROUTING_SUBRESOURCES';
20
+ const DEFAULT_BROWSER_ROUTING_SUBRESOURCES = ['curl'];
21
+ const BROWSER_ROUTE_CACHEABLE_PATH = /^\/(?:v\d+\/)?browsers(?:\/[^/]+)?\/?$/;
22
+ const BROWSER_POOL_ACQUIRE_PATH = /^\/(?:v\d+\/)?browser_pools\/[^/]+\/acquire\/?$/;
23
+ const BROWSER_DELETE_BY_ID_PATH = /^\/(?:v\d+\/)?browsers\/([^/]+)\/?$/;
24
+ const BROWSER_POOL_RELEASE_PATH = /^\/(?:v\d+\/)?browser_pools\/[^/]+\/release\/?$/;
25
+ export function browserRoutingSubresourcesFromEnv() {
26
+ const raw = readBrowserRoutingSubresourcesEnv();
27
+ if (raw === undefined) {
28
+ return [...DEFAULT_BROWSER_ROUTING_SUBRESOURCES];
29
+ }
30
+ if (raw.trim() === '') {
31
+ return [];
32
+ }
33
+ return raw
34
+ .split(',')
35
+ .map((value) => value.trim())
36
+ .filter(Boolean);
37
+ }
38
+ export function createRoutingFetch(innerFetch, { apiBaseURL, subresources, cache, }) {
39
+ const allowed = new Set([...subresources].map((value) => value.trim()).filter(Boolean));
40
+ const apiOrigin = new URL(apiBaseURL).origin;
41
+ return async (input, init) => {
42
+ const request = new Request(input, init);
43
+ const shouldSniff = shouldSniffAndPopulateCache(request, apiOrigin);
44
+ const response = await routeRequest(innerFetch, { input, init, request }, apiOrigin, allowed, cache);
45
+ if (shouldSniff) {
46
+ await sniffAndPopulateCache(response, cache);
47
+ }
48
+ await maybeEvictBrowserRoute(request, response, apiOrigin, cache);
49
+ return response;
50
+ };
51
+ }
52
+ function shouldSniffAndPopulateCache(request, apiOrigin) {
53
+ const url = new URL(request.url);
54
+ return (url.origin === apiOrigin &&
55
+ (BROWSER_ROUTE_CACHEABLE_PATH.test(url.pathname) || BROWSER_POOL_ACQUIRE_PATH.test(url.pathname)));
56
+ }
57
+ async function maybeEvictBrowserRoute(request, response, apiOrigin, cache) {
58
+ if (!response.ok) {
59
+ return;
60
+ }
61
+ const url = new URL(request.url);
62
+ if (url.origin !== apiOrigin) {
63
+ return;
64
+ }
65
+ const sessionId = deletedSessionIdFromPath(request, url.pathname) ??
66
+ (await releasedSessionIdFromRequest(request, url.pathname));
67
+ if (sessionId) {
68
+ cache.delete(sessionId);
69
+ }
70
+ }
71
+ function deletedSessionIdFromPath(request, pathname) {
72
+ if (request.method.toUpperCase() !== 'DELETE') {
73
+ return undefined;
74
+ }
75
+ const match = pathname.match(BROWSER_DELETE_BY_ID_PATH);
76
+ if (!match) {
77
+ return undefined;
78
+ }
79
+ const sessionId = decodeURIComponent(match[1] ?? '');
80
+ return sessionId || undefined;
81
+ }
82
+ async function releasedSessionIdFromRequest(request, pathname) {
83
+ if (request.method.toUpperCase() !== 'POST' || !BROWSER_POOL_RELEASE_PATH.test(pathname)) {
84
+ return undefined;
85
+ }
86
+ try {
87
+ const body = await request.clone().json();
88
+ if (!body || typeof body !== 'object') {
89
+ return undefined;
90
+ }
91
+ const sessionId = body['session_id'];
92
+ return typeof sessionId === 'string' && sessionId.trim() ? sessionId.trim() : undefined;
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ }
98
+ function browserRouteFromValue(value) {
99
+ if (!value || typeof value !== 'object') {
100
+ return undefined;
101
+ }
102
+ const record = value;
103
+ const sessionId = typeof record['session_id'] === 'string' ? record['session_id'].trim() : '';
104
+ const baseURL = typeof record['base_url'] === 'string' ? record['base_url'].trim() : '';
105
+ if (!sessionId || !baseURL) {
106
+ return undefined;
107
+ }
108
+ const explicitJWT = typeof record['jwt'] === 'string' ? record['jwt'].trim() : '';
109
+ const cdpWsURL = typeof record['cdp_ws_url'] === 'string' ? record['cdp_ws_url'] : undefined;
110
+ const jwt = explicitJWT || parseJwtFromCdpWsUrl(cdpWsURL) || '';
111
+ if (!jwt) {
112
+ return undefined;
113
+ }
114
+ return {
115
+ sessionId,
116
+ baseURL,
117
+ jwt,
118
+ };
119
+ }
120
+ async function sniffAndPopulateCache(response, cache) {
121
+ const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
122
+ if (!contentType.includes('application/json')) {
123
+ return;
124
+ }
125
+ try {
126
+ populateCache(await response.clone().json(), cache);
127
+ }
128
+ catch {
129
+ // Ignore malformed JSON in routing cache population.
130
+ }
131
+ }
132
+ function populateCache(value, cache) {
133
+ const route = browserRouteFromValue(value);
134
+ if (route) {
135
+ cache.set(route);
136
+ }
137
+ if (Array.isArray(value)) {
138
+ for (const item of value) {
139
+ populateCache(item, cache);
140
+ }
141
+ return;
142
+ }
143
+ if (!value || typeof value !== 'object') {
144
+ return;
145
+ }
146
+ for (const child of Object.values(value)) {
147
+ if (typeof child === 'object' && child !== null) {
148
+ populateCache(child, cache);
149
+ }
150
+ }
151
+ }
152
+ async function routeRequest(innerFetch, { input, init, request, }, apiOrigin, allowed, cache) {
153
+ const url = new URL(request.url);
154
+ if (url.origin !== apiOrigin) {
155
+ return innerFetch(input, init);
156
+ }
157
+ const match = url.pathname.match(/^\/(?:v\d+\/)?browsers\/([^/]+)\/([^/]+)(\/.*)?$/);
158
+ if (!match) {
159
+ return innerFetch(input, init);
160
+ }
161
+ const sessionId = decodeURIComponent(match[1] ?? '');
162
+ const subresource = match[2] ?? '';
163
+ if (!sessionId || !allowed.has(subresource)) {
164
+ return innerFetch(input, init);
165
+ }
166
+ const route = cache.get(sessionId);
167
+ if (route === undefined) {
168
+ return innerFetch(input, init);
169
+ }
170
+ const target = new URL(joinURL(route.baseURL, `/${subresource}${match[3] ?? ''}`));
171
+ url.searchParams.forEach((value, key) => {
172
+ if (key !== 'jwt') {
173
+ target.searchParams.append(key, value);
174
+ }
175
+ });
176
+ if (!target.searchParams.get('jwt')) {
177
+ target.searchParams.set('jwt', route.jwt);
178
+ }
179
+ const headers = new Headers(request.headers);
180
+ headers.delete('authorization');
181
+ return innerFetch(target.toString(), buildRoutedInit(request, init, headers));
182
+ }
183
+ function buildRoutedInit(request, originalInit, headers) {
184
+ const method = request.method.toUpperCase();
185
+ const routedInit = {
186
+ ...(originalInit ?? {}),
187
+ method,
188
+ headers,
189
+ redirect: request.redirect,
190
+ signal: request.signal,
191
+ };
192
+ delete routedInit['body'];
193
+ delete routedInit['duplex'];
194
+ if (method !== 'GET' && method !== 'HEAD') {
195
+ const body = requestBodyForFetch(request, originalInit);
196
+ if (body !== undefined) {
197
+ routedInit.body = body;
198
+ }
199
+ if (originalInit?.duplex !== undefined) {
200
+ routedInit.duplex = originalInit.duplex;
201
+ }
202
+ else if (requiresHalfDuplex(body)) {
203
+ routedInit.duplex = 'half';
204
+ }
205
+ }
206
+ return routedInit;
207
+ }
208
+ function requestBodyForFetch(request, originalInit) {
209
+ if (originalInit?.body !== undefined && originalInit.body !== null) {
210
+ return originalInit.body;
211
+ }
212
+ return request.body ?? undefined;
213
+ }
214
+ function requiresHalfDuplex(body) {
215
+ return ((globalThis.ReadableStream && body instanceof globalThis.ReadableStream) ||
216
+ (typeof body === 'object' && body !== null && Symbol.asyncIterator in body));
217
+ }
218
+ function parseJwtFromCdpWsUrl(cdpWsUrl) {
219
+ if (!cdpWsUrl) {
220
+ return undefined;
221
+ }
222
+ try {
223
+ return new URL(cdpWsUrl).searchParams.get('jwt') ?? undefined;
224
+ }
225
+ catch {
226
+ return undefined;
227
+ }
228
+ }
229
+ function readBrowserRoutingSubresourcesEnv() {
230
+ if (typeof globalThis.process !== 'undefined') {
231
+ const value = globalThis.process.env?.[BROWSER_ROUTING_SUBRESOURCES_ENV];
232
+ return typeof value === 'string' ? value : undefined;
233
+ }
234
+ if (typeof globalThis.Deno !== 'undefined') {
235
+ const value = globalThis.Deno.env?.get?.(BROWSER_ROUTING_SUBRESOURCES_ENV);
236
+ return typeof value === 'string' ? value : undefined;
237
+ }
238
+ return undefined;
239
+ }
240
+ //# sourceMappingURL=browser-routing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-routing.mjs","sourceRoot":"","sources":["../src/lib/browser-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function joinURL(baseURL: string, path: string): string;
2
+ //# sourceMappingURL=join-url.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-url.d.mts","sourceRoot":"","sources":["../src/lib/join-url.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,2 @@
1
+ export declare function joinURL(baseURL: string, path: string): string;
2
+ //# sourceMappingURL=join-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-url.d.ts","sourceRoot":"","sources":["../src/lib/join-url.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.joinURL = joinURL;
4
+ function joinURL(baseURL, path) {
5
+ return `${baseURL.replace(/\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
6
+ }
7
+ //# sourceMappingURL=join-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-url.js","sourceRoot":"","sources":["../src/lib/join-url.ts"],"names":[],"mappings":";;AAAA,0BAEC;AAFD,SAAgB,OAAO,CAAC,OAAe,EAAE,IAAY;IACnD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function joinURL(baseURL, path) {
2
+ return `${baseURL.replace(/\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
3
+ }
4
+ //# sourceMappingURL=join-url.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-url.mjs","sourceRoot":"","sources":["../src/lib/join-url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,IAAY;IACnD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onkernel/sdk",
3
- "version": "0.49.0",
3
+ "version": "0.52.0",
4
4
  "description": "The official TypeScript library for the Kernel API",
5
5
  "author": "Kernel <>",
6
6
  "types": "./index.d.ts",
@@ -95,6 +95,16 @@
95
95
  "./index.mjs": {
96
96
  "default": "./index.mjs"
97
97
  },
98
+ "./lib/*.mjs": {
99
+ "default": "./lib/*.mjs"
100
+ },
101
+ "./lib/*.js": {
102
+ "default": "./lib/*.js"
103
+ },
104
+ "./lib/*": {
105
+ "import": "./lib/*.mjs",
106
+ "require": "./lib/*.js"
107
+ },
98
108
  "./pagination": {
99
109
  "import": "./pagination.mjs",
100
110
  "require": "./pagination.js"
@@ -184,6 +184,12 @@ export interface ManagedAuth {
184
184
  * - Ping Identity: _.pingone.com, _.pingidentity.com
185
185
  */
186
186
  allowed_domains?: Array<string>;
187
+ /**
188
+ * ID of the underlying browser session driving the current flow (present when flow
189
+ * in progress). Use this to inspect or terminate the browser session via the
190
+ * `/browsers` API.
191
+ */
192
+ browser_session_id?: string | null;
187
193
  /**
188
194
  * Whether automatic re-authentication is possible (has credential, selectors, and
189
195
  * login_url)
@@ -219,7 +225,10 @@ export interface ManagedAuth {
219
225
  */
220
226
  external_action_message?: string | null;
221
227
  /**
222
- * When the current flow expires (null when no flow in progress)
228
+ * When the current flow expires (null when no flow in progress). A flow past this
229
+ * timestamp is no longer valid and its `flow_status` will be `EXPIRED`. Clients
230
+ * may start a new login to supersede a stale `IN_PROGRESS` flow past this
231
+ * timestamp.
223
232
  */
224
233
  flow_expires_at?: string | null;
225
234
  /**
@@ -247,9 +256,19 @@ export interface ManagedAuth {
247
256
  */
248
257
  hosted_url?: string | null;
249
258
  /**
250
- * When the profile was last successfully authenticated
259
+ * @deprecated Deprecated alias for `last_auth_check_at`. Despite the name, this is
260
+ * the last health-check timestamp, not the last successful authentication. Use
261
+ * `last_auth_check_at` instead.
251
262
  */
252
263
  last_auth_at?: string;
264
+ /**
265
+ * When the most recent auth health check ran for this connection, regardless of
266
+ * outcome. Updated on every health check and does not by itself indicate that the
267
+ * profile is currently authenticated - use `status` for that. May be newer than
268
+ * `flow_expires_at` when a flow is still in progress because health checks
269
+ * continue to run in parallel.
270
+ */
271
+ last_auth_check_at?: string;
253
272
  /**
254
273
  * Browser live view URL for debugging (present when flow in progress)
255
274
  */
@@ -336,6 +355,11 @@ export declare namespace ManagedAuth {
336
355
  * Field type
337
356
  */
338
357
  type: 'text' | 'email' | 'password' | 'tel' | 'number' | 'url' | 'code' | 'totp';
358
+ /**
359
+ * Contextual help text near the field that tells the user what to enter (e.g.,
360
+ * "Enter the phone ending in (**_) _**-\*\*92")
361
+ */
362
+ hint?: string;
339
363
  /**
340
364
  * If this field is associated with an MFA option, the type of that option (e.g.,
341
365
  * password field linked to "Enter password" option)
@@ -726,6 +750,11 @@ export declare namespace ConnectionFollowResponse {
726
750
  * Field type
727
751
  */
728
752
  type: 'text' | 'email' | 'password' | 'tel' | 'number' | 'url' | 'code' | 'totp';
753
+ /**
754
+ * Contextual help text near the field that tells the user what to enter (e.g.,
755
+ * "Enter the phone ending in (**_) _**-\*\*92")
756
+ */
757
+ hint?: string;
729
758
  /**
730
759
  * If this field is associated with an MFA option, the type of that option (e.g.,
731
760
  * password field linked to "Enter password" option)