feat: harden remote serve and reuse connections
Testing / remote-protocol-compat (0.9.5) (push) Successful in 56s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 59s
Testing / test (push) Successful in 1m1s
Build & Publish Package / publish (push) Successful in 33s
Package Extension / package-extension (push) Successful in 36s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 56s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 59s
Testing / test (push) Successful in 1m1s
Build & Publish Package / publish (push) Successful in 33s
Package Extension / package-extension (push) Successful in 36s
- Gate TCP serve commands with safe-by-default policies, per-key allow tokens, per-key rate limiting, and audit labels. - Reuse authenticated encrypted remote sessions and parallelize/caches multi-browser fanout to reduce repeated handshake roundtrips. - Increase paged native-host batch size with extension-side byte budgeting to speed large tab listings safely. - Point install output at public Chrome Web Store / Firefox AMO listings by default, with --dev preserving unpacked workflows. - Share search-engine metadata between CLI and SDK and bump the package/extension version to 0.16.0. - Cover the new security, pooling, paging, install, and fanout behavior with expanded Python and extension tests.
This commit is contained in:
@@ -17,17 +17,33 @@ function isCommandSpec(entry: CommandEntry): entry is CommandSpec {
|
||||
return typeof entry !== "function";
|
||||
}
|
||||
|
||||
// Fill each page up to a byte budget kept safely under the 1MB native-messaging
|
||||
// limit (extension → host). This makes paging adaptive: many small items pack
|
||||
// into one page, while a few oversized items (e.g. data-URI favicons) split
|
||||
// across pages instead of overflowing the limit.
|
||||
const PAGE_BYTE_BUDGET = 768 * 1024;
|
||||
|
||||
export function makePagedData(items: Serializable[], page: PageRequest) {
|
||||
const total = items.length;
|
||||
const offset = Math.max(0, Number(page.offset) || 0);
|
||||
const requestedLimit = Math.max(1, Number(page.limit) || 100);
|
||||
const limit = Math.min(requestedLimit, 1000);
|
||||
const end = Math.min(offset + limit, total);
|
||||
const maxCount = Math.min(requestedLimit, 1000);
|
||||
|
||||
let end = offset;
|
||||
let bytes = 0;
|
||||
while (end < total && end - offset < maxCount) {
|
||||
const itemBytes = JSON.stringify(items[end]).length + 1; // +1 ≈ separator
|
||||
// Always include at least one item so a single oversized item still advances.
|
||||
if (end > offset && bytes + itemBytes > PAGE_BYTE_BUDGET) break;
|
||||
bytes += itemBytes;
|
||||
end++;
|
||||
}
|
||||
|
||||
return {
|
||||
__browserCliPage: true,
|
||||
items: items.slice(offset, end),
|
||||
offset,
|
||||
limit,
|
||||
limit: maxCount,
|
||||
total,
|
||||
nextOffset: end < total ? end : null,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user