@outfoxx/sunday 2.0.0-beta.1 → 2.0.0-beta.11
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/README.md +94 -0
- package/build/client-settings.d.ts +23 -0
- package/build/client-settings.js +150 -0
- package/build/client-settings.js.map +1 -0
- package/build/credentials.d.ts +58 -0
- package/build/credentials.js +51 -0
- package/build/credentials.js.map +1 -0
- package/build/event-parser.d.ts +2 -0
- package/build/event-parser.js.map +1 -1
- package/build/fetch-event-source.d.ts +14 -5
- package/build/fetch-event-source.js +109 -44
- package/build/fetch-event-source.js.map +1 -1
- package/build/fetch-oauth-token-provider.d.ts +28 -0
- package/build/fetch-oauth-token-provider.js +171 -0
- package/build/fetch-oauth-token-provider.js.map +1 -0
- package/build/fetch-transport.d.ts +8 -0
- package/build/fetch-transport.js +84 -15
- package/build/fetch-transport.js.map +1 -1
- package/build/fetch.js +3 -2
- package/build/fetch.js.map +1 -1
- package/build/index.d.ts +12 -0
- package/build/index.js +12 -0
- package/build/index.js.map +1 -1
- package/build/media-type-codecs/cbor-encoder.d.ts +2 -2
- package/build/media-type-codecs/cbor-encoder.js +2 -2
- package/build/media-type-codecs/cbor-encoder.js.map +1 -1
- package/build/media-type-codecs/json-encoder.d.ts +3 -3
- package/build/media-type-codecs/json-encoder.js +4 -4
- package/build/media-type-codecs/json-encoder.js.map +1 -1
- package/build/media-type-codecs/media-type-encoder.d.ts +3 -3
- package/build/media-type-codecs/media-type-encoder.js.map +1 -1
- package/build/media-type-codecs/www-form-url-encoder.d.ts +2 -2
- package/build/media-type-codecs/www-form-url-encoder.js +2 -2
- package/build/media-type-codecs/www-form-url-encoder.js.map +1 -1
- package/build/model-construction.d.ts +5 -0
- package/build/model-construction.js +40 -0
- package/build/model-construction.js.map +1 -0
- package/build/model-schema.d.ts +9 -0
- package/build/model-schema.js +131 -0
- package/build/model-schema.js.map +1 -0
- package/build/oauth-wire.d.ts +33 -0
- package/build/oauth-wire.js +143 -0
- package/build/oauth-wire.js.map +1 -0
- package/build/operation.d.ts +11 -1
- package/build/operation.js +3 -0
- package/build/operation.js.map +1 -1
- package/build/problem.js +2 -1
- package/build/problem.js.map +1 -1
- package/build/request-security.d.ts +16 -0
- package/build/request-security.js +167 -0
- package/build/request-security.js.map +1 -0
- package/build/request-validation-error.d.ts +4 -0
- package/build/request-validation-error.js +21 -0
- package/build/request-validation-error.js.map +1 -0
- package/build/schema-builtins.js +11 -21
- package/build/schema-builtins.js.map +1 -1
- package/build/schema-runtime.d.ts +8 -1
- package/build/schema-runtime.js +12 -3
- package/build/schema-runtime.js.map +1 -1
- package/build/security-binding.d.ts +22 -0
- package/build/security-binding.js +15 -0
- package/build/security-binding.js.map +1 -0
- package/build/streaming-body.d.ts +21 -0
- package/build/streaming-body.js +65 -0
- package/build/streaming-body.js.map +1 -0
- package/build/token-manager-factory.d.ts +9 -0
- package/build/token-manager-factory.js +15 -0
- package/build/token-manager-factory.js.map +1 -0
- package/build/token-manager.d.ts +33 -0
- package/build/token-manager.js +199 -0
- package/build/token-manager.js.map +1 -0
- package/build/token-provider.d.ts +44 -0
- package/build/token-provider.js +31 -0
- package/build/token-provider.js.map +1 -0
- package/build/transport.d.ts +5 -0
- package/build/unknown-variant.d.ts +12 -0
- package/build/unknown-variant.js +45 -0
- package/build/unknown-variant.js.map +1 -0
- package/build/url-template.d.ts +3 -0
- package/build/url-template.js +30 -2
- package/build/url-template.js.map +1 -1
- package/build/util/base64.d.ts +4 -0
- package/build/util/base64.js +46 -0
- package/build/util/base64.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// Copyright 2020 Outfox, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { Instant, LocalDate, LocalDateTime, LocalTime, OffsetDateTime, ZonedDateTime } from '@js-joda/core';
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { defineSchema } from './schema-runtime.js';
|
|
17
|
+
// Generated schemas and their transformations are synchronous. A root invocation owns the
|
|
18
|
+
// untyped-payload cycle check; nested schemas protect only their own recursive entry points.
|
|
19
|
+
let invocationDepth = 0;
|
|
20
|
+
/** Defines a generated synchronous model codec with native Zod cycle diagnostics in both directions. */
|
|
21
|
+
export function defineModelSchema(build, options) {
|
|
22
|
+
return defineSchema((runtime) => {
|
|
23
|
+
const schema = build(runtime);
|
|
24
|
+
const ancestors = new WeakSet();
|
|
25
|
+
function evaluate(value, context, direction) {
|
|
26
|
+
const object = typeof value === 'object' && value !== null ? value : undefined;
|
|
27
|
+
if (object && ancestors.has(object)) {
|
|
28
|
+
context.issues.push(cycleIssue([]));
|
|
29
|
+
return z.NEVER;
|
|
30
|
+
}
|
|
31
|
+
if (object)
|
|
32
|
+
ancestors.add(object);
|
|
33
|
+
const root = invocationDepth++ === 0;
|
|
34
|
+
try {
|
|
35
|
+
const result = direction === 'decode' ? schema.safeParse(value) : schema.safeEncode(value);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
context.issues.push(...result.error.issues.map(issue => ({ ...issue, input: undefined })));
|
|
38
|
+
return z.NEVER;
|
|
39
|
+
}
|
|
40
|
+
// Native object parsing has already removed non-participating fields. Inspecting its result
|
|
41
|
+
// also covers raw extension payloads without rejecting discarded input or invoking constructors.
|
|
42
|
+
const path = root ? cyclePath(result.data) : undefined;
|
|
43
|
+
if (path) {
|
|
44
|
+
context.issues.push(cycleIssue(path));
|
|
45
|
+
return z.NEVER;
|
|
46
|
+
}
|
|
47
|
+
return result.data;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
invocationDepth--;
|
|
51
|
+
if (object)
|
|
52
|
+
ancestors.delete(object);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return z.codec(z.custom(), z.custom(), {
|
|
56
|
+
decode: (value, context) => evaluate(value, context, 'decode'),
|
|
57
|
+
encode: (value, context) => evaluate(value, context, 'encode'),
|
|
58
|
+
});
|
|
59
|
+
}, options);
|
|
60
|
+
}
|
|
61
|
+
/** Applies common native schema assertions without replacing a reusable union's payload type. */
|
|
62
|
+
export function withModelConstraints(payload, common, discriminator) {
|
|
63
|
+
function evaluate(value, context, direction) {
|
|
64
|
+
let fields = value;
|
|
65
|
+
if (direction === 'encode' && discriminator && typeof value === 'object' && value !== null && discriminator in value) {
|
|
66
|
+
const tag = value[discriminator];
|
|
67
|
+
if (typeof tag === 'object' && tag !== null && 'rawValue' in tag && typeof tag.rawValue === 'string') {
|
|
68
|
+
// Reused payload enums may have another nominal type; common tag rules inspect their wire value.
|
|
69
|
+
fields = { ...value, [discriminator]: tag.rawValue };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const constraints = direction === 'decode' ? common.safeParse(fields) : common.safeEncode(fields);
|
|
73
|
+
if (!constraints.success) {
|
|
74
|
+
context.issues.push(...constraints.error.issues.map(issue => ({ ...issue, input: undefined })));
|
|
75
|
+
return z.NEVER;
|
|
76
|
+
}
|
|
77
|
+
// Keep the selected payload's native conversion and identity. The common schema is assertion-only.
|
|
78
|
+
const result = direction === 'decode' ? payload.safeParse(value) : payload.safeEncode(value);
|
|
79
|
+
if (!result.success) {
|
|
80
|
+
context.issues.push(...result.error.issues.map(issue => ({ ...issue, input: undefined })));
|
|
81
|
+
return z.NEVER;
|
|
82
|
+
}
|
|
83
|
+
return result.data;
|
|
84
|
+
}
|
|
85
|
+
// A refinement attached directly to a union loses its issues during Zod's reverse union pass.
|
|
86
|
+
return z.codec(z.custom(), z.custom(), {
|
|
87
|
+
decode: (value, context) => evaluate(value, context, 'decode'),
|
|
88
|
+
encode: (value, context) => evaluate(value, context, 'encode'),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function cycleIssue(path) {
|
|
92
|
+
return { code: 'custom', input: undefined, message: 'Object cycles cannot be serialized', path, params: { reason: 'cycle' } };
|
|
93
|
+
}
|
|
94
|
+
function cyclePath(value) {
|
|
95
|
+
const ancestors = new WeakSet();
|
|
96
|
+
const pending = [{ value, path: [] }];
|
|
97
|
+
while (pending.length) {
|
|
98
|
+
const entry = pending.pop();
|
|
99
|
+
if (typeof entry.value !== 'object' || entry.value === null)
|
|
100
|
+
continue;
|
|
101
|
+
// Temporal codecs serialize these native values as scalars, not their cyclic zone-rule internals.
|
|
102
|
+
if (entry.value instanceof Instant || entry.value instanceof LocalDate ||
|
|
103
|
+
entry.value instanceof LocalDateTime || entry.value instanceof LocalTime ||
|
|
104
|
+
entry.value instanceof OffsetDateTime || entry.value instanceof ZonedDateTime)
|
|
105
|
+
continue;
|
|
106
|
+
if (entry.leave) {
|
|
107
|
+
ancestors.delete(entry.value);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (ancestors.has(entry.value))
|
|
111
|
+
return entry.path;
|
|
112
|
+
ancestors.add(entry.value);
|
|
113
|
+
pending.push({ ...entry, leave: true });
|
|
114
|
+
const children = modelChildren(entry.value);
|
|
115
|
+
for (let index = children.length - 1; index >= 0; index--) {
|
|
116
|
+
const [key, item] = children[index];
|
|
117
|
+
pending.push({ value: item, path: [...entry.path, key] });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
function modelChildren(value) {
|
|
123
|
+
if (Array.isArray(value))
|
|
124
|
+
return value.map((item, index) => [index, item]);
|
|
125
|
+
if (value instanceof Map)
|
|
126
|
+
return [...value].flatMap(([key, item], index) => [[`key:${index}`, key], [String(key), item]]);
|
|
127
|
+
if (value instanceof Set)
|
|
128
|
+
return [...value].map((item, index) => [index, item]);
|
|
129
|
+
return Object.entries(value);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=model-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-schema.js","sourceRoot":"","sources":["../src/model-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TokenSet } from './token-provider.js';
|
|
2
|
+
/** Internal wire decoding; client/session policy remains in the provider. */
|
|
3
|
+
export declare class DiscoveryMetadata {
|
|
4
|
+
readonly issuer: string;
|
|
5
|
+
readonly tokenUrl: string | undefined;
|
|
6
|
+
readonly authorizationUrl: string | undefined;
|
|
7
|
+
readonly methods: readonly string[] | undefined;
|
|
8
|
+
private constructor();
|
|
9
|
+
static parse(body: string): DiscoveryMetadata;
|
|
10
|
+
}
|
|
11
|
+
/** Internal token message, validated before conversion to application credentials. */
|
|
12
|
+
export declare class TokenSuccessResponse {
|
|
13
|
+
private readonly accessToken;
|
|
14
|
+
private readonly tokenType;
|
|
15
|
+
private readonly expiresIn;
|
|
16
|
+
private readonly refreshToken;
|
|
17
|
+
private readonly scope;
|
|
18
|
+
private constructor();
|
|
19
|
+
static parse(body: string): Promise<TokenSuccessResponse>;
|
|
20
|
+
tokens(scopes: readonly string[], now: number): TokenSet;
|
|
21
|
+
toString(): string;
|
|
22
|
+
toJSON(): string;
|
|
23
|
+
}
|
|
24
|
+
/** Internal error message; provider diagnostics never use descriptions from the server. */
|
|
25
|
+
export declare class TokenErrorResponse {
|
|
26
|
+
readonly code: string;
|
|
27
|
+
private constructor();
|
|
28
|
+
static parse(body: string): TokenErrorResponse;
|
|
29
|
+
toString(): string;
|
|
30
|
+
toJSON(): string;
|
|
31
|
+
}
|
|
32
|
+
/** Validates a selected or advertised endpoint before application authorization. */
|
|
33
|
+
export declare function endpoint(value: string | undefined): string;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Copyright 2020 Outfox, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import * as oauth from 'oauth4webapi';
|
|
15
|
+
import { parse, isLosslessNumber, isSafeNumber } from 'lossless-json';
|
|
16
|
+
import { TokenProviderError } from './token-provider.js';
|
|
17
|
+
/** Internal wire decoding; client/session policy remains in the provider. */
|
|
18
|
+
export class DiscoveryMetadata {
|
|
19
|
+
issuer;
|
|
20
|
+
tokenUrl;
|
|
21
|
+
authorizationUrl;
|
|
22
|
+
methods;
|
|
23
|
+
constructor(issuer, tokenUrl, authorizationUrl, methods) {
|
|
24
|
+
this.issuer = issuer;
|
|
25
|
+
this.tokenUrl = tokenUrl;
|
|
26
|
+
this.authorizationUrl = authorizationUrl;
|
|
27
|
+
this.methods = methods;
|
|
28
|
+
}
|
|
29
|
+
static parse(body) {
|
|
30
|
+
const data = document(body);
|
|
31
|
+
const issuer = string(data, 'issuer', true);
|
|
32
|
+
const tokenUrl = string(data, 'token_endpoint');
|
|
33
|
+
const authorizationUrl = string(data, 'authorization_endpoint');
|
|
34
|
+
if (tokenUrl !== undefined)
|
|
35
|
+
endpoint(tokenUrl);
|
|
36
|
+
if (authorizationUrl !== undefined)
|
|
37
|
+
endpoint(authorizationUrl);
|
|
38
|
+
for (const name of ['jwks_uri', 'registration_endpoint', 'revocation_endpoint', 'introspection_endpoint']) {
|
|
39
|
+
const value = string(data, name);
|
|
40
|
+
if (value !== undefined)
|
|
41
|
+
endpoint(value);
|
|
42
|
+
}
|
|
43
|
+
let methods;
|
|
44
|
+
if ('token_endpoint_auth_methods_supported' in data) {
|
|
45
|
+
const raw = data.token_endpoint_auth_methods_supported;
|
|
46
|
+
if (!Array.isArray(raw) || raw.some(value => typeof value !== 'string'))
|
|
47
|
+
throw new TokenProviderError();
|
|
48
|
+
methods = raw;
|
|
49
|
+
}
|
|
50
|
+
return new DiscoveryMetadata(issuer, tokenUrl, authorizationUrl, methods);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Internal token message, validated before conversion to application credentials. */
|
|
54
|
+
export class TokenSuccessResponse {
|
|
55
|
+
accessToken;
|
|
56
|
+
tokenType;
|
|
57
|
+
expiresIn;
|
|
58
|
+
refreshToken;
|
|
59
|
+
scope;
|
|
60
|
+
constructor(accessToken, tokenType, expiresIn, refreshToken, scope) {
|
|
61
|
+
this.accessToken = accessToken;
|
|
62
|
+
this.tokenType = tokenType;
|
|
63
|
+
this.expiresIn = expiresIn;
|
|
64
|
+
this.refreshToken = refreshToken;
|
|
65
|
+
this.scope = scope;
|
|
66
|
+
}
|
|
67
|
+
static async parse(body) {
|
|
68
|
+
const data = document(body);
|
|
69
|
+
let expiresIn;
|
|
70
|
+
if ('expires_in' in data) {
|
|
71
|
+
const raw = data.expires_in;
|
|
72
|
+
if (!isLosslessNumber(raw) || !isSafeNumber(raw.value) || !Number.isInteger(Number(raw.value)))
|
|
73
|
+
throw new TokenProviderError();
|
|
74
|
+
expiresIn = Number(raw.value);
|
|
75
|
+
data.expires_in = expiresIn;
|
|
76
|
+
}
|
|
77
|
+
const scope = string(data, 'scope');
|
|
78
|
+
if (scope !== undefined && !/^[\x21\x23-\x5b\x5d-\x7e]+(?: [\x21\x23-\x5b\x5d-\x7e]+)*(?![\s\S])/.test(scope))
|
|
79
|
+
throw new TokenProviderError();
|
|
80
|
+
// ID tokens are outside this OAuth-only API. Pass only the fields it consumes;
|
|
81
|
+
// oauth4webapi would otherwise also perform OIDC claim validation.
|
|
82
|
+
const protocolFields = Object.fromEntries(['access_token', 'token_type', 'expires_in', 'refresh_token', 'scope']
|
|
83
|
+
.filter(key => key in data).map(key => [key, data[key]]));
|
|
84
|
+
const parsed = await oauth.processGenericTokenEndpointResponse({ issuer: 'https://oauth.invalid' }, { client_id: 'sunday' }, Response.json(protocolFields));
|
|
85
|
+
return new TokenSuccessResponse(parsed.access_token, parsed.token_type, expiresIn, parsed.refresh_token, scope);
|
|
86
|
+
}
|
|
87
|
+
tokens(scopes, now) {
|
|
88
|
+
if (this.tokenType.toLowerCase() !== 'bearer' || (this.scope !== undefined && !scopes.every(scope => this.scope.split(' ').includes(scope))))
|
|
89
|
+
throw new TokenProviderError();
|
|
90
|
+
let expiresAt;
|
|
91
|
+
if (this.expiresIn !== undefined) {
|
|
92
|
+
expiresAt = Math.floor(now) + this.expiresIn * 1000;
|
|
93
|
+
if (this.expiresIn <= 0 || !Number.isSafeInteger(expiresAt))
|
|
94
|
+
throw new TokenProviderError();
|
|
95
|
+
}
|
|
96
|
+
return { accessToken: this.accessToken, expiresAt, refreshToken: this.refreshToken };
|
|
97
|
+
}
|
|
98
|
+
toString() { return 'OAuthSuccess()'; }
|
|
99
|
+
toJSON() { return this.toString(); }
|
|
100
|
+
}
|
|
101
|
+
/** Internal error message; provider diagnostics never use descriptions from the server. */
|
|
102
|
+
export class TokenErrorResponse {
|
|
103
|
+
code;
|
|
104
|
+
constructor(code) {
|
|
105
|
+
this.code = code;
|
|
106
|
+
}
|
|
107
|
+
static parse(body) {
|
|
108
|
+
const data = document(body);
|
|
109
|
+
string(data, 'error_description', false, true);
|
|
110
|
+
string(data, 'error_uri');
|
|
111
|
+
return new TokenErrorResponse(string(data, 'error', true));
|
|
112
|
+
}
|
|
113
|
+
toString() { return 'OAuthError()'; }
|
|
114
|
+
toJSON() { return this.toString(); }
|
|
115
|
+
}
|
|
116
|
+
/** Validates a selected or advertised endpoint before application authorization. */
|
|
117
|
+
export function endpoint(value) {
|
|
118
|
+
if (!value)
|
|
119
|
+
throw new TokenProviderError();
|
|
120
|
+
const url = new URL(value);
|
|
121
|
+
if (url.username || url.password || url.hash)
|
|
122
|
+
throw new TokenProviderError();
|
|
123
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)))
|
|
124
|
+
throw new TokenProviderError();
|
|
125
|
+
return url.toString();
|
|
126
|
+
}
|
|
127
|
+
function document(body) {
|
|
128
|
+
const data = parse(body);
|
|
129
|
+
if (!data || typeof data !== 'object' || Array.isArray(data))
|
|
130
|
+
throw new TokenProviderError();
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
function string(data, key, required = false, allowEmpty = false) {
|
|
134
|
+
if (!(key in data)) {
|
|
135
|
+
if (required)
|
|
136
|
+
throw new TokenProviderError();
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
if (typeof data[key] !== 'string' || (!allowEmpty && !data[key]))
|
|
140
|
+
throw new TokenProviderError();
|
|
141
|
+
return data[key];
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=oauth-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-wire.js","sourceRoot":"","sources":["../src/oauth-wire.ts"],"names":[],"mappings":"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"}
|
package/build/operation.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { Transport, RequestSpec } from './transport.js';
|
|
2
2
|
import { OperationResponse } from './operation-response.js';
|
|
3
3
|
import { SchemaLike } from './schema-runtime.js';
|
|
4
|
+
import { StreamingBody } from './streaming-body.js';
|
|
4
5
|
import { type ProblemMatcher } from './util/nullify.js';
|
|
5
6
|
/** Extracts the native request type from a transport. */
|
|
6
|
-
export type TransportRequest<Factory> = Factory extends
|
|
7
|
+
export type TransportRequest<Factory> = Factory extends {
|
|
8
|
+
transportRequest(requestSpec: RequestSpec<unknown>): Promise<infer NativeRequest>;
|
|
9
|
+
} ? NativeRequest : never;
|
|
7
10
|
/** Options used when converting an operation into a native request. */
|
|
8
11
|
export interface BuildRequestOptions {
|
|
9
12
|
readonly signal?: AbortSignal;
|
|
@@ -38,6 +41,9 @@ export interface Operation<RequestBody, ResponseBody, Factory extends Transport<
|
|
|
38
41
|
transportRequest(options?: BuildRequestOptions): Promise<TransportRequest<Factory>>;
|
|
39
42
|
transportResponse(options?: ExecuteOptions): Promise<Response>;
|
|
40
43
|
}
|
|
44
|
+
/** A generated streaming upload operation. */
|
|
45
|
+
export interface StreamingOperation<ResponseBody, Factory extends Transport<unknown> = Transport> extends Operation<StreamingBody, ResponseBody, Factory> {
|
|
46
|
+
}
|
|
41
47
|
/** A generated operation that can execute select problems as null responses. */
|
|
42
48
|
export interface NullableOperation<RequestBody, ResponseBody, Factory extends Transport<unknown> = Transport> extends Operation<RequestBody, ResponseBody, Factory> {
|
|
43
49
|
readonly nullify: NullifySpec;
|
|
@@ -48,6 +54,10 @@ export interface NullableOperation<RequestBody, ResponseBody, Factory extends Tr
|
|
|
48
54
|
export declare function createOperation<RequestBody = void, ResponseBody = void, Factory extends Transport<unknown> = Transport>(transport: Factory, spec: TypedOperationSpec<RequestBody, ResponseBody>): Operation<RequestBody, ResponseBody, Factory>;
|
|
49
55
|
/** Creates an operation with no decoded response body. */
|
|
50
56
|
export declare function createOperation<RequestBody = void, Factory extends Transport<unknown> = Transport>(transport: Factory, spec: VoidOperationSpec<RequestBody>): Operation<RequestBody, void, Factory>;
|
|
57
|
+
/** Creates a streaming upload operation with a decoded response body. */
|
|
58
|
+
export declare function createStreamingOperation<ResponseBody = void, Factory extends Transport<unknown> = Transport>(transport: Factory, spec: TypedOperationSpec<StreamingBody, ResponseBody>): StreamingOperation<ResponseBody, Factory>;
|
|
59
|
+
/** Creates a streaming upload operation with no decoded response body. */
|
|
60
|
+
export declare function createStreamingOperation<Factory extends Transport<unknown> = Transport>(transport: Factory, spec: VoidOperationSpec<StreamingBody>): StreamingOperation<void, Factory>;
|
|
51
61
|
/** Creates a nullable operation with a decoded response body. */
|
|
52
62
|
export declare function createNullableOperation<RequestBody = void, ResponseBody = void, Factory extends Transport<unknown> = Transport>(transport: Factory, spec: TypedOperationSpec<RequestBody, ResponseBody>, nullify: NullifySpec): NullableOperation<RequestBody, ResponseBody, Factory>;
|
|
53
63
|
/** Creates a nullable operation with no decoded response body. */
|
package/build/operation.js
CHANGED
|
@@ -15,6 +15,9 @@ import { nullifyProblem } from './util/nullify.js';
|
|
|
15
15
|
export function createOperation(transport, spec) {
|
|
16
16
|
return new TransportOperation(transport, spec);
|
|
17
17
|
}
|
|
18
|
+
export function createStreamingOperation(transport, spec) {
|
|
19
|
+
return new TransportOperation(transport, spec);
|
|
20
|
+
}
|
|
18
21
|
export function createNullableOperation(transport, spec, nullify) {
|
|
19
22
|
return new TransportNullableOperation(transport, spec, nullify);
|
|
20
23
|
}
|
package/build/operation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,gDAAgD;AAChD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;
|
|
1
|
+
{"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"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"}
|
package/build/problem.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
+
import { constructValidatedModel } from './model-construction.js';
|
|
14
15
|
import { z } from 'zod';
|
|
15
16
|
import { ResponseExample } from './fetch.js';
|
|
16
17
|
import { defineSchema, } from './schema-runtime.js';
|
|
@@ -104,7 +105,7 @@ export class Problem extends Error {
|
|
|
104
105
|
}
|
|
105
106
|
export function createProblemCodec(problemType, wireSchema) {
|
|
106
107
|
return z.codec(wireSchema, z.instanceof(problemType), {
|
|
107
|
-
decode: (value) =>
|
|
108
|
+
decode: (value) => constructValidatedModel(problemType, value),
|
|
108
109
|
encode: (value) => ({
|
|
109
110
|
type: value.type?.toString() ?? Problem.BLANK_URL.toString(),
|
|
110
111
|
title: value.title,
|
package/build/problem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"problem.js","sourceRoot":"","sources":["../src/problem.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"problem.js","sourceRoot":"","sources":["../src/problem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SecurityBinding } from './security-binding.js';
|
|
2
|
+
import { TokenLease, TokenManager } from './token-manager.js';
|
|
3
|
+
/** Per-request credentials, retained only for conditional invalidation and bounded recovery. */
|
|
4
|
+
export interface AuthorizedRequest {
|
|
5
|
+
readonly request: Request;
|
|
6
|
+
readonly bindings: readonly SecurityBinding[];
|
|
7
|
+
readonly leases: readonly TokenLease[];
|
|
8
|
+
}
|
|
9
|
+
/** Adds all credentials atomically after every provider succeeds. */
|
|
10
|
+
export declare function authorizeRequest(request: Request, bindings: readonly SecurityBinding[], manager: TokenManager | undefined, previous?: AuthorizedRequest): Promise<AuthorizedRequest>;
|
|
11
|
+
/** Requires a safe, replayable request and an explicit bearer invalid-token challenge. */
|
|
12
|
+
export declare function canRecoverAuthentication(request: AuthorizedRequest, response: Response): boolean;
|
|
13
|
+
/** Returns only bearer receipts rejected by an invalid-token challenge, preserving other conjuncts. */
|
|
14
|
+
export declare function rejectedBearerLeases(request: AuthorizedRequest): readonly TokenLease[];
|
|
15
|
+
/** Removes query credentials from responses before error translation or diagnostic rendering. */
|
|
16
|
+
export declare function redactSecurityResponse(response: Response, bindings: readonly SecurityBinding[]): Response;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Copyright 2020 Outfox, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { TokenProviderError } from './token-provider.js';
|
|
15
|
+
/** Adds all credentials atomically after every provider succeeds. */
|
|
16
|
+
export async function authorizeRequest(request, bindings, manager, previous) {
|
|
17
|
+
if (!manager)
|
|
18
|
+
throw new TokenProviderError();
|
|
19
|
+
const url = new URL(request.url);
|
|
20
|
+
const headers = new Headers(request.headers);
|
|
21
|
+
validateTransports(bindings, url, headers, !previous);
|
|
22
|
+
const leases = await Promise.all(bindings.map(binding => manager.credentials(binding, request.signal)));
|
|
23
|
+
request.signal.throwIfAborted();
|
|
24
|
+
bindings.forEach((binding, index) => applyCredential(binding, leases[index].tokens.accessToken, url, headers));
|
|
25
|
+
// Passing the body explicitly avoids Request's internal stream proxy, which can stall uploads in Bun.
|
|
26
|
+
// Manual redirects also protect custom API-key headers and cookies from crossing origins.
|
|
27
|
+
const authorized = url.toString() === request.url && request.redirect === 'manual' ? request :
|
|
28
|
+
new Request(url, {
|
|
29
|
+
method: request.method, headers, body: request.body, signal: request.signal,
|
|
30
|
+
cache: request.cache, credentials: request.credentials, integrity: request.integrity,
|
|
31
|
+
keepalive: request.keepalive, mode: request.mode, redirect: 'manual',
|
|
32
|
+
referrer: request.referrer, referrerPolicy: request.referrerPolicy,
|
|
33
|
+
...(request.body ? { duplex: 'half' } : {}),
|
|
34
|
+
});
|
|
35
|
+
for (const [name, value] of headers)
|
|
36
|
+
authorized.headers.set(name, value);
|
|
37
|
+
return { request: authorized, bindings, leases };
|
|
38
|
+
}
|
|
39
|
+
/** Requires a safe, replayable request and an explicit bearer invalid-token challenge. */
|
|
40
|
+
export function canRecoverAuthentication(request, response) {
|
|
41
|
+
return response.status === 401 && ['GET', 'HEAD', 'OPTIONS'].includes(request.request.method) &&
|
|
42
|
+
request.request.body === null && request.bindings.some(isBearerBinding) &&
|
|
43
|
+
hasInvalidBearerChallenge(response.headers.get('WWW-Authenticate') ?? '');
|
|
44
|
+
}
|
|
45
|
+
/** Returns only bearer receipts rejected by an invalid-token challenge, preserving other conjuncts. */
|
|
46
|
+
export function rejectedBearerLeases(request) {
|
|
47
|
+
return request.leases.filter((_, index) => isBearerBinding(request.bindings[index]));
|
|
48
|
+
}
|
|
49
|
+
function isBearerBinding(binding) {
|
|
50
|
+
return binding.transport.location === 'header' && binding.transport.name.toLowerCase() === 'authorization' &&
|
|
51
|
+
binding.transport.prefix?.toLowerCase() === 'bearer';
|
|
52
|
+
}
|
|
53
|
+
/** Removes query credentials from responses before error translation or diagnostic rendering. */
|
|
54
|
+
export function redactSecurityResponse(response, bindings) {
|
|
55
|
+
const queryNames = bindings.filter(binding => binding.transport.location === 'query').map(binding => binding.transport.name);
|
|
56
|
+
if (!queryNames.length || !response.url)
|
|
57
|
+
return response;
|
|
58
|
+
const url = new URL(response.url);
|
|
59
|
+
for (const name of queryNames)
|
|
60
|
+
if (url.searchParams.has(name))
|
|
61
|
+
replaceQueryCredential(url, name, '[redacted]');
|
|
62
|
+
const result = new Response(response.body, { status: response.status, statusText: response.statusText, headers: response.headers });
|
|
63
|
+
Object.defineProperty(result, 'url', { value: url.toString() });
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
function hasInvalidBearerChallenge(header) {
|
|
67
|
+
const parts = splitChallenges(header);
|
|
68
|
+
if (!parts)
|
|
69
|
+
return false;
|
|
70
|
+
let bearer = false;
|
|
71
|
+
for (let part of parts) {
|
|
72
|
+
const challenge = /^([a-z][a-z0-9_-]*)\s+(?!\s*=)(.*)$/i.exec(part);
|
|
73
|
+
if (challenge) {
|
|
74
|
+
bearer = challenge[1].toLowerCase() === 'bearer';
|
|
75
|
+
part = challenge[2];
|
|
76
|
+
}
|
|
77
|
+
else if (/^[a-z][a-z0-9_-]*$/i.test(part))
|
|
78
|
+
bearer = false;
|
|
79
|
+
const error = /^error\s*=\s*(?:"([^"]*)"|([^"\s]+))$/i.exec(part);
|
|
80
|
+
if (bearer && (error?.[1] ?? error?.[2]) === 'invalid_token')
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
function cookieEntries(headers) {
|
|
86
|
+
return (headers.get('Cookie') ?? '').split(';').flatMap(entry => {
|
|
87
|
+
const split = entry.indexOf('=');
|
|
88
|
+
return split < 0 ? [] : [[entry.slice(0, split).trim(), entry.slice(split + 1).trim()]];
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// URLSearchParams re-encodes unrelated values, which can invalidate application-signed query parameters.
|
|
92
|
+
function replaceQueryCredential(url, name, credential) {
|
|
93
|
+
const fields = (url.search ? url.search.slice(1).split('&') : []).filter(field => {
|
|
94
|
+
const key = field.split('=', 1)[0];
|
|
95
|
+
try {
|
|
96
|
+
return decodeURIComponent(key.replaceAll('+', ' ')) !== name;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
fields.push(`${encodeURIComponent(name)}=${encodeURIComponent(credential)}`);
|
|
103
|
+
url.search = fields.join('&');
|
|
104
|
+
}
|
|
105
|
+
function validateTransports(bindings, url, headers, checkExisting) {
|
|
106
|
+
const names = new Set();
|
|
107
|
+
for (const binding of bindings) {
|
|
108
|
+
const transport = binding.transport;
|
|
109
|
+
const name = `${transport.location}:${transport.location === 'header' ? transport.name.toLowerCase() : transport.name}`;
|
|
110
|
+
if (names.has(name))
|
|
111
|
+
throw new TokenProviderError();
|
|
112
|
+
names.add(name);
|
|
113
|
+
if (checkExisting && ((transport.location === 'header' && headers.has(transport.name)) ||
|
|
114
|
+
(transport.location === 'query' && url.searchParams.has(transport.name)) ||
|
|
115
|
+
(transport.location === 'cookie' && cookieEntries(headers).some(([name]) => name === transport.name))))
|
|
116
|
+
throw new TokenProviderError();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function applyCredential(binding, token, url, headers) {
|
|
120
|
+
const transport = binding.transport;
|
|
121
|
+
const credential = transport.prefix ? `${transport.prefix} ${token}` : token;
|
|
122
|
+
switch (transport.location) {
|
|
123
|
+
case 'header': {
|
|
124
|
+
if ([...credential].some(character => character.codePointAt(0) < 32 || character.codePointAt(0) === 127))
|
|
125
|
+
throw new TokenProviderError();
|
|
126
|
+
headers.set(transport.name, credential);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case 'query':
|
|
130
|
+
replaceQueryCredential(url, transport.name, credential);
|
|
131
|
+
break;
|
|
132
|
+
case 'cookie': {
|
|
133
|
+
const entries = cookieEntries(headers).filter(([name]) => name !== transport.name);
|
|
134
|
+
entries.push([transport.name, encodeURIComponent(credential)]);
|
|
135
|
+
headers.set('Cookie', entries.map(([name, value]) => `${name}=${value}`).join('; '));
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function splitChallenges(header) {
|
|
141
|
+
const parts = [];
|
|
142
|
+
let start = 0;
|
|
143
|
+
let quoted = false;
|
|
144
|
+
let escaped = false;
|
|
145
|
+
for (let index = 0; index < header.length; index++) {
|
|
146
|
+
const character = header[index];
|
|
147
|
+
if (escaped) {
|
|
148
|
+
escaped = false;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (quoted && character === '\\') {
|
|
152
|
+
escaped = true;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (character === '"')
|
|
156
|
+
quoted = !quoted;
|
|
157
|
+
if (!quoted && character === ',') {
|
|
158
|
+
parts.push(header.slice(start, index).trim());
|
|
159
|
+
start = index + 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (quoted || escaped)
|
|
163
|
+
return undefined;
|
|
164
|
+
parts.push(header.slice(start).trim());
|
|
165
|
+
return parts;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=request-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-security.js","sourceRoot":"","sources":["../src/request-security.ts"],"names":[],"mappings":"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"}
|