@getcirrus/pds 0.8.0 → 0.10.0

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.
package/README.md CHANGED
@@ -343,6 +343,7 @@ The PDS uses environment variables for configuration. Public values go in `wrang
343
343
  | `HANDLE` | Account handle |
344
344
  | `SIGNING_KEY_PUBLIC` | Public key for DID document (multibase) |
345
345
  | `INITIAL_ACTIVE` | Whether account starts active (true/false) |
346
+ | `DATA_LOCATION` | Data placement (optional, see below) |
346
347
 
347
348
  ### Secrets
348
349
 
@@ -353,6 +354,31 @@ The PDS uses environment variables for configuration. Public values go in `wrang
353
354
  | `JWT_SECRET` | Secret for signing session JWTs |
354
355
  | `PASSWORD_HASH` | Bcrypt hash of password for app login |
355
356
 
357
+ ### Data Placement
358
+
359
+ Cirrus supports Cloudflare's Durable Object [data placement features](https://developers.cloudflare.com/durable-objects/reference/data-location/) for users who need control over where their data is stored. By default a durable object is created near to the first location it is accessed from. This is likely to be correct for most users. However, if you have specific data residency requirements, you can set the `DATA_LOCATION` environment variable to control where your Durable Object is placed. This only affects the location of the Durable Object instance that stores your PDS data. ATProto data is globally distributed via relays, so this does not limit access to your data from other regions.
360
+
361
+ > [!WARNING]
362
+ > Once a Durable Object is created, its location cannot be changed. Therefore, you should set `DATA_LOCATION` before the first deployment of your PDS. Changing this value after deployment will break your installation, as existing data will not be migrated.
363
+
364
+ Supported values for `DATA_LOCATION`:
365
+
366
+ - **Auto** (`auto`): Default behaviour. Cloudflare places the DO near the first access location.
367
+ - **Jurisdiction** (`eu`): Hard guarantee that data never leaves the region. Use this for compliance requirements.
368
+ - **Hints** (`wnam`, `enam`, `weur`, `eeur`, `apac`, `oc`). Best-effort suggestions for initial placement region. Cloudflare may place the DO elsewhere based on availability. See [supported locations](https://developers.cloudflare.com/durable-objects/reference/data-location/#supported-locations-1) for more details)
369
+
370
+ Example in `wrangler.jsonc`:
371
+
372
+ ```jsonc
373
+ {
374
+ "vars": {
375
+ "DATA_LOCATION": "eu",
376
+ },
377
+ }
378
+ ```
379
+
380
+ See [Cloudflare's data location documentation](https://developers.cloudflare.com/durable-objects/reference/data-location/) for more details.
381
+
356
382
  ## API Endpoints
357
383
 
358
384
  ### Identity
@@ -473,6 +499,7 @@ npx pds migrate
473
499
  ```
474
500
 
475
501
  The migrate command:
502
+
476
503
  - Resolves your DID to find the current PDS
477
504
  - Authenticates with your source PDS
478
505
  - Downloads the repository (posts, follows, likes, etc.)
@@ -488,6 +515,7 @@ npx pds identity
488
515
  ```
489
516
 
490
517
  This updates your DID document to point to your new PDS. The command:
518
+
491
519
  1. Authenticates with your source PDS (requires password)
492
520
  2. Requests an email confirmation token
493
521
  3. Gets the source PDS to sign a PLC operation with your new endpoint
@@ -510,6 +538,7 @@ npx pds status
510
538
  ```
511
539
 
512
540
  Check that:
541
+
513
542
  - The account is active
514
543
  - The repository has the expected number of records
515
544
  - Your handle resolves correctly
package/dist/cli.js CHANGED
@@ -1768,7 +1768,8 @@ const initCommand = defineCommand({
1768
1768
  try {
1769
1769
  cfSecrets = await listSecrets();
1770
1770
  } catch {}
1771
- if (cfSecrets.includes("SIGNING_KEY") && !devVars.SIGNING_KEY) {
1771
+ const signingKeyInCloudflare = cfSecrets.includes("SIGNING_KEY");
1772
+ if (signingKeyInCloudflare && !devVars.SIGNING_KEY) {
1772
1773
  p.log.error("⚠️ Signing key exists in Cloudflare but not locally!");
1773
1774
  p.note([
1774
1775
  "Your PDS has a signing key deployed to Cloudflare, but you don't have",
@@ -1948,6 +1949,55 @@ const initCommand = defineCommand({
1948
1949
  ` containing: ${did}`
1949
1950
  ].join("\n"), "Identity Setup 🪪");
1950
1951
  }
1952
+ let dataLocation;
1953
+ if (currentVars.DATA_LOCATION) dataLocation = currentVars.DATA_LOCATION;
1954
+ else {
1955
+ dataLocation = await promptSelect({
1956
+ message: "Where should your data be stored?",
1957
+ options: [
1958
+ {
1959
+ value: "auto",
1960
+ label: "Auto (Recommended)",
1961
+ hint: "Cloudflare chooses optimal location"
1962
+ },
1963
+ {
1964
+ value: "eu",
1965
+ label: "European Union",
1966
+ hint: "GDPR jurisdiction guarantee"
1967
+ },
1968
+ {
1969
+ value: "wnam",
1970
+ label: "Western North America",
1971
+ hint: "Location hint"
1972
+ },
1973
+ {
1974
+ value: "enam",
1975
+ label: "Eastern North America",
1976
+ hint: "Location hint"
1977
+ },
1978
+ {
1979
+ value: "apac",
1980
+ label: "Asia-Pacific",
1981
+ hint: "Location hint"
1982
+ },
1983
+ {
1984
+ value: "oc",
1985
+ label: "Oceania",
1986
+ hint: "Location hint"
1987
+ }
1988
+ ]
1989
+ });
1990
+ if (dataLocation && dataLocation !== "auto") {
1991
+ p.log.warn("⚠️ Data location cannot be changed after deployment!");
1992
+ p.note([
1993
+ "Durable Objects cannot be relocated once created.",
1994
+ "If you deploy with this setting and later change it,",
1995
+ "existing data will become inaccessible.",
1996
+ "",
1997
+ `You selected: ${dataLocation}`
1998
+ ].join("\n"), "Important");
1999
+ }
2000
+ }
1951
2001
  const spinner = p.spinner();
1952
2002
  const authToken = await getOrGenerateSecret("AUTH_TOKEN", devVars, async () => {
1953
2003
  spinner.start("Generating auth token...");
@@ -2070,7 +2120,8 @@ const initCommand = defineCommand({
2070
2120
  DID: did,
2071
2121
  HANDLE: handle,
2072
2122
  SIGNING_KEY_PUBLIC: signingKeyPublic,
2073
- INITIAL_ACTIVE: initialActive
2123
+ INITIAL_ACTIVE: initialActive,
2124
+ DATA_LOCATION: dataLocation
2074
2125
  });
2075
2126
  setCustomDomains([hostname]);
2076
2127
  spinner.stop("wrangler.jsonc updated");
@@ -2102,12 +2153,12 @@ const initCommand = defineCommand({
2102
2153
  if (!isProduction) {
2103
2154
  const deployNow = await p.confirm({
2104
2155
  message: "Push secrets to Cloudflare now?",
2105
- initialValue: false
2156
+ initialValue: true
2106
2157
  });
2107
2158
  if (!p.isCancel(deployNow) && deployNow) {
2108
2159
  spinner.start("Deploying secrets to Cloudflare...");
2109
2160
  await setSecretValue("AUTH_TOKEN", authToken, false);
2110
- if (signingKeyIsNew) await setSecretValue("SIGNING_KEY", signingKey, false);
2161
+ if (!signingKeyInCloudflare) await setSecretValue("SIGNING_KEY", signingKey, false);
2111
2162
  await setSecretValue("JWT_SECRET", jwtSecret, false);
2112
2163
  await setSecretValue("PASSWORD_HASH", passwordHash, false);
2113
2164
  spinner.stop("Secrets deployed to Cloudflare");
@@ -2158,7 +2209,22 @@ const initCommand = defineCommand({
2158
2209
  }
2159
2210
  if (deployed) p.outro(`Your PDS is live at https://${hostname}! 🚀`);
2160
2211
  else if (deployedSecrets) p.outro(`Run '${formatCommand(pm, "deploy")}' to launch your PDS! 🚀`);
2161
- else p.outro(`Run '${formatCommand(pm, "dev")}' to start your PDS locally! 🦋`);
2212
+ else {
2213
+ p.note([
2214
+ "To deploy your PDS, first push your secrets to Cloudflare:",
2215
+ "",
2216
+ ` ${formatCommand(pm, "pds", "init")}`,
2217
+ "",
2218
+ "Then deploy:",
2219
+ "",
2220
+ ` ${formatCommand(pm, "deploy")}`,
2221
+ "",
2222
+ "Or to test locally first:",
2223
+ "",
2224
+ ` ${formatCommand(pm, "dev")}`
2225
+ ].join("\n"), "Next Steps");
2226
+ p.outro("Configuration saved to .dev.vars");
2227
+ }
2162
2228
  }
2163
2229
  });
