A decentralized music tracking and discovery platform built on AT Protocol 🎵
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: update dependencies and scripts in API

- Added postinstall script to copy jose-key.js to the appropriate directory.
- Updated dependencies:
- Added @noble/secp256k1 and jose.
- Downgraded several @atproto packages to specific versions for compatibility.
- Removed unused code related to keyset creation in auth client.
- Fixed formatting issues in index.ts for better readability.

+368 -43
+331
apps/api/jose-key.js
··· 1 + Object.defineProperty(exports, "__esModule", { value: true }); 2 + exports.JoseKey = void 0; 3 + const jose_1 = require("jose"); 4 + const jwk_1 = require("@atproto/jwk"); 5 + const util_1 = require("./util"); 6 + const secp = require("@noble/secp256k1"); 7 + const { JOSEError } = jose_1.errors; 8 + 9 + function base64urlEncode(buffer) { 10 + return Buffer.from(buffer).toString('base64url'); 11 + } 12 + 13 + function base64urlDecode(str) { 14 + return new Uint8Array(Buffer.from(str, 'base64url')); 15 + } 16 + 17 + function sha256(data) { 18 + const crypto = require('node:crypto'); 19 + return new Uint8Array(crypto.createHash('sha256').update(data).digest()); 20 + } 21 + 22 + async function signES256K(payload, header, privateKeyJwk) { 23 + const privateKeyBytes = base64urlDecode(privateKeyJwk.d); 24 + 25 + const encodedHeader = base64urlEncode( 26 + new TextEncoder().encode(JSON.stringify(header)) 27 + ); 28 + const encodedPayload = base64urlEncode( 29 + new TextEncoder().encode(JSON.stringify(payload)) 30 + ); 31 + 32 + const message = `${encodedHeader}.${encodedPayload}`; 33 + const messageHash = sha256(new TextEncoder().encode(message)); 34 + 35 + const signature = await secp.sign(messageHash, privateKeyBytes, { 36 + canonical: true, 37 + der: false 38 + }); 39 + const encodedSignature = base64urlEncode(signature); 40 + 41 + return `${message}.${encodedSignature}`; 42 + } 43 + 44 + async function verifyES256K(token, publicKeyJwk, options) { 45 + const [encodedHeader, encodedPayload, encodedSignature] = token.split('.'); 46 + 47 + if (!encodedHeader || !encodedPayload || !encodedSignature) { 48 + throw new Error('Invalid JWT format'); 49 + } 50 + 51 + const message = `${encodedHeader}.${encodedPayload}`; 52 + const messageHash = sha256(new TextEncoder().encode(message)); 53 + 54 + // Convert JWK to raw public key (uncompressed format: 0x04 + x + y) 55 + const x = base64urlDecode(publicKeyJwk.x); 56 + const y = base64urlDecode(publicKeyJwk.y); 57 + const publicKey = new Uint8Array([0x04, ...x, ...y]); 58 + 59 + const signature = base64urlDecode(encodedSignature); 60 + 61 + const isValid = secp.verify(signature, messageHash, publicKey); 62 + 63 + if (!isValid) { 64 + throw new Error('Invalid signature'); 65 + } 66 + 67 + const header = JSON.parse(new TextDecoder().decode(base64urlDecode(encodedHeader))); 68 + const payload = JSON.parse(new TextDecoder().decode(base64urlDecode(encodedPayload))); 69 + 70 + if (options) { 71 + const now = Math.floor(Date.now() / 1000); 72 + 73 + if (options.audience && payload.aud !== options.audience) { 74 + throw new Error('Invalid audience'); 75 + } 76 + 77 + if (options.issuer && payload.iss !== options.issuer) { 78 + throw new Error('Invalid issuer'); 79 + } 80 + 81 + if (payload.exp && payload.exp < now) { 82 + throw new Error('Token expired'); 83 + } 84 + 85 + if (payload.nbf && payload.nbf > now) { 86 + throw new Error('Token not yet valid'); 87 + } 88 + } 89 + 90 + return { 91 + protectedHeader: header, 92 + payload: payload, 93 + }; 94 + } 95 + 96 + function isES256K(alg) { 97 + return alg === 'ES256K'; 98 + } 99 + 100 + class JoseKey extends jwk_1.Key { 101 + /** 102 + * Some runtimes (e.g. Bun) require an `alg` second argument to be set when 103 + * invoking `importJWK`. In order to be compatible with these runtimes, we 104 + * provide the following method to ensure the `alg` is always set. We also 105 + * take the opportunity to ensure that the `alg` is compatible with this key. 106 + */ 107 + async getKeyObj(alg) { 108 + if (!this.algorithms.includes(alg)) { 109 + throw new jwk_1.JwkError(`Key cannot be used with algorithm "${alg}"`); 110 + } 111 + 112 + // For ES256K, return the JWK directly as we'll handle signing/verification separately 113 + if (isES256K(alg)) { 114 + return this.jwk; 115 + } 116 + 117 + try { 118 + return await (0, jose_1.importJWK)(this.jwk, alg.replaceAll('K', '')); 119 + } 120 + catch (cause) { 121 + throw new jwk_1.JwkError('Failed to import JWK', undefined, { cause }); 122 + } 123 + } 124 + 125 + async createJwt(header, payload) { 126 + try { 127 + const { kid } = header; 128 + if (kid && kid !== this.kid) { 129 + throw new jwk_1.JwtCreateError(`Invalid "kid" (${kid}) used to sign with key "${this.kid}"`); 130 + } 131 + 132 + const { alg } = header; 133 + if (!alg) { 134 + throw new jwk_1.JwtCreateError('Missing "alg" in JWT header'); 135 + } 136 + 137 + // Handle ES256K separately 138 + if (isES256K(alg)) { 139 + const fullHeader = { 140 + ...header, 141 + alg, 142 + kid: this.kid, 143 + }; 144 + return await signES256K(payload, fullHeader, this.jwk); 145 + } 146 + 147 + const keyObj = await this.getKeyObj(alg); 148 + const jwtBuilder = new jose_1.SignJWT(payload).setProtectedHeader({ 149 + ...header, 150 + alg, 151 + kid: this.kid, 152 + }); 153 + const signedJwt = await jwtBuilder.sign(keyObj); 154 + return signedJwt; 155 + } 156 + catch (cause) { 157 + if (cause instanceof JOSEError) { 158 + throw new jwk_1.JwtCreateError(cause.message, cause.code, { cause }); 159 + } 160 + else { 161 + throw jwk_1.JwtCreateError.from(cause); 162 + } 163 + } 164 + } 165 + 166 + async verifyJwt(token, options) { 167 + try { 168 + // Check if token uses ES256K by decoding header 169 + const headerB64 = token.split('.')[0]; 170 + const headerJson = JSON.parse( 171 + Buffer.from(headerB64, 'base64url').toString() 172 + ); 173 + 174 + // Handle ES256K separately 175 + if (isES256K(headerJson.alg)) { 176 + const result = await verifyES256K(token, this.jwk, options); 177 + 178 + const headerParsed = jwk_1.jwtHeaderSchema.safeParse(result.protectedHeader); 179 + if (!headerParsed.success) { 180 + throw new jwk_1.JwtVerifyError('Invalid JWT header', undefined, { 181 + cause: headerParsed.error, 182 + }); 183 + } 184 + 185 + const payloadParsed = jwk_1.jwtPayloadSchema.safeParse(result.payload); 186 + if (!payloadParsed.success) { 187 + throw new jwk_1.JwtVerifyError('Invalid JWT payload', undefined, { 188 + cause: payloadParsed.error, 189 + }); 190 + } 191 + 192 + return { 193 + protectedHeader: headerParsed.data, 194 + payload: payloadParsed.data, 195 + }; 196 + } 197 + 198 + const result = await (0, jose_1.jwtVerify)( 199 + token, 200 + async ({ alg }) => this.getKeyObj(alg), 201 + { ...options, algorithms: this.algorithms } 202 + ); 203 + 204 + const headerParsed = jwk_1.jwtHeaderSchema.safeParse(result.protectedHeader); 205 + if (!headerParsed.success) { 206 + throw new jwk_1.JwtVerifyError('Invalid JWT header', undefined, { 207 + cause: headerParsed.error, 208 + }); 209 + } 210 + 211 + const payloadParsed = jwk_1.jwtPayloadSchema.safeParse(result.payload); 212 + if (!payloadParsed.success) { 213 + throw new jwk_1.JwtVerifyError('Invalid JWT payload', undefined, { 214 + cause: payloadParsed.error, 215 + }); 216 + } 217 + 218 + return { 219 + protectedHeader: headerParsed.data, 220 + payload: payloadParsed.data, 221 + }; 222 + } 223 + catch (cause) { 224 + if (cause instanceof JOSEError) { 225 + throw new jwk_1.JwtVerifyError(cause.message, cause.code, { cause }); 226 + } 227 + else { 228 + throw jwk_1.JwtVerifyError.from(cause); 229 + } 230 + } 231 + } 232 + 233 + static async generateKeyPair(allowedAlgos = ['ES256'], options) { 234 + if (!allowedAlgos.length) { 235 + throw new jwk_1.JwkError('No algorithms provided for key generation'); 236 + } 237 + 238 + // Handle ES256K key generation 239 + if (allowedAlgos.includes('ES256K')) { 240 + const privateKey = secp.utils.randomPrivateKey(); 241 + const publicKey = secp.getPublicKey(privateKey, false); // uncompressed 242 + 243 + const x = publicKey.slice(1, 33); 244 + const y = publicKey.slice(33, 65); 245 + 246 + const privateJwk = { 247 + kty: 'EC', 248 + crv: 'secp256k1', 249 + x: base64urlEncode(x), 250 + y: base64urlEncode(y), 251 + d: base64urlEncode(privateKey), 252 + }; 253 + 254 + const publicJwk = { 255 + kty: 'EC', 256 + crv: 'secp256k1', 257 + x: base64urlEncode(x), 258 + y: base64urlEncode(y), 259 + }; 260 + 261 + return { 262 + privateKey: privateJwk, 263 + publicKey: publicJwk, 264 + }; 265 + } 266 + 267 + const errors = []; 268 + for (const alg of allowedAlgos) { 269 + try { 270 + return await (0, jose_1.generateKeyPair)(alg, options); 271 + } 272 + catch (err) { 273 + errors.push(err); 274 + } 275 + } 276 + throw new jwk_1.JwkError('Failed to generate key pair', undefined, { 277 + cause: new AggregateError(errors, 'None of the algorithms worked'), 278 + }); 279 + } 280 + 281 + static async generate(allowedAlgos = ['ES256'], kid, options) { 282 + const kp = await this.generateKeyPair(allowedAlgos, { 283 + ...options, 284 + extractable: true, 285 + }); 286 + return this.fromImportable(kp.privateKey, kid); 287 + } 288 + 289 + static async fromImportable(input, kid) { 290 + if (typeof input === 'string') { 291 + if (input.startsWith('-----')) { 292 + return this.fromPKCS8(input, '', kid); 293 + } 294 + if (input.startsWith('{')) { 295 + return this.fromJWK(input, kid); 296 + } 297 + throw new jwk_1.JwkError('Invalid input'); 298 + } 299 + if (typeof input === 'object') { 300 + if ('kty' in input || 'alg' in input) { 301 + return this.fromJWK(input, kid); 302 + } 303 + return this.fromKeyLike(input, kid); 304 + } 305 + throw new jwk_1.JwkError('Invalid input'); 306 + } 307 + 308 + static async fromKeyLike(keyLike, kid, alg) { 309 + const jwk = await (0, jose_1.exportJWK)(keyLike); 310 + if (alg) { 311 + if (!jwk.alg) jwk.alg = alg; 312 + else if (jwk.alg !== alg) throw new jwk_1.JwkError('Invalid "alg" in JWK'); 313 + } 314 + return this.fromJWK(jwk, kid); 315 + } 316 + 317 + static async fromPKCS8(pem, alg, kid) { 318 + const keyLike = await (0, jose_1.importPKCS8)(pem, alg, { extractable: true }); 319 + return this.fromKeyLike(keyLike, kid); 320 + } 321 + 322 + static async fromJWK(input, inputKid) { 323 + const jwk = typeof input === 'string' ? JSON.parse(input) : input; 324 + if (!jwk || typeof jwk !== 'object') throw new jwk_1.JwkError('Invalid JWK'); 325 + const kid = (0, util_1.either)(jwk.kid, inputKid); 326 + const use = jwk.use || 'sig'; 327 + return new JoseKey(jwk_1.jwkValidator.parse({ ...jwk, kid, use })); 328 + } 329 + } 330 + 331 + exports.JoseKey = JoseKey;
+4 -1
apps/api/package.json
··· 25 25 "format": "biome format src", 26 26 "lint": "biome lint src", 27 27 "feed": "bun ./src/scripts/feed.ts", 28 - "dedup": "bun ./src/scripts/dedup.ts" 28 + "dedup": "bun ./src/scripts/dedup.ts", 29 + "postinstall": "cp jose-key.js ../../node_modules/.bun/@atproto+jwk-jose@0.1.5/node_modules/@atproto/jwk-jose/dist" 29 30 }, 30 31 "dependencies": { 31 32 "@atproto/api": "^0.13.31", ··· 39 40 "@atproto/xrpc-server": "^0.7.8", 40 41 "@hono/node-server": "^1.13.8", 41 42 "@hono/node-ws": "^1.1.0", 43 + "@noble/secp256k1": "^3.0.0", 42 44 "@opentelemetry/api": "^1.9.0", 43 45 "@opentelemetry/auto-instrumentations-node": "^0.58.0", 44 46 "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", ··· 65 67 "hono": "^4.4.7", 66 68 "http-proxy-middleware": "^3.0.5", 67 69 "iron-session": "^8.0.4", 70 + "jose": "^6.1.0", 68 71 "jsonwebtoken": "^9.0.2", 69 72 "kysely": "^0.27.5", 70 73 "lodash": "^4.17.21",
-18
apps/api/src/auth/client.ts
··· 1 1 import { JoseKey } from "@atproto/jwk-jose"; 2 2 import { NodeOAuthClient } from "@atproto/oauth-client-node"; 3 - import { importJWK } from "jose"; 4 3 import type { Database } from "../db"; 5 4 import { env } from "../lib/env"; 6 5 import { SessionStore, StateStore } from "./storage"; 7 - 8 - console.log("<<"); 9 - console.log(env.PRIVATE_KEY_1); 10 - console.log(">>"); 11 - 12 - const keyset = await Promise.all([ 13 - JoseKey.fromImportable(env.PRIVATE_KEY_1), 14 - JoseKey.fromImportable(env.PRIVATE_KEY_2), 15 - JoseKey.fromImportable(env.PRIVATE_KEY_3), 16 - ]); 17 - 18 - console.log(keyset[0]["jwk"]); 19 - 20 - await importJWK(keyset[0]["jwk"], "ES256"); 21 - 22 - // keyset[0].createJwt(, payload) 23 - console.log(keyset[0]); 24 6 25 7 export const createClient = async (db: Database) => { 26 8 const publicUrl = env.PUBLIC_URL;
+3 -3
apps/api/src/index.ts
··· 47 47 rateLimiter({ 48 48 limit: 1000, 49 49 window: 30, // 👈 30 seconds 50 - }) 50 + }), 51 51 ); 52 52 53 53 app.use("*", async (c, next) => { ··· 162 162 ctx.redis.get(`nowplaying:${user.did}:status`), 163 163 ]); 164 164 return c.json( 165 - nowPlaying ? { ...JSON.parse(nowPlaying), is_playing: status === "1" } : {} 165 + nowPlaying ? { ...JSON.parse(nowPlaying), is_playing: status === "1" } : {}, 166 166 ); 167 167 }); 168 168 ··· 314 314 listeners: 1, 315 315 sha256: item.track.sha256, 316 316 id: item.scrobble.id, 317 - })) 317 + })), 318 318 ); 319 319 }); 320 320
+30 -21
bun.lock
··· 21 21 "@atproto/identity": "^0.4.5", 22 22 "@atproto/lex-cli": "^0.5.6", 23 23 "@atproto/lexicon": "^0.4.5", 24 - "@atproto/oauth-client-node": "^0.3.9", 24 + "@atproto/oauth-client-node": "0.2.14", 25 25 "@atproto/sync": "^0.1.11", 26 26 "@atproto/syntax": "^0.3.1", 27 27 "@atproto/xrpc-server": "^0.7.8", 28 28 "@hono/node-server": "^1.13.8", 29 29 "@hono/node-ws": "^1.1.0", 30 + "@noble/secp256k1": "^3.0.0", 30 31 "@opentelemetry/api": "^1.9.0", 31 32 "@opentelemetry/auto-instrumentations-node": "^0.58.0", 32 33 "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", ··· 339 340 340 341 "@asteasolutions/zod-to-openapi": ["@asteasolutions/zod-to-openapi@7.3.4", "", { "dependencies": { "openapi3-ts": "^4.1.2" }, "peerDependencies": { "zod": "^3.20.2" } }, "sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA=="], 341 342 342 - "@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.2.2", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.1", "zod": "^3.23.8" } }, "sha512-ca2B7xR43tVoQ8XxBvha58DXwIH8cIyKQl6lpOKGkPUrJuFoO4iCLlDiSDi2Ueh+yE1rMDPP/qveHdajgDX3WQ=="], 343 + "@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.1.11", "", { "dependencies": { "@atproto-labs/fetch": "0.2.2", "@atproto-labs/pipe": "0.1.0", "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-qXNzIX2GPQnxT1gl35nv/8ErDdc4Fj/+RlJE7oyE7JGkFAPUyuY03TvKJ79SmWFsWE8wyTXEpLuphr9Da1Vhkw=="], 343 344 344 - "@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.3", "", { "dependencies": { "@atproto-labs/pipe": "0.1.1" } }, "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw=="], 345 + "@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.2", "", { "dependencies": { "@atproto-labs/pipe": "0.1.0" } }, "sha512-QyafkedbFeVaN20DYUpnY2hcArYxjdThPXbYMqOSoZhcvkrUqaw4xDND4wZB5TBD9cq2yqe9V6mcw9P4XQKQuQ=="], 345 346 346 - "@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.1.10", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "ipaddr.js": "^2.1.0", "undici": "^6.14.1" } }, "sha512-o7hGaonA71A6p7O107VhM6UBUN/g9tTyYohMp1q0Kf6xQ4npnuZYRSHSf2g6reSfGQJ1GoFNjBObETTT1ge/jQ=="], 347 + "@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.1.8", "", { "dependencies": { "@atproto-labs/fetch": "0.2.2", "@atproto-labs/pipe": "0.1.0", "ipaddr.js": "^2.1.0", "psl": "^1.9.0", "undici": "^6.14.1" } }, "sha512-OOTIhZNPEDDm7kaYU8iYRgzM+D5n3mP2iiBSyKuLakKTaZBL5WwYlUsJVsqX26SnUXtGEroOJEVJ6f66OcG80w=="], 347 348 348 - "@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.3.2", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.1", "zod": "^3.23.8" } }, "sha512-KIerCzh3qb+zZoqWbIvTlvBY0XPq0r56kwViaJY/LTe/3oPO2JaqlYKS/F4dByWBhHK6YoUOJ0sWrh6PMJl40A=="], 349 + "@atproto-labs/handle-resolver": ["@atproto-labs/handle-resolver@0.1.7", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "zod": "^3.23.8" } }, "sha512-nb4uAOgRVMp2NGVTJnor4ohqySbd1KyB5VzQLaRjMaPwH60Al057eTqiKRbeH/xD7hOBPNj1m0YjgxzvyAnWkg=="], 349 350 350 - "@atproto-labs/handle-resolver-node": ["@atproto-labs/handle-resolver-node@0.1.20", "", { "dependencies": { "@atproto-labs/fetch-node": "0.1.10", "@atproto-labs/handle-resolver": "0.3.2", "@atproto/did": "0.2.1" } }, "sha512-094EL61XN9M7vm22cloSOxk/gcTRaCK52vN7BYgXgdoEI8uJJMTFXenQqu+LRGwiCcjvyclcBqbaz0DzJep50Q=="], 351 + "@atproto-labs/handle-resolver-node": ["@atproto-labs/handle-resolver-node@0.1.14", "", { "dependencies": { "@atproto-labs/fetch-node": "0.1.8", "@atproto-labs/handle-resolver": "0.1.7", "@atproto/did": "0.1.5" } }, "sha512-+kOf+xENdxUNrrLoIcp/L4ommIa1SHnwfHIWbxumXnacfurjMOnZhfXeiNsEguaAxDNYpqDNpKsFBtcgjffXvQ=="], 351 352 352 - "@atproto-labs/identity-resolver": ["@atproto-labs/identity-resolver@0.3.2", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.2", "@atproto-labs/handle-resolver": "0.3.2" } }, "sha512-MYxO9pe0WsFyi5HFdKAwqIqHfiF2kBPoVhAIuH/4PYHzGr799ED47xLhNMxR3ZUYrJm5+TQzWXypGZ0Btw1Ffw=="], 353 + "@atproto-labs/identity-resolver": ["@atproto-labs/identity-resolver@0.1.15", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/handle-resolver": "0.1.7", "@atproto/syntax": "0.4.0" } }, "sha512-3ABob5iUDoFL85I8/pJE4wncz3148fADoxNVAdksyACxxjpH1GNhSYNyIpRpdMCJ/kjj69DM9rggumTHqnD/Xg=="], 353 354 354 - "@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.1", "", {}, "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg=="], 355 + "@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.0", "", {}, "sha512-ghOqHFyJlQVFPESzlVHjKroP0tPzbmG5Jms0dNI9yLDEfL8xp4OFPWLX4f6T8mRq69wWs4nIDM3sSsFbFqLa1w=="], 355 356 356 - "@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.3.0", "", {}, "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ=="], 357 + "@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.1.2", "", {}, "sha512-9vTNvyPPBs44tKVFht16wGlilW8u4wpEtKwLkWbuNEh3h9TTQ8zjVhEoGZh/v73G4Otr9JUOSIq+/5+8OZD2mQ=="], 357 358 358 - "@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.4", "", { "dependencies": { "@atproto-labs/simple-store": "0.3.0", "lru-cache": "^10.2.0" } }, "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw=="], 359 + "@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.2", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.2", "lru-cache": "^10.2.0" } }, "sha512-q6wawjKKXuhUzr2MnkSlgr6zU6VimYkL8eNvLQvkroLnIDyMkoCKO4+EJ885ZD8lGwBo4pX9Lhrg9JJ+ncJI8g=="], 359 360 360 361 "@atproto/api": ["@atproto/api@0.13.35", "", { "dependencies": { "@atproto/common-web": "^0.4.0", "@atproto/lexicon": "^0.4.6", "@atproto/syntax": "^0.3.2", "@atproto/xrpc": "^0.6.8", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-vsEfBj0C333TLjDppvTdTE0IdKlXuljKSveAeI4PPx/l6eUKNnDTsYxvILtXUVzwUlTDmSRqy5O4Ryh78n1b7g=="], 361 362 ··· 365 366 366 367 "@atproto/crypto": ["@atproto/crypto@0.4.4", "", { "dependencies": { "@noble/curves": "^1.7.0", "@noble/hashes": "^1.6.1", "uint8arrays": "3.0.0" } }, "sha512-Yq9+crJ7WQl7sxStVpHgie5Z51R05etaK9DLWYG/7bR5T4bhdcIgF6IfklLShtZwLYdVVj+K15s0BqW9a8PSDA=="], 367 368 368 - "@atproto/did": ["@atproto/did@0.2.1", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-1i5BTU2GnBaaeYWhxUOnuEKFVq9euT5+dQPFabHpa927BlJ54PmLGyBBaOI7/NbLmN5HWwBa18SBkMpg3jGZRA=="], 369 + "@atproto/did": ["@atproto/did@0.1.5", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-8+1D08QdGE5TF0bB0vV8HLVrVZJeLNITpRTUVEoABNMRaUS7CoYSVb0+JNQDeJIVmqMjOL8dOjvCUDkp3gEaGQ=="], 369 370 370 371 "@atproto/identity": ["@atproto/identity@0.4.9", "", { "dependencies": { "@atproto/common-web": "^0.4.3", "@atproto/crypto": "^0.4.4" } }, "sha512-pRYCaeaEJMZ4vQlRQYYTrF3cMiRp21n/k/pUT1o7dgKby56zuLErDmFXkbKfKWPf7SgWRgamSaNmsGLqAOD7lQ=="], 371 372 372 - "@atproto/jwk": ["@atproto/jwk@0.6.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw=="], 373 + "@atproto/jwk": ["@atproto/jwk@0.1.4", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-dSRuEi0FbxL5ln6hEFHp5ZW01xbQH9yJi5odZaEYpcA6beZHf/bawlU12CQy/CDsbC3FxSqrBw7Q2t7mvdSBqw=="], 373 374 374 - "@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.11", "", { "dependencies": { "@atproto/jwk": "0.6.0", "jose": "^5.2.0" } }, "sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q=="], 375 + "@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.5", "", { "dependencies": { "@atproto/jwk": "0.1.4", "jose": "^5.2.0" } }, "sha512-piYZ3ohKhRiGlD6/bZCV/Ed3lIi7CVd6txbofEHik22EkYWK0nWKoEriCUSTssSylwFzeOq2r31Ut16WcJoghw=="], 375 376 376 - "@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.2.0", "", { "dependencies": { "@atproto/jwk": "0.6.0", "@atproto/jwk-jose": "0.1.11", "zod": "^3.23.8" } }, "sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg=="], 377 + "@atproto/jwk-webcrypto": ["@atproto/jwk-webcrypto@0.1.5", "", { "dependencies": { "@atproto/jwk": "0.1.4", "@atproto/jwk-jose": "0.1.5", "zod": "^3.23.8" } }, "sha512-xsX8cJO6rBakLz8zNKenuKIbjoTeaiMi/ETOFFYGtlMlk1grdxDOe6OGpCmUDXaOiYWu3x5K5Hc4J9ooI/4nRg=="], 377 378 378 379 "@atproto/lex-cli": ["@atproto/lex-cli@0.5.7", "", { "dependencies": { "@atproto/lexicon": "^0.4.6", "@atproto/syntax": "^0.3.2", "chalk": "^4.1.2", "commander": "^9.4.0", "prettier": "^3.2.5", "ts-morph": "^16.0.0", "yesno": "^0.4.0", "zod": "^3.23.8" }, "bin": { "lex": "dist/index.js" } }, "sha512-V5rsU95Th57KICxUGwTjudN5wmFBHL/fLkl7banl6izsQBiUrVvrj3EScNW/Wx2PnwlJwxtTpa1rTnP30+i5/A=="], 379 380 380 381 "@atproto/lexicon": ["@atproto/lexicon@0.4.14", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ=="], 381 382 382 - "@atproto/oauth-client": ["@atproto/oauth-client@0.5.7", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.2", "@atproto-labs/fetch": "0.2.3", "@atproto-labs/handle-resolver": "0.3.2", "@atproto-labs/identity-resolver": "0.3.2", "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.2.1", "@atproto/jwk": "0.6.0", "@atproto/oauth-types": "0.4.2", "@atproto/xrpc": "0.7.5", "core-js": "^3", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-pDvbvy9DCxrAJv7bAbBUzWrHZKhFy091HvEMZhr+EyZA6gSCGYmmQJG/coDj0oICSVQeafAZd+IxR0YUCWwmEg=="], 383 + "@atproto/oauth-client": ["@atproto/oauth-client@0.3.13", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/fetch": "0.2.2", "@atproto-labs/handle-resolver": "0.1.7", "@atproto-labs/identity-resolver": "0.1.15", "@atproto-labs/simple-store": "0.1.2", "@atproto-labs/simple-store-memory": "0.1.2", "@atproto/did": "0.1.5", "@atproto/jwk": "0.1.4", "@atproto/oauth-types": "0.2.4", "@atproto/xrpc": "0.6.12", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-PqE6hWG6bhpu5OUbccoAZjoj9LQroStuPjXqkHCsnUfQGmruzuNmzMS0myLdoWCx+NSGr4sMgUPjGzAHXSLoaQ=="], 383 384 384 - "@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.3.9", "", { "dependencies": { "@atproto-labs/did-resolver": "0.2.2", "@atproto-labs/handle-resolver-node": "0.1.20", "@atproto-labs/simple-store": "0.3.0", "@atproto/did": "0.2.1", "@atproto/jwk": "0.6.0", "@atproto/jwk-jose": "0.1.11", "@atproto/jwk-webcrypto": "0.2.0", "@atproto/oauth-client": "0.5.7", "@atproto/oauth-types": "0.4.2" } }, "sha512-JdzwDQ8Gczl0lgfJNm7lG7omkJ4yu99IuGkkRWixpEvKY/jY/mDZaho+3pfd29SrUvwQOOx4Bm4l7DGeYwxxyA=="], 385 + "@atproto/oauth-client-node": ["@atproto/oauth-client-node@0.2.14", "", { "dependencies": { "@atproto-labs/did-resolver": "0.1.11", "@atproto-labs/handle-resolver-node": "0.1.14", "@atproto-labs/simple-store": "0.1.2", "@atproto/did": "0.1.5", "@atproto/jwk": "0.1.4", "@atproto/jwk-jose": "0.1.5", "@atproto/jwk-webcrypto": "0.1.5", "@atproto/oauth-client": "0.3.13", "@atproto/oauth-types": "0.2.4" } }, "sha512-KDQWhkCqwVJtuBmqBLRo9sOL9Mw9SkFmCe1s+t6asdkfe1uMezvSTYCi5SIR+E4vwrYSIq2z6ZvWbc/XV3UwEQ=="], 385 386 386 - "@atproto/oauth-types": ["@atproto/oauth-types@0.4.2", "", { "dependencies": { "@atproto/did": "0.2.1", "@atproto/jwk": "0.6.0", "zod": "^3.23.8" } }, "sha512-gcfNTyFsPJcYDf79M0iKHykWqzxloscioKoerdIN3MTS3htiNOSgZjm2p8ho7pdrElLzea3qktuhTQI39j1XFQ=="], 387 + "@atproto/oauth-types": ["@atproto/oauth-types@0.2.4", "", { "dependencies": { "@atproto/jwk": "0.1.4", "zod": "^3.23.8" } }, "sha512-V2LnlXi1CSmBQWTQgDm8l4oN7xYxlftVwM7hrvYNP+Jxo3Ozfe0QLK1Wy/CH6/ZqzrBBhYvcbf4DJYTUwPA+hw=="], 387 388 388 389 "@atproto/repo": ["@atproto/repo@0.8.10", "", { "dependencies": { "@atproto/common": "^0.4.12", "@atproto/common-web": "^0.4.3", "@atproto/crypto": "^0.4.4", "@atproto/lexicon": "^0.5.1", "@ipld/dag-cbor": "^7.0.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "varint": "^6.0.0", "zod": "^3.23.8" } }, "sha512-REs6TZGyxNaYsjqLf447u+gSdyzhvMkVbxMBiKt1ouEVRkiho1CY32+omn62UkpCuGK2y6SCf6x3sVMctgmX4g=="], 389 390 ··· 730 731 "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], 731 732 732 733 "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], 734 + 735 + "@noble/secp256k1": ["@noble/secp256k1@3.0.0", "", {}, "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg=="], 733 736 734 737 "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 735 738 ··· 2371 2374 2372 2375 "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], 2373 2376 2377 + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], 2378 + 2374 2379 "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], 2375 2380 2376 2381 "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], ··· 2825 2830 2826 2831 "@atproto-labs/fetch-node/undici": ["undici@6.22.0", "", {}, "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw=="], 2827 2832 2833 + "@atproto-labs/identity-resolver/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], 2834 + 2828 2835 "@atproto/jwk-jose/jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], 2829 2836 2830 2837 "@atproto/jwk-webcrypto/@atproto/jwk": ["@atproto/jwk@0.3.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-MIAXyNMGu1tCNHjqW/8jqfE/wgWCIoK2cJ0mR6UxwhNPvkbe35TcpRYJdtQu/E6MUd7TziyDBa/GO4dKAiePhQ=="], ··· 2837 2844 2838 2845 "@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.1", "", {}, "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw=="], 2839 2846 2847 + <<<<<<< HEAD 2840 2848 "@atproto/oauth-client/@atproto/jwk": ["@atproto/jwk@0.3.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-MIAXyNMGu1tCNHjqW/8jqfE/wgWCIoK2cJ0mR6UxwhNPvkbe35TcpRYJdtQu/E6MUd7TziyDBa/GO4dKAiePhQ=="], 2841 2849 2842 2850 "@atproto/oauth-client/@atproto/xrpc": ["@atproto/xrpc@0.7.0", "", { "dependencies": { "@atproto/lexicon": "^0.4.11", "zod": "^3.23.8" } }, "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw=="], ··· 2848 2856 "@atproto/oauth-types/@atproto/jwk": ["@atproto/jwk@0.3.0", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-MIAXyNMGu1tCNHjqW/8jqfE/wgWCIoK2cJ0mR6UxwhNPvkbe35TcpRYJdtQu/E6MUd7TziyDBa/GO4dKAiePhQ=="], 2849 2857 2850 2858 "@atproto/sync/@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], 2859 + ======= 2860 + "@atproto/repo/@atproto/lexicon": ["@atproto/lexicon@0.5.1", "", { "dependencies": { "@atproto/common-web": "^0.4.3", "@atproto/syntax": "^0.4.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A=="], 2861 + >>>>>>> c657eb7 (feat: update dependencies and scripts in API) 2851 2862 2852 2863 "@atproto/sync/@atproto/lexicon": ["@atproto/lexicon@0.5.1", "", { "dependencies": { "@atproto/common-web": "^0.4.3", "@atproto/syntax": "^0.4.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A=="], 2853 2864 ··· 3133 3144 3134 3145 "prop-types-extra/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], 3135 3146 3147 + "psl/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 3148 + 3136 3149 "raw-body/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], 3137 3150 3138 3151 "react-router/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], ··· 3219 3232 3220 3233 "@atproto/lex-cli/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 3221 3234 3222 - "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.5.1", "", { "dependencies": { "@atproto/common-web": "^0.4.3", "@atproto/syntax": "^0.4.1", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A=="], 3223 - 3224 3235 "@atproto/repo/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.1", "", {}, "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw=="], 3225 3236 3226 3237 "@atproto/sync/@atproto/xrpc-server/@atproto/xrpc": ["@atproto/xrpc@0.7.5", "", { "dependencies": { "@atproto/lexicon": "^0.5.1", "zod": "^3.23.8" } }, "sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA=="], ··· 3586 3597 "wrangler/miniflare/youch": ["youch@3.3.4", "", { "dependencies": { "cookie": "^0.7.1", "mustache": "^4.2.0", "stacktracey": "^2.1.8" } }, "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg=="], 3587 3598 3588 3599 "wrangler/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], 3589 - 3590 - "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.1", "", {}, "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw=="], 3591 3600 3592 3601 "@atproto/sync/@atproto/xrpc-server/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], 3593 3602