mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
add region support to db calls (#10428)
This commit is contained in:
parent
771433fe24
commit
189ec47c1e
2 changed files with 22 additions and 6 deletions
5
.changeset/rotten-clocks-report.md
Normal file
5
.changeset/rotten-clocks-report.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"@astrojs/db": patch
|
||||
---
|
||||
|
||||
Fix an issue where short-lived tokens were not being authorized
|
|
@ -3,7 +3,7 @@ import { homedir } from 'node:os';
|
|||
import { join } from 'node:path';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { MISSING_PROJECT_ID_ERROR, MISSING_SESSION_ID_ERROR } from './errors.js';
|
||||
import { getAstroStudioEnv, getAstroStudioUrl, safeFetch } from './utils.js';
|
||||
import { getAstroStudioEnv, getAstroStudioUrl, getRemoteDatabaseUrl, safeFetch } from './utils.js';
|
||||
|
||||
export const SESSION_LOGIN_FILE = pathToFileURL(join(homedir(), '.astro', 'session-token'));
|
||||
export const PROJECT_ID_FILE = pathToFileURL(join(process.cwd(), '.astro', 'link'));
|
||||
|
@ -26,11 +26,20 @@ class ManagedLocalAppToken implements ManagedAppToken {
|
|||
class ManagedRemoteAppToken implements ManagedAppToken {
|
||||
token: string;
|
||||
session: string;
|
||||
region: string | undefined;
|
||||
projectId: string;
|
||||
ttl: number;
|
||||
renewTimer: NodeJS.Timeout | undefined;
|
||||
|
||||
static async getRegionCode(): Promise<string | undefined> {
|
||||
const pingResponse = await safeFetch(new URL(`${getRemoteDatabaseUrl()}/ping`));
|
||||
const pingResult = await pingResponse.json() as {success: true, data: {region: string} };
|
||||
return pingResult.data.region;
|
||||
}
|
||||
|
||||
|
||||
static async create(sessionToken: string, projectId: string) {
|
||||
const region = await ManagedRemoteAppToken.getRegionCode();
|
||||
const response = await safeFetch(
|
||||
new URL(`${getAstroStudioUrl()}/auth/cli/token-create`),
|
||||
{
|
||||
|
@ -38,7 +47,7 @@ class ManagedRemoteAppToken implements ManagedAppToken {
|
|||
headers: new Headers({
|
||||
Authorization: `Bearer ${sessionToken}`,
|
||||
}),
|
||||
body: JSON.stringify({ projectId }),
|
||||
body: JSON.stringify({ projectId, region }),
|
||||
},
|
||||
(res) => {
|
||||
throw new Error(`Failed to create token: ${res.status} ${res.statusText}`);
|
||||
|
@ -49,20 +58,22 @@ class ManagedRemoteAppToken implements ManagedAppToken {
|
|||
return new ManagedRemoteAppToken({
|
||||
token: shortLivedAppToken,
|
||||
session: sessionToken,
|
||||
region,
|
||||
projectId,
|
||||
ttl,
|
||||
});
|
||||
}
|
||||
|
||||
constructor(options: { token: string; session: string; projectId: string; ttl: number }) {
|
||||
constructor(options: { token: string; session: string; region: string | undefined; projectId: string; ttl: number }) {
|
||||
this.token = options.token;
|
||||
this.session = options.session;
|
||||
this.region = options.region;
|
||||
this.projectId = options.projectId;
|
||||
this.ttl = options.ttl;
|
||||
this.renewTimer = setTimeout(() => this.renew(), (1000 * 60 * 5) / 2);
|
||||
}
|
||||
|
||||
private async fetch(url: string, body: unknown) {
|
||||
private async fetch(url: string, body: Record<string, unknown>) {
|
||||
return safeFetch(
|
||||
`${getAstroStudioUrl()}${url}`,
|
||||
{
|
||||
|
@ -71,9 +82,9 @@ class ManagedRemoteAppToken implements ManagedAppToken {
|
|||
Authorization: `Bearer ${this.session}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
body: JSON.stringify({...body, region: this.region}),
|
||||
},
|
||||
() => {
|
||||
() => {
|
||||
throw new Error(`Failed to fetch ${url}.`);
|
||||
}
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue