import { DurableObject } from "cloudflare:workers"; import { createCardDavDoDb, type CardDavDoDb } from "@/worker/db/card-dav-do/client"; import { createAddressbook as createAddressbookOp, deleteAddressbook as deleteAddressbookOp, getAddressbook as getAddressbookOp, listAddressbooks as listAddressbooksOp, updateAddressbook as updateAddressbookOp, } from "@/worker/objects/card-dav/addressbooks"; import { addressbookMultiget as addressbookMultigetOp, addressbookQuery as addressbookQueryOp, deleteObject as deleteObjectOp, getObject as getObjectOp, putObject as putObjectOp, syncCollection as syncCollectionOp, } from "@/worker/objects/card-dav/address-objects"; import { describe as describeOp, ensureInitialized as ensureInitializedOp, proppatch as proppatchOp, } from "@/worker/objects/card-dav/properties"; import type { AddressbookCreateInput, AddressbookDeleteInput, AddressbookGetInput, AddressbookListInput, AddressbookMultigetInput, AddressbookQueryInput, AddressbookUpdateInput, DeleteAddressObjectInput, DescribeInput, EnsureInitializedInput, GetAddressObjectInput, ProppatchInput, PutAddressObjectInput, SyncCollectionInput, } from "@/worker/objects/card-dav/types"; import { migrateCardDavObject } from "@/worker/objects/common/migrations"; export type { AddressbookCreateInput, AddressbookDeleteInput, AddressbookGetInput, AddressbookListInput, AddressbookMultigetInput, AddressbookQueryInput, AddressbookRecord, AddressbookUpdateInput, CardDavError, CardDavErrorCode, CardDavResource, DeleteAddressObjectInput, DescribeInput, EnsureInitializedInput, GetAddressObjectInput, ProppatchInput, PutAddressObjectInput, SearchFilter, SyncCollectionInput, } from "@/worker/objects/card-dav/types"; export class CardDavObject extends DurableObject { readonly db: CardDavDoDb; constructor(ctx: DurableObjectState, env: Env) { super(ctx, env); this.db = createCardDavDoDb(ctx.storage); ctx.blockConcurrencyWhile(async () => { await migrateCardDavObject(this.db); }); } async ping(): Promise<{ ok: true; object: "card-dav" }> { return { ok: true, object: "card-dav" }; } async ensureInitialized(input: EnsureInitializedInput) { return ensureInitializedOp(this.db, input); } async listAddressbooks(input: AddressbookListInput) { return listAddressbooksOp(this.db, input); } async getAddressbook(input: AddressbookGetInput) { return getAddressbookOp(this.db, input); } async createAddressbook(input: AddressbookCreateInput) { return createAddressbookOp(this.db, input); } async updateAddressbook(input: AddressbookUpdateInput) { return updateAddressbookOp(this.db, input); } async deleteAddressbook(input: AddressbookDeleteInput) { return deleteAddressbookOp(this.db, input); } async describe(input: DescribeInput) { return describeOp(this.db, input); } async getObject(input: GetAddressObjectInput) { return getObjectOp(this.db, input); } async putObject(input: PutAddressObjectInput) { return putObjectOp(this.db, input); } async deleteObject(input: DeleteAddressObjectInput) { return deleteObjectOp(this.db, input); } async proppatch(input: ProppatchInput) { return proppatchOp(this.db, input); } async addressbookQuery(input: AddressbookQueryInput) { return addressbookQueryOp(this.db, input); } async addressbookMultiget(input: AddressbookMultigetInput) { return addressbookMultigetOp(this.db, input); } async syncCollection(input: SyncCollectionInput) { return syncCollectionOp(this.db, input); } }