integrate-sdk 0.9.0 → 0.9.3-dev.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/dist/adapters/auto-routes.d.ts.map +1 -1
- package/dist/adapters/auto-routes.js +107 -1
- package/dist/adapters/base-handler.d.ts +30 -0
- package/dist/adapters/base-handler.d.ts.map +1 -1
- package/dist/adapters/index.js +98 -0
- package/dist/adapters/nextjs.d.ts +17 -0
- package/dist/adapters/nextjs.d.ts.map +1 -1
- package/dist/adapters/nextjs.js +98 -0
- package/dist/adapters/node.js +98 -0
- package/dist/adapters/svelte-kit.js +98 -0
- package/dist/adapters/tanstack-start.js +98 -0
- package/dist/index.js +98 -0
- package/dist/oauth.js +107 -1
- package/dist/server.js +98 -0
- package/dist/src/adapters/auto-routes.d.ts.map +1 -1
- package/dist/src/adapters/base-handler.d.ts +30 -0
- package/dist/src/adapters/base-handler.d.ts.map +1 -1
- package/dist/src/adapters/nextjs.d.ts +17 -0
- package/dist/src/adapters/nextjs.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-routes.d.ts","sourceRoot":"","sources":["../../../src/adapters/auto-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,GAAG,IAAI,CAEhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AAkBH;;;GAGG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"auto-routes.d.ts","sourceRoot":"","sources":["../../../src/adapters/auto-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAe1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,GAAG,IAAI,CAEhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AAkBH;;;GAGG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CAwEd;AAED;;;GAGG;AACH,wBAAsB,GAAG,CACvB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC,OAAO,CAAC,GAAG,CAAC,CAoCd"}
|
|
@@ -11826,6 +11826,81 @@ class OAuthHandler {
|
|
|
11826
11826
|
const data = await response.json();
|
|
11827
11827
|
return data;
|
|
11828
11828
|
}
|
|
11829
|
+
async handleRefresh(request) {
|
|
11830
|
+
let webRequest;
|
|
11831
|
+
let refreshRequest;
|
|
11832
|
+
if (request instanceof Request) {
|
|
11833
|
+
webRequest = request;
|
|
11834
|
+
refreshRequest = await request.json();
|
|
11835
|
+
} else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
|
|
11836
|
+
refreshRequest = await request.json();
|
|
11837
|
+
} else {
|
|
11838
|
+
refreshRequest = request;
|
|
11839
|
+
}
|
|
11840
|
+
const providerConfig = this.config.providers[refreshRequest.provider];
|
|
11841
|
+
if (!providerConfig) {
|
|
11842
|
+
throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
11843
|
+
}
|
|
11844
|
+
let context;
|
|
11845
|
+
if (webRequest) {
|
|
11846
|
+
try {
|
|
11847
|
+
if (this.config.getSessionContext) {
|
|
11848
|
+
context = await this.config.getSessionContext(webRequest);
|
|
11849
|
+
}
|
|
11850
|
+
if (!context || !context.userId) {
|
|
11851
|
+
const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
|
|
11852
|
+
context = await detectSessionContext2(webRequest);
|
|
11853
|
+
}
|
|
11854
|
+
} catch (error) {}
|
|
11855
|
+
}
|
|
11856
|
+
const body = {
|
|
11857
|
+
provider: refreshRequest.provider,
|
|
11858
|
+
refresh_token: refreshRequest.refreshToken,
|
|
11859
|
+
client_id: providerConfig.clientId
|
|
11860
|
+
};
|
|
11861
|
+
if (providerConfig.clientSecret) {
|
|
11862
|
+
body.client_secret = providerConfig.clientSecret;
|
|
11863
|
+
}
|
|
11864
|
+
if (providerConfig.config?.subdomain) {
|
|
11865
|
+
body.subdomain = providerConfig.config.subdomain;
|
|
11866
|
+
}
|
|
11867
|
+
const url = new URL("/oauth/refresh", this.serverUrl);
|
|
11868
|
+
const response = await fetch(url.toString(), {
|
|
11869
|
+
method: "POST",
|
|
11870
|
+
headers: this.getHeaders({
|
|
11871
|
+
"Content-Type": "application/json"
|
|
11872
|
+
}),
|
|
11873
|
+
body: JSON.stringify(body)
|
|
11874
|
+
});
|
|
11875
|
+
if (!response.ok) {
|
|
11876
|
+
const error = await response.text();
|
|
11877
|
+
const lowerError = error.toLowerCase();
|
|
11878
|
+
if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
|
|
11879
|
+
throw new Error(`Token refresh not supported: ${error}`);
|
|
11880
|
+
}
|
|
11881
|
+
throw new Error(`Token refresh failed: ${error}`);
|
|
11882
|
+
}
|
|
11883
|
+
const data = await response.json();
|
|
11884
|
+
const result = data;
|
|
11885
|
+
if (this.config.setProviderToken) {
|
|
11886
|
+
try {
|
|
11887
|
+
const tokenData = {
|
|
11888
|
+
accessToken: result.accessToken,
|
|
11889
|
+
refreshToken: result.refreshToken,
|
|
11890
|
+
tokenType: result.tokenType,
|
|
11891
|
+
expiresIn: result.expiresIn,
|
|
11892
|
+
expiresAt: result.expiresAt,
|
|
11893
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11894
|
+
};
|
|
11895
|
+
const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
|
|
11896
|
+
if (email) {
|
|
11897
|
+
tokenData.email = email;
|
|
11898
|
+
}
|
|
11899
|
+
await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
|
|
11900
|
+
} catch (error) {}
|
|
11901
|
+
}
|
|
11902
|
+
return result;
|
|
11903
|
+
}
|
|
11829
11904
|
async handleToolCall(request, authHeader, integrationsHeader) {
|
|
11830
11905
|
const url = this.serverUrl;
|
|
11831
11906
|
const headers = this.getHeaders({
|
|
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
|
|
|
11956
12031
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11957
12032
|
}
|
|
11958
12033
|
},
|
|
12034
|
+
async refresh(req) {
|
|
12035
|
+
try {
|
|
12036
|
+
const result = await handler.handleRefresh(req);
|
|
12037
|
+
const response = Response.json(result);
|
|
12038
|
+
if (handler.hasDatabaseCallbacks()) {
|
|
12039
|
+
response.headers.set("X-Integrate-Use-Database", "true");
|
|
12040
|
+
}
|
|
12041
|
+
return response;
|
|
12042
|
+
} catch (error) {
|
|
12043
|
+
if (error.message?.toLowerCase().includes("not supported")) {
|
|
12044
|
+
logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
|
|
12045
|
+
} else {
|
|
12046
|
+
logger33.error("[OAuth Refresh] Error:", error);
|
|
12047
|
+
}
|
|
12048
|
+
return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
|
|
12049
|
+
}
|
|
12050
|
+
},
|
|
11959
12051
|
createRoutes() {
|
|
11960
12052
|
return {
|
|
11961
12053
|
async POST(req, context) {
|
|
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
|
|
|
11970
12062
|
if (action === "disconnect") {
|
|
11971
12063
|
return handlers.disconnect(req);
|
|
11972
12064
|
}
|
|
12065
|
+
if (action === "refresh") {
|
|
12066
|
+
return handlers.refresh(req);
|
|
12067
|
+
}
|
|
11973
12068
|
if (action === "mcp") {
|
|
11974
12069
|
return handlers.mcp(req);
|
|
11975
12070
|
}
|
|
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
|
|
|
12015
12110
|
if (action === "disconnect") {
|
|
12016
12111
|
return handlers.disconnect(req);
|
|
12017
12112
|
}
|
|
12113
|
+
if (action === "refresh") {
|
|
12114
|
+
return handlers.refresh(req);
|
|
12115
|
+
}
|
|
12018
12116
|
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
12019
12117
|
}
|
|
12020
12118
|
if (segments.length === 1 && segments[0] === "mcp") {
|
|
@@ -12138,9 +12236,17 @@ async function POST2(req, context) {
|
|
|
12138
12236
|
const result = await handler.handleDisconnect({ provider: body.provider }, accessToken, req);
|
|
12139
12237
|
return createSuccessResponse(result);
|
|
12140
12238
|
}
|
|
12239
|
+
if (action === "refresh") {
|
|
12240
|
+
const result = await handler.handleRefresh(req);
|
|
12241
|
+
return createSuccessResponse(result);
|
|
12242
|
+
}
|
|
12141
12243
|
return createErrorResponse(`Unknown action: ${action}`, 404);
|
|
12142
12244
|
} catch (error) {
|
|
12143
|
-
|
|
12245
|
+
if (action === "refresh" && error.message?.toLowerCase().includes("not supported")) {
|
|
12246
|
+
logger34.info(`[OAuth ${action}] Not supported for this provider:`, error.message);
|
|
12247
|
+
} else {
|
|
12248
|
+
logger34.error(`[OAuth ${action}] Error:`, error);
|
|
12249
|
+
}
|
|
12144
12250
|
return createErrorResponse(error.message, 500);
|
|
12145
12251
|
}
|
|
12146
12252
|
}
|
|
@@ -179,6 +179,25 @@ export interface DisconnectResponse {
|
|
|
179
179
|
success: boolean;
|
|
180
180
|
provider: string;
|
|
181
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Request body for token refresh endpoint
|
|
184
|
+
*/
|
|
185
|
+
export interface RefreshRequest {
|
|
186
|
+
provider: string;
|
|
187
|
+
refreshToken: string;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Response from token refresh endpoint
|
|
191
|
+
*/
|
|
192
|
+
export interface RefreshResponse {
|
|
193
|
+
accessToken: string;
|
|
194
|
+
refreshToken?: string;
|
|
195
|
+
tokenType: string;
|
|
196
|
+
expiresIn: number;
|
|
197
|
+
expiresAt?: string;
|
|
198
|
+
scopes?: string[];
|
|
199
|
+
email?: string;
|
|
200
|
+
}
|
|
182
201
|
/**
|
|
183
202
|
* Request body for MCP tool call endpoint
|
|
184
203
|
*/
|
|
@@ -285,6 +304,17 @@ export declare class OAuthHandler {
|
|
|
285
304
|
* @throws Error if MCP server request fails
|
|
286
305
|
*/
|
|
287
306
|
handleDisconnect(request: DisconnectRequest, accessToken: string, webRequest?: Request): Promise<DisconnectResponse>;
|
|
307
|
+
/**
|
|
308
|
+
* Handle token refresh
|
|
309
|
+
* Refreshes an expired access token via the MCP server's /oauth/refresh endpoint
|
|
310
|
+
*
|
|
311
|
+
* @param request - Refresh request with provider and refreshToken, OR full Web Request object
|
|
312
|
+
* @returns Refreshed token data
|
|
313
|
+
*
|
|
314
|
+
* @throws Error if provider is not configured
|
|
315
|
+
* @throws Error if MCP server request fails
|
|
316
|
+
*/
|
|
317
|
+
handleRefresh(request: RefreshRequest | Request): Promise<RefreshResponse>;
|
|
288
318
|
/**
|
|
289
319
|
* Handle MCP tool call
|
|
290
320
|
* Forwards tool call requests to MCP server with API key and provider token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base-handler.d.ts","sourceRoot":"","sources":["../../../src/adapters/base-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/index.js
CHANGED
|
@@ -11826,6 +11826,81 @@ class OAuthHandler {
|
|
|
11826
11826
|
const data = await response.json();
|
|
11827
11827
|
return data;
|
|
11828
11828
|
}
|
|
11829
|
+
async handleRefresh(request) {
|
|
11830
|
+
let webRequest;
|
|
11831
|
+
let refreshRequest;
|
|
11832
|
+
if (request instanceof Request) {
|
|
11833
|
+
webRequest = request;
|
|
11834
|
+
refreshRequest = await request.json();
|
|
11835
|
+
} else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
|
|
11836
|
+
refreshRequest = await request.json();
|
|
11837
|
+
} else {
|
|
11838
|
+
refreshRequest = request;
|
|
11839
|
+
}
|
|
11840
|
+
const providerConfig = this.config.providers[refreshRequest.provider];
|
|
11841
|
+
if (!providerConfig) {
|
|
11842
|
+
throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
11843
|
+
}
|
|
11844
|
+
let context;
|
|
11845
|
+
if (webRequest) {
|
|
11846
|
+
try {
|
|
11847
|
+
if (this.config.getSessionContext) {
|
|
11848
|
+
context = await this.config.getSessionContext(webRequest);
|
|
11849
|
+
}
|
|
11850
|
+
if (!context || !context.userId) {
|
|
11851
|
+
const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
|
|
11852
|
+
context = await detectSessionContext2(webRequest);
|
|
11853
|
+
}
|
|
11854
|
+
} catch (error) {}
|
|
11855
|
+
}
|
|
11856
|
+
const body = {
|
|
11857
|
+
provider: refreshRequest.provider,
|
|
11858
|
+
refresh_token: refreshRequest.refreshToken,
|
|
11859
|
+
client_id: providerConfig.clientId
|
|
11860
|
+
};
|
|
11861
|
+
if (providerConfig.clientSecret) {
|
|
11862
|
+
body.client_secret = providerConfig.clientSecret;
|
|
11863
|
+
}
|
|
11864
|
+
if (providerConfig.config?.subdomain) {
|
|
11865
|
+
body.subdomain = providerConfig.config.subdomain;
|
|
11866
|
+
}
|
|
11867
|
+
const url = new URL("/oauth/refresh", this.serverUrl);
|
|
11868
|
+
const response = await fetch(url.toString(), {
|
|
11869
|
+
method: "POST",
|
|
11870
|
+
headers: this.getHeaders({
|
|
11871
|
+
"Content-Type": "application/json"
|
|
11872
|
+
}),
|
|
11873
|
+
body: JSON.stringify(body)
|
|
11874
|
+
});
|
|
11875
|
+
if (!response.ok) {
|
|
11876
|
+
const error = await response.text();
|
|
11877
|
+
const lowerError = error.toLowerCase();
|
|
11878
|
+
if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
|
|
11879
|
+
throw new Error(`Token refresh not supported: ${error}`);
|
|
11880
|
+
}
|
|
11881
|
+
throw new Error(`Token refresh failed: ${error}`);
|
|
11882
|
+
}
|
|
11883
|
+
const data = await response.json();
|
|
11884
|
+
const result = data;
|
|
11885
|
+
if (this.config.setProviderToken) {
|
|
11886
|
+
try {
|
|
11887
|
+
const tokenData = {
|
|
11888
|
+
accessToken: result.accessToken,
|
|
11889
|
+
refreshToken: result.refreshToken,
|
|
11890
|
+
tokenType: result.tokenType,
|
|
11891
|
+
expiresIn: result.expiresIn,
|
|
11892
|
+
expiresAt: result.expiresAt,
|
|
11893
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11894
|
+
};
|
|
11895
|
+
const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
|
|
11896
|
+
if (email) {
|
|
11897
|
+
tokenData.email = email;
|
|
11898
|
+
}
|
|
11899
|
+
await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
|
|
11900
|
+
} catch (error) {}
|
|
11901
|
+
}
|
|
11902
|
+
return result;
|
|
11903
|
+
}
|
|
11829
11904
|
async handleToolCall(request, authHeader, integrationsHeader) {
|
|
11830
11905
|
const url = this.serverUrl;
|
|
11831
11906
|
const headers = this.getHeaders({
|
|
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
|
|
|
11956
12031
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11957
12032
|
}
|
|
11958
12033
|
},
|
|
12034
|
+
async refresh(req) {
|
|
12035
|
+
try {
|
|
12036
|
+
const result = await handler.handleRefresh(req);
|
|
12037
|
+
const response = Response.json(result);
|
|
12038
|
+
if (handler.hasDatabaseCallbacks()) {
|
|
12039
|
+
response.headers.set("X-Integrate-Use-Database", "true");
|
|
12040
|
+
}
|
|
12041
|
+
return response;
|
|
12042
|
+
} catch (error) {
|
|
12043
|
+
if (error.message?.toLowerCase().includes("not supported")) {
|
|
12044
|
+
logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
|
|
12045
|
+
} else {
|
|
12046
|
+
logger33.error("[OAuth Refresh] Error:", error);
|
|
12047
|
+
}
|
|
12048
|
+
return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
|
|
12049
|
+
}
|
|
12050
|
+
},
|
|
11959
12051
|
createRoutes() {
|
|
11960
12052
|
return {
|
|
11961
12053
|
async POST(req, context) {
|
|
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
|
|
|
11970
12062
|
if (action === "disconnect") {
|
|
11971
12063
|
return handlers.disconnect(req);
|
|
11972
12064
|
}
|
|
12065
|
+
if (action === "refresh") {
|
|
12066
|
+
return handlers.refresh(req);
|
|
12067
|
+
}
|
|
11973
12068
|
if (action === "mcp") {
|
|
11974
12069
|
return handlers.mcp(req);
|
|
11975
12070
|
}
|
|
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
|
|
|
12015
12110
|
if (action === "disconnect") {
|
|
12016
12111
|
return handlers.disconnect(req);
|
|
12017
12112
|
}
|
|
12113
|
+
if (action === "refresh") {
|
|
12114
|
+
return handlers.refresh(req);
|
|
12115
|
+
}
|
|
12018
12116
|
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
12019
12117
|
}
|
|
12020
12118
|
if (segments.length === 1 && segments[0] === "mcp") {
|
|
@@ -218,6 +218,22 @@ export declare function createNextOAuthHandler(config: OAuthHandlerConfig): {
|
|
|
218
218
|
* ```
|
|
219
219
|
*/
|
|
220
220
|
disconnect(req: NextRequest): Promise<NextResponse>;
|
|
221
|
+
/**
|
|
222
|
+
* POST /api/integrate/oauth/refresh
|
|
223
|
+
*
|
|
224
|
+
* Refresh an expired access token via the MCP server
|
|
225
|
+
*
|
|
226
|
+
* Request body:
|
|
227
|
+
* ```json
|
|
228
|
+
* {
|
|
229
|
+
* "provider": "github",
|
|
230
|
+
* "refreshToken": "<stored-refresh-token>"
|
|
231
|
+
* }
|
|
232
|
+
* ```
|
|
233
|
+
*
|
|
234
|
+
* Response: Same shape as callback response (accessToken, refreshToken, etc.)
|
|
235
|
+
*/
|
|
236
|
+
refresh(req: NextRequest): Promise<NextResponse>;
|
|
221
237
|
/**
|
|
222
238
|
* Create unified route handlers for catch-all route
|
|
223
239
|
*
|
|
@@ -324,6 +340,7 @@ export declare function createNextOAuthHandler(config: OAuthHandlerConfig): {
|
|
|
324
340
|
* - GET /api/integrate/oauth/callback - Provider OAuth redirect
|
|
325
341
|
* - GET /api/integrate/oauth/status - Check authorization status
|
|
326
342
|
* - POST /api/integrate/oauth/disconnect - Disconnect provider
|
|
343
|
+
* - POST /api/integrate/oauth/refresh - Refresh expired token
|
|
327
344
|
* - POST /api/integrate/mcp - Execute MCP tool calls
|
|
328
345
|
*/
|
|
329
346
|
toNextJsHandler(redirectConfig?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU1E,KAAK,WAAW,GAAG,GAAG,CAAC;AACvB,KAAK,YAAY,GAAG,GAAG,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB;IAI7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;mBACkB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;kBACiB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;gBACe,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;oBACmB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD;;;;;;;;;;;;;;OAcG;iBACgB,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;QAGC;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;QA+BxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GACpE,OAAO,CAAC,YAAY,CAAC;;IAiB5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACY,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;qCAC8B;QAC/B,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;QAKG;;WAEG;kBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;QA0CxB;;WAEG;iBAEI,WAAW,WACP;YAAE,MAAM,EAAE;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,GAAG,OAAO,CAAC;gBAAE,GAAG,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,GAClE,OAAO,CAAC,YAAY,CAAC;;EAqG/B"}
|
package/dist/adapters/nextjs.js
CHANGED
|
@@ -11826,6 +11826,81 @@ class OAuthHandler {
|
|
|
11826
11826
|
const data = await response.json();
|
|
11827
11827
|
return data;
|
|
11828
11828
|
}
|
|
11829
|
+
async handleRefresh(request) {
|
|
11830
|
+
let webRequest;
|
|
11831
|
+
let refreshRequest;
|
|
11832
|
+
if (request instanceof Request) {
|
|
11833
|
+
webRequest = request;
|
|
11834
|
+
refreshRequest = await request.json();
|
|
11835
|
+
} else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
|
|
11836
|
+
refreshRequest = await request.json();
|
|
11837
|
+
} else {
|
|
11838
|
+
refreshRequest = request;
|
|
11839
|
+
}
|
|
11840
|
+
const providerConfig = this.config.providers[refreshRequest.provider];
|
|
11841
|
+
if (!providerConfig) {
|
|
11842
|
+
throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
11843
|
+
}
|
|
11844
|
+
let context;
|
|
11845
|
+
if (webRequest) {
|
|
11846
|
+
try {
|
|
11847
|
+
if (this.config.getSessionContext) {
|
|
11848
|
+
context = await this.config.getSessionContext(webRequest);
|
|
11849
|
+
}
|
|
11850
|
+
if (!context || !context.userId) {
|
|
11851
|
+
const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
|
|
11852
|
+
context = await detectSessionContext2(webRequest);
|
|
11853
|
+
}
|
|
11854
|
+
} catch (error) {}
|
|
11855
|
+
}
|
|
11856
|
+
const body = {
|
|
11857
|
+
provider: refreshRequest.provider,
|
|
11858
|
+
refresh_token: refreshRequest.refreshToken,
|
|
11859
|
+
client_id: providerConfig.clientId
|
|
11860
|
+
};
|
|
11861
|
+
if (providerConfig.clientSecret) {
|
|
11862
|
+
body.client_secret = providerConfig.clientSecret;
|
|
11863
|
+
}
|
|
11864
|
+
if (providerConfig.config?.subdomain) {
|
|
11865
|
+
body.subdomain = providerConfig.config.subdomain;
|
|
11866
|
+
}
|
|
11867
|
+
const url = new URL("/oauth/refresh", this.serverUrl);
|
|
11868
|
+
const response = await fetch(url.toString(), {
|
|
11869
|
+
method: "POST",
|
|
11870
|
+
headers: this.getHeaders({
|
|
11871
|
+
"Content-Type": "application/json"
|
|
11872
|
+
}),
|
|
11873
|
+
body: JSON.stringify(body)
|
|
11874
|
+
});
|
|
11875
|
+
if (!response.ok) {
|
|
11876
|
+
const error = await response.text();
|
|
11877
|
+
const lowerError = error.toLowerCase();
|
|
11878
|
+
if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
|
|
11879
|
+
throw new Error(`Token refresh not supported: ${error}`);
|
|
11880
|
+
}
|
|
11881
|
+
throw new Error(`Token refresh failed: ${error}`);
|
|
11882
|
+
}
|
|
11883
|
+
const data = await response.json();
|
|
11884
|
+
const result = data;
|
|
11885
|
+
if (this.config.setProviderToken) {
|
|
11886
|
+
try {
|
|
11887
|
+
const tokenData = {
|
|
11888
|
+
accessToken: result.accessToken,
|
|
11889
|
+
refreshToken: result.refreshToken,
|
|
11890
|
+
tokenType: result.tokenType,
|
|
11891
|
+
expiresIn: result.expiresIn,
|
|
11892
|
+
expiresAt: result.expiresAt,
|
|
11893
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11894
|
+
};
|
|
11895
|
+
const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
|
|
11896
|
+
if (email) {
|
|
11897
|
+
tokenData.email = email;
|
|
11898
|
+
}
|
|
11899
|
+
await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
|
|
11900
|
+
} catch (error) {}
|
|
11901
|
+
}
|
|
11902
|
+
return result;
|
|
11903
|
+
}
|
|
11829
11904
|
async handleToolCall(request, authHeader, integrationsHeader) {
|
|
11830
11905
|
const url = this.serverUrl;
|
|
11831
11906
|
const headers = this.getHeaders({
|
|
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
|
|
|
11956
12031
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11957
12032
|
}
|
|
11958
12033
|
},
|
|
12034
|
+
async refresh(req) {
|
|
12035
|
+
try {
|
|
12036
|
+
const result = await handler.handleRefresh(req);
|
|
12037
|
+
const response = Response.json(result);
|
|
12038
|
+
if (handler.hasDatabaseCallbacks()) {
|
|
12039
|
+
response.headers.set("X-Integrate-Use-Database", "true");
|
|
12040
|
+
}
|
|
12041
|
+
return response;
|
|
12042
|
+
} catch (error) {
|
|
12043
|
+
if (error.message?.toLowerCase().includes("not supported")) {
|
|
12044
|
+
logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
|
|
12045
|
+
} else {
|
|
12046
|
+
logger33.error("[OAuth Refresh] Error:", error);
|
|
12047
|
+
}
|
|
12048
|
+
return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
|
|
12049
|
+
}
|
|
12050
|
+
},
|
|
11959
12051
|
createRoutes() {
|
|
11960
12052
|
return {
|
|
11961
12053
|
async POST(req, context) {
|
|
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
|
|
|
11970
12062
|
if (action === "disconnect") {
|
|
11971
12063
|
return handlers.disconnect(req);
|
|
11972
12064
|
}
|
|
12065
|
+
if (action === "refresh") {
|
|
12066
|
+
return handlers.refresh(req);
|
|
12067
|
+
}
|
|
11973
12068
|
if (action === "mcp") {
|
|
11974
12069
|
return handlers.mcp(req);
|
|
11975
12070
|
}
|
|
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
|
|
|
12015
12110
|
if (action === "disconnect") {
|
|
12016
12111
|
return handlers.disconnect(req);
|
|
12017
12112
|
}
|
|
12113
|
+
if (action === "refresh") {
|
|
12114
|
+
return handlers.refresh(req);
|
|
12115
|
+
}
|
|
12018
12116
|
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
12019
12117
|
}
|
|
12020
12118
|
if (segments.length === 1 && segments[0] === "mcp") {
|
package/dist/adapters/node.js
CHANGED
|
@@ -11826,6 +11826,81 @@ class OAuthHandler {
|
|
|
11826
11826
|
const data = await response.json();
|
|
11827
11827
|
return data;
|
|
11828
11828
|
}
|
|
11829
|
+
async handleRefresh(request) {
|
|
11830
|
+
let webRequest;
|
|
11831
|
+
let refreshRequest;
|
|
11832
|
+
if (request instanceof Request) {
|
|
11833
|
+
webRequest = request;
|
|
11834
|
+
refreshRequest = await request.json();
|
|
11835
|
+
} else if (typeof request === "object" && "json" in request && typeof request.json === "function") {
|
|
11836
|
+
refreshRequest = await request.json();
|
|
11837
|
+
} else {
|
|
11838
|
+
refreshRequest = request;
|
|
11839
|
+
}
|
|
11840
|
+
const providerConfig = this.config.providers[refreshRequest.provider];
|
|
11841
|
+
if (!providerConfig) {
|
|
11842
|
+
throw new Error(`Provider ${refreshRequest.provider} not configured. Add OAuth credentials to your API route configuration.`);
|
|
11843
|
+
}
|
|
11844
|
+
let context;
|
|
11845
|
+
if (webRequest) {
|
|
11846
|
+
try {
|
|
11847
|
+
if (this.config.getSessionContext) {
|
|
11848
|
+
context = await this.config.getSessionContext(webRequest);
|
|
11849
|
+
}
|
|
11850
|
+
if (!context || !context.userId) {
|
|
11851
|
+
const { detectSessionContext: detectSessionContext2 } = await Promise.resolve().then(() => exports_session_detector);
|
|
11852
|
+
context = await detectSessionContext2(webRequest);
|
|
11853
|
+
}
|
|
11854
|
+
} catch (error) {}
|
|
11855
|
+
}
|
|
11856
|
+
const body = {
|
|
11857
|
+
provider: refreshRequest.provider,
|
|
11858
|
+
refresh_token: refreshRequest.refreshToken,
|
|
11859
|
+
client_id: providerConfig.clientId
|
|
11860
|
+
};
|
|
11861
|
+
if (providerConfig.clientSecret) {
|
|
11862
|
+
body.client_secret = providerConfig.clientSecret;
|
|
11863
|
+
}
|
|
11864
|
+
if (providerConfig.config?.subdomain) {
|
|
11865
|
+
body.subdomain = providerConfig.config.subdomain;
|
|
11866
|
+
}
|
|
11867
|
+
const url = new URL("/oauth/refresh", this.serverUrl);
|
|
11868
|
+
const response = await fetch(url.toString(), {
|
|
11869
|
+
method: "POST",
|
|
11870
|
+
headers: this.getHeaders({
|
|
11871
|
+
"Content-Type": "application/json"
|
|
11872
|
+
}),
|
|
11873
|
+
body: JSON.stringify(body)
|
|
11874
|
+
});
|
|
11875
|
+
if (!response.ok) {
|
|
11876
|
+
const error = await response.text();
|
|
11877
|
+
const lowerError = error.toLowerCase();
|
|
11878
|
+
if (lowerError.includes("not supported") || lowerError.includes("unsupported")) {
|
|
11879
|
+
throw new Error(`Token refresh not supported: ${error}`);
|
|
11880
|
+
}
|
|
11881
|
+
throw new Error(`Token refresh failed: ${error}`);
|
|
11882
|
+
}
|
|
11883
|
+
const data = await response.json();
|
|
11884
|
+
const result = data;
|
|
11885
|
+
if (this.config.setProviderToken) {
|
|
11886
|
+
try {
|
|
11887
|
+
const tokenData = {
|
|
11888
|
+
accessToken: result.accessToken,
|
|
11889
|
+
refreshToken: result.refreshToken,
|
|
11890
|
+
tokenType: result.tokenType,
|
|
11891
|
+
expiresIn: result.expiresIn,
|
|
11892
|
+
expiresAt: result.expiresAt,
|
|
11893
|
+
scopes: result.scopes ? result.scopes.flatMap((s) => s.split(" ").filter(Boolean)) : result.scopes
|
|
11894
|
+
};
|
|
11895
|
+
const email = result.email || await fetchUserEmail(refreshRequest.provider, tokenData);
|
|
11896
|
+
if (email) {
|
|
11897
|
+
tokenData.email = email;
|
|
11898
|
+
}
|
|
11899
|
+
await this.config.setProviderToken(refreshRequest.provider, tokenData, email, context);
|
|
11900
|
+
} catch (error) {}
|
|
11901
|
+
}
|
|
11902
|
+
return result;
|
|
11903
|
+
}
|
|
11829
11904
|
async handleToolCall(request, authHeader, integrationsHeader) {
|
|
11830
11905
|
const url = this.serverUrl;
|
|
11831
11906
|
const headers = this.getHeaders({
|
|
@@ -11956,6 +12031,23 @@ function createNextOAuthHandler(config) {
|
|
|
11956
12031
|
return Response.json({ error: error.message || "Failed to disconnect provider" }, { status: 500 });
|
|
11957
12032
|
}
|
|
11958
12033
|
},
|
|
12034
|
+
async refresh(req) {
|
|
12035
|
+
try {
|
|
12036
|
+
const result = await handler.handleRefresh(req);
|
|
12037
|
+
const response = Response.json(result);
|
|
12038
|
+
if (handler.hasDatabaseCallbacks()) {
|
|
12039
|
+
response.headers.set("X-Integrate-Use-Database", "true");
|
|
12040
|
+
}
|
|
12041
|
+
return response;
|
|
12042
|
+
} catch (error) {
|
|
12043
|
+
if (error.message?.toLowerCase().includes("not supported")) {
|
|
12044
|
+
logger33.info("[OAuth Refresh] Not supported for this provider:", error.message);
|
|
12045
|
+
} else {
|
|
12046
|
+
logger33.error("[OAuth Refresh] Error:", error);
|
|
12047
|
+
}
|
|
12048
|
+
return Response.json({ error: error.message || "Failed to refresh token" }, { status: 500 });
|
|
12049
|
+
}
|
|
12050
|
+
},
|
|
11959
12051
|
createRoutes() {
|
|
11960
12052
|
return {
|
|
11961
12053
|
async POST(req, context) {
|
|
@@ -11970,6 +12062,9 @@ function createNextOAuthHandler(config) {
|
|
|
11970
12062
|
if (action === "disconnect") {
|
|
11971
12063
|
return handlers.disconnect(req);
|
|
11972
12064
|
}
|
|
12065
|
+
if (action === "refresh") {
|
|
12066
|
+
return handlers.refresh(req);
|
|
12067
|
+
}
|
|
11973
12068
|
if (action === "mcp") {
|
|
11974
12069
|
return handlers.mcp(req);
|
|
11975
12070
|
}
|
|
@@ -12015,6 +12110,9 @@ function createNextOAuthHandler(config) {
|
|
|
12015
12110
|
if (action === "disconnect") {
|
|
12016
12111
|
return handlers.disconnect(req);
|
|
12017
12112
|
}
|
|
12113
|
+
if (action === "refresh") {
|
|
12114
|
+
return handlers.refresh(req);
|
|
12115
|
+
}
|
|
12018
12116
|
return Response.json({ error: `Unknown action: ${action}` }, { status: 404 });
|
|
12019
12117
|
}
|
|
12020
12118
|
if (segments.length === 1 && segments[0] === "mcp") {
|