[D1] TypeError: Cannot read properties of undefined (reading 'alwaysPrimarySession')

im trying to make my worker's D1 batch have many attempts, but it refuses to run, its running on an scheduled event, and the batch runs at the very end of it, using await or ctx.waitUntil makes no difference
/**
* awaits a function, but with multiple attempts and wait time between attempts
* @param fn Function pointer to the function to await for
* @param awaitArgs Array of arguments to pass to the awaiting function
* @param retries How many attempts
* @param interval How many milliseconds are there between each attempt
* @param errHandler What to do every time the await gets rejected
* @returns The end result in case the function resolves correctly
*/
export function awaitWithRetry<Args extends any[], ReturnType>(
fn: (...args: Args) => Promise<ReturnType>,
awaitArgs: Args,
retries: number,
interval: number,
errHandler: (err: unknown) => void
): Promise<ReturnType> {
return new Promise((resolve, reject) => {
let attempts = retries;

async function attempt() {
if (!attempts)
return reject(new Error('Ran out of tries.'));
try {
const ret = await fn(...awaitArgs);
resolve(ret);
} catch (err) {
errHandler(err);
attempts--;
setTimeout(attempt, interval);
}
}

attempt();
});
}

// Call inside scheduled event
ctx.waitUntil(awaitWithRetry(env.DB.batch, [updateBatch], 5, 1000, (err) => { console.warn(err); }));
/**
* awaits a function, but with multiple attempts and wait time between attempts
* @param fn Function pointer to the function to await for
* @param awaitArgs Array of arguments to pass to the awaiting function
* @param retries How many attempts
* @param interval How many milliseconds are there between each attempt
* @param errHandler What to do every time the await gets rejected
* @returns The end result in case the function resolves correctly
*/
export function awaitWithRetry<Args extends any[], ReturnType>(
fn: (...args: Args) => Promise<ReturnType>,
awaitArgs: Args,
retries: number,
interval: number,
errHandler: (err: unknown) => void
): Promise<ReturnType> {
return new Promise((resolve, reject) => {
let attempts = retries;

async function attempt() {
if (!attempts)
return reject(new Error('Ran out of tries.'));
try {
const ret = await fn(...awaitArgs);
resolve(ret);
} catch (err) {
errHandler(err);
attempts--;
setTimeout(attempt, interval);
}
}

attempt();
});
}

// Call inside scheduled event
ctx.waitUntil(awaitWithRetry(env.DB.batch, [updateBatch], 5, 1000, (err) => { console.warn(err); }));
Error:
✘ [ERROR] TypeError: Cannot read properties of undefined (reading 'alwaysPrimarySession')

at batch (cloudflare-internal:d1-api:28:21)
at attempt (file:///home/pedro/dev/vita3k-api/src/utils.ts:116:23)
at null.<anonymous> (file:///home/pedro/dev/vita3k-api/src/utils.ts:125:3)
at new Promise (<anonymous>)
at awaitWithRetry (file:///home/pedro/dev/vita3k-api/src/utils.ts:109:9)
at Object.scheduled (file:///home/pedro/dev/vita3k-api/src/main.ts:96:19)
at async scheduled
(file:///home/pedro/dev/vita3k-api/node_modules/wrangler/templates/middleware/middleware-scheduled.ts:8:3)
at async drainBody
(file:///home/pedro/dev/vita3k-api/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts:5:10)
✘ [ERROR] TypeError: Cannot read properties of undefined (reading 'alwaysPrimarySession')

at batch (cloudflare-internal:d1-api:28:21)
at attempt (file:///home/pedro/dev/vita3k-api/src/utils.ts:116:23)
at null.<anonymous> (file:///home/pedro/dev/vita3k-api/src/utils.ts:125:3)
at new Promise (<anonymous>)
at awaitWithRetry (file:///home/pedro/dev/vita3k-api/src/utils.ts:109:9)
at Object.scheduled (file:///home/pedro/dev/vita3k-api/src/main.ts:96:19)
at async scheduled
(file:///home/pedro/dev/vita3k-api/node_modules/wrangler/templates/middleware/middleware-scheduled.ts:8:3)
at async drainBody
(file:///home/pedro/dev/vita3k-api/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts:5:10)
1 Reply
EXtremeExploit
EXtremeExploitOP4w ago
:pleadingturtle: help

Did you find this page helpful?