@atproto/bsky 0.0.219 → 0.0.220

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.
Files changed (77) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/feature-gates/types.d.ts +1 -1
  6. package/dist/feature-gates/types.d.ts.map +1 -1
  7. package/dist/feature-gates/types.js.map +1 -1
  8. package/dist/feature-gates/utils.d.ts.map +1 -1
  9. package/dist/feature-gates/utils.js +4 -2
  10. package/dist/feature-gates/utils.js.map +1 -1
  11. package/dist/hydration/actor.d.ts +1 -1
  12. package/dist/hydration/actor.d.ts.map +1 -1
  13. package/dist/hydration/actor.js +4 -3
  14. package/dist/hydration/actor.js.map +1 -1
  15. package/dist/hydration/hydrator.d.ts +14 -2
  16. package/dist/hydration/hydrator.d.ts.map +1 -1
  17. package/dist/hydration/hydrator.js +23 -2
  18. package/dist/hydration/hydrator.js.map +1 -1
  19. package/dist/hydration/util.d.ts +2 -0
  20. package/dist/hydration/util.d.ts.map +1 -1
  21. package/dist/hydration/util.js +14 -3
  22. package/dist/hydration/util.js.map +1 -1
  23. package/dist/image/sharp.js +2 -2
  24. package/dist/image/sharp.js.map +1 -1
  25. package/dist/image/uri.d.ts.map +1 -1
  26. package/dist/image/uri.js +13 -15
  27. package/dist/image/uri.js.map +1 -1
  28. package/dist/image/util.d.ts +1 -1
  29. package/dist/image/util.d.ts.map +1 -1
  30. package/dist/image/util.js +1 -0
  31. package/dist/image/util.js.map +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -6
  34. package/dist/index.js.map +1 -1
  35. package/dist/util/uris.d.ts +1 -1
  36. package/dist/util/uris.d.ts.map +1 -1
  37. package/dist/views/index.js +1 -1
  38. package/dist/views/index.js.map +1 -1
  39. package/package.json +9 -9
  40. package/src/config.ts +1 -0
  41. package/src/feature-gates/types.ts +2 -1
  42. package/src/feature-gates/utils.ts +4 -2
  43. package/src/hydration/actor.ts +7 -4
  44. package/src/hydration/hydrator.ts +29 -3
  45. package/src/hydration/util.ts +14 -2
  46. package/src/image/sharp.ts +2 -2
  47. package/src/image/uri.ts +16 -17
  48. package/src/image/util.ts +2 -1
  49. package/src/index.ts +14 -10
  50. package/src/views/index.ts +1 -1
  51. package/tests/__snapshots__/feed-generation.test.ts.snap +52 -52
  52. package/tests/_util.ts +6 -4
  53. package/tests/data-plane/__snapshots__/indexing.test.ts.snap +7 -7
  54. package/tests/hydration/util.test.ts +40 -0
  55. package/tests/image/server.test.ts +4 -4
  56. package/tests/image/sharp.test.ts +7 -7
  57. package/tests/image/uri.test.ts +24 -10
  58. package/tests/views/__snapshots__/author-feed.test.ts.snap +110 -110
  59. package/tests/views/__snapshots__/block-lists.test.ts.snap +14 -14
  60. package/tests/views/__snapshots__/blocks.test.ts.snap +6 -6
  61. package/tests/views/__snapshots__/bookmarks.test.ts.snap +10 -10
  62. package/tests/views/__snapshots__/follows.test.ts.snap +34 -34
  63. package/tests/views/__snapshots__/labeler-service.test.ts.snap +4 -4
  64. package/tests/views/__snapshots__/likes.test.ts.snap +1 -1
  65. package/tests/views/__snapshots__/list-feed.test.ts.snap +16 -16
  66. package/tests/views/__snapshots__/lists.test.ts.snap +8 -8
  67. package/tests/views/__snapshots__/mute-lists.test.ts.snap +19 -19
  68. package/tests/views/__snapshots__/mutes.test.ts.snap +10 -10
  69. package/tests/views/__snapshots__/notifications.test.ts.snap +36 -36
  70. package/tests/views/__snapshots__/posts.test.ts.snap +17 -17
  71. package/tests/views/__snapshots__/profile.test.ts.snap +15 -15
  72. package/tests/views/__snapshots__/quotes.test.ts.snap +6 -6
  73. package/tests/views/__snapshots__/reposts.test.ts.snap +1 -1
  74. package/tests/views/__snapshots__/starter-packs.test.ts.snap +16 -16
  75. package/tests/views/__snapshots__/thread.test.ts.snap +36 -36
  76. package/tests/views/__snapshots__/timeline.test.ts.snap +133 -133
  77. package/tests/views/profile.test.ts +35 -0
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAAsC;AACtC,iDAAkC;AAClC,8CAA4C;AAC5C,4CAAuC;AACvC,kDAA8C;AAG9C,MAAa,YAAgB,SAAQ,GAAqB;IACxD,KAAK,CAAC,GAAoB;QACxB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAPD,oCAOC;AAgBM,MAAM,SAAS,GAAG,CACvB,IAAQ,EACR,IAAQ,EACO,EAAE;IACjB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAA;AAPY,QAAA,SAAS,aAOrB;AAEM,MAAM,eAAe,GAAG,CAC7B,IAAQ,EACR,IAAQ,EACO,EAAE;IACjB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,CAAC,CAAA;QACtE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAbY,QAAA,eAAe,mBAa3B;AAEM,MAAM,aAAa,GAAG,CAAI,GAAG,IAAuB,EAAE,EAAE;IAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAS,EAAE,SAAwC,CAAC,CAAA;AACzE,CAAC,CAAA;AAFY,QAAA,aAAa,iBAEzB;AAIM,MAAM,WAAW,GAAG,CACzB,KAAa,EACb,gBAAyB,EACE,EAAE;IAC7B,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACzC,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,wBAAgB,EAAI,KAAK,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;IACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAM;IAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IACD,OAAO;QACL,MAAM;QACN,GAAG;QACH,QAAQ;QACR,SAAS;QACT,WAAW,EAAE,IAAA,uBAAe,EAAC,KAAK,CAAC;KACpC,CAAA;AACH,CAAC,CAAA;AAtBY,QAAA,WAAW,eAsBvB;AAED,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,EAAE;IACtC,MAAM,SAAS,GAAG,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAA;IACjC,IAAI,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC;QACH,mBAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;QACzD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,mGAAmG;AAC5F,MAAM,gBAAgB,GAAG,CAC9B,KAA6B,EACd,EAAE;IACjB,OAAO,IAAA,sBAAc,EAAC,KAAK,CAAM,CAAA;AACnC,CAAC,CAAA;AAJY,QAAA,gBAAgB,oBAI5B;AAEM,MAAM,cAAc,GAAG,CAAC,KAA6B,EAAW,EAAE;IACvE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;QAAE,OAAM;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IACtD,OAAO,MAAM,IAAI,SAAS,CAAA;AAC5B,CAAC,CAAA;AAJY,QAAA,cAAc,kBAI1B;AAEM,MAAM,WAAW,GAAG,CAAC,GAAuB,EAAsB,EAAE;IACzE,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AAChD,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB;AAEM,MAAM,QAAQ,GAAG,CAAC,MAA0B,EAAmB,EAAE;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC1C,IAAI,CAAC;QACH,OAAO,SAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;AACH,CAAC,CAAA;AAPY,QAAA,QAAQ,YAOpB;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAyB,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,cAAK,CAAC,GAAG,CAAC,CAAC,UAAU,CAAA;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACf,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AATY,QAAA,gBAAgB,oBAS5B;AAEM,MAAM,KAAK,GAAG,CACnB,KAAU,EACV,SAA+B,EACnB,EAAE;IACd,MAAM,GAAG,GAAQ,EAAE,CAAA;IACnB,MAAM,EAAE,GAAQ,EAAE,CAAA;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AAClB,CAAC,CAAA;AAdY,QAAA,KAAK,SAcjB;AAEM,MAAM,eAAe,GAAG,CAAC,GAG/B,EAAsB,EAAE;IACvB,IAAI,CAAC,GAAG;QAAE,OAAM;IAChB,IAAI,GAAG,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC,WAAW,CAAA;IAC3C,IAAI,GAAG,CAAC,SAAS;QAAE,OAAO,uBAAuB,CAAA;AACnD,CAAC,CAAA;AAPY,QAAA,eAAe,mBAO3B;AAEM,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,KAAK,GAIN,EAAW,EAAE,CAAC,IAAI,IAAI,KAAK,CAAA;AANf,QAAA,6BAA6B,iCAMd","sourcesContent":["import { CID } from 'multiformats/cid'\nimport * as ui8 from 'uint8arrays'\nimport { jsonToLex } from '@atproto/lexicon'\nimport { AtUri } from '@atproto/syntax'\nimport { lexicons } from '../lexicon/lexicons'\nimport { Record } from '../proto/bsky_pb'\n\nexport class HydrationMap<T> extends Map<string, T | null> implements Merges {\n merge(map: HydrationMap<T>): this {\n map.forEach((val, key) => {\n this.set(key, val)\n })\n return this\n }\n}\n\nexport interface Merges {\n merge<T extends this>(map: T): this\n}\n\ntype UnknownRecord = { $type: string; [x: string]: unknown }\n\nexport type RecordInfo<T extends UnknownRecord> = {\n record: T\n cid: string\n sortedAt: Date\n indexedAt: Date\n takedownRef: string | undefined\n}\n\nexport const mergeMaps = <V, M extends HydrationMap<V>>(\n mapA?: M,\n mapB?: M,\n): M | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n return mapA.merge(mapB)\n}\n\nexport const mergeNestedMaps = <V, M extends HydrationMap<HydrationMap<V>>>(\n mapA?: M,\n mapB?: M,\n): M | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n\n for (const [key, map] of mapB) {\n const merged = mergeMaps(mapA.get(key) ?? undefined, map ?? undefined)\n mapA.set(key, merged ?? null)\n }\n\n return mapA\n}\n\nexport const mergeManyMaps = <T>(...maps: HydrationMap<T>[]) => {\n return maps.reduce(mergeMaps, undefined as HydrationMap<T> | undefined)\n}\n\nexport type ItemRef = { uri: string; cid?: string }\n\nexport const parseRecord = <T extends UnknownRecord>(\n entry: Record,\n includeTakedowns: boolean,\n): RecordInfo<T> | undefined => {\n if (!includeTakedowns && entry.takenDown) {\n return undefined\n }\n const record = parseRecordBytes<T>(entry.record)\n const cid = entry.cid\n const sortedAt = entry.sortedAt?.toDate() ?? new Date(0)\n const indexedAt = entry.indexedAt?.toDate() ?? new Date(0)\n if (!record || !cid) return\n if (!isValidRecord(record)) {\n return\n }\n return {\n record,\n cid,\n sortedAt,\n indexedAt,\n takedownRef: safeTakedownRef(entry),\n }\n}\n\nconst isValidRecord = (json: unknown) => {\n const lexRecord = jsonToLex(json)\n if (typeof lexRecord?.['$type'] !== 'string') {\n return false\n }\n try {\n lexicons.assertValidRecord(lexRecord['$type'], lexRecord)\n return true\n } catch {\n return false\n }\n}\n\n// @NOTE not parsed into lex format, so will not match lexicon record types on CID and blob values.\nexport const parseRecordBytes = <T>(\n bytes: Uint8Array | undefined,\n): T | undefined => {\n return parseJsonBytes(bytes) as T\n}\n\nexport const parseJsonBytes = (bytes: Uint8Array | undefined): unknown => {\n if (!bytes || bytes.byteLength === 0) return\n const parsed = JSON.parse(ui8.toString(bytes, 'utf8'))\n return parsed ?? undefined\n}\n\nexport const parseString = (str: string | undefined): string | undefined => {\n return str && str.length > 0 ? str : undefined\n}\n\nexport const parseCid = (cidStr: string | undefined): CID | undefined => {\n if (!cidStr || cidStr.length === 0) return\n try {\n return CID.parse(cidStr)\n } catch {\n return\n }\n}\n\nexport const urisByCollection = (uris: string[]): Map<string, string[]> => {\n const result = new Map<string, string[]>()\n for (const uri of uris) {\n const collection = new AtUri(uri).collection\n const items = result.get(collection) ?? []\n items.push(uri)\n result.set(collection, items)\n }\n return result\n}\n\nexport const split = <T>(\n items: T[],\n predicate: (item: T) => boolean,\n): [T[], T[]] => {\n const yes: T[] = []\n const no: T[] = []\n for (const item of items) {\n if (predicate(item)) {\n yes.push(item)\n } else {\n no.push(item)\n }\n }\n return [yes, no]\n}\n\nexport const safeTakedownRef = (obj?: {\n takenDown: boolean\n takedownRef: string\n}): string | undefined => {\n if (!obj) return\n if (obj.takedownRef) return obj.takedownRef\n if (obj.takenDown) return 'BSKY-TAKEDOWN-UNKNOWN'\n}\n\nexport const isActivitySubscriptionEnabled = ({\n post,\n reply,\n}: {\n post: boolean\n reply: boolean\n}): boolean => post || reply\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { Timestamp } from '@bufbuild/protobuf'\nimport { CID } from 'multiformats/cid'\nimport * as ui8 from 'uint8arrays'\nimport { jsonToLex } from '@atproto/lexicon'\nimport { AtUri } from '@atproto/syntax'\nimport { lexicons } from '../lexicon/lexicons'\nimport { Record } from '../proto/bsky_pb'\n\nexport class HydrationMap<T> extends Map<string, T | null> implements Merges {\n merge(map: HydrationMap<T>): this {\n map.forEach((val, key) => {\n this.set(key, val)\n })\n return this\n }\n}\n\nexport interface Merges {\n merge<T extends this>(map: T): this\n}\n\ntype UnknownRecord = { $type: string; [x: string]: unknown }\n\nexport type RecordInfo<T extends UnknownRecord> = {\n record: T\n cid: string\n sortedAt: Date\n indexedAt: Date\n takedownRef: string | undefined\n}\n\nexport const mergeMaps = <V, M extends HydrationMap<V>>(\n mapA?: M,\n mapB?: M,\n): M | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n return mapA.merge(mapB)\n}\n\nexport const mergeNestedMaps = <V, M extends HydrationMap<HydrationMap<V>>>(\n mapA?: M,\n mapB?: M,\n): M | undefined => {\n if (!mapA) return mapB\n if (!mapB) return mapA\n\n for (const [key, map] of mapB) {\n const merged = mergeMaps(mapA.get(key) ?? undefined, map ?? undefined)\n mapA.set(key, merged ?? null)\n }\n\n return mapA\n}\n\nexport const mergeManyMaps = <T>(...maps: HydrationMap<T>[]) => {\n return maps.reduce(mergeMaps, undefined as HydrationMap<T> | undefined)\n}\n\nexport type ItemRef = { uri: string; cid?: string }\n\nexport const parseRecord = <T extends UnknownRecord>(\n entry: Record,\n includeTakedowns: boolean,\n): RecordInfo<T> | undefined => {\n if (!includeTakedowns && entry.takenDown) {\n return undefined\n }\n const record = parseRecordBytes<T>(entry.record)\n const cid = entry.cid\n const sortedAt = parseDate(entry.sortedAt) ?? new Date(0)\n const indexedAt = parseDate(entry.indexedAt) ?? new Date(0)\n if (!record || !cid) return\n if (!isValidRecord(record)) {\n return\n }\n return {\n record,\n cid,\n sortedAt,\n indexedAt,\n takedownRef: safeTakedownRef(entry),\n }\n}\n\nconst isValidRecord = (json: unknown) => {\n const lexRecord = jsonToLex(json)\n if (typeof lexRecord?.['$type'] !== 'string') {\n return false\n }\n try {\n lexicons.assertValidRecord(lexRecord['$type'], lexRecord)\n return true\n } catch {\n return false\n }\n}\n\n// @NOTE not parsed into lex format, so will not match lexicon record types on CID and blob values.\nexport const parseRecordBytes = <T>(\n bytes: Uint8Array | undefined,\n): T | undefined => {\n return parseJsonBytes(bytes) as T\n}\n\nexport const parseJsonBytes = (bytes: Uint8Array | undefined): unknown => {\n if (!bytes || bytes.byteLength === 0) return\n const parsed = JSON.parse(ui8.toString(bytes, 'utf8'))\n return parsed ?? undefined\n}\n\nexport const parseString = (str: string | undefined): string | undefined => {\n return str && str.length > 0 ? str : undefined\n}\n\nexport const parseCid = (cidStr: string | undefined): CID | undefined => {\n if (!cidStr || cidStr.length === 0) return\n try {\n return CID.parse(cidStr)\n } catch {\n return\n }\n}\n\nexport const parseDate = (\n timestamp: Timestamp | undefined,\n): Date | undefined => {\n if (!timestamp) return undefined\n const date = timestamp.toDate()\n // Check for year 1 (0001-01-01 00:00:00 UTC) which is -62135596800000ms from epoch.\n // The Go dataplane gives us those values as they come from the Go zero-value for dates.\n if (date.getTime() === -62135596800000) return undefined\n return date\n}\n\nexport const urisByCollection = (uris: string[]): Map<string, string[]> => {\n const result = new Map<string, string[]>()\n for (const uri of uris) {\n const collection = new AtUri(uri).collection\n const items = result.get(collection) ?? []\n items.push(uri)\n result.set(collection, items)\n }\n return result\n}\n\nexport const split = <T>(\n items: T[],\n predicate: (item: T) => boolean,\n): [T[], T[]] => {\n const yes: T[] = []\n const no: T[] = []\n for (const item of items) {\n if (predicate(item)) {\n yes.push(item)\n } else {\n no.push(item)\n }\n }\n return [yes, no]\n}\n\nexport const safeTakedownRef = (obj?: {\n takenDown: boolean\n takedownRef: string\n}): string | undefined => {\n if (!obj) return\n if (obj.takedownRef) return obj.takedownRef\n if (obj.takenDown) return 'BSKY-TAKEDOWN-UNKNOWN'\n}\n\nexport const isActivitySubscriptionEnabled = ({\n post,\n reply,\n}: {\n post: boolean\n reply: boolean\n}): boolean => post || reply\n"]}
@@ -42,8 +42,8 @@ function createImageProcessor({ height, width, min = false, fit = 'cover', forma
42
42
  if (format === 'jpeg') {
43
43
  return processor.jpeg({ quality });
44
44
  }
45
- else if (format === 'png') {
46
- return processor.png({ quality });
45
+ else if (format === 'webp') {
46
+ return processor.webp({ quality });
47
47
  }
48
48
  else {
49
49
  throw new Error(`Unhandled case: ${format}`);
@@ -1 +1 @@
1
- {"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":";;;;;AAWA,kDAYC;AAMD,oDAsBC;AAED,oCA2BC;AAED,0BAMC;AAxFD,6CAAmD;AACnD,mDAA+C;AAC/C,kDAAyB;AACzB,4CAA2C;AAC3C,iCAA2D;AAI3D;;GAEG;AACH,SAAgB,mBAAmB,CAAC,EAAE,GAAG,GAAG,KAAK,EAAW;IAC1D,6EAA6E;IAC7E,qBAAqB;IACrB,OAAO,OAAO,GAAG,KAAK,SAAS;QAC7B,CAAC,CAAC,IAAA,eAAK,GAAE,CAAC,MAAM,CAAC;YACb,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QACJ,CAAC,CAAC,IAAI,yBAAW,EAAE,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,KAAK,EACL,GAAG,GAAG,KAAK,EACX,GAAG,GAAG,OAAO,EACb,MAAM,EACN,OAAO,GAAG,GAAG,GACL;IACR,MAAM,SAAS,GAAG,IAAA,eAAK,GAAE,CAAC,MAAM,CAAC;QAC/B,GAAG;QACH,KAAK;QACL,MAAM;QACN,kBAAkB,EAAE,GAAG,KAAK,IAAI;KACjC,CAAC,CAAA;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,eAAK,GAAE,CAAA;QAEzB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,SAAS,CAAC,QAAQ,EAAE;YACpB,IAAA,mBAAQ,EAAC,MAAM,EAAE,SAAS,CAAC,EAAE,4BAA4B;SAC1D,CAAC,CAAA;QAEF,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACtE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,MAAM;YACN,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,qBAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;SAC9C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,IAAA,kBAAS,EAAC,GAAG,EAAE,gDAAgD,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,MAAgB;IAC5C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import { PassThrough, Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport sharp from 'sharp'\nimport { errHasMsg } from '@atproto/common'\nimport { ImageInfo, Options, formatsToMimes } from './util'\n\nexport type { Options }\n\n/**\n * Scale up to hit any specified minimum size\n */\nexport function createImageUpscaler({ min = false }: Options) {\n // Due to the way sharp works, up-scaling must happen in a separate processor\n // than down-scaling.\n return typeof min !== 'boolean'\n ? sharp().resize({\n fit: 'outside',\n width: min.width,\n height: min.height,\n withoutReduction: true,\n withoutEnlargement: false,\n })\n : new PassThrough()\n}\n\n/**\n * Scale down (or possibly up if min is true) to desired size, then compress\n * to the desired format.\n */\nexport function createImageProcessor({\n height,\n width,\n min = false,\n fit = 'cover',\n format,\n quality = 100,\n}: Options) {\n const processor = sharp().resize({\n fit,\n width,\n height,\n withoutEnlargement: min !== true,\n })\n\n if (format === 'jpeg') {\n return processor.jpeg({ quality })\n } else if (format === 'png') {\n return processor.png({ quality })\n } else {\n throw new Error(`Unhandled case: ${format}`)\n }\n}\n\nexport async function maybeGetInfo(\n stream: Readable,\n): Promise<ImageInfo | null> {\n try {\n const processor = sharp()\n\n const [{ size, height, width, format }] = await Promise.all([\n processor.metadata(),\n pipeline(stream, processor), // Handles error propagation\n ])\n\n if (size == null || height == null || width == null || format == null) {\n return null\n }\n\n return {\n height,\n width,\n size,\n mime: formatsToMimes.get(format) ?? 'unknown',\n }\n } catch (err) {\n if (errHasMsg(err, 'Input buffer contains unsupported image format')) {\n return null\n }\n throw err\n }\n}\n\nexport async function getInfo(stream: Readable): Promise<ImageInfo> {\n const maybeInfo = await maybeGetInfo(stream)\n if (!maybeInfo) {\n throw new Error('could not obtain all image metadata')\n }\n return maybeInfo\n}\n"]}
1
+ {"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../src/image/sharp.ts"],"names":[],"mappings":";;;;;AAWA,kDAYC;AAMD,oDAsBC;AAED,oCA2BC;AAED,0BAMC;AAxFD,6CAAmD;AACnD,mDAA+C;AAC/C,kDAAyB;AACzB,4CAA2C;AAC3C,iCAA2D;AAI3D;;GAEG;AACH,SAAgB,mBAAmB,CAAC,EAAE,GAAG,GAAG,KAAK,EAAW;IAC1D,6EAA6E;IAC7E,qBAAqB;IACrB,OAAO,OAAO,GAAG,KAAK,SAAS;QAC7B,CAAC,CAAC,IAAA,eAAK,GAAE,CAAC,MAAM,CAAC;YACb,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,KAAK;SAC1B,CAAC;QACJ,CAAC,CAAC,IAAI,yBAAW,EAAE,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,KAAK,EACL,GAAG,GAAG,KAAK,EACX,GAAG,GAAG,OAAO,EACb,MAAM,EACN,OAAO,GAAG,GAAG,GACL;IACR,MAAM,SAAS,GAAG,IAAA,eAAK,GAAE,CAAC,MAAM,CAAC;QAC/B,GAAG;QACH,KAAK;QACL,MAAM;QACN,kBAAkB,EAAE,GAAG,KAAK,IAAI;KACjC,CAAC,CAAA;IAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,eAAK,GAAE,CAAA;QAEzB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,SAAS,CAAC,QAAQ,EAAE;YACpB,IAAA,mBAAQ,EAAC,MAAM,EAAE,SAAS,CAAC,EAAE,4BAA4B;SAC1D,CAAC,CAAA;QAEF,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACtE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,MAAM;YACN,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,qBAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;SAC9C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,IAAA,kBAAS,EAAC,GAAG,EAAE,gDAAgD,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,MAAgB;IAC5C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import { PassThrough, Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport sharp from 'sharp'\nimport { errHasMsg } from '@atproto/common'\nimport { ImageInfo, Options, formatsToMimes } from './util'\n\nexport type { Options }\n\n/**\n * Scale up to hit any specified minimum size\n */\nexport function createImageUpscaler({ min = false }: Options) {\n // Due to the way sharp works, up-scaling must happen in a separate processor\n // than down-scaling.\n return typeof min !== 'boolean'\n ? sharp().resize({\n fit: 'outside',\n width: min.width,\n height: min.height,\n withoutReduction: true,\n withoutEnlargement: false,\n })\n : new PassThrough()\n}\n\n/**\n * Scale down (or possibly up if min is true) to desired size, then compress\n * to the desired format.\n */\nexport function createImageProcessor({\n height,\n width,\n min = false,\n fit = 'cover',\n format,\n quality = 100,\n}: Options) {\n const processor = sharp().resize({\n fit,\n width,\n height,\n withoutEnlargement: min !== true,\n })\n\n if (format === 'jpeg') {\n return processor.jpeg({ quality })\n } else if (format === 'webp') {\n return processor.webp({ quality })\n } else {\n throw new Error(`Unhandled case: ${format}`)\n }\n}\n\nexport async function maybeGetInfo(\n stream: Readable,\n): Promise<ImageInfo | null> {\n try {\n const processor = sharp()\n\n const [{ size, height, width, format }] = await Promise.all([\n processor.metadata(),\n pipeline(stream, processor), // Handles error propagation\n ])\n\n if (size == null || height == null || width == null || format == null) {\n return null\n }\n\n return {\n height,\n width,\n size,\n mime: formatsToMimes.get(format) ?? 'unknown',\n }\n } catch (err) {\n if (errHasMsg(err, 'Input buffer contains unsupported image format')) {\n return null\n }\n throw err\n }\n}\n\nexport async function getInfo(stream: Readable): Promise<ImageInfo> {\n const maybeInfo = await maybeGetInfo(stream)\n if (!maybeInfo) {\n throw new Error('could not obtain all image metadata')\n }\n return maybeInfo\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAGhC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,gBAAgB,GAChB,eAAe,CAAA;AAInB,qBAAa,eAAe;IACP,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;IAEnC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAK5B;IAED,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAe/D,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,YAAY;IAK3D,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,YAAY,GAAG;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE;CAsBpD;AAED,KAAK,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CA6BhD,CAAA"}
1
+ {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAGhC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,gBAAgB,GAChB,eAAe,CAAA;AAInB,qBAAa,eAAe;IACP,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;IAEnC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAK5B;IAED,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAS/D,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,YAAY;IAI3D,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,YAAY,GAAG;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE;CA0BpD;AAED,KAAK,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAI1C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CA6BhD,CAAA"}
package/dist/image/uri.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.presets = exports.BadPathError = exports.ImageUriBuilder = void 0;
4
- const PATH_REGEX = /^\/(.+?)\/plain\/(.+?)\/(.+?)@(.+?)$/;
4
+ const PATH_REGEX = /^\/(.+?)\/plain\/(.+?)\/(.+?)(?:@(.+?))?$/;
5
5
  class ImageUriBuilder {
6
6
  constructor(endpoint) {
7
7
  Object.defineProperty(this, "endpoint", {
@@ -16,16 +16,10 @@ class ImageUriBuilder {
16
16
  if (!options) {
17
17
  throw new Error(`Unrecognized requested common uri type: ${id}`);
18
18
  }
19
- return (this.endpoint +
20
- ImageUriBuilder.getPath({
21
- preset: id,
22
- did,
23
- cid,
24
- }));
19
+ return this.endpoint + ImageUriBuilder.getPath({ preset: id, did, cid });
25
20
  }
26
21
  static getPath(opts) {
27
- const { format } = exports.presets[opts.preset];
28
- return `/${opts.preset}/plain/${opts.did}/${opts.cid}@${format}`;
22
+ return `/${opts.preset}/plain/${opts.did}/${opts.cid}`;
29
23
  }
30
24
  static getOptions(path) {
31
25
  const match = path.match(PATH_REGEX);
@@ -36,17 +30,19 @@ class ImageUriBuilder {
36
30
  if (!ImageUriBuilder.presets.includes(presetUnsafe)) {
37
31
  throw new BadPathError('Invalid path: bad preset');
38
32
  }
39
- if (formatUnsafe !== 'jpeg' && formatUnsafe !== 'png') {
33
+ if (formatUnsafe !== undefined &&
34
+ formatUnsafe !== 'jpeg' &&
35
+ formatUnsafe !== 'webp') {
40
36
  throw new BadPathError('Invalid path: bad format');
41
37
  }
42
38
  const preset = presetUnsafe;
43
39
  const format = formatUnsafe;
44
40
  return {
45
41
  ...exports.presets[preset],
42
+ format: format ?? exports.presets[preset].format,
46
43
  did,
47
44
  cid,
48
45
  preset,
49
- format,
50
46
  };
51
47
  }
52
48
  }
@@ -65,30 +61,32 @@ Object.defineProperty(ImageUriBuilder, "presets", {
65
61
  class BadPathError extends Error {
66
62
  }
67
63
  exports.BadPathError = BadPathError;
64
+ // @NOTE these prefix settings don't get used anywhere in this package,
65
+ // but they serve as soft documentation of the behavior in production.
68
66
  exports.presets = {
69
67
  avatar: {
70
- format: 'jpeg',
68
+ format: 'webp',
71
69
  fit: 'cover',
72
70
  height: 1000,
73
71
  width: 1000,
74
72
  min: true,
75
73
  },
76
74
  banner: {
77
- format: 'jpeg',
75
+ format: 'webp',
78
76
  fit: 'cover',
79
77
  height: 1000,
80
78
  width: 3000,
81
79
  min: true,
82
80
  },
83
81
  feed_thumbnail: {
84
- format: 'jpeg',
82
+ format: 'webp',
85
83
  fit: 'inside',
86
84
  height: 2000,
87
85
  width: 2000,
88
86
  min: true,
89
87
  },
90
88
  feed_fullsize: {
91
- format: 'jpeg',
89
+ format: 'webp',
92
90
  fit: 'inside',
93
91
  height: 1000,
94
92
  width: 1000,
@@ -1 +1 @@
1
- {"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":";;;AASA,MAAM,UAAU,GAAG,sCAAsC,CAAA;AAEzD,MAAa,eAAe;IAC1B,YAAmB,QAAgB;QAAvB;;;;mBAAO,QAAQ;WAAQ;IAAG,CAAC;IASvC,YAAY,CAAC,EAAe,EAAE,GAAW,EAAE,GAAW;QACpD,MAAM,OAAO,GAAG,eAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,CACL,IAAI,CAAC,QAAQ;YACb,eAAe,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,EAAE;gBACV,GAAG;gBACH,GAAG;aACJ,CAAC,CACH,CAAA;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAA4C;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,eAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,IAAI,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAA;IAClE,CAAC;IAED,MAAM,CAAC,UAAU,CACf,IAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,YAAY,CAAC,cAAc,CAAC,CAAA;QACxC,CAAC;QACD,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,KAAK,CAAA;QACtD,IAAI,CAAE,eAAe,CAAC,OAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,YAAY,CAAC,0BAA0B,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;YACtD,MAAM,IAAI,YAAY,CAAC,0BAA0B,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,YAA2B,CAAA;QAC1C,MAAM,MAAM,GAAG,YAAiC,CAAA;QAChD,OAAO;YACL,GAAG,eAAO,CAAC,MAAM,CAAC;YAClB,GAAG;YACH,GAAG;YACH,MAAM;YACN,MAAM;SACP,CAAA;IACH,CAAC;;AArDH,0CAsDC;AAnDQ;;;;WAAyB;QAC9B,QAAQ;QACR,QAAQ;QACR,gBAAgB;QAChB,eAAe;KAChB;EALa,CAKb;AAkDH,MAAa,YAAa,SAAQ,KAAK;CAAG;AAA1C,oCAA0C;AAE7B,QAAA,OAAO,GAAiC;IACnD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,cAAc,EAAE;QACd,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,aAAa,EAAE;QACb,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;CACF,CAAA","sourcesContent":["import { Options } from './util'\n\n// @NOTE if there are any additions here, ensure to include them on ImageUriBuilder.presets\nexport type ImagePreset =\n | 'avatar'\n | 'banner'\n | 'feed_thumbnail'\n | 'feed_fullsize'\n\nconst PATH_REGEX = /^\\/(.+?)\\/plain\\/(.+?)\\/(.+?)@(.+?)$/\n\nexport class ImageUriBuilder {\n constructor(public endpoint: string) {}\n\n static presets: ImagePreset[] = [\n 'avatar',\n 'banner',\n 'feed_thumbnail',\n 'feed_fullsize',\n ]\n\n getPresetUri(id: ImagePreset, did: string, cid: string): string {\n const options = presets[id]\n if (!options) {\n throw new Error(`Unrecognized requested common uri type: ${id}`)\n }\n return (\n this.endpoint +\n ImageUriBuilder.getPath({\n preset: id,\n did,\n cid,\n })\n )\n }\n\n static getPath(opts: { preset: ImagePreset } & BlobLocation) {\n const { format } = presets[opts.preset]\n return `/${opts.preset}/plain/${opts.did}/${opts.cid}@${format}`\n }\n\n static getOptions(\n path: string,\n ): Options & BlobLocation & { preset: ImagePreset } {\n const match = path.match(PATH_REGEX)\n if (!match) {\n throw new BadPathError('Invalid path')\n }\n const [, presetUnsafe, did, cid, formatUnsafe] = match\n if (!(ImageUriBuilder.presets as string[]).includes(presetUnsafe)) {\n throw new BadPathError('Invalid path: bad preset')\n }\n if (formatUnsafe !== 'jpeg' && formatUnsafe !== 'png') {\n throw new BadPathError('Invalid path: bad format')\n }\n const preset = presetUnsafe as ImagePreset\n const format = formatUnsafe as Options['format']\n return {\n ...presets[preset],\n did,\n cid,\n preset,\n format,\n }\n }\n}\n\ntype BlobLocation = { cid: string; did: string }\n\nexport class BadPathError extends Error {}\n\nexport const presets: Record<ImagePreset, Options> = {\n avatar: {\n format: 'jpeg',\n fit: 'cover',\n height: 1000,\n width: 1000,\n min: true,\n },\n banner: {\n format: 'jpeg',\n fit: 'cover',\n height: 1000,\n width: 3000,\n min: true,\n },\n feed_thumbnail: {\n format: 'jpeg',\n fit: 'inside',\n height: 2000,\n width: 2000,\n min: true,\n },\n feed_fullsize: {\n format: 'jpeg',\n fit: 'inside',\n height: 1000,\n width: 1000,\n min: true,\n },\n}\n"]}
1
+ {"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":";;;AASA,MAAM,UAAU,GAAG,2CAA2C,CAAA;AAE9D,MAAa,eAAe;IAC1B,YAAmB,QAAgB;QAAvB;;;;mBAAO,QAAQ;WAAQ;IAAG,CAAC;IASvC,YAAY,CAAC,EAAe,EAAE,GAAW,EAAE,GAAW;QACpD,MAAM,OAAO,GAAG,eAAO,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAA4C;QACzD,OAAO,IAAI,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACxD,CAAC;IAED,MAAM,CAAC,UAAU,CACf,IAAY;QAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,YAAY,CAAC,cAAc,CAAC,CAAA;QACxC,CAAC;QACD,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,KAAK,CAAA;QACtD,IAAI,CAAE,eAAe,CAAC,OAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,YAAY,CAAC,0BAA0B,CAAC,CAAA;QACpD,CAAC;QACD,IACE,YAAY,KAAK,SAAS;YAC1B,YAAY,KAAK,MAAM;YACvB,YAAY,KAAK,MAAM,EACvB,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,0BAA0B,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,YAA2B,CAAA;QAC1C,MAAM,MAAM,GAAG,YAAiC,CAAA;QAChD,OAAO;YACL,GAAG,eAAO,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,IAAI,eAAO,CAAC,MAAM,CAAC,CAAC,MAAM;YACxC,GAAG;YACH,GAAG;YACH,MAAM;SACP,CAAA;IACH,CAAC;;AAlDH,0CAmDC;AAhDQ;;;;WAAyB;QAC9B,QAAQ;QACR,QAAQ;QACR,gBAAgB;QAChB,eAAe;KAChB;EALa,CAKb;AA+CH,MAAa,YAAa,SAAQ,KAAK;CAAG;AAA1C,oCAA0C;AAE1C,uEAAuE;AACvE,sEAAsE;AACzD,QAAA,OAAO,GAAiC;IACnD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,cAAc,EAAE;QACd,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;IACD,aAAa,EAAE;QACb,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;KACV;CACF,CAAA","sourcesContent":["import { Options } from './util'\n\n// @NOTE if there are any additions here, ensure to include them on ImageUriBuilder.presets\nexport type ImagePreset =\n | 'avatar'\n | 'banner'\n | 'feed_thumbnail'\n | 'feed_fullsize'\n\nconst PATH_REGEX = /^\\/(.+?)\\/plain\\/(.+?)\\/(.+?)(?:@(.+?))?$/\n\nexport class ImageUriBuilder {\n constructor(public endpoint: string) {}\n\n static presets: ImagePreset[] = [\n 'avatar',\n 'banner',\n 'feed_thumbnail',\n 'feed_fullsize',\n ]\n\n getPresetUri(id: ImagePreset, did: string, cid: string): string {\n const options = presets[id]\n if (!options) {\n throw new Error(`Unrecognized requested common uri type: ${id}`)\n }\n\n return this.endpoint + ImageUriBuilder.getPath({ preset: id, did, cid })\n }\n\n static getPath(opts: { preset: ImagePreset } & BlobLocation) {\n return `/${opts.preset}/plain/${opts.did}/${opts.cid}`\n }\n\n static getOptions(\n path: string,\n ): Options & BlobLocation & { preset: ImagePreset } {\n const match = path.match(PATH_REGEX)\n if (!match) {\n throw new BadPathError('Invalid path')\n }\n const [, presetUnsafe, did, cid, formatUnsafe] = match\n if (!(ImageUriBuilder.presets as string[]).includes(presetUnsafe)) {\n throw new BadPathError('Invalid path: bad preset')\n }\n if (\n formatUnsafe !== undefined &&\n formatUnsafe !== 'jpeg' &&\n formatUnsafe !== 'webp'\n ) {\n throw new BadPathError('Invalid path: bad format')\n }\n const preset = presetUnsafe as ImagePreset\n const format = formatUnsafe as Options['format']\n return {\n ...presets[preset],\n format: format ?? presets[preset].format,\n did,\n cid,\n preset,\n }\n }\n}\n\ntype BlobLocation = { cid: string; did: string }\n\nexport class BadPathError extends Error {}\n\n// @NOTE these prefix settings don't get used anywhere in this package,\n// but they serve as soft documentation of the behavior in production.\nexport const presets: Record<ImagePreset, Options> = {\n avatar: {\n format: 'webp',\n fit: 'cover',\n height: 1000,\n width: 1000,\n min: true,\n },\n banner: {\n format: 'webp',\n fit: 'cover',\n height: 1000,\n width: 3000,\n min: true,\n },\n feed_thumbnail: {\n format: 'webp',\n fit: 'inside',\n height: 2000,\n width: 2000,\n min: true,\n },\n feed_fullsize: {\n format: 'webp',\n fit: 'inside',\n height: 1000,\n width: 1000,\n min: true,\n },\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { FormatEnum, OutputInfo } from 'sharp';
2
2
  export type ImageMime = `image/${string}`;
3
3
  export type Options = Dimensions & {
4
- format: 'jpeg' | 'png';
4
+ format: 'jpeg' | 'webp';
5
5
  fit?: 'cover' | 'inside';
6
6
  min?: Dimensions | boolean;
7
7
  quality?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/image/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,MAAM,EAAE,CAAA;AAEzC,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG;IACjC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAA;IAGtB,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAIxB,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,eAAO,MAAM,cAAc,0CAazB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,UAAU,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/image/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,MAAM,EAAE,CAAA;AAEzC,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG;IACjC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IAGvB,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAIxB,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,SAAS,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,eAAO,MAAM,cAAc,0CAczB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,UAAU,CAAA;CAAE,CAAA"}
@@ -14,5 +14,6 @@ exports.formatsToMimes = new Map([
14
14
  ['heif', 'image/heif'],
15
15
  ['jp2', 'image/jp2'],
16
16
  ['jxl', 'image/jxl'],
17
+ ['webp', 'image/webp'],
17
18
  ]);
18
19
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/image/util.ts"],"names":[],"mappings":";;;AAwBa,QAAA,cAAc,GAAG,IAAI,GAAG,CAA8B;IACjE,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,eAAe,CAAC;IACxB,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;CACrB,CAAC,CAAA","sourcesContent":["import { FormatEnum, OutputInfo } from 'sharp'\n\nexport type ImageMime = `image/${string}`\n\nexport type Options = Dimensions & {\n format: 'jpeg' | 'png'\n // When 'cover' (default), scale to fill given dimensions, cropping if necessary.\n // When 'inside', scale to fit within given dimensions.\n fit?: 'cover' | 'inside'\n // When false (default), do not scale up.\n // When true, scale up to hit dimensions given in options.\n // Otherwise, scale up to hit specified min dimensions.\n min?: Dimensions | boolean\n // A number 1-100\n quality?: number\n}\n\nexport type ImageInfo = Dimensions & {\n size: number\n mime: ImageMime | 'unknown'\n}\n\nexport type Dimensions = { height: number; width: number }\n\nexport const formatsToMimes = new Map<keyof FormatEnum, ImageMime>([\n ['jpg', 'image/jpeg'],\n ['jpeg', 'image/jpeg'],\n ['png', 'image/png'],\n ['gif', 'image/gif'],\n ['svg', 'image/svg+xml'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['webp', 'image/webp'],\n ['avif', 'image/avif'],\n ['heif', 'image/heif'],\n ['jp2', 'image/jp2'],\n ['jxl', 'image/jxl'],\n])\n\nexport type SharpInfo = OutputInfo & { format: keyof FormatEnum }\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/image/util.ts"],"names":[],"mappings":";;;AAwBa,QAAA,cAAc,GAAG,IAAI,GAAG,CAA8B;IACjE,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,eAAe,CAAC;IACxB,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,MAAM,EAAE,YAAY,CAAC;IACtB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,MAAM,EAAE,YAAY,CAAC;CACvB,CAAC,CAAA","sourcesContent":["import { FormatEnum, OutputInfo } from 'sharp'\n\nexport type ImageMime = `image/${string}`\n\nexport type Options = Dimensions & {\n format: 'jpeg' | 'webp'\n // When 'cover' (default), scale to fill given dimensions, cropping if necessary.\n // When 'inside', scale to fit within given dimensions.\n fit?: 'cover' | 'inside'\n // When false (default), do not scale up.\n // When true, scale up to hit dimensions given in options.\n // Otherwise, scale up to hit specified min dimensions.\n min?: Dimensions | boolean\n // A number 1-100\n quality?: number\n}\n\nexport type ImageInfo = Dimensions & {\n size: number\n mime: ImageMime | 'unknown'\n}\n\nexport type Dimensions = { height: number; width: number }\n\nexport const formatsToMimes = new Map<keyof FormatEnum, ImageMime>([\n ['jpg', 'image/jpeg'],\n ['jpeg', 'image/jpeg'],\n ['png', 'image/png'],\n ['gif', 'image/gif'],\n ['svg', 'image/svg+xml'],\n ['tif', 'image/tiff'],\n ['tiff', 'image/tiff'],\n ['webp', 'image/webp'],\n ['avif', 'image/avif'],\n ['heif', 'image/heif'],\n ['jp2', 'image/jp2'],\n ['jxl', 'image/jxl'],\n ['webp', 'image/webp'],\n])\n\nexport type SharpInfo = OutputInfo & { format: keyof FormatEnum }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAI7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAoBtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,qBAAa,WAAW;IACf,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;gBAEvB,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE;IAK/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,YAAY,CAAA;QACpB,UAAU,EAAE,OAAO,CAAA;KACpB,GAAG,WAAW;IAqLT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAe7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAI7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAMzC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAoBtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,qBAAa,WAAW;IACf,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;gBAEvB,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE;IAK/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,MAAM,EAAE,YAAY,CAAA;QACpB,UAAU,EAAE,OAAO,CAAA;KACpB,GAAG,WAAW;IAyLT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAe7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED,eAAe,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -148,13 +148,18 @@ class BskyAppView {
148
148
  const dataplaneHostList = etcd && config.dataplaneUrlsEtcdKeyPrefix
149
149
  ? new client_1.EtcdHostList(etcd, config.dataplaneUrlsEtcdKeyPrefix, config.dataplaneUrls)
150
150
  : new client_1.BasicHostList(config.dataplaneUrls);
151
+ const featureGatesClient = new feature_gates_1.FeatureGatesClient({
152
+ growthBookApiHost: config.growthBookApiHost,
153
+ growthBookClientKey: config.growthBookClientKey,
154
+ eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,
155
+ });
151
156
  const dataplane = (0, client_1.createDataPlaneClient)(dataplaneHostList, {
152
157
  httpVersion: config.dataplaneHttpVersion,
153
158
  rejectUnauthorized: !config.dataplaneIgnoreBadTls,
154
159
  });
155
160
  const hydrator = new hydrator_1.Hydrator(dataplane, config.labelsFromIssuerDids, {
156
161
  debugFieldAllowedDids: config.debugFieldAllowedDids,
157
- });
162
+ }, featureGatesClient);
158
163
  const views = new views_1.Views({
159
164
  imgUriBuilder: imgUriBuilder,
160
165
  videoUriBuilder: videoUriBuilder,
@@ -202,11 +207,6 @@ class BskyAppView {
202
207
  adminPasses: config.adminPasswords,
203
208
  entrywayJwtPublicKey,
204
209
  });
205
- const featureGatesClient = new feature_gates_1.FeatureGatesClient({
206
- growthBookApiHost: config.growthBookApiHost,
207
- growthBookClientKey: config.growthBookClientKey,
208
- eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,
209
- });
210
210
  const blobDispatcher = (0, blob_dispatcher_1.createBlobDispatcher)(config);
211
211
  const ctx = new context_1.AppContext({
212
212
  cfg: config,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\nimport { HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { AtpAgent } from '@atproto/api'\nimport { DAY, SECOND } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport API, { blobResolver, external, health, sitemap, wellKnown } from './api'\nimport { createBlobDispatcher } from './api/blob-dispatcher'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync'\nimport { ServerConfig } from './config'\nimport { AppContext } from './context'\nimport { authWithApiKey as courierAuth, createCourierClient } from './courier'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client'\nimport * as error from './error'\nimport { FeatureGatesClient } from './feature-gates'\nimport { Hydrator } from './hydration/hydrator'\nimport * as imageServer from './image/server'\nimport { ImageUriBuilder } from './image/uri'\nimport { createKwsClient } from './kws'\nimport { createServer } from './lexicon'\nimport { loggerMiddleware } from './logger'\nimport { authWithApiKey as rolodexAuth, createRolodexClient } from './rolodex'\nimport { createStashClient } from './stash'\nimport { Views } from './views'\nimport { VideoUriBuilder } from './views/util'\n\nexport { ServerConfig } from './config'\nexport type { ServerConfigValues } from './config'\nexport { AppContext } from './context'\nexport * from './data-plane'\nexport { BackgroundQueue } from './data-plane/server/background'\nexport { Database } from './data-plane/server/db'\nexport { Redis } from './redis'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n\n const imgUriBuilder = new ImageUriBuilder(\n config.cdnUrl || `${config.publicUrl}/img`,\n )\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchAgent = config.searchUrl\n ? new AtpAgent({ service: config.searchUrl })\n : undefined\n\n const suggestionsAgent = config.suggestionsUrl\n ? new AtpAgent({ service: config.suggestionsUrl })\n : undefined\n if (suggestionsAgent && config.suggestionsApiKey) {\n suggestionsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.suggestionsApiKey}`,\n )\n }\n\n const topicsAgent = config.topicsUrl\n ? new AtpAgent({ service: config.topicsUrl })\n : undefined\n if (topicsAgent && config.topicsApiKey) {\n topicsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.topicsApiKey}`,\n )\n }\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(dataplane, config.labelsFromIssuerDids, {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n })\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const rolodexClient = config.rolodexUrl\n ? createRolodexClient({\n baseUrl: config.rolodexUrl,\n httpVersion: config.rolodexHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },\n interceptors: config.rolodexApiKey\n ? [rolodexAuth(config.rolodexApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const featureGatesClient = new FeatureGatesClient({\n growthBookApiHost: config.growthBookApiHost,\n growthBookClientKey: config.growthBookClientKey,\n eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchAgent,\n suggestionsAgent,\n topicsAgent,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n rolodexClient,\n authVerifier,\n featureGatesClient,\n blobDispatcher,\n kwsClient,\n })\n\n let server = createServer({\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n\n if (config.dataplaneUrls.length > 0 || config.dataplaneUrlsEtcdKeyPrefix) {\n app.use(sitemap.createRouter(ctx))\n }\n\n app.use(server.xrpc.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n this.ctx.featureGatesClient.start() // lazy, no await\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n this.ctx.featureGatesClient.destroy()\n await this.terminator?.terminate()\n await this.ctx.etcd?.close()\n }\n}\n\nexport default BskyAppView\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport { Etcd3 } from 'etcd3'\nimport express from 'express'\nimport { HttpTerminator, createHttpTerminator } from 'http-terminator'\nimport { AtpAgent } from '@atproto/api'\nimport { DAY, SECOND } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport API, { blobResolver, external, health, sitemap, wellKnown } from './api'\nimport { createBlobDispatcher } from './api/blob-dispatcher'\nimport { AuthVerifier, createPublicKeyObject } from './auth-verifier'\nimport { authWithApiKey as bsyncAuth, createBsyncClient } from './bsync'\nimport { ServerConfig } from './config'\nimport { AppContext } from './context'\nimport { authWithApiKey as courierAuth, createCourierClient } from './courier'\nimport {\n BasicHostList,\n EtcdHostList,\n createDataPlaneClient,\n} from './data-plane/client'\nimport * as error from './error'\nimport { FeatureGatesClient } from './feature-gates'\nimport { Hydrator } from './hydration/hydrator'\nimport * as imageServer from './image/server'\nimport { ImageUriBuilder } from './image/uri'\nimport { createKwsClient } from './kws'\nimport { createServer } from './lexicon'\nimport { loggerMiddleware } from './logger'\nimport { authWithApiKey as rolodexAuth, createRolodexClient } from './rolodex'\nimport { createStashClient } from './stash'\nimport { Views } from './views'\nimport { VideoUriBuilder } from './views/util'\n\nexport { ServerConfig } from './config'\nexport type { ServerConfigValues } from './config'\nexport { AppContext } from './context'\nexport * from './data-plane'\nexport { BackgroundQueue } from './data-plane/server/background'\nexport { Database } from './data-plane/server/db'\nexport { Redis } from './redis'\n\nexport class BskyAppView {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: HttpTerminator\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static create(opts: {\n config: ServerConfig\n signingKey: Keypair\n }): BskyAppView {\n const { config, signingKey } = opts\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n // used solely for handle resolution: identity lookups occur on dataplane\n const idResolver = new IdResolver({\n plcUrl: config.didPlcUrl,\n backupNameservers: config.handleResolveNameservers,\n })\n const imgUriBuilder = new ImageUriBuilder(\n config.cdnUrl || `${config.publicUrl}/img`,\n )\n const videoUriBuilder = new VideoUriBuilder({\n playlistUrlPattern:\n config.videoPlaylistUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/playlist.m3u8`,\n thumbnailUrlPattern:\n config.videoThumbnailUrlPattern ||\n `${config.publicUrl}/vid/%s/%s/thumbnail.jpg`,\n })\n\n const searchAgent = config.searchUrl\n ? new AtpAgent({ service: config.searchUrl })\n : undefined\n\n const suggestionsAgent = config.suggestionsUrl\n ? new AtpAgent({ service: config.suggestionsUrl })\n : undefined\n if (suggestionsAgent && config.suggestionsApiKey) {\n suggestionsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.suggestionsApiKey}`,\n )\n }\n\n const topicsAgent = config.topicsUrl\n ? new AtpAgent({ service: config.topicsUrl })\n : undefined\n if (topicsAgent && config.topicsApiKey) {\n topicsAgent.api.setHeader(\n 'authorization',\n `Bearer ${config.topicsApiKey}`,\n )\n }\n\n const etcd = config.etcdHosts.length\n ? new Etcd3({ hosts: config.etcdHosts })\n : undefined\n\n const dataplaneHostList =\n etcd && config.dataplaneUrlsEtcdKeyPrefix\n ? new EtcdHostList(\n etcd,\n config.dataplaneUrlsEtcdKeyPrefix,\n config.dataplaneUrls,\n )\n : new BasicHostList(config.dataplaneUrls)\n\n const featureGatesClient = new FeatureGatesClient({\n growthBookApiHost: config.growthBookApiHost,\n growthBookClientKey: config.growthBookClientKey,\n eventProxyTrackingEndpoint: config.eventProxyTrackingEndpoint,\n })\n\n const dataplane = createDataPlaneClient(dataplaneHostList, {\n httpVersion: config.dataplaneHttpVersion,\n rejectUnauthorized: !config.dataplaneIgnoreBadTls,\n })\n const hydrator = new Hydrator(\n dataplane,\n config.labelsFromIssuerDids,\n {\n debugFieldAllowedDids: config.debugFieldAllowedDids,\n },\n featureGatesClient,\n )\n const views = new Views({\n imgUriBuilder: imgUriBuilder,\n videoUriBuilder: videoUriBuilder,\n indexedAtEpoch: config.indexedAtEpoch,\n threadTagsBumpDown: [...config.threadTagsBumpDown],\n threadTagsHide: [...config.threadTagsHide],\n visibilityTagHide: config.visibilityTagHide,\n visibilityTagRankPrefix: config.visibilityTagRankPrefix,\n })\n\n const bsyncClient = createBsyncClient({\n baseUrl: config.bsyncUrl,\n httpVersion: config.bsyncHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.bsyncIgnoreBadTls },\n interceptors: config.bsyncApiKey ? [bsyncAuth(config.bsyncApiKey)] : [],\n })\n\n const stashClient = createStashClient(bsyncClient)\n\n const courierClient = config.courierUrl\n ? createCourierClient({\n baseUrl: config.courierUrl,\n httpVersion: config.courierHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.courierIgnoreBadTls },\n interceptors: config.courierApiKey\n ? [courierAuth(config.courierApiKey)]\n : [],\n })\n : undefined\n\n const rolodexClient = config.rolodexUrl\n ? createRolodexClient({\n baseUrl: config.rolodexUrl,\n httpVersion: config.rolodexHttpVersion ?? '2',\n nodeOptions: { rejectUnauthorized: !config.rolodexIgnoreBadTls },\n interceptors: config.rolodexApiKey\n ? [rolodexAuth(config.rolodexApiKey)]\n : [],\n })\n : undefined\n\n const kwsClient = config.kws ? createKwsClient(config.kws) : undefined\n\n const entrywayJwtPublicKey = config.entrywayJwtPublicKeyHex\n ? createPublicKeyObject(config.entrywayJwtPublicKeyHex)\n : undefined\n const authVerifier = new AuthVerifier(dataplane, {\n ownDid: config.serverDid,\n alternateAudienceDids: config.alternateAudienceDids,\n modServiceDid: config.modServiceDid,\n adminPasses: config.adminPasswords,\n entrywayJwtPublicKey,\n })\n\n const blobDispatcher = createBlobDispatcher(config)\n\n const ctx = new AppContext({\n cfg: config,\n etcd,\n dataplane,\n dataplaneHostList,\n searchAgent,\n suggestionsAgent,\n topicsAgent,\n hydrator,\n views,\n signingKey,\n idResolver,\n bsyncClient,\n stashClient,\n courierClient,\n rolodexClient,\n authVerifier,\n featureGatesClient,\n blobDispatcher,\n kwsClient,\n })\n\n let server = createServer({\n validateResponse: config.debugMode,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(blobResolver.createMiddleware(ctx))\n app.use(imageServer.createMiddleware(ctx, { prefix: '/img/' }))\n\n if (config.dataplaneUrls.length > 0 || config.dataplaneUrlsEtcdKeyPrefix) {\n app.use(sitemap.createRouter(ctx))\n }\n\n app.use(server.xrpc.router)\n app.use(error.handler)\n app.use('/external', external.createRouter(ctx))\n\n return new BskyAppView({ ctx, app })\n }\n\n async start(): Promise<http.Server> {\n if (this.ctx.dataplaneHostList instanceof EtcdHostList) {\n await this.ctx.dataplaneHostList.connect()\n }\n this.ctx.featureGatesClient.start() // lazy, no await\n const server = this.app.listen(this.ctx.cfg.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.cfg.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n this.ctx.featureGatesClient.destroy()\n await this.terminator?.terminate()\n await this.ctx.etcd?.close()\n }\n}\n\nexport default BskyAppView\n"]}
@@ -9,6 +9,6 @@ export declare function postUriToThreadgateUri(postUri: string): import("@atprot
9
9
  * post URI, return URI unchanged. Postgate lookups will then fail.
10
10
  */
11
11
  export declare function postUriToPostgateUri(postUri: string): import("@atproto/syntax").AtUriString;
12
- export declare function uriToDid(uri: string): string;
12
+ export declare function uriToDid(uri: string): import("@atproto/syntax").AtIdentifierString;
13
13
  export declare function safePinnedPost(value: unknown): StrongRef | undefined;
14
14
  //# sourceMappingURL=uris.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uris.d.ts","sourceRoot":"","sources":["../../src/util/uris.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,IAAI,IAAI,SAAS,EAElB,MAAM,6CAA6C,CAAA;AAEpD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,yCAMrD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,yCAMnD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,yBAS5C"}
1
+ {"version":3,"file":"uris.d.ts","sourceRoot":"","sources":["../../src/util/uris.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,IAAI,IAAI,SAAS,EAElB,MAAM,6CAA6C,CAAA;AAEpD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,yCAMrD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,yCAMnD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,gDAEnC;AAGD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,yBAS5C"}
@@ -866,7 +866,7 @@ class Views {
866
866
  return;
867
867
  const item = this.maybePost(bookmark.subjectUri, state);
868
868
  return {
869
- createdAt: bookmark.indexedAt?.toDate().toISOString(),
869
+ createdAt: bookmark.indexedAt?.toISOString(),
870
870
  subject: {
871
871
  uri: bookmark.subjectUri,
872
872
  cid: bookmark.subjectCid,