2164
2230
  /**
package/dist/index.d.ts CHANGED
@@ -250,6 +250,27 @@ interface BlobRef {
250
250
  }
251
251
  //#endregion
252
252
  //#region src/types.d.ts
253
+ /**
254
+ * Data location options for Durable Object placement.
255
+ *
256
+ * - "auto": No location constraint (default, recommended)
257
+ * - "eu": European Union - hard guarantee data never leaves EU
258
+ * - Location hints (best-effort, not guaranteed):
259
+ * - "wnam": Western North America
260
+ * - "enam": Eastern North America
261
+ * - "sam": South America
262
+ * - "weur": Western Europe
263
+ * - "eeur": Eastern Europe
264
+ * - "apac": Asia-Pacific
265
+ * - "oc": Oceania
266
+ * - "afr": Africa
267
+ * - "me": Middle East
268
+ *
269
+ * IMPORTANT: This setting only affects newly-created Durable Objects.
270
+ * Changing this after initial deployment will NOT migrate existing data.
271
+ * To relocate data, you must export and re-import to a new PDS.
272
+ */
273
+ type DataLocation = "auto" | "eu" | "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "oc" | "afr" | "me";
253
274
  /**
254
275
  * Environment bindings required by the PDS worker.
255
276
  * Consumers must provide these bindings in their wrangler config.
@@ -277,6 +298,20 @@ interface PDSEnv {
277
298
  BLOBS?: R2Bucket;
278
299
  /** Initial activation state for new accounts (default: true) */
