@undefineds.co/xpod 0.3.41 → 0.3.42

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.
@@ -158,7 +158,7 @@ class AccountRoleRepository {
158
158
  return accounts;
159
159
  }
160
160
  async loadIdentityStoreAccounts(accounts) {
161
- const tableId = drizzle_orm_1.sql.identifier([IDENTITY_STORE_TABLE]);
161
+ const tableId = drizzle_orm_1.sql.identifier(IDENTITY_STORE_TABLE);
162
162
  let rows = [];
163
163
  try {
164
164
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
@@ -230,7 +230,7 @@ class AccountRoleRepository {
230
230
  }
231
231
  }
232
232
  async loadInternalKvAccounts(accounts) {
233
- const tableId = drizzle_orm_1.sql.identifier([INTERNAL_KV_TABLE]);
233
+ const tableId = drizzle_orm_1.sql.identifier(INTERNAL_KV_TABLE);
234
234
  try {
235
235
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
236
236
  SELECT key, value
@@ -289,7 +289,7 @@ class AccountRoleRepository {
289
289
  }
290
290
  async updateAccountRecord(record, payload) {
291
291
  if (record.source === 'identity-store') {
292
- const tableId = drizzle_orm_1.sql.identifier([IDENTITY_STORE_TABLE]);
292
+ const tableId = drizzle_orm_1.sql.identifier(IDENTITY_STORE_TABLE);
293
293
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
294
294
  UPDATE ${tableId}
295
295
  SET payload = ${this.toJsonSql(payload)}
@@ -298,7 +298,7 @@ class AccountRoleRepository {
298
298
  return;
299
299
  }
300
300
  if (record.source === 'internal-kv' && record.key) {
301
- const tableId = drizzle_orm_1.sql.identifier([INTERNAL_KV_TABLE]);
301
+ const tableId = drizzle_orm_1.sql.identifier(INTERNAL_KV_TABLE);
302
302
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
303
303
  UPDATE ${tableId}
304
304
  SET value = ${JSON.stringify(payload)}
@@ -1 +1 @@
1
- {"version":3,"file":"AccountRoleRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/AccountRoleRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { sql } from 'drizzle-orm';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { IdentityDatabase } from './db';\nimport { executeQuery, executeStatement, isDatabaseSqlite } from './db';\n\nconst ACCOUNT_DATA_DIR = path.resolve('.internal', 'accounts', 'data');\nconst IDENTITY_STORE_TABLE = 'identity_store';\nconst INTERNAL_KV_TABLE = 'internal_kv';\n\nexport interface AccountRoleContext {\n accountId: string;\n webId?: string;\n roles: string[];\n}\n\ninterface AccountPayloadRecord {\n id: string;\n payload: Record<string, unknown>;\n source: 'identity-store' | 'internal-kv' | 'file';\n key?: string;\n}\n\nfunction resolveWebIds(payload: Record<string, unknown>): string[] {\n const candidates = new Set<string>();\n const possibleKeys = [ 'webId', 'webid', 'primaryWebId', 'primary_webid' ];\n for (const key of possibleKeys) {\n const value = payload[key];\n if (typeof value === 'string' && value.trim().length > 0) {\n candidates.add(value.trim());\n }\n }\n const settings = payload.settings;\n if (settings && typeof settings === 'object') {\n const webId = (settings as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n const pods = payload.pods;\n if (Array.isArray(pods)) {\n for (const entry of pods) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n\n const webIdLink = payload['**webIdLink**'] ?? payload.webIdLink;\n if (webIdLink && typeof webIdLink === 'object') {\n for (const entry of Object.values(webIdLink as Record<string, unknown>)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n\n const podMap = payload['**pod**'] ?? payload.pod;\n if (podMap && typeof podMap === 'object') {\n for (const pod of Object.values(podMap as Record<string, unknown>)) {\n if (!pod || typeof pod !== 'object') {\n continue;\n }\n const owner = (pod as Record<string, unknown>)['**owner**'] ?? (pod as Record<string, unknown>).owner;\n if (!owner || typeof owner !== 'object') {\n continue;\n }\n for (const entry of Object.values(owner as Record<string, unknown>)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n }\n\n return Array.from(candidates);\n}\n\nfunction resolveRoles(payload: Record<string, unknown>): string[] {\n const roles = payload.roles;\n if (!Array.isArray(roles)) {\n return [];\n }\n return Array.from(new Set(\n roles\n .map((role) => typeof role === 'string' ? role.trim() : '')\n .filter((role) => role.length > 0),\n ));\n}\n\nfunction parsePayload(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n return typeof value === 'object' ? value as Record<string, unknown> : undefined;\n}\n\nexport class AccountRoleRepository {\n private readonly logger = getLoggerFor(this);\n\n public constructor(private readonly db: IdentityDatabase) {}\n\n public async findByAccountId(accountId: string): Promise<AccountRoleContext | undefined> {\n const record = await this.getAccountById(accountId);\n if (!record) {\n return undefined;\n }\n const [ webId ] = resolveWebIds(record.payload);\n return { accountId, webId, roles: resolveRoles(record.payload) };\n }\n\n public async findByWebId(webId: string): Promise<AccountRoleContext | undefined> {\n const accounts = await this.loadAllAccounts();\n for (const { id, payload } of accounts.values()) {\n const knownWebIds = resolveWebIds(payload);\n if (knownWebIds.includes(webId)) {\n return {\n accountId: id,\n webId,\n roles: resolveRoles(payload),\n };\n }\n }\n return undefined;\n }\n\n public async findByWebIdLoose(webId: string): Promise<AccountRoleContext | undefined> {\n return this.findByWebId(webId);\n }\n\n public async addRoles(accountId: string, roles: string[]): Promise<void> {\n const unique = Array.from(new Set(\n roles.map((role) => role.trim()).filter((role) => role.length > 0),\n ));\n if (unique.length === 0) {\n return;\n }\n const record = await this.getAccountById(accountId);\n if (!record) {\n this.logger.warn(`Cannot add roles for unknown account ${accountId}`);\n return;\n }\n const nextRoles = Array.from(new Set([ ...resolveRoles(record.payload), ...unique ]));\n await this.updateAccountRecord(record, { ...record.payload, roles: nextRoles });\n }\n\n private async getAccountById(accountId: string): Promise<AccountPayloadRecord | undefined> {\n const accounts = await this.loadAllAccounts();\n return accounts.get(accountId);\n }\n\n private async loadAllAccounts(): Promise<Map<string, AccountPayloadRecord>> {\n const accounts = new Map<string, AccountPayloadRecord>();\n await this.loadIdentityStoreAccounts(accounts);\n await this.loadInternalKvAccounts(accounts);\n for (const [id, payload] of await this.loadFileAccountMap()) {\n if (!accounts.has(id)) {\n accounts.set(id, { id, payload, source: 'file' });\n }\n }\n return accounts;\n }\n\n private async loadIdentityStoreAccounts(accounts: Map<string, AccountPayloadRecord>): Promise<void> {\n const tableId = sql.identifier([IDENTITY_STORE_TABLE]);\n let rows: Array<{ container?: string; id?: string; payload?: unknown }> = [];\n try {\n const result = await executeQuery<{ container?: string; id?: string; payload?: unknown }>(this.db, sql`\n SELECT container, id, payload\n FROM ${tableId}\n WHERE container IN ('account', 'pod', 'owner', 'webIdLink')\n `);\n rows = result.rows;\n } catch (error: unknown) {\n if (!this.isTableMissing(error)) {\n throw error;\n }\n return;\n }\n\n const podAccountIds = new Map<string, string>();\n const webIdsByAccount = new Map<string, Set<string>>();\n\n for (const row of rows) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayload(row.payload);\n if (!payload) {\n continue;\n }\n if (row.container === 'account') {\n accounts.set(row.id, { id: row.id, payload, source: 'identity-store' });\n } else if (row.container === 'pod') {\n const accountId = typeof payload.accountId === 'string' ? payload.accountId : undefined;\n if (accountId) {\n podAccountIds.set(row.id, accountId);\n }\n }\n }\n\n for (const row of rows) {\n const payload = parsePayload(row.payload);\n if (!row.container || !payload) {\n continue;\n }\n if (row.container === 'webIdLink') {\n const accountId = typeof payload.accountId === 'string' ? payload.accountId : undefined;\n const webId = typeof payload.webId === 'string' ? payload.webId : undefined;\n if (accountId && webId) {\n appendWebId(webIdsByAccount, accountId, webId);\n }\n } else if (row.container === 'owner') {\n const podId = typeof payload.podId === 'string' ? payload.podId : undefined;\n const webId = typeof payload.webId === 'string' ? payload.webId : undefined;\n const accountId = podId ? podAccountIds.get(podId) : undefined;\n if (accountId && webId) {\n appendWebId(webIdsByAccount, accountId, webId);\n }\n }\n }\n\n for (const [accountId, webIds] of webIdsByAccount) {\n const record = accounts.get(accountId);\n if (!record) {\n continue;\n }\n record.payload = {\n ...record.payload,\n webIdLink: Object.fromEntries(Array.from(webIds).map((webId, index) => [\n `webid-${index}`,\n { accountId, webId },\n ])),\n };\n }\n }\n\n private async loadInternalKvAccounts(accounts: Map<string, AccountPayloadRecord>): Promise<void> {\n const tableId = sql.identifier([INTERNAL_KV_TABLE]);\n try {\n const result = await executeQuery<{ key?: string; value?: unknown }>(this.db, sql`\n SELECT key, value\n FROM ${tableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n for (const row of result.rows) {\n if (!row.key) {\n continue;\n }\n const accountId = extractAccountIdFromKey(row.key);\n const payload = parsePayload(row.value);\n if (!accountId || !payload || accounts.has(accountId)) {\n continue;\n }\n accounts.set(accountId, { id: accountId, payload, source: 'internal-kv', key: row.key });\n }\n } catch (error: unknown) {\n if (!this.isTableMissing(error)) {\n throw error;\n }\n }\n }\n\n private async loadFileAccountMap(): Promise<Map<string, Record<string, unknown>>> {\n const map = new Map<string, Record<string, unknown>>();\n try {\n const files = await fs.readdir(ACCOUNT_DATA_DIR);\n for (const file of files) {\n if (!file.endsWith('.json')) {\n continue;\n }\n const fullPath = path.join(ACCOUNT_DATA_DIR, file);\n try {\n const raw = await fs.readFile(fullPath, 'utf8');\n const parsed = JSON.parse(raw) as { payload?: unknown };\n const payload = parsed?.payload;\n if (!payload || typeof payload !== 'object') {\n continue;\n }\n const accountId = (payload as Record<string, unknown>).id;\n if (typeof accountId === 'string' && accountId.trim().length > 0) {\n map.set(accountId, payload as Record<string, unknown>);\n }\n } catch (error: unknown) {\n this.logger.debug(`Skipping account file ${fullPath}: ${(error as Error).message}`);\n }\n }\n } catch (error: unknown) {\n this.logger.debug(`Account data directory unavailable (${ACCOUNT_DATA_DIR}): ${(error as Error).message}`);\n }\n return map;\n }\n\n private async updateAccountRecord(record: AccountPayloadRecord, payload: Record<string, unknown>): Promise<void> {\n if (record.source === 'identity-store') {\n const tableId = sql.identifier([IDENTITY_STORE_TABLE]);\n await executeStatement(this.db, sql`\n UPDATE ${tableId}\n SET payload = ${this.toJsonSql(payload)}\n WHERE container = 'account' AND id = ${record.id}\n `);\n return;\n }\n if (record.source === 'internal-kv' && record.key) {\n const tableId = sql.identifier([INTERNAL_KV_TABLE]);\n await executeStatement(this.db, sql`\n UPDATE ${tableId}\n SET value = ${JSON.stringify(payload)}\n WHERE key = ${record.key}\n `);\n }\n }\n\n private toJsonSql(payload: Record<string, unknown>): unknown {\n const serialized = JSON.stringify(payload);\n return isDatabaseSqlite(this.db) ? sql`${serialized}` : sql`${serialized}::jsonb`;\n }\n\n private isTableMissing(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const code = (error as { code?: string }).code;\n if (code === '42P01') {\n return true;\n }\n const message = (error as { message?: string }).message ?? '';\n return /does not exist|no such table/u.test(message);\n }\n}\n\nfunction appendWebId(target: Map<string, Set<string>>, accountId: string, webId: string): void {\n const values = target.get(accountId) ?? new Set<string>();\n values.add(webId);\n target.set(accountId, values);\n}\n\nfunction extractAccountIdFromKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n"]}
1
+ {"version":3,"file":"AccountRoleRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/AccountRoleRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { sql } from 'drizzle-orm';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { IdentityDatabase } from './db';\nimport { executeQuery, executeStatement, isDatabaseSqlite } from './db';\n\nconst ACCOUNT_DATA_DIR = path.resolve('.internal', 'accounts', 'data');\nconst IDENTITY_STORE_TABLE = 'identity_store';\nconst INTERNAL_KV_TABLE = 'internal_kv';\n\nexport interface AccountRoleContext {\n accountId: string;\n webId?: string;\n roles: string[];\n}\n\ninterface AccountPayloadRecord {\n id: string;\n payload: Record<string, unknown>;\n source: 'identity-store' | 'internal-kv' | 'file';\n key?: string;\n}\n\nfunction resolveWebIds(payload: Record<string, unknown>): string[] {\n const candidates = new Set<string>();\n const possibleKeys = [ 'webId', 'webid', 'primaryWebId', 'primary_webid' ];\n for (const key of possibleKeys) {\n const value = payload[key];\n if (typeof value === 'string' && value.trim().length > 0) {\n candidates.add(value.trim());\n }\n }\n const settings = payload.settings;\n if (settings && typeof settings === 'object') {\n const webId = (settings as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n const pods = payload.pods;\n if (Array.isArray(pods)) {\n for (const entry of pods) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n\n const webIdLink = payload['**webIdLink**'] ?? payload.webIdLink;\n if (webIdLink && typeof webIdLink === 'object') {\n for (const entry of Object.values(webIdLink as Record<string, unknown>)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n\n const podMap = payload['**pod**'] ?? payload.pod;\n if (podMap && typeof podMap === 'object') {\n for (const pod of Object.values(podMap as Record<string, unknown>)) {\n if (!pod || typeof pod !== 'object') {\n continue;\n }\n const owner = (pod as Record<string, unknown>)['**owner**'] ?? (pod as Record<string, unknown>).owner;\n if (!owner || typeof owner !== 'object') {\n continue;\n }\n for (const entry of Object.values(owner as Record<string, unknown>)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const webId = (entry as Record<string, unknown>).webId;\n if (typeof webId === 'string' && webId.trim().length > 0) {\n candidates.add(webId.trim());\n }\n }\n }\n }\n\n return Array.from(candidates);\n}\n\nfunction resolveRoles(payload: Record<string, unknown>): string[] {\n const roles = payload.roles;\n if (!Array.isArray(roles)) {\n return [];\n }\n return Array.from(new Set(\n roles\n .map((role) => typeof role === 'string' ? role.trim() : '')\n .filter((role) => role.length > 0),\n ));\n}\n\nfunction parsePayload(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n return typeof value === 'object' ? value as Record<string, unknown> : undefined;\n}\n\nexport class AccountRoleRepository {\n private readonly logger = getLoggerFor(this);\n\n public constructor(private readonly db: IdentityDatabase) {}\n\n public async findByAccountId(accountId: string): Promise<AccountRoleContext | undefined> {\n const record = await this.getAccountById(accountId);\n if (!record) {\n return undefined;\n }\n const [ webId ] = resolveWebIds(record.payload);\n return { accountId, webId, roles: resolveRoles(record.payload) };\n }\n\n public async findByWebId(webId: string): Promise<AccountRoleContext | undefined> {\n const accounts = await this.loadAllAccounts();\n for (const { id, payload } of accounts.values()) {\n const knownWebIds = resolveWebIds(payload);\n if (knownWebIds.includes(webId)) {\n return {\n accountId: id,\n webId,\n roles: resolveRoles(payload),\n };\n }\n }\n return undefined;\n }\n\n public async findByWebIdLoose(webId: string): Promise<AccountRoleContext | undefined> {\n return this.findByWebId(webId);\n }\n\n public async addRoles(accountId: string, roles: string[]): Promise<void> {\n const unique = Array.from(new Set(\n roles.map((role) => role.trim()).filter((role) => role.length > 0),\n ));\n if (unique.length === 0) {\n return;\n }\n const record = await this.getAccountById(accountId);\n if (!record) {\n this.logger.warn(`Cannot add roles for unknown account ${accountId}`);\n return;\n }\n const nextRoles = Array.from(new Set([ ...resolveRoles(record.payload), ...unique ]));\n await this.updateAccountRecord(record, { ...record.payload, roles: nextRoles });\n }\n\n private async getAccountById(accountId: string): Promise<AccountPayloadRecord | undefined> {\n const accounts = await this.loadAllAccounts();\n return accounts.get(accountId);\n }\n\n private async loadAllAccounts(): Promise<Map<string, AccountPayloadRecord>> {\n const accounts = new Map<string, AccountPayloadRecord>();\n await this.loadIdentityStoreAccounts(accounts);\n await this.loadInternalKvAccounts(accounts);\n for (const [id, payload] of await this.loadFileAccountMap()) {\n if (!accounts.has(id)) {\n accounts.set(id, { id, payload, source: 'file' });\n }\n }\n return accounts;\n }\n\n private async loadIdentityStoreAccounts(accounts: Map<string, AccountPayloadRecord>): Promise<void> {\n const tableId = sql.identifier(IDENTITY_STORE_TABLE);\n let rows: Array<{ container?: string; id?: string; payload?: unknown }> = [];\n try {\n const result = await executeQuery<{ container?: string; id?: string; payload?: unknown }>(this.db, sql`\n SELECT container, id, payload\n FROM ${tableId}\n WHERE container IN ('account', 'pod', 'owner', 'webIdLink')\n `);\n rows = result.rows;\n } catch (error: unknown) {\n if (!this.isTableMissing(error)) {\n throw error;\n }\n return;\n }\n\n const podAccountIds = new Map<string, string>();\n const webIdsByAccount = new Map<string, Set<string>>();\n\n for (const row of rows) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayload(row.payload);\n if (!payload) {\n continue;\n }\n if (row.container === 'account') {\n accounts.set(row.id, { id: row.id, payload, source: 'identity-store' });\n } else if (row.container === 'pod') {\n const accountId = typeof payload.accountId === 'string' ? payload.accountId : undefined;\n if (accountId) {\n podAccountIds.set(row.id, accountId);\n }\n }\n }\n\n for (const row of rows) {\n const payload = parsePayload(row.payload);\n if (!row.container || !payload) {\n continue;\n }\n if (row.container === 'webIdLink') {\n const accountId = typeof payload.accountId === 'string' ? payload.accountId : undefined;\n const webId = typeof payload.webId === 'string' ? payload.webId : undefined;\n if (accountId && webId) {\n appendWebId(webIdsByAccount, accountId, webId);\n }\n } else if (row.container === 'owner') {\n const podId = typeof payload.podId === 'string' ? payload.podId : undefined;\n const webId = typeof payload.webId === 'string' ? payload.webId : undefined;\n const accountId = podId ? podAccountIds.get(podId) : undefined;\n if (accountId && webId) {\n appendWebId(webIdsByAccount, accountId, webId);\n }\n }\n }\n\n for (const [accountId, webIds] of webIdsByAccount) {\n const record = accounts.get(accountId);\n if (!record) {\n continue;\n }\n record.payload = {\n ...record.payload,\n webIdLink: Object.fromEntries(Array.from(webIds).map((webId, index) => [\n `webid-${index}`,\n { accountId, webId },\n ])),\n };\n }\n }\n\n private async loadInternalKvAccounts(accounts: Map<string, AccountPayloadRecord>): Promise<void> {\n const tableId = sql.identifier(INTERNAL_KV_TABLE);\n try {\n const result = await executeQuery<{ key?: string; value?: unknown }>(this.db, sql`\n SELECT key, value\n FROM ${tableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n for (const row of result.rows) {\n if (!row.key) {\n continue;\n }\n const accountId = extractAccountIdFromKey(row.key);\n const payload = parsePayload(row.value);\n if (!accountId || !payload || accounts.has(accountId)) {\n continue;\n }\n accounts.set(accountId, { id: accountId, payload, source: 'internal-kv', key: row.key });\n }\n } catch (error: unknown) {\n if (!this.isTableMissing(error)) {\n throw error;\n }\n }\n }\n\n private async loadFileAccountMap(): Promise<Map<string, Record<string, unknown>>> {\n const map = new Map<string, Record<string, unknown>>();\n try {\n const files = await fs.readdir(ACCOUNT_DATA_DIR);\n for (const file of files) {\n if (!file.endsWith('.json')) {\n continue;\n }\n const fullPath = path.join(ACCOUNT_DATA_DIR, file);\n try {\n const raw = await fs.readFile(fullPath, 'utf8');\n const parsed = JSON.parse(raw) as { payload?: unknown };\n const payload = parsed?.payload;\n if (!payload || typeof payload !== 'object') {\n continue;\n }\n const accountId = (payload as Record<string, unknown>).id;\n if (typeof accountId === 'string' && accountId.trim().length > 0) {\n map.set(accountId, payload as Record<string, unknown>);\n }\n } catch (error: unknown) {\n this.logger.debug(`Skipping account file ${fullPath}: ${(error as Error).message}`);\n }\n }\n } catch (error: unknown) {\n this.logger.debug(`Account data directory unavailable (${ACCOUNT_DATA_DIR}): ${(error as Error).message}`);\n }\n return map;\n }\n\n private async updateAccountRecord(record: AccountPayloadRecord, payload: Record<string, unknown>): Promise<void> {\n if (record.source === 'identity-store') {\n const tableId = sql.identifier(IDENTITY_STORE_TABLE);\n await executeStatement(this.db, sql`\n UPDATE ${tableId}\n SET payload = ${this.toJsonSql(payload)}\n WHERE container = 'account' AND id = ${record.id}\n `);\n return;\n }\n if (record.source === 'internal-kv' && record.key) {\n const tableId = sql.identifier(INTERNAL_KV_TABLE);\n await executeStatement(this.db, sql`\n UPDATE ${tableId}\n SET value = ${JSON.stringify(payload)}\n WHERE key = ${record.key}\n `);\n }\n }\n\n private toJsonSql(payload: Record<string, unknown>): unknown {\n const serialized = JSON.stringify(payload);\n return isDatabaseSqlite(this.db) ? sql`${serialized}` : sql`${serialized}::jsonb`;\n }\n\n private isTableMissing(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const code = (error as { code?: string }).code;\n if (code === '42P01') {\n return true;\n }\n const message = (error as { message?: string }).message ?? '';\n return /does not exist|no such table/u.test(message);\n }\n}\n\nfunction appendWebId(target: Map<string, Set<string>>, accountId: string, webId: string): void {\n const values = target.get(accountId) ?? new Set<string>();\n values.add(webId);\n target.set(accountId, values);\n}\n\nfunction extractAccountIdFromKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n"]}
@@ -45,7 +45,7 @@ class DrizzleIndexedStorage {
45
45
  if (this.ready)
46
46
  return;
47
47
  const jsonType = (0, db_1.isDatabaseSqlite)(this.db) ? drizzle_orm_1.sql.raw('TEXT') : drizzle_orm_1.sql.raw('JSONB');
48
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
48
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
49
49
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
50
50
  CREATE TABLE IF NOT EXISTS ${tableNameId} (
51
51
  container TEXT NOT NULL,
@@ -86,7 +86,7 @@ class DrizzleIndexedStorage {
86
86
  await this.ensureTable();
87
87
  const id = node_crypto_1.default.randomUUID();
88
88
  const payload = serializePayload(value);
89
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
89
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
90
90
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
91
91
  INSERT INTO ${tableNameId} (container, id, payload)
92
92
  VALUES (${type}, ${id}, ${this.toJsonSql(payload)})
@@ -97,7 +97,7 @@ class DrizzleIndexedStorage {
97
97
  async has(type, id) {
98
98
  const started = Date.now();
99
99
  await this.ensureTable();
100
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
100
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
101
101
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `SELECT 1 FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);
102
102
  this.logDuration('has', started, { type, id }, 50, 500);
103
103
  return result.rows.length > 0;
@@ -105,7 +105,7 @@ class DrizzleIndexedStorage {
105
105
  async get(type, id) {
106
106
  const started = Date.now();
107
107
  await this.ensureTable();
108
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
108
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
109
109
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `SELECT payload FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);
110
110
  this.logDuration('get', started, { type, id }, 50, 500);
111
111
  if (result.rows.length === 0) {
@@ -117,7 +117,7 @@ class DrizzleIndexedStorage {
117
117
  async find(type, query) {
118
118
  const started = Date.now();
119
119
  await this.ensureTable();
120
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
120
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
121
121
  const normalizedQuery = (query ?? {});
122
122
  const pushdown = this.canPushDownQuery(normalizedQuery);
123
123
  const result = pushdown
@@ -148,7 +148,7 @@ class DrizzleIndexedStorage {
148
148
  async set(type, value) {
149
149
  const started = Date.now();
150
150
  await this.ensureTable();
151
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
151
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
152
152
  const { id, ...rest } = value;
153
153
  const payload = serializePayload(rest);
154
154
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
@@ -169,13 +169,13 @@ class DrizzleIndexedStorage {
169
169
  async delete(type, id) {
170
170
  const started = Date.now();
171
171
  await this.ensureTable();
172
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
172
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
173
173
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `DELETE FROM ${tableNameId} WHERE container = ${type} AND id = ${id}`);
174
174
  this.logDuration('delete', started, { type, id }, 50, 500);
175
175
  }
176
176
  async *entries(type) {
177
177
  await this.ensureTable();
178
- const tableNameId = drizzle_orm_1.sql.identifier([this.tableName]);
178
+ const tableNameId = drizzle_orm_1.sql.identifier(this.tableName);
179
179
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `SELECT id, payload FROM ${tableNameId} WHERE container = ${type}`);
180
180
  for (const row of result.rows) {
181
181
  yield {
@@ -1 +1 @@
1
- {"version":3,"file":"DrizzleIndexedStorage.js","sourceRoot":"","sources":["../../../src/identity/drizzle/DrizzleIndexedStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { sql } from 'drizzle-orm';\nimport crypto from 'node:crypto';\nimport type {\n CreateTypeObject,\n IndexedQuery,\n IndexedStorage,\n IndexTypeCollection,\n StringKey,\n TypeObject,\n ValueTypeDescription,\n} from '@solid/community-server';\nimport { \n getIdentityDatabase, \n IdentityDatabase, \n executeQuery, \n executeStatement,\n isDatabaseSqlite \n} from './db';\n\nfunction serializePayload(value: Record<string, unknown>): string {\n return JSON.stringify(value ?? {});\n}\n\nfunction parsePayload<T>(value: unknown): T {\n if (value == null) {\n return {} as T;\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return {} as T;\n }\n }\n return value as T;\n}\n\n/**\n * A generic Key-Value storage backed by a single SQL table.\n * Maps `type` (container) and `id` (key) to rows in the table.\n */\nexport class DrizzleIndexedStorage implements IndexedStorage<any> {\n private readonly logger = getLoggerFor(this);\n private readonly db: IdentityDatabase;\n private readonly tableName: string;\n private readonly definitions: Map<string, Record<string, ValueTypeDescription<string>>> = new Map();\n private readonly createdIndexes: Set<string> = new Set();\n private ready: boolean = false;\n\n public constructor(connectionString: string, tablePrefix = 'identity_') {\n this.db = getIdentityDatabase(connectionString);\n this.tableName = `${tablePrefix}store`;\n }\n\n private toJsonSql(payload: string): any {\n return isDatabaseSqlite(this.db) ? sql`${payload}` : sql`${payload}::jsonb`;\n }\n\n private async ensureTable(): Promise<void> {\n if (this.ready) return;\n \n const jsonType = isDatabaseSqlite(this.db) ? sql.raw('TEXT') : sql.raw('JSONB');\n const tableNameId = sql.identifier([this.tableName]);\n \n await executeStatement(this.db, sql`\n CREATE TABLE IF NOT EXISTS ${tableNameId} (\n container TEXT NOT NULL,\n id TEXT NOT NULL,\n payload ${jsonType} NOT NULL,\n PRIMARY KEY (container, id)\n )\n `);\n this.ready = true;\n }\n\n public async defineType(type: string, description: any): Promise<void> {\n this.definitions.set(type, description as Record<string, ValueTypeDescription<string>>);\n await this.ensureTable();\n }\n\n public async createIndex(type: string, key: string): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n if (key === 'id') {\n return;\n }\n\n const cacheKey = `${type}:${key}`;\n if (this.createdIndexes.has(cacheKey)) {\n return;\n }\n\n if (isDatabaseSqlite(this.db)) {\n const jsonPath = this.escapeSqlLiteral(this.toSqliteJsonPath(key));\n await executeStatement(this.db, sql.raw(\n `CREATE INDEX IF NOT EXISTS \"${this.buildIndexName(type, key)}\" ON \"${this.tableName}\" (container, json_extract(payload, '${jsonPath}'))`,\n ));\n } else {\n const escapedKey = this.escapeSqlLiteral(key);\n await executeStatement(this.db, sql.raw(\n `CREATE INDEX IF NOT EXISTS \"${this.buildIndexName(type, key)}\" ON \"${this.tableName}\" (container, (jsonb_extract_path_text(payload, '${escapedKey}')))` ,\n ));\n }\n\n this.createdIndexes.add(cacheKey);\n this.logDuration('createIndex', started, { type, key }, 50, 500);\n }\n\n public async create(type: string, value: any): Promise<any> {\n const started = Date.now();\n await this.ensureTable();\n const id = crypto.randomUUID();\n const payload = serializePayload(value as Record<string, unknown>);\n const tableNameId = sql.identifier([this.tableName]);\n\n await executeStatement(this.db, sql`\n INSERT INTO ${tableNameId} (container, id, payload)\n VALUES (${type}, ${id}, ${this.toJsonSql(payload)})\n `);\n this.logDuration('create', started, { type, fields: Object.keys(value ?? {}) }, 50, 500);\n return { id, ...(value as Record<string, unknown>) };\n }\n\n public async has(type: string, id: string): Promise<boolean> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n const result = await executeQuery(this.db, sql`SELECT 1 FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);\n this.logDuration('has', started, { type, id }, 50, 500);\n return result.rows.length > 0;\n }\n\n public async get(type: string, id: string): Promise<any | undefined> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n const result = await executeQuery(this.db, sql`SELECT payload FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);\n this.logDuration('get', started, { type, id }, 50, 500);\n if (result.rows.length === 0) {\n return undefined;\n }\n const payload = parsePayload<Record<string, unknown>>(result.rows[0].payload);\n return { id, ...payload };\n }\n\n public async find(type: string, query: any): Promise<any[]> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n const normalizedQuery = (query ?? {}) as Record<string, unknown>;\n const pushdown = this.canPushDownQuery(normalizedQuery);\n const result = pushdown\n ? await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE ${this.buildWhereClause(type, normalizedQuery)}`)\n : await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE container = ${type}`);\n const matches: any[] = [];\n for (const row of result.rows) {\n const payload = {\n id: row.id as string,\n ...parsePayload<Record<string, unknown>>(row.payload),\n };\n if (this.matchesQuery(type, payload, normalizedQuery)) {\n matches.push(payload);\n }\n }\n this.logDuration('find', started, {\n type,\n keys: Object.keys(normalizedQuery),\n pushdown,\n matched: matches.length,\n }, 50, 500);\n return matches;\n }\n\n public async findIds(type: string, query: any): Promise<string[]> {\n const rows = await this.find(type, query);\n return rows.map((row) => row.id as string);\n }\n\n public async set(type: string, value: any): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n const { id, ...rest } = value as Record<string, unknown>;\n const payload = serializePayload(rest);\n \n await executeStatement(this.db, sql`\n UPDATE ${tableNameId}\n SET payload = ${this.toJsonSql(payload)}\n WHERE container = ${type} AND id = ${id}\n `);\n this.logDuration('set', started, { type, id, fields: Object.keys(rest) }, 50, 500);\n }\n\n public async setField(type: string, id: string, key: string, value: any): Promise<void> {\n const current = await this.get(type, id);\n if (!current) {\n return;\n }\n const updated = { ...current, [key]: value };\n await this.set(type, updated);\n }\n\n public async delete(type: string, id: string): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n await executeStatement(this.db, sql`DELETE FROM ${tableNameId} WHERE container = ${type} AND id = ${id}`);\n this.logDuration('delete', started, { type, id }, 50, 500);\n }\n\n public async *entries(type: string): AsyncIterableIterator<any> {\n await this.ensureTable();\n const tableNameId = sql.identifier([this.tableName]);\n const result = await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE container = ${type}`);\n for (const row of result.rows) {\n yield {\n id: row.id as string,\n ...parsePayload<Record<string, unknown>>(row.payload),\n };\n }\n }\n\n private matchesQuery(type: string, payload: any, query: any): boolean {\n // Basic in-memory implementation of query matching\n // This mirrors MemoryIndexedStorage behavior for compatibility\n for (const key of Object.keys(query)) {\n if (payload[key] !== query[key]) {\n return false;\n }\n }\n return true;\n }\n\n private canPushDownQuery(query: Record<string, unknown>): boolean {\n return Object.values(query).every((value) => this.isSupportedQueryValue(value));\n }\n\n private isSupportedQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private buildWhereClause(type: string, query: Record<string, unknown>): any {\n const clauses = [sql`container = ${type}`];\n\n for (const [key, value] of Object.entries(query)) {\n if (key === 'id') {\n clauses.push(sql`id = ${String(value)}`);\n continue;\n }\n\n if (isDatabaseSqlite(this.db)) {\n const jsonPath = this.toSqliteJsonPath(key);\n const wrappedValue = JSON.stringify({ value });\n clauses.push(sql`json_extract(payload, ${jsonPath}) = json_extract(${wrappedValue}, '$.value')`);\n continue;\n }\n\n clauses.push(sql`jsonb_extract_path_text(payload, ${key}) = ${String(value)}`);\n }\n\n return sql.join(clauses, sql` AND `);\n }\n\n private buildIndexName(type: string, key: string): string {\n const rawName = `${this.tableName}_${type}_${key}_idx`;\n const normalized = rawName.replace(/[^a-zA-Z0-9_]/g, '_');\n if (normalized.length <= 63) {\n return normalized;\n }\n\n return `${normalized.slice(0, 54)}_${crypto.createHash('sha1').update(rawName).digest('hex').slice(0, 8)}`;\n }\n\n private toSqliteJsonPath(key: string): string {\n const escaped = key.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `$.\"${escaped}\"`;\n }\n\n private escapeSqlLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n private logDuration(\n operation: string,\n started: number,\n details: Record<string, unknown>,\n slowThresholdMs = 100,\n warnThresholdMs = 1000,\n ): void {\n const elapsedMs = Date.now() - started;\n if (elapsedMs < slowThresholdMs) {\n return;\n }\n\n const detailText = Object.entries(details)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(',') : String(value)}`)\n .join(' ');\n const message = `[timing] DrizzleIndexedStorage.${operation} ${detailText} took=${elapsedMs}ms`;\n\n if (elapsedMs >= warnThresholdMs) {\n this.logger.warn(message);\n return;\n }\n\n this.logger.info(message);\n }\n}\n"]}
1
+ {"version":3,"file":"DrizzleIndexedStorage.js","sourceRoot":"","sources":["../../../src/identity/drizzle/DrizzleIndexedStorage.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { sql } from 'drizzle-orm';\nimport crypto from 'node:crypto';\nimport type {\n CreateTypeObject,\n IndexedQuery,\n IndexedStorage,\n IndexTypeCollection,\n StringKey,\n TypeObject,\n ValueTypeDescription,\n} from '@solid/community-server';\nimport { \n getIdentityDatabase, \n IdentityDatabase, \n executeQuery, \n executeStatement,\n isDatabaseSqlite \n} from './db';\n\nfunction serializePayload(value: Record<string, unknown>): string {\n return JSON.stringify(value ?? {});\n}\n\nfunction parsePayload<T>(value: unknown): T {\n if (value == null) {\n return {} as T;\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return {} as T;\n }\n }\n return value as T;\n}\n\n/**\n * A generic Key-Value storage backed by a single SQL table.\n * Maps `type` (container) and `id` (key) to rows in the table.\n */\nexport class DrizzleIndexedStorage implements IndexedStorage<any> {\n private readonly logger = getLoggerFor(this);\n private readonly db: IdentityDatabase;\n private readonly tableName: string;\n private readonly definitions: Map<string, Record<string, ValueTypeDescription<string>>> = new Map();\n private readonly createdIndexes: Set<string> = new Set();\n private ready: boolean = false;\n\n public constructor(connectionString: string, tablePrefix = 'identity_') {\n this.db = getIdentityDatabase(connectionString);\n this.tableName = `${tablePrefix}store`;\n }\n\n private toJsonSql(payload: string): any {\n return isDatabaseSqlite(this.db) ? sql`${payload}` : sql`${payload}::jsonb`;\n }\n\n private async ensureTable(): Promise<void> {\n if (this.ready) return;\n \n const jsonType = isDatabaseSqlite(this.db) ? sql.raw('TEXT') : sql.raw('JSONB');\n const tableNameId = sql.identifier(this.tableName);\n \n await executeStatement(this.db, sql`\n CREATE TABLE IF NOT EXISTS ${tableNameId} (\n container TEXT NOT NULL,\n id TEXT NOT NULL,\n payload ${jsonType} NOT NULL,\n PRIMARY KEY (container, id)\n )\n `);\n this.ready = true;\n }\n\n public async defineType(type: string, description: any): Promise<void> {\n this.definitions.set(type, description as Record<string, ValueTypeDescription<string>>);\n await this.ensureTable();\n }\n\n public async createIndex(type: string, key: string): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n if (key === 'id') {\n return;\n }\n\n const cacheKey = `${type}:${key}`;\n if (this.createdIndexes.has(cacheKey)) {\n return;\n }\n\n if (isDatabaseSqlite(this.db)) {\n const jsonPath = this.escapeSqlLiteral(this.toSqliteJsonPath(key));\n await executeStatement(this.db, sql.raw(\n `CREATE INDEX IF NOT EXISTS \"${this.buildIndexName(type, key)}\" ON \"${this.tableName}\" (container, json_extract(payload, '${jsonPath}'))`,\n ));\n } else {\n const escapedKey = this.escapeSqlLiteral(key);\n await executeStatement(this.db, sql.raw(\n `CREATE INDEX IF NOT EXISTS \"${this.buildIndexName(type, key)}\" ON \"${this.tableName}\" (container, (jsonb_extract_path_text(payload, '${escapedKey}')))` ,\n ));\n }\n\n this.createdIndexes.add(cacheKey);\n this.logDuration('createIndex', started, { type, key }, 50, 500);\n }\n\n public async create(type: string, value: any): Promise<any> {\n const started = Date.now();\n await this.ensureTable();\n const id = crypto.randomUUID();\n const payload = serializePayload(value as Record<string, unknown>);\n const tableNameId = sql.identifier(this.tableName);\n\n await executeStatement(this.db, sql`\n INSERT INTO ${tableNameId} (container, id, payload)\n VALUES (${type}, ${id}, ${this.toJsonSql(payload)})\n `);\n this.logDuration('create', started, { type, fields: Object.keys(value ?? {}) }, 50, 500);\n return { id, ...(value as Record<string, unknown>) };\n }\n\n public async has(type: string, id: string): Promise<boolean> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n const result = await executeQuery(this.db, sql`SELECT 1 FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);\n this.logDuration('has', started, { type, id }, 50, 500);\n return result.rows.length > 0;\n }\n\n public async get(type: string, id: string): Promise<any | undefined> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n const result = await executeQuery(this.db, sql`SELECT payload FROM ${tableNameId} WHERE container = ${type} AND id = ${id} LIMIT 1`);\n this.logDuration('get', started, { type, id }, 50, 500);\n if (result.rows.length === 0) {\n return undefined;\n }\n const payload = parsePayload<Record<string, unknown>>(result.rows[0].payload);\n return { id, ...payload };\n }\n\n public async find(type: string, query: any): Promise<any[]> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n const normalizedQuery = (query ?? {}) as Record<string, unknown>;\n const pushdown = this.canPushDownQuery(normalizedQuery);\n const result = pushdown\n ? await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE ${this.buildWhereClause(type, normalizedQuery)}`)\n : await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE container = ${type}`);\n const matches: any[] = [];\n for (const row of result.rows) {\n const payload = {\n id: row.id as string,\n ...parsePayload<Record<string, unknown>>(row.payload),\n };\n if (this.matchesQuery(type, payload, normalizedQuery)) {\n matches.push(payload);\n }\n }\n this.logDuration('find', started, {\n type,\n keys: Object.keys(normalizedQuery),\n pushdown,\n matched: matches.length,\n }, 50, 500);\n return matches;\n }\n\n public async findIds(type: string, query: any): Promise<string[]> {\n const rows = await this.find(type, query);\n return rows.map((row) => row.id as string);\n }\n\n public async set(type: string, value: any): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n const { id, ...rest } = value as Record<string, unknown>;\n const payload = serializePayload(rest);\n \n await executeStatement(this.db, sql`\n UPDATE ${tableNameId}\n SET payload = ${this.toJsonSql(payload)}\n WHERE container = ${type} AND id = ${id}\n `);\n this.logDuration('set', started, { type, id, fields: Object.keys(rest) }, 50, 500);\n }\n\n public async setField(type: string, id: string, key: string, value: any): Promise<void> {\n const current = await this.get(type, id);\n if (!current) {\n return;\n }\n const updated = { ...current, [key]: value };\n await this.set(type, updated);\n }\n\n public async delete(type: string, id: string): Promise<void> {\n const started = Date.now();\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n await executeStatement(this.db, sql`DELETE FROM ${tableNameId} WHERE container = ${type} AND id = ${id}`);\n this.logDuration('delete', started, { type, id }, 50, 500);\n }\n\n public async *entries(type: string): AsyncIterableIterator<any> {\n await this.ensureTable();\n const tableNameId = sql.identifier(this.tableName);\n const result = await executeQuery(this.db, sql`SELECT id, payload FROM ${tableNameId} WHERE container = ${type}`);\n for (const row of result.rows) {\n yield {\n id: row.id as string,\n ...parsePayload<Record<string, unknown>>(row.payload),\n };\n }\n }\n\n private matchesQuery(type: string, payload: any, query: any): boolean {\n // Basic in-memory implementation of query matching\n // This mirrors MemoryIndexedStorage behavior for compatibility\n for (const key of Object.keys(query)) {\n if (payload[key] !== query[key]) {\n return false;\n }\n }\n return true;\n }\n\n private canPushDownQuery(query: Record<string, unknown>): boolean {\n return Object.values(query).every((value) => this.isSupportedQueryValue(value));\n }\n\n private isSupportedQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private buildWhereClause(type: string, query: Record<string, unknown>): any {\n const clauses = [sql`container = ${type}`];\n\n for (const [key, value] of Object.entries(query)) {\n if (key === 'id') {\n clauses.push(sql`id = ${String(value)}`);\n continue;\n }\n\n if (isDatabaseSqlite(this.db)) {\n const jsonPath = this.toSqliteJsonPath(key);\n const wrappedValue = JSON.stringify({ value });\n clauses.push(sql`json_extract(payload, ${jsonPath}) = json_extract(${wrappedValue}, '$.value')`);\n continue;\n }\n\n clauses.push(sql`jsonb_extract_path_text(payload, ${key}) = ${String(value)}`);\n }\n\n return sql.join(clauses, sql` AND `);\n }\n\n private buildIndexName(type: string, key: string): string {\n const rawName = `${this.tableName}_${type}_${key}_idx`;\n const normalized = rawName.replace(/[^a-zA-Z0-9_]/g, '_');\n if (normalized.length <= 63) {\n return normalized;\n }\n\n return `${normalized.slice(0, 54)}_${crypto.createHash('sha1').update(rawName).digest('hex').slice(0, 8)}`;\n }\n\n private toSqliteJsonPath(key: string): string {\n const escaped = key.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `$.\"${escaped}\"`;\n }\n\n private escapeSqlLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n private logDuration(\n operation: string,\n started: number,\n details: Record<string, unknown>,\n slowThresholdMs = 100,\n warnThresholdMs = 1000,\n ): void {\n const elapsedMs = Date.now() - started;\n if (elapsedMs < slowThresholdMs) {\n return;\n }\n\n const detailText = Object.entries(details)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(',') : String(value)}`)\n .join(' ');\n const message = `[timing] DrizzleIndexedStorage.${operation} ${detailText} took=${elapsedMs}ms`;\n\n if (elapsedMs >= warnThresholdMs) {\n this.logger.warn(message);\n return;\n }\n\n this.logger.info(message);\n }\n}\n"]}
@@ -183,7 +183,7 @@ class PodLookupRepository {
183
183
  ]);
184
184
  }
185
185
  async getAccountRowsFromKv() {
186
- const kvTableId = drizzle_orm_1.sql.identifier([this.kvTableName]);
186
+ const kvTableId = drizzle_orm_1.sql.identifier(this.kvTableName);
187
187
  try {
188
188
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
189
189
  SELECT key, value FROM ${kvTableId}
@@ -198,7 +198,7 @@ class PodLookupRepository {
198
198
  }
199
199
  async getNodeAssignments() {
200
200
  try {
201
- const tableId = drizzle_orm_1.sql.identifier(['cluster_node']);
201
+ const tableId = drizzle_orm_1.sql.identifier('cluster_node');
202
202
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
203
203
  SELECT id, pod_base_urls FROM ${tableId}
204
204
  WHERE pod_base_urls IS NOT NULL AND pod_base_urls <> ''
@@ -262,7 +262,7 @@ class PodLookupRepository {
262
262
  return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
263
263
  }
264
264
  async readKvValue(key) {
265
- const tableId = drizzle_orm_1.sql.identifier([this.kvTableName]);
265
+ const tableId = drizzle_orm_1.sql.identifier(this.kvTableName);
266
266
  try {
267
267
  const result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
268
268
  SELECT value FROM ${tableId}
@@ -310,7 +310,7 @@ class PodLookupRepository {
310
310
  * identity_store; this is the canonical clustered identity source.
311
311
  */
312
312
  async getPodsFromIndexedStore(nodeAssignments = []) {
313
- const storeTableId = drizzle_orm_1.sql.identifier([this.indexedStoreTableName]);
313
+ const storeTableId = drizzle_orm_1.sql.identifier(this.indexedStoreTableName);
314
314
  let result;
315
315
  try {
316
316
  result = await (0, db_1.executeQuery)(this.db, (0, drizzle_orm_1.sql) `
@@ -1 +1 @@
1
- {"version":3,"file":"PodLookupRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/PodLookupRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'drizzle-orm';\nimport { type IdentityDatabase, executeQuery } from './db';\n\nexport interface PodLookupResult {\n podId: string;\n accountId: string;\n baseUrl: string;\n storageUrl?: string;\n webId?: string;\n webIds?: string[];\n nodeId?: string;\n edgeNodeId?: string;\n}\n\ninterface InternalKvRow {\n key?: string;\n value?: string;\n}\n\ninterface NodeAssignmentRow {\n node_id?: string | null;\n base_url?: string | null;\n}\n\n/**\n * Repository for Pod lookup operations.\n *\n * Reads Pod facts from the canonical identity_store table and from CSS\n * WrappedIndexedStorage rows when that storage backend is active.\n */\nexport class PodLookupRepository {\n private readonly kvTableName: string;\n private readonly indexedStoreTableName: string;\n\n public constructor(\n private readonly db: IdentityDatabase,\n kvTableName?: string,\n ) {\n this.kvTableName = kvTableName ?? 'internal_kv';\n this.indexedStoreTableName = 'identity_store';\n }\n\n /**\n * Find Pod by resource path (matches longest canonical storage/base URL prefix).\n */\n public async findByResourceIdentifier(resourcePath: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n\n let bestMatch: PodLookupResult | undefined;\n let bestLength = 0;\n\n for (const pod of pods) {\n const candidateBase = pod.storageUrl ?? pod.baseUrl;\n if (resourcePath.startsWith(candidateBase) && candidateBase.length > bestLength) {\n bestMatch = pod;\n bestLength = candidateBase.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Get Pod by ID.\n */\n public async findById(podId: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n return pods.find((p) => p.podId === podId);\n }\n\n /**\n * Find Pod by a linked WebID URL.\n *\n * CSS account data stores WebID links separately from Pod base URLs. This is\n * the precise lookup for IdP/SP split deployments where the WebID path does\n * not have to match the storage base URL.\n */\n public async findByWebId(webId: string): Promise<PodLookupResult | undefined> {\n return (await this.findAllByWebId(webId))[0];\n }\n\n /**\n * Find all Pods linked to a WebID.\n *\n * A Cloud WebID can legitimately back both a Cloud Pod and a Local SP Pod.\n * Callers that are scoped to a storage provider must inspect all candidates\n * instead of accepting the first account record returned by CSS storage.\n */\n public async findAllByWebId(webId: string): Promise<PodLookupResult[]> {\n const normalized = normalizeWebId(webId);\n if (!normalized) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => normalizeWebId(candidate) === normalized);\n if (matchedWebId) {\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n }\n\n if (results.length > 0) {\n return results;\n }\n\n const indexed = await this.findByWebIdIndex(normalized);\n if (!indexed) {\n return [];\n }\n return [{\n ...indexed,\n }];\n }\n\n /**\n * Find Pods by linked WebID URLs in one scan.\n */\n public async findByWebIds(webIds: string[]): Promise<PodLookupResult[]> {\n const normalizedTargets = new Set(webIds.map(normalizeWebId).filter((value): value is string => Boolean(value)));\n if (normalizedTargets.size === 0) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => {\n const normalized = normalizeWebId(candidate);\n return normalized ? normalizedTargets.has(normalized) : false;\n });\n if (!matchedWebId) {\n continue;\n }\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n if (results.length < normalizedTargets.size) {\n const seen = new Set(results.map((result) => normalizeWebId(result.webId)).filter(Boolean));\n for (const normalized of normalizedTargets) {\n if (seen.has(normalized)) {\n continue;\n }\n const indexed = await this.findByWebIdIndex(normalized);\n if (indexed) {\n results.push(indexed);\n }\n }\n }\n return results;\n }\n\n /**\n * List Pods for a specific account.\n */\n public async listByAccountId(accountId: string): Promise<PodLookupResult[]> {\n const pods = await this.getAllPods();\n return pods.filter((pod) => pod.accountId === accountId);\n }\n\n /**\n * List all pods.\n */\n public async listAllPods(): Promise<PodLookupResult[]> {\n return this.getAllPods();\n }\n\n /**\n * Extract all pods from the configured CSS identity storage.\n */\n private async getAllPods(): Promise<PodLookupResult[]> {\n const result = await this.getAccountRowsFromKv();\n const nodeAssignments = await this.getNodeAssignments();\n\n const pods: PodLookupResult[] = [];\n\n for (const row of result) {\n if (!row.key || row.value === undefined) {\n continue;\n }\n\n try {\n const accountId = extractAccountIdFromAccountDataKey(row.key);\n if (!accountId) {\n continue;\n }\n const data = unwrapStoredValue(typeof row.value === 'string' ? JSON.parse(row.value) : row.value);\n\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : findNodeIdForPod(nodeAssignments, [storageUrl, pod.baseUrl]),\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n } catch {\n // Skip malformed entries.\n }\n }\n\n return mergePodLookupResults([\n ...pods,\n ...await this.getPodsFromIndexedStore(nodeAssignments),\n ]);\n }\n\n private async getAccountRowsFromKv(): Promise<InternalKvRow[]> {\n const kvTableId = sql.identifier([this.kvTableName]);\n try {\n const result = await executeQuery<InternalKvRow>(this.db, sql`\n SELECT key, value FROM ${kvTableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n return result?.rows ?? [];\n } catch {\n return [];\n }\n }\n\n private async getNodeAssignments(): Promise<NodeAssignmentRow[]> {\n try {\n const tableId = sql.identifier(['cluster_node']);\n const result = await executeQuery<{ id?: string | null; pod_base_urls?: unknown }>(this.db, sql`\n SELECT id, pod_base_urls FROM ${tableId}\n WHERE pod_base_urls IS NOT NULL AND pod_base_urls <> ''\n `);\n return result.rows.flatMap((row) => {\n if (!row.id) {\n return [];\n }\n return parsePodBaseUrls(row.pod_base_urls).map((baseUrl) => ({\n node_id: row.id,\n base_url: baseUrl,\n }));\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Fast path for CSS WrappedIndexedStorage. WebID indexes point to the root\n * account id, so a single indexed key plus account data row can resolve the\n * profile without scanning all account records.\n */\n private async findByWebIdIndex(webId: string): Promise<PodLookupResult | undefined> {\n const accountIds = await this.readStringArrayFromKv(`accounts/index/webIdLink/webId/${encodeURIComponent(webId)}`);\n for (const accountId of accountIds) {\n const account = await this.readAccountData(accountId);\n if (!account) {\n continue;\n }\n const pods = this.extractPodsFromAccountData(accountId, account);\n const match = pods.find((pod) => getPodWebIds(pod).some((candidate) => normalizeWebId(candidate) === webId));\n if (match) {\n return {\n ...match,\n webId,\n };\n }\n if (pods.length === 1) {\n return {\n ...pods[0],\n webId,\n ...webIdsProperty([webId, ...getPodWebIds(pods[0])]),\n };\n }\n }\n return undefined;\n }\n\n private async readAccountData(accountId: string): Promise<Record<string, unknown> | undefined> {\n for (const key of [`accounts/data/${accountId}`, `/.internal/accounts/data/${accountId}`]) {\n const value = await this.readKvValue(key);\n const record = parsePayloadRecord(value);\n if (record) {\n return record;\n }\n }\n return undefined;\n }\n\n private async readStringArrayFromKv(key: string): Promise<string[]> {\n const value = await this.readKvValue(key);\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n }\n\n private async readKvValue(key: string): Promise<unknown> {\n const tableId = sql.identifier([this.kvTableName]);\n try {\n const result = await executeQuery<{ value?: unknown }>(this.db, sql`\n SELECT value FROM ${tableId}\n WHERE key = ${key}\n LIMIT 1\n `);\n if (result.rows.length === 0) {\n return undefined;\n }\n return parseStoredValue(result.rows[0].value);\n } catch {\n return undefined;\n }\n }\n\n private extractPodsFromAccountData(accountId: string, data: Record<string, unknown>): PodLookupResult[] {\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n const pods: PodLookupResult[] = [];\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n\n return pods;\n }\n\n /**\n * DrizzleIndexedStorage stores CSS identity facts as typed rows in\n * identity_store; this is the canonical clustered identity source.\n */\n private async getPodsFromIndexedStore(nodeAssignments: NodeAssignmentRow[] = []): Promise<PodLookupResult[]> {\n const storeTableId = sql.identifier([this.indexedStoreTableName]);\n let result: { rows?: Array<{ container?: string; id?: string; payload?: unknown }> } | undefined;\n try {\n result = await executeQuery(this.db, sql`\n SELECT container, id, payload FROM ${storeTableId}\n WHERE container IN ('pod', 'owner', 'webIdLink')\n `);\n } catch {\n return [];\n }\n\n const podPayloads = new Map<string, Record<string, unknown>>();\n const ownerWebIdsByPodId = new Map<string, string[]>();\n const webIdsByAccountId = new Map<string, string[]>();\n\n for (const row of result?.rows ?? []) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayloadRecord(row.payload);\n if (!payload) {\n continue;\n }\n\n if (row.container === 'pod') {\n podPayloads.set(row.id, payload);\n continue;\n }\n\n if (row.container === 'owner') {\n const podId = stringValue(payload.podId);\n const webId = stringValue(payload.webId);\n if (podId && webId) {\n appendMapValue(ownerWebIdsByPodId, podId, webId);\n }\n continue;\n }\n\n if (row.container === 'webIdLink') {\n const accountId = stringValue(payload.accountId);\n const webId = stringValue(payload.webId);\n if (accountId && webId) {\n appendMapValue(webIdsByAccountId, accountId, webId);\n }\n }\n }\n\n const pods: PodLookupResult[] = [];\n for (const [podId, pod] of podPayloads) {\n const baseUrl = stringValue(pod.baseUrl);\n const accountId = stringValue(pod.accountId);\n if (!baseUrl || !accountId) {\n continue;\n }\n const podWebIds = dedupeStrings([\n stringValue(pod.webId),\n ...(ownerWebIdsByPodId.get(podId) ?? []),\n ...(webIdsByAccountId.get(accountId) ?? []),\n ].filter((value): value is string => typeof value === 'string'));\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n\n pods.push({\n podId,\n accountId,\n baseUrl,\n storageUrl,\n webId: podWebIds[0],\n ...webIdsProperty(podWebIds),\n nodeId: stringValue(pod.nodeId) ?? findNodeIdForPod(nodeAssignments, [storageUrl, baseUrl]),\n edgeNodeId: stringValue(pod.edgeNodeId),\n });\n }\n\n return pods;\n }\n}\n\nfunction extractAccountIdFromAccountDataKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n\nfunction extractAccountWebIds(data: unknown): string[] {\n if (!data || typeof data !== 'object') {\n return [];\n }\n\n const record = data as Record<string, unknown>;\n const linkMap = record['**webIdLink**'] || record.webIdLink || {};\n if (!linkMap || typeof linkMap !== 'object') {\n return [];\n }\n\n return Object.values(linkMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction extractPodOwnerWebIds(pod: Record<string, unknown>): string[] {\n const ownerMap = pod['**owner**'] || pod.owner || {};\n if (!ownerMap || typeof ownerMap !== 'object') {\n return [];\n }\n\n return Object.values(ownerMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction normalizeWebId(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n return new URL(webId).toString();\n } catch {\n return webId;\n }\n}\n\nfunction normalizeUrlRoot(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n const parsed = new URL(url);\n parsed.pathname = parsed.pathname.replace(/\\/+$/u, '') || '/';\n parsed.search = '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getPodWebIds(pod: PodLookupResult): string[] {\n return dedupeStrings([\n pod.webId,\n ...(pod.webIds ?? []),\n ].filter((value): value is string => typeof value === 'string' && value.length > 0));\n}\n\nfunction webIdsProperty(values: string[]): Pick<PodLookupResult, 'webIds'> {\n const webIds = dedupeStrings(values);\n return webIds.length > 1 ? { webIds } : {};\n}\n\nfunction mergePodLookupResults(values: PodLookupResult[]): PodLookupResult[] {\n const byPodId = new Map<string, PodLookupResult>();\n for (const value of values) {\n const existing = byPodId.get(value.podId);\n if (!existing) {\n byPodId.set(value.podId, value);\n continue;\n }\n\n const webIds = dedupeStrings([\n ...getPodWebIds(existing),\n ...getPodWebIds(value),\n ]);\n byPodId.set(value.podId, {\n ...existing,\n baseUrl: existing.baseUrl || value.baseUrl,\n storageUrl: existing.storageUrl ?? value.storageUrl,\n accountId: existing.accountId || value.accountId,\n webId: webIds[0],\n ...webIdsProperty(webIds),\n nodeId: existing.nodeId ?? value.nodeId,\n edgeNodeId: existing.edgeNodeId ?? value.edgeNodeId,\n });\n }\n return [...byPodId.values()];\n}\n\nfunction parsePayloadRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n const unwrapped = unwrapStoredValue(parsed);\n return unwrapped && typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n const unwrapped = unwrapStoredValue(value);\n return typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n}\n\nfunction parseStoredValue(value: unknown): unknown {\n if (typeof value === 'string') {\n try {\n return unwrapStoredValue(JSON.parse(value));\n } catch {\n return undefined;\n }\n }\n return unwrapStoredValue(value);\n}\n\nfunction unwrapStoredValue(value: unknown): unknown {\n if (value && typeof value === 'object' && 'key' in value && 'payload' in value) {\n return (value as Record<string, unknown>).payload;\n }\n return value;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction appendMapValue(map: Map<string, string[]>, key: string, value: string): void {\n const values = map.get(key) ?? [];\n values.push(value);\n map.set(key, values);\n}\n\nfunction parsePodBaseUrls(value: unknown): string[] {\n if (Array.isArray(value)) {\n return dedupeStrings(value.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0));\n }\n if (typeof value !== 'string' || value.length === 0) {\n return [];\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed)\n ? dedupeStrings(parsed.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0))\n : [];\n } catch {\n return [];\n }\n}\n\nfunction findNodeIdForPod(assignments: NodeAssignmentRow[], urls: Array<string | undefined>): string | undefined {\n const normalizedUrls = urls.map(normalizeUrlRoot).filter((value): value is string => Boolean(value));\n if (normalizedUrls.length === 0) {\n return undefined;\n }\n\n let bestMatch: { nodeId: string; length: number } | undefined;\n for (const assignment of assignments) {\n if (!assignment.node_id || !assignment.base_url) {\n continue;\n }\n const assignedBase = normalizeUrlRoot(assignment.base_url);\n if (!assignedBase) {\n continue;\n }\n for (const url of normalizedUrls) {\n if (url.startsWith(assignedBase) && assignedBase.length > (bestMatch?.length ?? 0)) {\n bestMatch = {\n nodeId: assignment.node_id,\n length: assignedBase.length,\n };\n }\n }\n }\n\n return bestMatch?.nodeId;\n}\n"]}
1
+ {"version":3,"file":"PodLookupRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/PodLookupRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'drizzle-orm';\nimport { type IdentityDatabase, executeQuery } from './db';\n\nexport interface PodLookupResult {\n podId: string;\n accountId: string;\n baseUrl: string;\n storageUrl?: string;\n webId?: string;\n webIds?: string[];\n nodeId?: string;\n edgeNodeId?: string;\n}\n\ninterface InternalKvRow {\n key?: string;\n value?: string;\n}\n\ninterface NodeAssignmentRow {\n node_id?: string | null;\n base_url?: string | null;\n}\n\n/**\n * Repository for Pod lookup operations.\n *\n * Reads Pod facts from the canonical identity_store table and from CSS\n * WrappedIndexedStorage rows when that storage backend is active.\n */\nexport class PodLookupRepository {\n private readonly kvTableName: string;\n private readonly indexedStoreTableName: string;\n\n public constructor(\n private readonly db: IdentityDatabase,\n kvTableName?: string,\n ) {\n this.kvTableName = kvTableName ?? 'internal_kv';\n this.indexedStoreTableName = 'identity_store';\n }\n\n /**\n * Find Pod by resource path (matches longest canonical storage/base URL prefix).\n */\n public async findByResourceIdentifier(resourcePath: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n\n let bestMatch: PodLookupResult | undefined;\n let bestLength = 0;\n\n for (const pod of pods) {\n const candidateBase = pod.storageUrl ?? pod.baseUrl;\n if (resourcePath.startsWith(candidateBase) && candidateBase.length > bestLength) {\n bestMatch = pod;\n bestLength = candidateBase.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Get Pod by ID.\n */\n public async findById(podId: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n return pods.find((p) => p.podId === podId);\n }\n\n /**\n * Find Pod by a linked WebID URL.\n *\n * CSS account data stores WebID links separately from Pod base URLs. This is\n * the precise lookup for IdP/SP split deployments where the WebID path does\n * not have to match the storage base URL.\n */\n public async findByWebId(webId: string): Promise<PodLookupResult | undefined> {\n return (await this.findAllByWebId(webId))[0];\n }\n\n /**\n * Find all Pods linked to a WebID.\n *\n * A Cloud WebID can legitimately back both a Cloud Pod and a Local SP Pod.\n * Callers that are scoped to a storage provider must inspect all candidates\n * instead of accepting the first account record returned by CSS storage.\n */\n public async findAllByWebId(webId: string): Promise<PodLookupResult[]> {\n const normalized = normalizeWebId(webId);\n if (!normalized) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => normalizeWebId(candidate) === normalized);\n if (matchedWebId) {\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n }\n\n if (results.length > 0) {\n return results;\n }\n\n const indexed = await this.findByWebIdIndex(normalized);\n if (!indexed) {\n return [];\n }\n return [{\n ...indexed,\n }];\n }\n\n /**\n * Find Pods by linked WebID URLs in one scan.\n */\n public async findByWebIds(webIds: string[]): Promise<PodLookupResult[]> {\n const normalizedTargets = new Set(webIds.map(normalizeWebId).filter((value): value is string => Boolean(value)));\n if (normalizedTargets.size === 0) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => {\n const normalized = normalizeWebId(candidate);\n return normalized ? normalizedTargets.has(normalized) : false;\n });\n if (!matchedWebId) {\n continue;\n }\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n if (results.length < normalizedTargets.size) {\n const seen = new Set(results.map((result) => normalizeWebId(result.webId)).filter(Boolean));\n for (const normalized of normalizedTargets) {\n if (seen.has(normalized)) {\n continue;\n }\n const indexed = await this.findByWebIdIndex(normalized);\n if (indexed) {\n results.push(indexed);\n }\n }\n }\n return results;\n }\n\n /**\n * List Pods for a specific account.\n */\n public async listByAccountId(accountId: string): Promise<PodLookupResult[]> {\n const pods = await this.getAllPods();\n return pods.filter((pod) => pod.accountId === accountId);\n }\n\n /**\n * List all pods.\n */\n public async listAllPods(): Promise<PodLookupResult[]> {\n return this.getAllPods();\n }\n\n /**\n * Extract all pods from the configured CSS identity storage.\n */\n private async getAllPods(): Promise<PodLookupResult[]> {\n const result = await this.getAccountRowsFromKv();\n const nodeAssignments = await this.getNodeAssignments();\n\n const pods: PodLookupResult[] = [];\n\n for (const row of result) {\n if (!row.key || row.value === undefined) {\n continue;\n }\n\n try {\n const accountId = extractAccountIdFromAccountDataKey(row.key);\n if (!accountId) {\n continue;\n }\n const data = unwrapStoredValue(typeof row.value === 'string' ? JSON.parse(row.value) : row.value);\n\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : findNodeIdForPod(nodeAssignments, [storageUrl, pod.baseUrl]),\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n } catch {\n // Skip malformed entries.\n }\n }\n\n return mergePodLookupResults([\n ...pods,\n ...await this.getPodsFromIndexedStore(nodeAssignments),\n ]);\n }\n\n private async getAccountRowsFromKv(): Promise<InternalKvRow[]> {\n const kvTableId = sql.identifier(this.kvTableName);\n try {\n const result = await executeQuery<InternalKvRow>(this.db, sql`\n SELECT key, value FROM ${kvTableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n return result?.rows ?? [];\n } catch {\n return [];\n }\n }\n\n private async getNodeAssignments(): Promise<NodeAssignmentRow[]> {\n try {\n const tableId = sql.identifier('cluster_node');\n const result = await executeQuery<{ id?: string | null; pod_base_urls?: unknown }>(this.db, sql`\n SELECT id, pod_base_urls FROM ${tableId}\n WHERE pod_base_urls IS NOT NULL AND pod_base_urls <> ''\n `);\n return result.rows.flatMap((row) => {\n if (!row.id) {\n return [];\n }\n return parsePodBaseUrls(row.pod_base_urls).map((baseUrl) => ({\n node_id: row.id,\n base_url: baseUrl,\n }));\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Fast path for CSS WrappedIndexedStorage. WebID indexes point to the root\n * account id, so a single indexed key plus account data row can resolve the\n * profile without scanning all account records.\n */\n private async findByWebIdIndex(webId: string): Promise<PodLookupResult | undefined> {\n const accountIds = await this.readStringArrayFromKv(`accounts/index/webIdLink/webId/${encodeURIComponent(webId)}`);\n for (const accountId of accountIds) {\n const account = await this.readAccountData(accountId);\n if (!account) {\n continue;\n }\n const pods = this.extractPodsFromAccountData(accountId, account);\n const match = pods.find((pod) => getPodWebIds(pod).some((candidate) => normalizeWebId(candidate) === webId));\n if (match) {\n return {\n ...match,\n webId,\n };\n }\n if (pods.length === 1) {\n return {\n ...pods[0],\n webId,\n ...webIdsProperty([webId, ...getPodWebIds(pods[0])]),\n };\n }\n }\n return undefined;\n }\n\n private async readAccountData(accountId: string): Promise<Record<string, unknown> | undefined> {\n for (const key of [`accounts/data/${accountId}`, `/.internal/accounts/data/${accountId}`]) {\n const value = await this.readKvValue(key);\n const record = parsePayloadRecord(value);\n if (record) {\n return record;\n }\n }\n return undefined;\n }\n\n private async readStringArrayFromKv(key: string): Promise<string[]> {\n const value = await this.readKvValue(key);\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n }\n\n private async readKvValue(key: string): Promise<unknown> {\n const tableId = sql.identifier(this.kvTableName);\n try {\n const result = await executeQuery<{ value?: unknown }>(this.db, sql`\n SELECT value FROM ${tableId}\n WHERE key = ${key}\n LIMIT 1\n `);\n if (result.rows.length === 0) {\n return undefined;\n }\n return parseStoredValue(result.rows[0].value);\n } catch {\n return undefined;\n }\n }\n\n private extractPodsFromAccountData(accountId: string, data: Record<string, unknown>): PodLookupResult[] {\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n const pods: PodLookupResult[] = [];\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n\n return pods;\n }\n\n /**\n * DrizzleIndexedStorage stores CSS identity facts as typed rows in\n * identity_store; this is the canonical clustered identity source.\n */\n private async getPodsFromIndexedStore(nodeAssignments: NodeAssignmentRow[] = []): Promise<PodLookupResult[]> {\n const storeTableId = sql.identifier(this.indexedStoreTableName);\n let result: { rows?: Array<{ container?: string; id?: string; payload?: unknown }> } | undefined;\n try {\n result = await executeQuery(this.db, sql`\n SELECT container, id, payload FROM ${storeTableId}\n WHERE container IN ('pod', 'owner', 'webIdLink')\n `);\n } catch {\n return [];\n }\n\n const podPayloads = new Map<string, Record<string, unknown>>();\n const ownerWebIdsByPodId = new Map<string, string[]>();\n const webIdsByAccountId = new Map<string, string[]>();\n\n for (const row of result?.rows ?? []) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayloadRecord(row.payload);\n if (!payload) {\n continue;\n }\n\n if (row.container === 'pod') {\n podPayloads.set(row.id, payload);\n continue;\n }\n\n if (row.container === 'owner') {\n const podId = stringValue(payload.podId);\n const webId = stringValue(payload.webId);\n if (podId && webId) {\n appendMapValue(ownerWebIdsByPodId, podId, webId);\n }\n continue;\n }\n\n if (row.container === 'webIdLink') {\n const accountId = stringValue(payload.accountId);\n const webId = stringValue(payload.webId);\n if (accountId && webId) {\n appendMapValue(webIdsByAccountId, accountId, webId);\n }\n }\n }\n\n const pods: PodLookupResult[] = [];\n for (const [podId, pod] of podPayloads) {\n const baseUrl = stringValue(pod.baseUrl);\n const accountId = stringValue(pod.accountId);\n if (!baseUrl || !accountId) {\n continue;\n }\n const podWebIds = dedupeStrings([\n stringValue(pod.webId),\n ...(ownerWebIdsByPodId.get(podId) ?? []),\n ...(webIdsByAccountId.get(accountId) ?? []),\n ].filter((value): value is string => typeof value === 'string'));\n const storageUrl = stringValue(pod.storageUrl) ?? stringValue(pod.storage);\n\n pods.push({\n podId,\n accountId,\n baseUrl,\n storageUrl,\n webId: podWebIds[0],\n ...webIdsProperty(podWebIds),\n nodeId: stringValue(pod.nodeId) ?? findNodeIdForPod(nodeAssignments, [storageUrl, baseUrl]),\n edgeNodeId: stringValue(pod.edgeNodeId),\n });\n }\n\n return pods;\n }\n}\n\nfunction extractAccountIdFromAccountDataKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n\nfunction extractAccountWebIds(data: unknown): string[] {\n if (!data || typeof data !== 'object') {\n return [];\n }\n\n const record = data as Record<string, unknown>;\n const linkMap = record['**webIdLink**'] || record.webIdLink || {};\n if (!linkMap || typeof linkMap !== 'object') {\n return [];\n }\n\n return Object.values(linkMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction extractPodOwnerWebIds(pod: Record<string, unknown>): string[] {\n const ownerMap = pod['**owner**'] || pod.owner || {};\n if (!ownerMap || typeof ownerMap !== 'object') {\n return [];\n }\n\n return Object.values(ownerMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction normalizeWebId(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n return new URL(webId).toString();\n } catch {\n return webId;\n }\n}\n\nfunction normalizeUrlRoot(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n const parsed = new URL(url);\n parsed.pathname = parsed.pathname.replace(/\\/+$/u, '') || '/';\n parsed.search = '';\n parsed.hash = '';\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getPodWebIds(pod: PodLookupResult): string[] {\n return dedupeStrings([\n pod.webId,\n ...(pod.webIds ?? []),\n ].filter((value): value is string => typeof value === 'string' && value.length > 0));\n}\n\nfunction webIdsProperty(values: string[]): Pick<PodLookupResult, 'webIds'> {\n const webIds = dedupeStrings(values);\n return webIds.length > 1 ? { webIds } : {};\n}\n\nfunction mergePodLookupResults(values: PodLookupResult[]): PodLookupResult[] {\n const byPodId = new Map<string, PodLookupResult>();\n for (const value of values) {\n const existing = byPodId.get(value.podId);\n if (!existing) {\n byPodId.set(value.podId, value);\n continue;\n }\n\n const webIds = dedupeStrings([\n ...getPodWebIds(existing),\n ...getPodWebIds(value),\n ]);\n byPodId.set(value.podId, {\n ...existing,\n baseUrl: existing.baseUrl || value.baseUrl,\n storageUrl: existing.storageUrl ?? value.storageUrl,\n accountId: existing.accountId || value.accountId,\n webId: webIds[0],\n ...webIdsProperty(webIds),\n nodeId: existing.nodeId ?? value.nodeId,\n edgeNodeId: existing.edgeNodeId ?? value.edgeNodeId,\n });\n }\n return [...byPodId.values()];\n}\n\nfunction parsePayloadRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n const unwrapped = unwrapStoredValue(parsed);\n return unwrapped && typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n const unwrapped = unwrapStoredValue(value);\n return typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n}\n\nfunction parseStoredValue(value: unknown): unknown {\n if (typeof value === 'string') {\n try {\n return unwrapStoredValue(JSON.parse(value));\n } catch {\n return undefined;\n }\n }\n return unwrapStoredValue(value);\n}\n\nfunction unwrapStoredValue(value: unknown): unknown {\n if (value && typeof value === 'object' && 'key' in value && 'payload' in value) {\n return (value as Record<string, unknown>).payload;\n }\n return value;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction appendMapValue(map: Map<string, string[]>, key: string, value: string): void {\n const values = map.get(key) ?? [];\n values.push(value);\n map.set(key, values);\n}\n\nfunction parsePodBaseUrls(value: unknown): string[] {\n if (Array.isArray(value)) {\n return dedupeStrings(value.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0));\n }\n if (typeof value !== 'string' || value.length === 0) {\n return [];\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed)\n ? dedupeStrings(parsed.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0))\n : [];\n } catch {\n return [];\n }\n}\n\nfunction findNodeIdForPod(assignments: NodeAssignmentRow[], urls: Array<string | undefined>): string | undefined {\n const normalizedUrls = urls.map(normalizeUrlRoot).filter((value): value is string => Boolean(value));\n if (normalizedUrls.length === 0) {\n return undefined;\n }\n\n let bestMatch: { nodeId: string; length: number } | undefined;\n for (const assignment of assignments) {\n if (!assignment.node_id || !assignment.base_url) {\n continue;\n }\n const assignedBase = normalizeUrlRoot(assignment.base_url);\n if (!assignedBase) {\n continue;\n }\n for (const url of normalizedUrls) {\n if (url.startsWith(assignedBase) && assignedBase.length > (bestMatch?.length ?? 0)) {\n bestMatch = {\n nodeId: assignment.node_id,\n length: assignedBase.length,\n };\n }\n }\n }\n\n return bestMatch?.nodeId;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/xpod",
3
- "version": "0.3.41",
3
+ "version": "0.3.42",
4
4
  "description": "Xpod is an extended Community Solid Server, offering rich-feature, production-level Solid Pod and identity management.",
5
5
  "repository": "https://github.com/undefinedsco/xpod",
6
6
  "author": "developer@undefineds.co",