diff --git a/packages/access-api/src/models/delegations.js b/packages/access-api/src/models/delegations.js index 3acc5cef7..b18efa166 100644 --- a/packages/access-api/src/models/delegations.js +++ b/packages/access-api/src/models/delegations.js @@ -162,3 +162,20 @@ export function createDelegationRowUpdate(d) { bytes: delegationsToBytes([d]), } } + +/** + * @param {Array | Buffer | unknown} sqlValue - value from kysely 'bytes' table - in node it could be a Buffer. In cloudflare it might be an Array + * @returns {ArrayBuffer|undefined} - undefined if unable to convert + */ +export function delegationsTableBytesToArrayBuffer(sqlValue) { + if (ArrayBuffer.isView(sqlValue)) { + return new Uint8Array( + sqlValue.buffer, + sqlValue.byteOffset, + sqlValue.byteLength + ) + } + if (Array.isArray(sqlValue)) { + return Uint8Array.from(sqlValue) + } +} diff --git a/packages/access-api/src/service/voucher-redeem.js b/packages/access-api/src/service/voucher-redeem.js index 6579a4e73..788302dcf 100644 --- a/packages/access-api/src/service/voucher-redeem.js +++ b/packages/access-api/src/service/voucher-redeem.js @@ -46,7 +46,7 @@ export function voucherRedeemProvider(ctx) { ) if (error) { - if (error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') { + if ('code' in error && error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') { return new Failure(`Space ${capability.nb.space} already registered.`) } else { throw error diff --git a/packages/access-api/src/utils/context.js b/packages/access-api/src/utils/context.js index 26a957f89..ed886de8f 100644 --- a/packages/access-api/src/utils/context.js +++ b/packages/access-api/src/utils/context.js @@ -9,7 +9,10 @@ import { Validations } from '../models/validations.js' import * as Email from './email.js' import { createUploadApiConnection } from '../service/upload-api-proxy.js' import { DID } from '@ucanto/core' -import { DbDelegationsStorage } from '../models/delegations.js' +import { + DbDelegationsStorage, + delegationsTableBytesToArrayBuffer, +} from '../models/delegations.js' import { createD1Database } from './d1.js' /** @@ -64,7 +67,13 @@ export function getContext(request, env, ctx) { config, url, models: { - delegations: new DbDelegationsStorage(createD1Database(config.DB)), + delegations: new DbDelegationsStorage( + createD1Database(config.DB, { + bytes: (v) => { + return delegationsTableBytesToArrayBuffer(v) ?? v + }, + }) + ), spaces: new Spaces(config.DB), validations: new Validations(config.VALIDATIONS), accounts: new Accounts(config.DB), diff --git a/packages/access-api/src/utils/d1.js b/packages/access-api/src/utils/d1.js index b4b615fb6..a8ab9b60c 100644 --- a/packages/access-api/src/utils/d1.js +++ b/packages/access-api/src/utils/d1.js @@ -142,9 +142,10 @@ export class D1Error extends Error { /** * @template S * @param {D1Database} d1 + * @param {Record unknown>} [resultTransforms] * @returns {import('../types/database.js').Database} */ -export function createD1Database(d1) { +export function createD1Database(d1, resultTransforms = {}) { /** @type {Kysely} */ const kdb = new Kysely({ dialect: new D1Dialect({ database: d1 }), @@ -154,6 +155,7 @@ export function createD1Database(d1) { expires_at: (v) => (typeof v === 'string' ? new Date(v) : null), inserted_at: (v) => new Date(v), updated_at: (v) => new Date(v), + ...resultTransforms, }), ], })