279
300
  INITIAL_ACTIVE?: string;
301
+ /**
302
+ * Data location for Durable Object placement.
303
+ *
304
+ * WARNING: DO NOT CHANGE THIS AFTER INITIAL DEPLOYMENT.
305
+ * This setting only affects newly-created DOs. Changing it will NOT
306
+ * migrate existing data and may cause issues.
307
+ *
308
+ * Options:
309
+ * - "auto" or unset: No location constraint (default, recommended)
310
+ * - "eu": European Union - hard guarantee data never leaves EU
311
+ * - Location hints (best-effort, not guaranteed):
312
+ * "wnam", "enam", "sam", "weur", "eeur", "apac", "oc", "afr", "me"
313
+ */
314
+ DATA_LOCATION?: DataLocation;
280
315
  }
281
316
  //#endregion
282
317
  //#region src/account-do.d.ts
@@ -439,6 +474,13 @@ declare class AccountDurableObject extends DurableObject<PDSEnv> {
439
474
  * Used for partial sync and migration.
440
475
  */
441
476
  rpcGetBlocks(cids: string[]): Promise<Uint8Array>;
477
+ /**
478
+ * RPC method: Get record with proof as CAR file.
479
+ * Returns the commit block and all MST blocks needed to verify
480
+ * the existence (or non-existence) of a record.
481
+ * Used by com.atproto.sync.getRecord for record verification.
482
+ */
483
+ rpcGetRecordProof(collection: string, rkey: string): Promise<Uint8Array>;
442
484
  /**
443
485
  * RPC method: Import repo from CAR file
444
486
  * This is used for account migration - importing an existing repository
@@ -652,5 +694,5 @@ declare const app: Hono<{
652
694
  Bindings: PDSEnv;
653
695
  }, hono_types0.BlankSchema, "/">;
654
696
  //#endregion
655
- export { AccountDurableObject, type PDSEnv, app as default };
697
+ export { AccountDurableObject, type DataLocation, type PDSEnv, app as default };
656
698
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/storage.ts","../src/oauth-storage.ts","../src/blobs.ts","../src/types.ts","../src/account-do.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/storage.ts","../src/oauth-storage.ts","../src/blobs.ts","../src/types.ts","../src/account-do.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { DurableObject, env, waitUntil } from "cloudflare:workers";
2
- import { BlockMap, ReadableBlockstore, Repo, WriteOpAction, blocksToCarFile, readCarWithRoot } from "@atproto/repo";
2
+ import { BlockMap, ReadableBlockstore, Repo, WriteOpAction, blocksToCarFile, getRecords, readCarWithRoot } from "@atproto/repo";
3
3
  import { Secp256k1Keypair, randomStr, verifySignature } from "@atproto/crypto";
4
4
  import { CID, asCid, isBlobRef } from "@atproto/lex-data";
5
5
  import { now } from "@atcute/tid";
@@ -7,8 +7,8 @@ import { decode, encode, fromBytes, isBytes, toBytes, toCidLink } from "@atcute/
7
7
  import { CODEC_RAW, create, fromString, toString } from "@atcute/cid";
8
8
  import { Hono } from "hono";
9
9
  import { cors } from "hono/cors";
10
- import { isDid, isHandle } from "@atcute/lexicons/syntax";
11
- import { SignJWT, base64url, jwtVerify } from "jose";
10
+ import { isDid, isHandle, isNsid, isRecordKey } from "@atcute/lexicons/syntax";
11
+ import { SignJWT, base64url, errors, jwtVerify } from "jose";
12
12
  import { compare, compare as compare$1 } from "bcryptjs";
13
13
  import { ATProtoOAuthProvider } from "@getcirrus/oauth-provider";
14
14
  import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse } from "@simplewebauthn/server";
@@ -1365,6 +1365,30 @@ var AccountDurableObject = class extends DurableObject {
1365
1365
  return blocksToCarFile(root, blocks);
1366
1366
  }
1367
1367
  /**
1368
+ * RPC method: Get record with proof as CAR file.
1369
+ * Returns the commit block and all MST blocks needed to verify
1370
+ * the existence (or non-existence) of a record.
1371
+ * Used by com.atproto.sync.getRecord for record verification.
1372
+ */
1373
+ async rpcGetRecordProof(collection, rkey) {
1374
+ const storage = await this.getStorage();
1375
+ const root = await storage.getRoot();
1376
+ if (!root) throw new Error("No repository root found");
1377
+ const carChunks = [];
1378
+ for await (const chunk of getRecords(storage, root, [{
1379
+ collection,
1380
+ rkey
1381
+ }])) carChunks.push(chunk);
1382
+ const totalLength = carChunks.reduce((acc, chunk) => acc + chunk.length, 0);
1383
+ const result = new Uint8Array(totalLength);
1384
+ let offset = 0;
1385
+ for (const chunk of carChunks) {
1386
+ result.set(chunk, offset);
1387
+ offset += chunk.length;
1388
+ }
1389
+ return result;
1390
+ }
1391
+ /**
1368
1392
  * RPC method: Import repo from CAR file
1369
1393
  * This is used for account migration - importing an existing repository
1370
1394
  * from another PDS.
@@ -1893,7 +1917,17 @@ async function verifyServiceJwt(token, signingKey, expectedAudience, expectedIss
1893
1917
 
1894
1918
  //#endregion
1895
1919
  //#region src/session.ts
1896
- const ACCESS_TOKEN_LIFETIME = "15m";
1920
+ /**
1921
+ * Error thrown when a JWT has expired.
1922
+ * Callers should return HTTP 400 with error code 'ExpiredToken'.
1923
+ */
1924
+ var TokenExpiredError = class extends Error {
1925
+ constructor(message = "Token has expired") {
1926
+ super(message);
1927
+ this.name = "TokenExpiredError";
1928
+ }
1929
+ };
1930
+ const ACCESS_TOKEN_LIFETIME = "120m";
1897
1931
  const REFRESH_TOKEN_LIFETIME = "90d";
1898
1932
  /**
1899
1933
  * Create a secret key from string for HS256 signing
@@ -1906,44 +1940,58 @@ function createSecretKey(secret) {
1906
1940
  */
1907
1941
  async function createAccessToken(jwtSecret, userDid, serviceDid) {
1908
1942
  const secret = createSecretKey(jwtSecret);
1909
- return new SignJWT({ scope: "atproto" }).setProtectedHeader({
1943
+ return new SignJWT({ scope: "com.atproto.access" }).setProtectedHeader({
1910
1944
  alg: "HS256",
1911
1945
  typ: "at+jwt"
1912
- }).setIssuedAt().setIssuer(serviceDid).setAudience(serviceDid).setSubject(userDid).setExpirationTime(ACCESS_TOKEN_LIFETIME).sign(secret);
1946
+ }).setIssuedAt().setAudience(serviceDid).setSubject(userDid).setExpirationTime(ACCESS_TOKEN_LIFETIME).sign(secret);
1913
1947
  }
1914
1948
  /**
1915
1949
  * Create a refresh token (long-lived, 90 days)
1916
1950
  */
1917
1951
  async function createRefreshToken(jwtSecret, userDid, serviceDid) {
1918
1952
  const secret = createSecretKey(jwtSecret);
1919
- return new SignJWT({
1920
- scope: "com.atproto.refresh",
1921
- jti: crypto.randomUUID()
1922
- }).setProtectedHeader({
1953
+ const jti = crypto.randomUUID();
1954
+ return new SignJWT({ scope: "com.atproto.refresh" }).setProtectedHeader({
1923
1955
  alg: "HS256",
1924
1956
  typ: "refresh+jwt"
1925
- }).setIssuedAt().setIssuer(serviceDid).setAudience(serviceDid).setSubject(userDid).setExpirationTime(REFRESH_TOKEN_LIFETIME).sign(secret);
1957
+ }).setIssuedAt().setAudience(serviceDid).setSubject(userDid).setJti(jti).setExpirationTime(REFRESH_TOKEN_LIFETIME).sign(secret);
1926
1958
  }
1927
1959
  /**
1928
- * Verify an access token and return the payload
1960
+ * Verify an access token and return the payload.
1961
+ * Throws TokenExpiredError if the token has expired.
1929
1962
  */
1930
1963
  async function verifyAccessToken(token, jwtSecret, serviceDid) {
1931
- const { payload, protectedHeader } = await jwtVerify(token, createSecretKey(jwtSecret), {
1932
- issuer: serviceDid,
1933
- audience: serviceDid
1934
- });
1964
+ const secret = createSecretKey(jwtSecret);
1965
+ let payload;
1966
+ let protectedHeader;
1967
+ try {
1968
+ const result = await jwtVerify(token, secret, { audience: serviceDid });
1969
+ payload = result.payload;
1970
+ protectedHeader = result.protectedHeader;
1971
+ } catch (err) {
1972
+ if (err instanceof errors.JWTExpired) throw new TokenExpiredError();
1973
+ throw err;
1974
+ }
1935
1975
  if (protectedHeader.typ !== "at+jwt") throw new Error("Invalid token type");
1936
- if (payload.scope !== "atproto") throw new Error("Invalid scope");
1976
+ if (payload.scope !== "com.atproto.access") throw new Error("Invalid scope");
1937
1977
  return payload;
1938
1978
  }
1939
1979
  /**
1940
- * Verify a refresh token and return the payload
1980
+ * Verify a refresh token and return the payload.
1981
+ * Throws TokenExpiredError if the token has expired.
1941
1982
  */
1942
1983
  async function verifyRefreshToken(token, jwtSecret, serviceDid) {
1943
- const { payload, protectedHeader } = await jwtVerify(token, createSecretKey(jwtSecret), {
1944
- issuer: serviceDid,
1945
- audience: serviceDid
1946
- });
1984
+ const secret = createSecretKey(jwtSecret);
1985
+ let payload;
1986
+ let protectedHeader;
1987
+ try {
1988
+ const result = await jwtVerify(token, secret, { audience: serviceDid });
1989
+ payload = result.payload;
1990
+ protectedHeader = result.protectedHeader;
1991
+ } catch (err) {
1992
+ if (err instanceof errors.JWTExpired) throw new TokenExpiredError();
1993
+ throw err;
1994
+ }
1947
1995
  if (protectedHeader.typ !== "refresh+jwt") throw new Error("Invalid token type");
1948
1996
  if (payload.scope !== "com.atproto.refresh") throw new Error("Invalid scope");
1949
1997
  if (!payload.jti) throw new Error("Missing token ID");
@@ -2348,7 +2396,7 @@ async function requireAuth(c, next) {
2348
2396
  if (token === c.env.AUTH_TOKEN) {
2349
2397
  c.set("auth", {
2350
2398
  did: c.env.DID,
2351
- scope: "atproto"
2399
+ scope: "com.atproto.access"
2352
2400
  });
2353
2401
  return next();
2354
2402
  }
@@ -2364,7 +2412,12 @@ async function requireAuth(c, next) {
2364
2412
  scope: payload.scope
2365
2413
  });
2366
2414
  return next();
2367
- } catch {}
2415
+ } catch (err) {
2416
+ if (err instanceof TokenExpiredError) return c.json({
2417
+ error: "ExpiredToken",
2418
+ message: err.message
2419
+ }, 400);
2420
+ }
2368
2421
  try {
2369
2422
  const payload = await verifyServiceJwt(token, c.env.SIGNING_KEY, serviceDid, c.env.DID);
2370
2423
  c.set("auth", {
@@ -2577,7 +2630,12 @@ async function handleXrpcProxy(c, didResolver$1, getKeypair$1) {
2577
2630
  const payload = await verifyAccessToken(token, c.env.JWT_SECRET, serviceDid);
2578
2631
  if (payload.sub) userDid = payload.sub;
2579
2632
  }
2580
- } catch {}
2633
+ } catch (err) {
2634
+ if (err instanceof TokenExpiredError) return c.json({
2635
+ error: "ExpiredToken",
2636
+ message: err.message
2637
+ }, 400);
2638
+ }
2581
2639
  }
