@tashiscool/agents 0.1.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/README.md +186 -0
- package/dist/conversation.d.ts +146 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +239 -0
- package/dist/conversation.js.map +1 -0
- package/dist/events.d.ts +218 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +299 -0
- package/dist/events.js.map +1 -0
- package/dist/executor.d.ts +144 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +362 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/langchain.d.ts +210 -0
- package/dist/langchain.d.ts.map +1 -0
- package/dist/langchain.js +333 -0
- package/dist/langchain.js.map +1 -0
- package/dist/mcp.d.ts +208 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +266 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +96 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +248 -0
- package/dist/memory.js.map +1 -0
- package/dist/oauth.d.ts +158 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +344 -0
- package/dist/oauth.js.map +1 -0
- package/dist/output.d.ts +262 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +249 -0
- package/dist/output.js.map +1 -0
- package/dist/session.d.ts +212 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +347 -0
- package/dist/session.js.map +1 -0
- package/dist/tools.d.ts +125 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +195 -0
- package/dist/tools.js.map +1 -0
- package/package.json +45 -0
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Manager
|
|
3
|
+
* Manage OAuth tokens with automatic refresh
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* OAuth token data
|
|
7
|
+
*/
|
|
8
|
+
export interface OAuthToken {
|
|
9
|
+
/** Access token */
|
|
10
|
+
accessToken: string;
|
|
11
|
+
/** Token type (usually 'Bearer') */
|
|
12
|
+
tokenType: string;
|
|
13
|
+
/** Expiration timestamp */
|
|
14
|
+
expiresAt: Date;
|
|
15
|
+
/** Refresh token (if available) */
|
|
16
|
+
refreshToken?: string;
|
|
17
|
+
/** Token scope */
|
|
18
|
+
scope?: string;
|
|
19
|
+
/** Additional token data */
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* OAuth provider configuration
|
|
24
|
+
*/
|
|
25
|
+
export interface OAuthProviderConfig {
|
|
26
|
+
/** Provider name */
|
|
27
|
+
name: string;
|
|
28
|
+
/** Authorization URL */
|
|
29
|
+
authorizationUrl: string;
|
|
30
|
+
/** Token URL */
|
|
31
|
+
tokenUrl: string;
|
|
32
|
+
/** Revocation URL */
|
|
33
|
+
revocationUrl?: string;
|
|
34
|
+
/** Client ID */
|
|
35
|
+
clientId: string;
|
|
36
|
+
/** Client secret */
|
|
37
|
+
clientSecret?: string;
|
|
38
|
+
/** Default scopes */
|
|
39
|
+
defaultScopes?: string[];
|
|
40
|
+
/** Token refresh buffer in ms (refresh before expiry) */
|
|
41
|
+
refreshBufferMs?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Token storage interface
|
|
45
|
+
*/
|
|
46
|
+
export interface TokenStorage {
|
|
47
|
+
save(key: string, token: OAuthToken): Promise<void>;
|
|
48
|
+
load(key: string): Promise<OAuthToken | null>;
|
|
49
|
+
delete(key: string): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* In-memory token storage
|
|
53
|
+
*/
|
|
54
|
+
export declare class InMemoryTokenStorage implements TokenStorage {
|
|
55
|
+
private tokens;
|
|
56
|
+
save(key: string, token: OAuthToken): Promise<void>;
|
|
57
|
+
load(key: string): Promise<OAuthToken | null>;
|
|
58
|
+
delete(key: string): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Token refresh function type
|
|
62
|
+
*/
|
|
63
|
+
export type TokenRefreshFn = (refreshToken: string, config: OAuthProviderConfig) => Promise<OAuthToken>;
|
|
64
|
+
/**
|
|
65
|
+
* OAuth token manager options
|
|
66
|
+
*/
|
|
67
|
+
export interface TokenManagerOptions {
|
|
68
|
+
/** Token storage */
|
|
69
|
+
storage?: TokenStorage;
|
|
70
|
+
/** Custom refresh function */
|
|
71
|
+
refreshFn?: TokenRefreshFn;
|
|
72
|
+
/** Auto-refresh enabled */
|
|
73
|
+
autoRefresh?: boolean;
|
|
74
|
+
/** Refresh buffer in ms (refresh before expiry) */
|
|
75
|
+
refreshBufferMs?: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* OAuth token manager
|
|
79
|
+
*/
|
|
80
|
+
export declare class OAuthTokenManager {
|
|
81
|
+
private providers;
|
|
82
|
+
private storage;
|
|
83
|
+
private refreshFn;
|
|
84
|
+
private autoRefresh;
|
|
85
|
+
private refreshBufferMs;
|
|
86
|
+
private refreshTimers;
|
|
87
|
+
private refreshPromises;
|
|
88
|
+
constructor(options?: TokenManagerOptions);
|
|
89
|
+
/**
|
|
90
|
+
* Register an OAuth provider
|
|
91
|
+
*/
|
|
92
|
+
registerProvider(config: OAuthProviderConfig): void;
|
|
93
|
+
/**
|
|
94
|
+
* Get provider config
|
|
95
|
+
*/
|
|
96
|
+
getProvider(name: string): OAuthProviderConfig | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Generate storage key
|
|
99
|
+
*/
|
|
100
|
+
private getStorageKey;
|
|
101
|
+
/**
|
|
102
|
+
* Store a token
|
|
103
|
+
*/
|
|
104
|
+
storeToken(provider: string, token: OAuthToken, userId?: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Schedule token refresh
|
|
107
|
+
*/
|
|
108
|
+
private scheduleRefresh;
|
|
109
|
+
/**
|
|
110
|
+
* Get a valid token, refreshing if necessary
|
|
111
|
+
*/
|
|
112
|
+
getToken(provider: string, userId?: string): Promise<OAuthToken | null>;
|
|
113
|
+
/**
|
|
114
|
+
* Refresh a token
|
|
115
|
+
*/
|
|
116
|
+
refreshToken(provider: string, userId?: string): Promise<OAuthToken>;
|
|
117
|
+
/**
|
|
118
|
+
* Revoke a token
|
|
119
|
+
*/
|
|
120
|
+
revokeToken(provider: string, userId?: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Check if a valid token exists
|
|
123
|
+
*/
|
|
124
|
+
hasValidToken(provider: string, userId?: string): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Get authorization URL for OAuth flow
|
|
127
|
+
*/
|
|
128
|
+
getAuthorizationUrl(provider: string, options: {
|
|
129
|
+
redirectUri: string;
|
|
130
|
+
state?: string;
|
|
131
|
+
scopes?: string[];
|
|
132
|
+
codeChallenge?: string;
|
|
133
|
+
codeChallengeMethod?: 'S256' | 'plain';
|
|
134
|
+
}): string;
|
|
135
|
+
/**
|
|
136
|
+
* Exchange authorization code for tokens
|
|
137
|
+
*/
|
|
138
|
+
exchangeCode(provider: string, code: string, redirectUri: string, codeVerifier?: string): Promise<OAuthToken>;
|
|
139
|
+
/**
|
|
140
|
+
* Cleanup all refresh timers
|
|
141
|
+
*/
|
|
142
|
+
cleanup(): void;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create an OAuth token manager
|
|
146
|
+
*/
|
|
147
|
+
export declare function createOAuthManager(options?: TokenManagerOptions): OAuthTokenManager;
|
|
148
|
+
/**
|
|
149
|
+
* Common OAuth provider configurations
|
|
150
|
+
*/
|
|
151
|
+
export declare const OAuthProviders: {
|
|
152
|
+
google: (clientId: string, clientSecret?: string) => OAuthProviderConfig;
|
|
153
|
+
github: (clientId: string, clientSecret?: string) => OAuthProviderConfig;
|
|
154
|
+
microsoft: (clientId: string, clientSecret?: string) => OAuthProviderConfig;
|
|
155
|
+
slack: (clientId: string, clientSecret?: string) => OAuthProviderConfig;
|
|
156
|
+
notion: (clientId: string, clientSecret?: string) => OAuthProviderConfig;
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Manager
|
|
3
|
+
* Manage OAuth tokens with automatic refresh
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* In-memory token storage
|
|
7
|
+
*/
|
|
8
|
+
export class InMemoryTokenStorage {
|
|
9
|
+
tokens = new Map();
|
|
10
|
+
async save(key, token) {
|
|
11
|
+
this.tokens.set(key, token);
|
|
12
|
+
}
|
|
13
|
+
async load(key) {
|
|
14
|
+
return this.tokens.get(key) || null;
|
|
15
|
+
}
|
|
16
|
+
async delete(key) {
|
|
17
|
+
this.tokens.delete(key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Default token refresh implementation
|
|
22
|
+
*/
|
|
23
|
+
async function defaultRefreshToken(refreshToken, config) {
|
|
24
|
+
const params = new URLSearchParams({
|
|
25
|
+
grant_type: 'refresh_token',
|
|
26
|
+
refresh_token: refreshToken,
|
|
27
|
+
client_id: config.clientId,
|
|
28
|
+
});
|
|
29
|
+
if (config.clientSecret) {
|
|
30
|
+
params.set('client_secret', config.clientSecret);
|
|
31
|
+
}
|
|
32
|
+
const response = await fetch(config.tokenUrl, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
36
|
+
},
|
|
37
|
+
body: params.toString(),
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const error = await response.text();
|
|
41
|
+
throw new Error(`Token refresh failed: ${error}`);
|
|
42
|
+
}
|
|
43
|
+
const data = await response.json();
|
|
44
|
+
return {
|
|
45
|
+
accessToken: data.access_token,
|
|
46
|
+
tokenType: data.token_type || 'Bearer',
|
|
47
|
+
expiresAt: new Date(Date.now() + data.expires_in * 1000),
|
|
48
|
+
refreshToken: data.refresh_token || refreshToken,
|
|
49
|
+
scope: data.scope,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* OAuth token manager
|
|
54
|
+
*/
|
|
55
|
+
export class OAuthTokenManager {
|
|
56
|
+
providers = new Map();
|
|
57
|
+
storage;
|
|
58
|
+
refreshFn;
|
|
59
|
+
autoRefresh;
|
|
60
|
+
refreshBufferMs;
|
|
61
|
+
refreshTimers = new Map();
|
|
62
|
+
refreshPromises = new Map();
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
this.storage = options.storage || new InMemoryTokenStorage();
|
|
65
|
+
this.refreshFn = options.refreshFn || defaultRefreshToken;
|
|
66
|
+
this.autoRefresh = options.autoRefresh ?? true;
|
|
67
|
+
this.refreshBufferMs = options.refreshBufferMs ?? 60000; // 1 minute default
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register an OAuth provider
|
|
71
|
+
*/
|
|
72
|
+
registerProvider(config) {
|
|
73
|
+
this.providers.set(config.name, config);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get provider config
|
|
77
|
+
*/
|
|
78
|
+
getProvider(name) {
|
|
79
|
+
return this.providers.get(name);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate storage key
|
|
83
|
+
*/
|
|
84
|
+
getStorageKey(provider, userId) {
|
|
85
|
+
return userId ? `${provider}:${userId}` : provider;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Store a token
|
|
89
|
+
*/
|
|
90
|
+
async storeToken(provider, token, userId) {
|
|
91
|
+
const key = this.getStorageKey(provider, userId);
|
|
92
|
+
await this.storage.save(key, token);
|
|
93
|
+
// Setup auto-refresh if enabled
|
|
94
|
+
if (this.autoRefresh && token.refreshToken) {
|
|
95
|
+
this.scheduleRefresh(provider, key, token);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Schedule token refresh
|
|
100
|
+
*/
|
|
101
|
+
scheduleRefresh(provider, key, token) {
|
|
102
|
+
// Clear existing timer
|
|
103
|
+
const existingTimer = this.refreshTimers.get(key);
|
|
104
|
+
if (existingTimer) {
|
|
105
|
+
clearTimeout(existingTimer);
|
|
106
|
+
}
|
|
107
|
+
// Calculate time until refresh
|
|
108
|
+
const config = this.providers.get(provider);
|
|
109
|
+
const bufferMs = config?.refreshBufferMs ?? this.refreshBufferMs;
|
|
110
|
+
const refreshAt = token.expiresAt.getTime() - bufferMs;
|
|
111
|
+
const delay = Math.max(0, refreshAt - Date.now());
|
|
112
|
+
// Schedule refresh
|
|
113
|
+
const timer = setTimeout(async () => {
|
|
114
|
+
try {
|
|
115
|
+
await this.refreshToken(provider, key.split(':')[1]);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error(`Auto-refresh failed for ${key}:`, error);
|
|
119
|
+
}
|
|
120
|
+
}, delay);
|
|
121
|
+
this.refreshTimers.set(key, timer);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get a valid token, refreshing if necessary
|
|
125
|
+
*/
|
|
126
|
+
async getToken(provider, userId) {
|
|
127
|
+
const key = this.getStorageKey(provider, userId);
|
|
128
|
+
const token = await this.storage.load(key);
|
|
129
|
+
if (!token) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
// Check if token is expired or about to expire
|
|
133
|
+
const config = this.providers.get(provider);
|
|
134
|
+
const bufferMs = config?.refreshBufferMs ?? this.refreshBufferMs;
|
|
135
|
+
const isExpired = token.expiresAt.getTime() - bufferMs < Date.now();
|
|
136
|
+
if (isExpired && token.refreshToken) {
|
|
137
|
+
return this.refreshToken(provider, userId);
|
|
138
|
+
}
|
|
139
|
+
return token;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Refresh a token
|
|
143
|
+
*/
|
|
144
|
+
async refreshToken(provider, userId) {
|
|
145
|
+
const key = this.getStorageKey(provider, userId);
|
|
146
|
+
// Check for in-flight refresh
|
|
147
|
+
const existingPromise = this.refreshPromises.get(key);
|
|
148
|
+
if (existingPromise) {
|
|
149
|
+
return existingPromise;
|
|
150
|
+
}
|
|
151
|
+
const config = this.providers.get(provider);
|
|
152
|
+
if (!config) {
|
|
153
|
+
throw new Error(`Unknown OAuth provider: ${provider}`);
|
|
154
|
+
}
|
|
155
|
+
const currentToken = await this.storage.load(key);
|
|
156
|
+
if (!currentToken?.refreshToken) {
|
|
157
|
+
throw new Error('No refresh token available');
|
|
158
|
+
}
|
|
159
|
+
// Create refresh promise
|
|
160
|
+
const refreshPromise = (async () => {
|
|
161
|
+
try {
|
|
162
|
+
const newToken = await this.refreshFn(currentToken.refreshToken, config);
|
|
163
|
+
await this.storeToken(provider, newToken, userId);
|
|
164
|
+
return newToken;
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
this.refreshPromises.delete(key);
|
|
168
|
+
}
|
|
169
|
+
})();
|
|
170
|
+
this.refreshPromises.set(key, refreshPromise);
|
|
171
|
+
return refreshPromise;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Revoke a token
|
|
175
|
+
*/
|
|
176
|
+
async revokeToken(provider, userId) {
|
|
177
|
+
const key = this.getStorageKey(provider, userId);
|
|
178
|
+
const config = this.providers.get(provider);
|
|
179
|
+
const token = await this.storage.load(key);
|
|
180
|
+
if (config?.revocationUrl && token) {
|
|
181
|
+
try {
|
|
182
|
+
const params = new URLSearchParams({
|
|
183
|
+
token: token.accessToken,
|
|
184
|
+
client_id: config.clientId,
|
|
185
|
+
});
|
|
186
|
+
if (config.clientSecret) {
|
|
187
|
+
params.set('client_secret', config.clientSecret);
|
|
188
|
+
}
|
|
189
|
+
await fetch(config.revocationUrl, {
|
|
190
|
+
method: 'POST',
|
|
191
|
+
headers: {
|
|
192
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
193
|
+
},
|
|
194
|
+
body: params.toString(),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('Token revocation failed:', error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Clear timer and storage
|
|
202
|
+
const timer = this.refreshTimers.get(key);
|
|
203
|
+
if (timer) {
|
|
204
|
+
clearTimeout(timer);
|
|
205
|
+
this.refreshTimers.delete(key);
|
|
206
|
+
}
|
|
207
|
+
await this.storage.delete(key);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check if a valid token exists
|
|
211
|
+
*/
|
|
212
|
+
async hasValidToken(provider, userId) {
|
|
213
|
+
const token = await this.getToken(provider, userId);
|
|
214
|
+
return token !== null;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get authorization URL for OAuth flow
|
|
218
|
+
*/
|
|
219
|
+
getAuthorizationUrl(provider, options) {
|
|
220
|
+
const config = this.providers.get(provider);
|
|
221
|
+
if (!config) {
|
|
222
|
+
throw new Error(`Unknown OAuth provider: ${provider}`);
|
|
223
|
+
}
|
|
224
|
+
const params = new URLSearchParams({
|
|
225
|
+
response_type: 'code',
|
|
226
|
+
client_id: config.clientId,
|
|
227
|
+
redirect_uri: options.redirectUri,
|
|
228
|
+
});
|
|
229
|
+
const scopes = options.scopes || config.defaultScopes;
|
|
230
|
+
if (scopes?.length) {
|
|
231
|
+
params.set('scope', scopes.join(' '));
|
|
232
|
+
}
|
|
233
|
+
if (options.state) {
|
|
234
|
+
params.set('state', options.state);
|
|
235
|
+
}
|
|
236
|
+
if (options.codeChallenge) {
|
|
237
|
+
params.set('code_challenge', options.codeChallenge);
|
|
238
|
+
params.set('code_challenge_method', options.codeChallengeMethod || 'S256');
|
|
239
|
+
}
|
|
240
|
+
return `${config.authorizationUrl}?${params.toString()}`;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Exchange authorization code for tokens
|
|
244
|
+
*/
|
|
245
|
+
async exchangeCode(provider, code, redirectUri, codeVerifier) {
|
|
246
|
+
const config = this.providers.get(provider);
|
|
247
|
+
if (!config) {
|
|
248
|
+
throw new Error(`Unknown OAuth provider: ${provider}`);
|
|
249
|
+
}
|
|
250
|
+
const params = new URLSearchParams({
|
|
251
|
+
grant_type: 'authorization_code',
|
|
252
|
+
code,
|
|
253
|
+
redirect_uri: redirectUri,
|
|
254
|
+
client_id: config.clientId,
|
|
255
|
+
});
|
|
256
|
+
if (config.clientSecret) {
|
|
257
|
+
params.set('client_secret', config.clientSecret);
|
|
258
|
+
}
|
|
259
|
+
if (codeVerifier) {
|
|
260
|
+
params.set('code_verifier', codeVerifier);
|
|
261
|
+
}
|
|
262
|
+
const response = await fetch(config.tokenUrl, {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
headers: {
|
|
265
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
266
|
+
},
|
|
267
|
+
body: params.toString(),
|
|
268
|
+
});
|
|
269
|
+
if (!response.ok) {
|
|
270
|
+
const error = await response.text();
|
|
271
|
+
throw new Error(`Token exchange failed: ${error}`);
|
|
272
|
+
}
|
|
273
|
+
const data = await response.json();
|
|
274
|
+
return {
|
|
275
|
+
accessToken: data.access_token,
|
|
276
|
+
tokenType: data.token_type || 'Bearer',
|
|
277
|
+
expiresAt: new Date(Date.now() + data.expires_in * 1000),
|
|
278
|
+
refreshToken: data.refresh_token,
|
|
279
|
+
scope: data.scope,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Cleanup all refresh timers
|
|
284
|
+
*/
|
|
285
|
+
cleanup() {
|
|
286
|
+
for (const timer of this.refreshTimers.values()) {
|
|
287
|
+
clearTimeout(timer);
|
|
288
|
+
}
|
|
289
|
+
this.refreshTimers.clear();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Create an OAuth token manager
|
|
294
|
+
*/
|
|
295
|
+
export function createOAuthManager(options) {
|
|
296
|
+
return new OAuthTokenManager(options);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Common OAuth provider configurations
|
|
300
|
+
*/
|
|
301
|
+
export const OAuthProviders = {
|
|
302
|
+
google: (clientId, clientSecret) => ({
|
|
303
|
+
name: 'google',
|
|
304
|
+
authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
305
|
+
tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
306
|
+
revocationUrl: 'https://oauth2.googleapis.com/revoke',
|
|
307
|
+
clientId,
|
|
308
|
+
clientSecret,
|
|
309
|
+
defaultScopes: ['openid', 'email', 'profile'],
|
|
310
|
+
}),
|
|
311
|
+
github: (clientId, clientSecret) => ({
|
|
312
|
+
name: 'github',
|
|
313
|
+
authorizationUrl: 'https://github.com/login/oauth/authorize',
|
|
314
|
+
tokenUrl: 'https://github.com/login/oauth/access_token',
|
|
315
|
+
clientId,
|
|
316
|
+
clientSecret,
|
|
317
|
+
defaultScopes: ['read:user', 'user:email'],
|
|
318
|
+
}),
|
|
319
|
+
microsoft: (clientId, clientSecret) => ({
|
|
320
|
+
name: 'microsoft',
|
|
321
|
+
authorizationUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
|
|
322
|
+
tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
|
|
323
|
+
clientId,
|
|
324
|
+
clientSecret,
|
|
325
|
+
defaultScopes: ['openid', 'email', 'profile', 'offline_access'],
|
|
326
|
+
}),
|
|
327
|
+
slack: (clientId, clientSecret) => ({
|
|
328
|
+
name: 'slack',
|
|
329
|
+
authorizationUrl: 'https://slack.com/oauth/v2/authorize',
|
|
330
|
+
tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
331
|
+
revocationUrl: 'https://slack.com/api/auth.revoke',
|
|
332
|
+
clientId,
|
|
333
|
+
clientSecret,
|
|
334
|
+
}),
|
|
335
|
+
notion: (clientId, clientSecret) => ({
|
|
336
|
+
name: 'notion',
|
|
337
|
+
authorizationUrl: 'https://api.notion.com/v1/oauth/authorize',
|
|
338
|
+
tokenUrl: 'https://api.notion.com/v1/oauth/token',
|
|
339
|
+
clientId,
|
|
340
|
+
clientSecret,
|
|
341
|
+
defaultScopes: [],
|
|
342
|
+
}),
|
|
343
|
+
};
|
|
344
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|