@the-open-engine/zeroshot 6.29.0 → 6.30.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.
- package/CHANGELOG.md +4 -0
- package/cli/index.js +2 -4
- package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/codex.js +0 -1
- package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
- package/lib/agent-cli-provider/contract-actions.d.ts +1 -1
- package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-actions.js +5 -5
- package/lib/agent-cli-provider/contract-actions.js.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts +1 -1
- package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-invoke.js +2 -2
- package/lib/agent-cli-provider/contract-invoke.js.map +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts +1 -1
- package/lib/agent-cli-provider/contract-support.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract-support.js +2 -2
- package/lib/agent-cli-provider/contract-support.js.map +1 -1
- package/lib/agent-cli-provider/contract.d.ts +1 -0
- package/lib/agent-cli-provider/contract.d.ts.map +1 -1
- package/lib/agent-cli-provider/contract.js +1 -1
- package/lib/agent-cli-provider/contract.js.map +1 -1
- package/lib/agent-cli-provider/index.d.ts +1 -1
- package/lib/agent-cli-provider/index.d.ts.map +1 -1
- package/lib/agent-cli-provider/index.js +2 -1
- package/lib/agent-cli-provider/index.js.map +1 -1
- package/lib/agent-cli-provider/provider-registry.d.ts +1 -0
- package/lib/agent-cli-provider/provider-registry.d.ts.map +1 -1
- package/lib/agent-cli-provider/provider-registry.js +4 -0
- package/lib/agent-cli-provider/provider-registry.js.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.d.ts +3 -3
- package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -1
- package/lib/agent-cli-provider/single-agent-runtime.js +22 -48
- package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -1
- package/lib/cluster/client.cjs +30 -7
- package/lib/cluster/client.d.cts +52 -0
- package/lib/cluster/client.d.mts +52 -0
- package/lib/cluster/client.d.ts +4 -6
- package/lib/cluster/client.mjs +32 -9
- package/lib/cluster/connection-state.cjs +25 -0
- package/lib/cluster/connection-state.d.cts +13 -0
- package/lib/cluster/connection-state.d.mts +13 -0
- package/lib/cluster/connection-state.d.ts +13 -0
- package/lib/cluster/connection-state.mjs +21 -0
- package/lib/{target/hosted-run/contracts.js → cluster/connection-types.cjs} +0 -1
- package/lib/cluster/connection-types.d.cts +33 -0
- package/lib/cluster/connection-types.d.mts +33 -0
- package/lib/cluster/connection-types.d.ts +33 -0
- package/lib/cluster/connection-types.mjs +1 -0
- package/lib/cluster/connection.cjs +18 -46
- package/lib/cluster/connection.d.cts +26 -0
- package/lib/cluster/connection.d.mts +26 -0
- package/lib/cluster/connection.d.ts +7 -25
- package/lib/cluster/connection.mjs +12 -42
- package/lib/cluster/errors.cjs +9 -1
- package/lib/cluster/errors.d.cts +29 -0
- package/lib/cluster/errors.d.mts +29 -0
- package/lib/cluster/errors.d.ts +4 -0
- package/lib/cluster/errors.mjs +7 -0
- package/lib/cluster/frames.d.cts +12 -0
- package/lib/cluster/frames.d.mts +12 -0
- package/lib/cluster/generated/protocol-schema.d.cts +1 -0
- package/lib/cluster/generated/protocol-schema.d.mts +1 -0
- package/lib/cluster/generated/protocol.d.cts +781 -0
- package/lib/cluster/generated/protocol.d.mts +781 -0
- package/lib/cluster/index.cjs +2 -2
- package/lib/cluster/index.d.cts +13 -0
- package/lib/cluster/index.d.mts +13 -0
- package/lib/cluster/index.d.ts +3 -3
- package/lib/cluster/index.mjs +2 -2
- package/lib/cluster/json-source.cjs +1 -0
- package/lib/cluster/json-source.d.cts +5 -0
- package/lib/cluster/json-source.d.mts +5 -0
- package/lib/cluster/json-source.d.ts +1 -0
- package/lib/cluster/json-source.mjs +1 -0
- package/lib/cluster/payload-value.cjs +1 -0
- package/lib/cluster/payload-value.d.cts +8 -0
- package/lib/cluster/payload-value.d.mts +8 -0
- package/lib/cluster/payload-value.d.ts +1 -0
- package/lib/cluster/payload-value.mjs +1 -0
- package/lib/cluster/queue.d.cts +15 -0
- package/lib/cluster/queue.d.mts +15 -0
- package/lib/cluster/socket.cjs +8 -0
- package/lib/cluster/socket.d.cts +13 -0
- package/lib/cluster/socket.d.mts +13 -0
- package/lib/cluster/socket.d.ts +2 -0
- package/lib/cluster/socket.mjs +7 -0
- package/lib/cluster/subscriptions.d.cts +73 -0
- package/lib/cluster/subscriptions.d.mts +73 -0
- package/lib/cluster/subscriptions.d.ts +5 -1
- package/lib/cluster/validators.cjs +1 -0
- package/lib/cluster/validators.d.cts +7 -0
- package/lib/cluster/validators.d.mts +7 -0
- package/lib/cluster/validators.d.ts +1 -0
- package/lib/cluster/validators.mjs +1 -0
- package/lib/cluster-worker/engine-adapter-common.js +37 -0
- package/lib/cluster-worker/engine-adapter.js +24 -30
- package/lib/cluster-worker/engine-start.js +59 -0
- package/lib/cluster-worker/index.js +49 -67
- package/lib/cluster-worker/profiles.js +1 -42
- package/lib/cluster-worker/runtime-dependencies.js +49 -0
- package/lib/cluster-worker/runtime-support.js +2 -34
- package/lib/cluster-worker/terminal-normalizer.js +9 -10
- package/lib/hosted-session/authority.cjs +61 -0
- package/lib/hosted-session/authority.d.cts +3 -0
- package/lib/hosted-session/authority.d.mts +3 -0
- package/lib/hosted-session/authority.d.ts +3 -0
- package/lib/hosted-session/authority.mjs +57 -0
- package/lib/hosted-session/coordinator.cjs +78 -51
- package/lib/hosted-session/coordinator.d.cts +11 -0
- package/lib/hosted-session/coordinator.d.mts +11 -0
- package/lib/hosted-session/coordinator.d.ts +4 -2
- package/lib/hosted-session/coordinator.mjs +75 -51
- package/lib/hosted-session/errors.cjs +25 -0
- package/lib/hosted-session/errors.d.cts +10 -0
- package/lib/hosted-session/errors.d.mts +10 -0
- package/lib/hosted-session/errors.d.ts +10 -0
- package/lib/hosted-session/errors.mjs +19 -0
- package/lib/hosted-session/index.cjs +4 -1
- package/lib/hosted-session/index.d.cts +2 -0
- package/lib/hosted-session/index.d.mts +2 -0
- package/lib/hosted-session/index.d.ts +2 -2
- package/lib/hosted-session/index.mjs +1 -1
- package/lib/hosted-session/reconnecting-watch.cjs +131 -0
- package/lib/hosted-session/reconnecting-watch.d.cts +13 -0
- package/lib/hosted-session/reconnecting-watch.d.mts +13 -0
- package/lib/hosted-session/reconnecting-watch.d.ts +13 -0
- package/lib/hosted-session/reconnecting-watch.mjs +127 -0
- package/lib/hosted-session/types.d.cts +32 -0
- package/lib/hosted-session/types.d.mts +32 -0
- package/lib/hosted-session/types.d.ts +19 -7
- package/lib/hosted-target/access-url.cjs +44 -0
- package/lib/hosted-target/access-url.d.cts +2 -0
- package/lib/hosted-target/access-url.d.mts +2 -0
- package/lib/hosted-target/access-url.d.ts +2 -0
- package/lib/hosted-target/access-url.mjs +41 -0
- package/lib/hosted-target/adapter-request.cjs +12 -0
- package/lib/hosted-target/adapter-request.d.cts +17 -0
- package/lib/hosted-target/adapter-request.d.mts +17 -0
- package/lib/hosted-target/adapter-request.d.ts +17 -0
- package/lib/hosted-target/adapter-request.mjs +9 -0
- package/lib/hosted-target/adapter-types.cjs +2 -0
- package/lib/hosted-target/adapter-types.d.cts +27 -0
- package/lib/hosted-target/adapter-types.d.mts +27 -0
- package/lib/hosted-target/adapter-types.d.ts +27 -0
- package/lib/hosted-target/adapter-types.mjs +1 -0
- package/lib/hosted-target/bounds.cjs +10 -0
- package/lib/hosted-target/bounds.d.cts +7 -0
- package/lib/hosted-target/bounds.d.mts +7 -0
- package/lib/hosted-target/bounds.d.ts +7 -0
- package/lib/hosted-target/bounds.mjs +7 -0
- package/lib/hosted-target/capsule-error-response.cjs +76 -0
- package/lib/hosted-target/capsule-error-response.d.cts +2 -0
- package/lib/hosted-target/capsule-error-response.d.mts +2 -0
- package/lib/hosted-target/capsule-error-response.d.ts +2 -0
- package/lib/hosted-target/capsule-error-response.mjs +73 -0
- package/lib/hosted-target/errors.cjs +88 -0
- package/lib/hosted-target/errors.d.cts +36 -0
- package/lib/hosted-target/errors.d.mts +36 -0
- package/lib/hosted-target/errors.d.ts +36 -0
- package/lib/hosted-target/errors.mjs +75 -0
- package/lib/hosted-target/index.cjs +16 -0
- package/lib/hosted-target/index.d.cts +3 -0
- package/lib/hosted-target/index.d.mts +3 -0
- package/lib/hosted-target/index.d.ts +3 -0
- package/lib/hosted-target/index.mjs +2 -0
- package/lib/hosted-target/response-validation.cjs +169 -0
- package/lib/hosted-target/response-validation.d.cts +5 -0
- package/lib/hosted-target/response-validation.d.mts +5 -0
- package/lib/hosted-target/response-validation.d.ts +5 -0
- package/lib/hosted-target/response-validation.mjs +163 -0
- package/lib/hosted-target/retry-executor.cjs +51 -0
- package/lib/hosted-target/retry-executor.d.cts +8 -0
- package/lib/hosted-target/retry-executor.d.mts +8 -0
- package/lib/hosted-target/retry-executor.d.ts +8 -0
- package/lib/hosted-target/retry-executor.mjs +48 -0
- package/lib/hosted-target/retry.cjs +78 -0
- package/lib/hosted-target/retry.d.cts +9 -0
- package/lib/hosted-target/retry.d.mts +9 -0
- package/lib/hosted-target/retry.d.ts +9 -0
- package/lib/hosted-target/retry.mjs +73 -0
- package/lib/hosted-target/target-adapter.cjs +10 -0
- package/lib/hosted-target/target-adapter.d.cts +3 -0
- package/lib/hosted-target/target-adapter.d.mts +3 -0
- package/lib/hosted-target/target-adapter.d.ts +3 -0
- package/lib/hosted-target/target-adapter.mjs +7 -0
- package/lib/hosted-target/types.cjs +4 -0
- package/lib/hosted-target/types.d.cts +50 -0
- package/lib/hosted-target/types.d.mts +50 -0
- package/lib/hosted-target/types.d.ts +50 -0
- package/lib/hosted-target/types.mjs +1 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.cjs +185 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.cts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.mts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.d.ts +13 -0
- package/lib/hosted-target/zero-cloud-v1-adapter.mjs +181 -0
- package/lib/start-cluster.js +3 -3
- package/lib/target/bounded-response.cjs +51 -0
- package/lib/target/bounded-response.d.cts +1 -0
- package/lib/target/bounded-response.d.mts +1 -0
- package/lib/target/bounded-response.d.ts +1 -0
- package/lib/target/bounded-response.js +51 -0
- package/lib/target/bounded-response.mjs +48 -0
- package/lib/target/credential-lock.js +1 -3
- package/lib/target/credential-store.js +9 -4
- package/lib/target/device-flow.cjs +213 -0
- package/lib/target/device-flow.d.cts +54 -0
- package/lib/target/device-flow.d.mts +54 -0
- package/lib/target/device-flow.d.ts +26 -14
- package/lib/target/device-flow.js +162 -58
- package/lib/target/device-flow.mjs +203 -0
- package/lib/target/discovery-errors.cjs +10 -0
- package/lib/target/discovery-errors.d.cts +3 -0
- package/lib/target/discovery-errors.d.mts +3 -0
- package/lib/target/discovery-errors.d.ts +3 -0
- package/lib/target/discovery-errors.js +10 -0
- package/lib/target/discovery-errors.mjs +6 -0
- package/lib/target/discovery-sections.cjs +191 -0
- package/lib/target/discovery-sections.d.cts +52 -0
- package/lib/target/discovery-sections.d.mts +52 -0
- package/lib/target/discovery-sections.d.ts +52 -0
- package/lib/target/discovery-sections.js +191 -0
- package/lib/target/discovery-sections.mjs +179 -0
- package/lib/target/discovery-validation.cjs +109 -0
- package/lib/target/discovery-validation.d.cts +28 -0
- package/lib/target/discovery-validation.d.mts +28 -0
- package/lib/target/discovery-validation.d.ts +28 -0
- package/lib/target/discovery-validation.js +109 -0
- package/lib/target/discovery-validation.mjs +99 -0
- package/lib/target/discovery.cjs +112 -0
- package/lib/target/discovery.d.cts +74 -0
- package/lib/target/discovery.d.mts +74 -0
- package/lib/target/discovery.d.ts +67 -5
- package/lib/target/discovery.js +94 -79
- package/lib/target/discovery.mjs +105 -0
- package/lib/target/index.d.ts +6 -6
- package/lib/target/index.js +36 -36
- package/lib/target/oauth-http.d.ts +2 -0
- package/lib/target/oauth-http.js +25 -0
- package/lib/target/refresh-exchange.d.ts +11 -0
- package/lib/target/refresh-exchange.js +24 -0
- package/lib/target/refresh-revocation.d.ts +8 -0
- package/lib/target/refresh-revocation.js +19 -0
- package/lib/target/route-template.cjs +85 -0
- package/lib/target/route-template.d.cts +7 -0
- package/lib/target/route-template.d.mts +7 -0
- package/lib/target/route-template.d.ts +7 -0
- package/lib/target/route-template.js +85 -0
- package/lib/target/route-template.mjs +81 -0
- package/lib/target/session-errors.d.ts +4 -0
- package/lib/target/session-errors.js +12 -0
- package/lib/target/session-verification.d.ts +10 -0
- package/lib/target/session-verification.js +42 -0
- package/lib/target/target-registry.d.ts +7 -3
- package/lib/target/target-registry.js +41 -10
- package/lib/target/target-session-manager.d.ts +48 -0
- package/lib/target/target-session-manager.js +226 -0
- package/lib/target/target-session.d.ts +39 -32
- package/lib/target/target-session.js +63 -151
- package/lib/target/token-response.cjs +51 -0
- package/lib/target/token-response.d.cts +7 -0
- package/lib/target/token-response.d.mts +7 -0
- package/lib/target/token-response.d.ts +7 -0
- package/lib/target/token-response.js +51 -0
- package/lib/target/token-response.mjs +48 -0
- package/package.json +14 -7
- package/protocol/openengine-cluster/v1/worker.schema.json +171 -9
- package/scripts/build-cluster.js +23 -3
- package/scripts/opcore-introduced-check.js +0 -2
- package/src/agent-cli-provider/adapters/codex.ts +0 -1
- package/src/agent-cli-provider/contract-actions.ts +9 -5
- package/src/agent-cli-provider/contract-invoke.ts +3 -2
- package/src/agent-cli-provider/contract-support.ts +12 -6
- package/src/agent-cli-provider/contract.ts +6 -1
- package/src/agent-cli-provider/index.ts +1 -0
- package/src/agent-cli-provider/provider-registry.ts +4 -0
- package/src/agent-cli-provider/single-agent-runtime.ts +32 -45
- package/src/cluster/client.ts +42 -15
- package/src/cluster/connection-state.ts +33 -0
- package/src/cluster/connection-types.ts +28 -0
- package/src/cluster/connection.ts +37 -68
- package/src/cluster/errors.ts +5 -0
- package/src/cluster/index.ts +3 -1
- package/src/cluster/json-source.ts +1 -0
- package/src/cluster/payload-value.ts +1 -0
- package/src/cluster/socket.ts +13 -0
- package/src/cluster/subscriptions.ts +7 -2
- package/src/cluster/validators.ts +1 -0
- package/src/cluster/ws.d.ts +1 -1
- package/src/hosted-session/authority.ts +77 -0
- package/src/hosted-session/coordinator.ts +113 -56
- package/src/hosted-session/errors.ts +21 -0
- package/src/hosted-session/index.ts +14 -2
- package/src/hosted-session/reconnecting-watch.ts +148 -0
- package/src/hosted-session/types.ts +22 -8
- package/src/hosted-target/access-url.ts +46 -0
- package/src/hosted-target/adapter-request.ts +28 -0
- package/src/hosted-target/adapter-types.ts +39 -0
- package/src/hosted-target/bounds.ts +1 -0
- package/src/hosted-target/capsule-error-response.ts +107 -0
- package/src/hosted-target/errors.ts +36 -35
- package/src/hosted-target/index.ts +10 -23
- package/src/hosted-target/response-validation.ts +170 -62
- package/src/hosted-target/retry-executor.ts +62 -0
- package/src/hosted-target/retry.ts +47 -11
- package/src/hosted-target/target-adapter.ts +12 -8
- package/src/hosted-target/types.ts +19 -18
- package/src/hosted-target/zero-cloud-v1-adapter.ts +229 -316
- package/src/isolation-manager.js +1 -16
- package/src/target/bounded-response.ts +68 -0
- package/src/target/credential-lock.ts +1 -3
- package/src/target/credential-store.ts +14 -10
- package/src/target/device-flow.ts +209 -85
- package/src/target/discovery-errors.ts +6 -0
- package/src/target/discovery-sections.ts +251 -0
- package/src/target/discovery-validation.ts +144 -0
- package/src/target/discovery.ts +163 -97
- package/src/target/index.ts +15 -11
- package/src/target/oauth-http.ts +27 -0
- package/src/target/refresh-exchange.ts +36 -0
- package/src/target/refresh-revocation.ts +29 -0
- package/src/target/route-template.ts +105 -0
- package/src/target/session-errors.ts +9 -0
- package/src/target/session-verification.ts +51 -0
- package/src/target/target-registry.ts +60 -27
- package/src/target/target-session-manager.ts +285 -0
- package/src/target/target-session.ts +105 -226
- package/src/target/token-response.ts +62 -0
- package/docker/zeroshot-oecp/Cargo.toml +0 -12
- package/docker/zeroshot-oecp/Dockerfile +0 -65
- package/docker/zeroshot-oecp/src/main.rs +0 -32
- package/lib/target/bounded-json.d.ts +0 -6
- package/lib/target/bounded-json.js +0 -43
- package/lib/target/hosted-run/client.d.ts +0 -26
- package/lib/target/hosted-run/client.js +0 -158
- package/lib/target/hosted-run/commands.d.ts +0 -4
- package/lib/target/hosted-run/commands.js +0 -113
- package/lib/target/hosted-run/contracts.d.ts +0 -49
- package/lib/target/hosted-run/input.d.ts +0 -5
- package/lib/target/hosted-run/input.js +0 -200
- package/lib/target/hosted-run.d.ts +0 -4
- package/lib/target/hosted-run.js +0 -12
- package/src/target/bounded-json.ts +0 -48
- package/src/target/hosted-run/client.ts +0 -198
- package/src/target/hosted-run/commands.ts +0 -140
- package/src/target/hosted-run/contracts.ts +0 -53
- package/src/target/hosted-run/input.ts +0 -199
- package/src/target/hosted-run.ts +0 -8
|
@@ -1,8 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnboundSessionError = exports.DeviceFlowExpiredError = exports.DeviceFlowDeniedError = void 0;
|
|
3
|
+
exports.UnboundSessionError = exports.DeviceFlowExpiredError = exports.DeviceFlowDeniedError = exports.parseTokenResponse = void 0;
|
|
4
|
+
exports.oauthFormRequest = oauthFormRequest;
|
|
4
5
|
exports.requestDeviceCode = requestDeviceCode;
|
|
5
6
|
exports.pollForToken = pollForToken;
|
|
7
|
+
const bounded_response_js_1 = require("./bounded-response.js");
|
|
8
|
+
const token_response_js_1 = require("./token-response.js");
|
|
9
|
+
var token_response_js_2 = require("./token-response.js");
|
|
10
|
+
Object.defineProperty(exports, "parseTokenResponse", { enumerable: true, get: function () { return token_response_js_2.parseTokenResponse; } });
|
|
11
|
+
function exchangeFields(exchange) {
|
|
12
|
+
if (exchange === undefined)
|
|
13
|
+
return {};
|
|
14
|
+
if ('grantType' in exchange) {
|
|
15
|
+
return {
|
|
16
|
+
grant_type: exchange.grantType,
|
|
17
|
+
device_token: exchange.deviceToken,
|
|
18
|
+
device_label: exchange.deviceLabel,
|
|
19
|
+
audience: exchange.audience,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
device_token: exchange.token,
|
|
24
|
+
device_label: exchange.label,
|
|
25
|
+
audience: 'admin',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
6
28
|
class DeviceFlowDeniedError extends Error {
|
|
7
29
|
constructor() {
|
|
8
30
|
super('Device authorization denied by user');
|
|
@@ -27,6 +49,104 @@ class UnboundSessionError extends Error {
|
|
|
27
49
|
}
|
|
28
50
|
exports.UnboundSessionError = UnboundSessionError;
|
|
29
51
|
const DEFAULT_CLOCK = { now: () => Date.now() };
|
|
52
|
+
const MAX_OAUTH_RESPONSE_BYTES = 64 * 1024;
|
|
53
|
+
const MAX_DEVICE_CODE_BYTES = 16 * 1024;
|
|
54
|
+
const LOOPBACK_HOSTS = Object.freeze({
|
|
55
|
+
'127.0.0.1': true,
|
|
56
|
+
'::1': true,
|
|
57
|
+
'[::1]': true,
|
|
58
|
+
});
|
|
59
|
+
const MAX_URI_BYTES = 4 * 1024;
|
|
60
|
+
function oauthFormRequest(body, signal) {
|
|
61
|
+
const init = {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
64
|
+
body: body.toString(),
|
|
65
|
+
redirect: 'error',
|
|
66
|
+
};
|
|
67
|
+
if (signal !== undefined)
|
|
68
|
+
init.signal = signal;
|
|
69
|
+
return init;
|
|
70
|
+
}
|
|
71
|
+
async function requireResponseRoute(response, expectedUrl) {
|
|
72
|
+
if (!response.url || new URL(response.url).href === expectedUrl)
|
|
73
|
+
return;
|
|
74
|
+
await response.body?.cancel().catch(() => undefined);
|
|
75
|
+
throw new Error('OAuth response changed target route or authority');
|
|
76
|
+
}
|
|
77
|
+
async function readBoundedJson(response) {
|
|
78
|
+
return (0, bounded_response_js_1.readBoundedResponseJson)(response, MAX_OAUTH_RESPONSE_BYTES, (kind) => new Error(kind === 'size' ? 'OAuth response exceeds the size limit' : 'OAuth response is malformed'));
|
|
79
|
+
}
|
|
80
|
+
function boundedString(value, maxBytes) {
|
|
81
|
+
return (typeof value === 'string' &&
|
|
82
|
+
value.length > 0 &&
|
|
83
|
+
new TextEncoder().encode(value).byteLength <= maxBytes);
|
|
84
|
+
}
|
|
85
|
+
function safeVerificationAuthority(url, allowQuery) {
|
|
86
|
+
const literalLoopback = LOOPBACK_HOSTS[url.hostname] === true;
|
|
87
|
+
return !url.username && !url.password && !url.hash &&
|
|
88
|
+
(allowQuery || !url.search) &&
|
|
89
|
+
(url.protocol === 'https:' || (url.protocol === 'http:' && literalLoopback));
|
|
90
|
+
}
|
|
91
|
+
function verificationUrl(value, allowQuery) {
|
|
92
|
+
if (!boundedString(value, MAX_URI_BYTES) ||
|
|
93
|
+
/[\u0000-\u0020\u007f]|\s/u.test(value)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const url = new URL(value);
|
|
98
|
+
return url.href === value && safeVerificationAuthority(url, allowQuery);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function deviceFieldsValid(device) {
|
|
105
|
+
const fields = Object.keys(device);
|
|
106
|
+
const required = ['device_code', 'user_code', 'verification_uri', 'expires_in', 'interval'];
|
|
107
|
+
return fields.every((field) => required.includes(field) || field === 'verification_uri_complete') && required.every((field) => field in device);
|
|
108
|
+
}
|
|
109
|
+
function deviceStringsValid(device) {
|
|
110
|
+
return boundedString(device.device_code, MAX_DEVICE_CODE_BYTES) &&
|
|
111
|
+
boundedString(device.user_code, 256) &&
|
|
112
|
+
verificationUrl(device.verification_uri, false) &&
|
|
113
|
+
(device.verification_uri_complete === undefined ||
|
|
114
|
+
verificationUrl(device.verification_uri_complete, true));
|
|
115
|
+
}
|
|
116
|
+
function deviceTimingValid(device) {
|
|
117
|
+
return Number.isSafeInteger(device.expires_in) &&
|
|
118
|
+
device.expires_in >= 1 &&
|
|
119
|
+
device.expires_in <= 86_400 &&
|
|
120
|
+
Number.isSafeInteger(device.interval) &&
|
|
121
|
+
device.interval >= 0 &&
|
|
122
|
+
device.interval <= 300;
|
|
123
|
+
}
|
|
124
|
+
function browserAuthorityMatches(device) {
|
|
125
|
+
return device.verification_uri_complete === undefined ||
|
|
126
|
+
new URL(device.verification_uri_complete).origin ===
|
|
127
|
+
new URL(device.verification_uri).origin;
|
|
128
|
+
}
|
|
129
|
+
function parseDeviceCodeResponse(value) {
|
|
130
|
+
const device = object(value, 'Device code');
|
|
131
|
+
if (!deviceFieldsValid(device) || !deviceStringsValid(device) ||
|
|
132
|
+
!deviceTimingValid(device) || !browserAuthorityMatches(device)) {
|
|
133
|
+
throw new Error('Device code response is malformed');
|
|
134
|
+
}
|
|
135
|
+
return Object.freeze(device);
|
|
136
|
+
}
|
|
137
|
+
function parseOAuthError(value) {
|
|
138
|
+
const error = object(value, 'OAuth error');
|
|
139
|
+
if (Object.keys(error).length !== 1 || typeof error.error !== 'string') {
|
|
140
|
+
throw new Error('OAuth error response is malformed');
|
|
141
|
+
}
|
|
142
|
+
return error.error;
|
|
143
|
+
}
|
|
144
|
+
function object(value, field) {
|
|
145
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
146
|
+
throw new Error(`${field} response is malformed`);
|
|
147
|
+
}
|
|
148
|
+
return value;
|
|
149
|
+
}
|
|
30
150
|
function sleep(ms, signal) {
|
|
31
151
|
return new Promise((resolve, reject) => {
|
|
32
152
|
if (signal?.aborted) {
|
|
@@ -41,69 +161,53 @@ function sleep(ms, signal) {
|
|
|
41
161
|
});
|
|
42
162
|
}
|
|
43
163
|
async function requestDeviceCode(deviceAuthorizationEndpoint, clientId, http, signal) {
|
|
44
|
-
const body = new URLSearchParams({
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
48
|
-
const init = {
|
|
49
|
-
method: 'POST',
|
|
50
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
51
|
-
body: body.toString(),
|
|
52
|
-
redirect: 'error',
|
|
53
|
-
};
|
|
54
|
-
if (signal)
|
|
55
|
-
init.signal = signal;
|
|
56
|
-
const response = await http.fetch(deviceAuthorizationEndpoint, init);
|
|
164
|
+
const body = new URLSearchParams({ client_id: clientId });
|
|
165
|
+
const response = await http.fetch(deviceAuthorizationEndpoint, oauthFormRequest(body, signal));
|
|
166
|
+
await requireResponseRoute(response, deviceAuthorizationEndpoint);
|
|
57
167
|
if (!response.ok) {
|
|
58
|
-
|
|
59
|
-
throw new Error(`Device code request failed (${response.status})
|
|
168
|
+
parseOAuthError(await readBoundedJson(response));
|
|
169
|
+
throw new Error(`Device code request failed (${response.status})`);
|
|
60
170
|
}
|
|
61
|
-
return (await response
|
|
171
|
+
return parseDeviceCodeResponse(await readBoundedJson(response));
|
|
172
|
+
}
|
|
173
|
+
async function parsePollResponse(response) {
|
|
174
|
+
if (response.ok)
|
|
175
|
+
return (0, token_response_js_1.parseTokenResponse)(await readBoundedJson(response));
|
|
176
|
+
const error = parseOAuthError(await readBoundedJson(response));
|
|
177
|
+
if (error === 'authorization_pending' || error === 'slow_down')
|
|
178
|
+
return error;
|
|
179
|
+
if (error === 'access_denied')
|
|
180
|
+
throw new DeviceFlowDeniedError();
|
|
181
|
+
if (error === 'expired_token')
|
|
182
|
+
throw new DeviceFlowExpiredError();
|
|
183
|
+
throw new Error('Token endpoint returned an unsupported OAuth error');
|
|
62
184
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
185
|
+
function pollBody(request) {
|
|
186
|
+
return new URLSearchParams({
|
|
187
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
188
|
+
device_code: request.deviceCode,
|
|
189
|
+
client_id: request.clientId,
|
|
190
|
+
...exchangeFields(request.exchange),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async function pollForToken(request) {
|
|
194
|
+
const clock = request.clock ?? DEFAULT_CLOCK;
|
|
195
|
+
const deadline = clock.now() + request.expiresIn * 1000;
|
|
196
|
+
let currentInterval = request.interval;
|
|
66
197
|
while (clock.now() < deadline) {
|
|
67
|
-
if (signal?.aborted) {
|
|
68
|
-
throw signal.reason ?? new DOMException('Aborted', 'AbortError');
|
|
69
|
-
}
|
|
70
|
-
await sleep(currentInterval * 1000, signal);
|
|
71
|
-
const body = new URLSearchParams({
|
|
72
|
-
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
73
|
-
device_code: deviceCode,
|
|
74
|
-
client_id: clientId,
|
|
75
|
-
});
|
|
76
|
-
if (deviceIdentity) {
|
|
77
|
-
body.set('audience', 'admin');
|
|
78
|
-
body.set('device_token', deviceIdentity.token);
|
|
79
|
-
body.set('device_label', deviceIdentity.label);
|
|
80
|
-
}
|
|
81
|
-
const init = {
|
|
82
|
-
method: 'POST',
|
|
83
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
84
|
-
body: body.toString(),
|
|
85
|
-
redirect: 'error',
|
|
86
|
-
};
|
|
87
|
-
if (signal)
|
|
88
|
-
init.signal = signal;
|
|
89
|
-
const response = await http.fetch(tokenEndpoint, init);
|
|
90
|
-
if (response.ok) {
|
|
91
|
-
return (await response.json());
|
|
198
|
+
if (request.signal?.aborted) {
|
|
199
|
+
throw request.signal.reason ?? new DOMException('Aborted', 'AbortError');
|
|
92
200
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
throw new DeviceFlowDeniedError();
|
|
102
|
-
case 'expired_token':
|
|
103
|
-
throw new DeviceFlowExpiredError();
|
|
104
|
-
default:
|
|
105
|
-
throw new Error(`Token endpoint error: ${errorBody.error}`);
|
|
201
|
+
await sleep(currentInterval * 1000, request.signal);
|
|
202
|
+
const response = await request.http.fetch(request.tokenEndpoint, oauthFormRequest(pollBody(request), request.signal));
|
|
203
|
+
const result = await parsePollResponse(response);
|
|
204
|
+
if (result === 'authorization_pending')
|
|
205
|
+
continue;
|
|
206
|
+
if (result === 'slow_down') {
|
|
207
|
+
currentInterval += 5;
|
|
208
|
+
continue;
|
|
106
209
|
}
|
|
210
|
+
return result;
|
|
107
211
|
}
|
|
108
212
|
throw new DeviceFlowExpiredError();
|
|
109
213
|
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { readBoundedResponseJson } from './bounded-response.mjs';
|
|
2
|
+
import { parseTokenResponse } from './token-response.mjs';
|
|
3
|
+
export { parseTokenResponse } from './token-response.mjs';
|
|
4
|
+
function exchangeFields(exchange) {
|
|
5
|
+
if (exchange === undefined)
|
|
6
|
+
return {};
|
|
7
|
+
if ('grantType' in exchange) {
|
|
8
|
+
return {
|
|
9
|
+
grant_type: exchange.grantType,
|
|
10
|
+
device_token: exchange.deviceToken,
|
|
11
|
+
device_label: exchange.deviceLabel,
|
|
12
|
+
audience: exchange.audience,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
device_token: exchange.token,
|
|
17
|
+
device_label: exchange.label,
|
|
18
|
+
audience: 'admin',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export class DeviceFlowDeniedError extends Error {
|
|
22
|
+
constructor() {
|
|
23
|
+
super('Device authorization denied by user');
|
|
24
|
+
this.name = 'DeviceFlowDeniedError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class DeviceFlowExpiredError extends Error {
|
|
28
|
+
constructor() {
|
|
29
|
+
super('Device authorization code expired');
|
|
30
|
+
this.name = 'DeviceFlowExpiredError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class UnboundSessionError extends Error {
|
|
34
|
+
verificationUri;
|
|
35
|
+
constructor(verificationUri) {
|
|
36
|
+
super(`Session not bound to an organization. Re-approve at ${verificationUri} and select an organization.`);
|
|
37
|
+
this.name = 'UnboundSessionError';
|
|
38
|
+
this.verificationUri = verificationUri;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const DEFAULT_CLOCK = { now: () => Date.now() };
|
|
42
|
+
const MAX_OAUTH_RESPONSE_BYTES = 64 * 1024;
|
|
43
|
+
const MAX_DEVICE_CODE_BYTES = 16 * 1024;
|
|
44
|
+
const LOOPBACK_HOSTS = Object.freeze({
|
|
45
|
+
'127.0.0.1': true,
|
|
46
|
+
'::1': true,
|
|
47
|
+
'[::1]': true,
|
|
48
|
+
});
|
|
49
|
+
const MAX_URI_BYTES = 4 * 1024;
|
|
50
|
+
export function oauthFormRequest(body, signal) {
|
|
51
|
+
const init = {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
54
|
+
body: body.toString(),
|
|
55
|
+
redirect: 'error',
|
|
56
|
+
};
|
|
57
|
+
if (signal !== undefined)
|
|
58
|
+
init.signal = signal;
|
|
59
|
+
return init;
|
|
60
|
+
}
|
|
61
|
+
async function requireResponseRoute(response, expectedUrl) {
|
|
62
|
+
if (!response.url || new URL(response.url).href === expectedUrl)
|
|
63
|
+
return;
|
|
64
|
+
await response.body?.cancel().catch(() => undefined);
|
|
65
|
+
throw new Error('OAuth response changed target route or authority');
|
|
66
|
+
}
|
|
67
|
+
async function readBoundedJson(response) {
|
|
68
|
+
return readBoundedResponseJson(response, MAX_OAUTH_RESPONSE_BYTES, (kind) => new Error(kind === 'size' ? 'OAuth response exceeds the size limit' : 'OAuth response is malformed'));
|
|
69
|
+
}
|
|
70
|
+
function boundedString(value, maxBytes) {
|
|
71
|
+
return (typeof value === 'string' &&
|
|
72
|
+
value.length > 0 &&
|
|
73
|
+
new TextEncoder().encode(value).byteLength <= maxBytes);
|
|
74
|
+
}
|
|
75
|
+
function safeVerificationAuthority(url, allowQuery) {
|
|
76
|
+
const literalLoopback = LOOPBACK_HOSTS[url.hostname] === true;
|
|
77
|
+
return !url.username && !url.password && !url.hash &&
|
|
78
|
+
(allowQuery || !url.search) &&
|
|
79
|
+
(url.protocol === 'https:' || (url.protocol === 'http:' && literalLoopback));
|
|
80
|
+
}
|
|
81
|
+
function verificationUrl(value, allowQuery) {
|
|
82
|
+
if (!boundedString(value, MAX_URI_BYTES) ||
|
|
83
|
+
/[\u0000-\u0020\u007f]|\s/u.test(value)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const url = new URL(value);
|
|
88
|
+
return url.href === value && safeVerificationAuthority(url, allowQuery);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function deviceFieldsValid(device) {
|
|
95
|
+
const fields = Object.keys(device);
|
|
96
|
+
const required = ['device_code', 'user_code', 'verification_uri', 'expires_in', 'interval'];
|
|
97
|
+
return fields.every((field) => required.includes(field) || field === 'verification_uri_complete') && required.every((field) => field in device);
|
|
98
|
+
}
|
|
99
|
+
function deviceStringsValid(device) {
|
|
100
|
+
return boundedString(device.device_code, MAX_DEVICE_CODE_BYTES) &&
|
|
101
|
+
boundedString(device.user_code, 256) &&
|
|
102
|
+
verificationUrl(device.verification_uri, false) &&
|
|
103
|
+
(device.verification_uri_complete === undefined ||
|
|
104
|
+
verificationUrl(device.verification_uri_complete, true));
|
|
105
|
+
}
|
|
106
|
+
function deviceTimingValid(device) {
|
|
107
|
+
return Number.isSafeInteger(device.expires_in) &&
|
|
108
|
+
device.expires_in >= 1 &&
|
|
109
|
+
device.expires_in <= 86_400 &&
|
|
110
|
+
Number.isSafeInteger(device.interval) &&
|
|
111
|
+
device.interval >= 0 &&
|
|
112
|
+
device.interval <= 300;
|
|
113
|
+
}
|
|
114
|
+
function browserAuthorityMatches(device) {
|
|
115
|
+
return device.verification_uri_complete === undefined ||
|
|
116
|
+
new URL(device.verification_uri_complete).origin ===
|
|
117
|
+
new URL(device.verification_uri).origin;
|
|
118
|
+
}
|
|
119
|
+
function parseDeviceCodeResponse(value) {
|
|
120
|
+
const device = object(value, 'Device code');
|
|
121
|
+
if (!deviceFieldsValid(device) || !deviceStringsValid(device) ||
|
|
122
|
+
!deviceTimingValid(device) || !browserAuthorityMatches(device)) {
|
|
123
|
+
throw new Error('Device code response is malformed');
|
|
124
|
+
}
|
|
125
|
+
return Object.freeze(device);
|
|
126
|
+
}
|
|
127
|
+
function parseOAuthError(value) {
|
|
128
|
+
const error = object(value, 'OAuth error');
|
|
129
|
+
if (Object.keys(error).length !== 1 || typeof error.error !== 'string') {
|
|
130
|
+
throw new Error('OAuth error response is malformed');
|
|
131
|
+
}
|
|
132
|
+
return error.error;
|
|
133
|
+
}
|
|
134
|
+
function object(value, field) {
|
|
135
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
136
|
+
throw new Error(`${field} response is malformed`);
|
|
137
|
+
}
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
function sleep(ms, signal) {
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
if (signal?.aborted) {
|
|
143
|
+
reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const timer = setTimeout(resolve, ms);
|
|
147
|
+
signal?.addEventListener('abort', () => {
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
150
|
+
}, { once: true });
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function requestDeviceCode(deviceAuthorizationEndpoint, clientId, http, signal) {
|
|
154
|
+
const body = new URLSearchParams({ client_id: clientId });
|
|
155
|
+
const response = await http.fetch(deviceAuthorizationEndpoint, oauthFormRequest(body, signal));
|
|
156
|
+
await requireResponseRoute(response, deviceAuthorizationEndpoint);
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
parseOAuthError(await readBoundedJson(response));
|
|
159
|
+
throw new Error(`Device code request failed (${response.status})`);
|
|
160
|
+
}
|
|
161
|
+
return parseDeviceCodeResponse(await readBoundedJson(response));
|
|
162
|
+
}
|
|
163
|
+
async function parsePollResponse(response) {
|
|
164
|
+
if (response.ok)
|
|
165
|
+
return parseTokenResponse(await readBoundedJson(response));
|
|
166
|
+
const error = parseOAuthError(await readBoundedJson(response));
|
|
167
|
+
if (error === 'authorization_pending' || error === 'slow_down')
|
|
168
|
+
return error;
|
|
169
|
+
if (error === 'access_denied')
|
|
170
|
+
throw new DeviceFlowDeniedError();
|
|
171
|
+
if (error === 'expired_token')
|
|
172
|
+
throw new DeviceFlowExpiredError();
|
|
173
|
+
throw new Error('Token endpoint returned an unsupported OAuth error');
|
|
174
|
+
}
|
|
175
|
+
function pollBody(request) {
|
|
176
|
+
return new URLSearchParams({
|
|
177
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
178
|
+
device_code: request.deviceCode,
|
|
179
|
+
client_id: request.clientId,
|
|
180
|
+
...exchangeFields(request.exchange),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
export async function pollForToken(request) {
|
|
184
|
+
const clock = request.clock ?? DEFAULT_CLOCK;
|
|
185
|
+
const deadline = clock.now() + request.expiresIn * 1000;
|
|
186
|
+
let currentInterval = request.interval;
|
|
187
|
+
while (clock.now() < deadline) {
|
|
188
|
+
if (request.signal?.aborted) {
|
|
189
|
+
throw request.signal.reason ?? new DOMException('Aborted', 'AbortError');
|
|
190
|
+
}
|
|
191
|
+
await sleep(currentInterval * 1000, request.signal);
|
|
192
|
+
const response = await request.http.fetch(request.tokenEndpoint, oauthFormRequest(pollBody(request), request.signal));
|
|
193
|
+
const result = await parsePollResponse(response);
|
|
194
|
+
if (result === 'authorization_pending')
|
|
195
|
+
continue;
|
|
196
|
+
if (result === 'slow_down') {
|
|
197
|
+
currentInterval += 5;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
throw new DeviceFlowExpiredError();
|
|
203
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TargetDiscoveryError = void 0;
|
|
4
|
+
class TargetDiscoveryError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'TargetDiscoveryError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TargetDiscoveryError = TargetDiscoveryError;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TargetDiscoveryError = void 0;
|
|
4
|
+
class TargetDiscoveryError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'TargetDiscoveryError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TargetDiscoveryError = TargetDiscoveryError;
|