fix(auth): singleflight access schema initialization (#1953)
This commit is contained in:
@@ -175,6 +175,11 @@ class AccessController {
|
|||||||
this.openFga = openFgaAuthorizer ?? createOpenFgaAuthorizer({ env, fetchImpl, now, configStore: store });
|
this.openFga = openFgaAuthorizer ?? createOpenFgaAuthorizer({ env, fetchImpl, now, configStore: store });
|
||||||
this.userBilling = userBillingClient ?? createUserBillingClient({ env, fetchImpl });
|
this.userBilling = userBillingClient ?? createUserBillingClient({ env, fetchImpl });
|
||||||
this.bootstrapAttempted = false;
|
this.bootstrapAttempted = false;
|
||||||
|
if (typeof this.store?.ensureSchema === "function") {
|
||||||
|
this.store.ensureSchema().catch((error) => {
|
||||||
|
console.warn("access store schema warmup failed", error?.message ?? error);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configureCodeAgentWorkspaceContext({ env = null, fetchImpl = null, traceStore = null, codeAgentChatResults = null } = {}) {
|
configureCodeAgentWorkspaceContext({ env = null, fetchImpl = null, traceStore = null, codeAgentChatResults = null } = {}) {
|
||||||
@@ -1370,12 +1375,22 @@ class PostgresAccessStore extends MemoryAccessStore {
|
|||||||
super({ now });
|
super({ now });
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.schemaReady = false;
|
this.schemaReady = false;
|
||||||
|
this.schemaReadyPromise = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async ensureSchema() {
|
async ensureSchema() {
|
||||||
if (this.schemaReady) return;
|
if (this.schemaReady) return;
|
||||||
for (const sql of ACCESS_SCHEMA_STATEMENTS) await this.query(sql, []);
|
if (!this.schemaReadyPromise) {
|
||||||
this.schemaReady = true;
|
this.schemaReadyPromise = (async () => {
|
||||||
|
for (const sql of ACCESS_SCHEMA_STATEMENTS) await this.query(sql, []);
|
||||||
|
this.schemaReady = true;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await this.schemaReadyPromise;
|
||||||
|
} finally {
|
||||||
|
if (!this.schemaReady) this.schemaReadyPromise = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async countUsers() { await this.ensureSchema(); const result = await this.query("SELECT COUNT(*)::int AS count FROM users", []); return Number(result.rows?.[0]?.count ?? 0); }
|
async countUsers() { await this.ensureSchema(); const result = await this.query("SELECT COUNT(*)::int AS count FROM users", []); return Number(result.rows?.[0]?.count ?? 0); }
|
||||||
|
|||||||
Reference in New Issue
Block a user