2582
2640
  if (userDid) try {
2583
2641
  const keypair = await getKeypair$1();
@@ -2753,6 +2811,55 @@ async function getBlob(c, _accountDO) {
2753
2811
  }
2754
2812
  });
2755
2813
  }
2814
+ async function getRecord$1(c, accountDO) {
2815
+ const did = c.req.query("did");
2816
+ const collection = c.req.query("collection");
2817
+ const rkey = c.req.query("rkey");
2818
+ if (!did) return c.json({
2819
+ error: "InvalidRequest",
2820
+ message: "Missing required parameter: did"
2821
+ }, 400);
2822
+ if (!collection) return c.json({
2823
+ error: "InvalidRequest",
2824
+ message: "Missing required parameter: collection"
2825
+ }, 400);
2826
+ if (!rkey) return c.json({
2827
+ error: "InvalidRequest",
2828
+ message: "Missing required parameter: rkey"
2829
+ }, 400);
2830
+ if (!isDid(did)) return c.json({
2831
+ error: "InvalidRequest",
2832
+ message: "Invalid DID format"
2833
+ }, 400);
2834
+ if (!isNsid(collection)) return c.json({
2835
+ error: "InvalidRequest",
2836
+ message: "Invalid collection format (must be NSID)"
2837
+ }, 400);
2838
+ if (!isRecordKey(rkey)) return c.json({
2839
+ error: "InvalidRequest",
2840
+ message: "Invalid rkey format"
2841
+ }, 400);
2842
+ if (did !== c.env.DID) return c.json({
2843
+ error: "RepoNotFound",
2844
+ message: `Repository not found for DID: ${did}`
2845
+ }, 404);
2846
+ try {
2847
+ const carBytes = await accountDO.rpcGetRecordProof(collection, rkey);
2848
+ return new Response(carBytes, {
2849
+ status: 200,
2850
+ headers: {
2851
+ "Content-Type": "application/vnd.ipld.car",
2852
+ "Content-Length": carBytes.length.toString()
2853
+ }
2854
+ });
2855
+ } catch (err) {
2856
+ console.error("Error getting record proof:", err);
2857
+ return c.json({
2858
+ error: "InternalServerError",
2859
+ message: "Failed to get record proof"
2860
+ }, 500);
2861
+ }
2862
+ }
2756
2863
 
