Skip to content
← Public packages

@kody/doordash-driver

Request DoorDash Drive (Dasher) deliveries with JWT auth from Developer Portal access keys.

src/settings.ts

84 lines · 2.2 KB · TypeScript
/**
 * Read or update DoorDash Drive Portal identity (developer_id + key_id).
 * These are UUIDs from the access-key JSON — keep the signing_secret in a Kody
 * secret (`doorDashSigningSecret`), not here.
 *
 * ```ts
 * import settings from 'kody:@kody/doordash-driver/settings'
 * await settings({
 *   developerId: '……',
 *   keyId: '……',
 * })
 * ```
 */

import { packageStorage } from 'kody:runtime'
import {
	DEFAULT_SIGNING_SECRET,
	DEVELOPER_PORTAL_URL,
	SETTINGS_DEVELOPER_ID,
	SETTINGS_KEY_ID,
	signingSecretSetupUrl,
} from './core.ts'

const UUID_PATTERN =
	/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i

function trimString(value: unknown) {
	return typeof value === 'string' ? value.trim() : ''
}

function requireUuid(value: unknown, label: string) {
	const text = trimString(value)
	if (!UUID_PATTERN.test(text)) {
		throw new Error(
			label + ' must be a UUID from the DoorDash Developer Portal access key JSON.',
		)
	}
	return text
}

export type DoorDashSettings = {
	developerId: string | null
	keyId: string | null
	signingSecretSecret: string
	signingSecretUrl: string
	portal: string
}

export async function readDriveSettings(): Promise<DoorDashSettings> {
	const storage = packageStorage()
	const developerId = trimString(await storage.get(SETTINGS_DEVELOPER_ID)) || null
	const keyId = trimString(await storage.get(SETTINGS_KEY_ID)) || null
	return {
		developerId,
		keyId,
		signingSecretSecret: DEFAULT_SIGNING_SECRET,
		signingSecretUrl: signingSecretSetupUrl(),
		portal: DEVELOPER_PORTAL_URL,
	}
}

export default async function settings(
	input: { developerId?: string; keyId?: string } = {},
) {
	const storage = packageStorage()
	const updated: string[] = []
	const nextDeveloperId = trimString(input.developerId)
	const nextKeyId = trimString(input.keyId)

	if (nextDeveloperId) {
		await storage.set(SETTINGS_DEVELOPER_ID, requireUuid(nextDeveloperId, 'developerId'))
		updated.push('developerId')
	}
	if (nextKeyId) {
		await storage.set(SETTINGS_KEY_ID, requireUuid(nextKeyId, 'keyId'))
		updated.push('keyId')
	}

	const current = await readDriveSettings()
	if (updated.length) {
		return { updated, settings: current }
	}
	return current
}