2757
2864
  //#endregion
2758
2865
  //#region src/validation.ts
@@ -3150,6 +3257,7 @@ async function createSession(c) {
3150
3257
  refreshJwt,
3151
3258
  handle: c.env.HANDLE,
3152
3259
  did: c.env.DID,
3260
+ emailConfirmed: false,
3153
3261
  active: true
3154
3262
  });
3155
3263
  }
@@ -3176,11 +3284,16 @@ async function refreshSession(c) {
3176
3284
  refreshJwt,
3177
3285
  handle: c.env.HANDLE,
3178
3286
  did: c.env.DID,
3287
+ emailConfirmed: false,
3179
3288
  active: true
3180
3289
  });
3181
3290
  } catch (err) {
3182
- return c.json({
3291
+ if (err instanceof TokenExpiredError) return c.json({
3183
3292
  error: "ExpiredToken",
3293
+ message: err.message
3294
+ }, 400);
3295
+ return c.json({
3296
+ error: "InvalidToken",
3184
3297
  message: err instanceof Error ? err.message : "Invalid refresh token"
3185
3298
  }, 400);
3186
3299
  }
@@ -3199,6 +3312,7 @@ async function getSession(c) {
3199
3312
  if (token === c.env.AUTH_TOKEN) return c.json({
3200
3313
  handle: c.env.HANDLE,
3201
3314
  did: c.env.DID,
3315
+ emailConfirmed: false,
3202
3316
  active: true
3203
3317
  });
3204
3318
  try {
@@ -3209,9 +3323,14 @@ async function getSession(c) {
3209
3323
  return c.json({
3210
3324
  handle: c.env.HANDLE,
3211
3325
  did: c.env.DID,
3326
+ emailConfirmed: false,
3212
3327
  active: true
3213
3328
  });
3214
3329
  } catch (err) {
3330
+ if (err instanceof TokenExpiredError) return c.json({
3331
+ error: "ExpiredToken",
3332
+ message: err.message
3333
+ }, 400);
3215
3334
  return c.json({
3216
3335
  error: "InvalidToken",
3217
3336
  message: err instanceof Error ? err.message : "Invalid access token"
@@ -3925,7 +4044,7 @@ function renderPasskeyErrorPage(error, description) {
3925
4044
 
3926
4045
  //#endregion
3927
4046
  //#region package.json
3928
- var version = "0.8.0";
4047
+ var version = "0.10.0";
3929
4048
 
3930
4049
  //#endregion
3931
4050
  //#region src/index.ts
@@ -3967,7 +4086,13 @@ app.use("*", cors({
3967
4086
  maxAge: 86400
3968
4087
  }));
3969
4088
  function getAccountDO(env$2) {
4089
+ const location = env$2.DATA_LOCATION;
4090
+ if (location === "eu") {
4091
+ const namespace = env$2.ACCOUNT.jurisdiction("eu");
4092
+ return namespace.get(namespace.idFromName("account"));
4093
+ }
3970
4094
  const id = env$2.ACCOUNT.idFromName("account");
4095
+ if (location && location !== "auto") return env$2.ACCOUNT.get(id, { locationHint: location });
3971
4096
  return env$2.ACCOUNT.get(id);
3972
4097
  }
3973
4098
  app.get("/.well-known/did.json", (c) => {
@@ -4056,6 +4181,7 @@ app.get("/xrpc/com.atproto.sync.getBlocks", (c) => getBlocks(c, getAccountDO(c.e
4056
4181
  app.get("/xrpc/com.atproto.sync.getBlob", (c) => getBlob(c, getAccountDO(c.env)));
4057
4182
  app.get("/xrpc/com.atproto.sync.listRepos", (c) => listRepos(c, getAccountDO(c.env)));
4058
4183
  app.get("/xrpc/com.atproto.sync.listBlobs", (c) => listBlobs(c, getAccountDO(c.env)));
4184
+ app.get("/xrpc/com.atproto.sync.getRecord", (c) => getRecord$1(c, getAccountDO(c.env)));
4059
4185
  app.get("/xrpc/com.atproto.sync.subscribeRepos", async (c) => {
4060
4186
  if (c.req.header("Upgrade") !== "websocket") return c.json({
4061
4187
  error: "InvalidRequest",