@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.
- package/CHANGELOG.md +22 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/feature-gates/types.d.ts +1 -1
- package/dist/feature-gates/types.d.ts.map +1 -1
- package/dist/feature-gates/types.js.map +1 -1
- package/dist/feature-gates/utils.d.ts.map +1 -1
- package/dist/feature-gates/utils.js +4 -2
- package/dist/feature-gates/utils.js.map +1 -1
- package/dist/hydration/actor.d.ts +1 -1
- package/dist/hydration/actor.d.ts.map +1 -1
- package/dist/hydration/actor.js +4 -3
- package/dist/hydration/actor.js.map +1 -1
- package/dist/hydration/hydrator.d.ts +14 -2
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +23 -2
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/hydration/util.d.ts +2 -0
- package/dist/hydration/util.d.ts.map +1 -1
- package/dist/hydration/util.js +14 -3
- package/dist/hydration/util.js.map +1 -1
- package/dist/image/sharp.js +2 -2
- package/dist/image/sharp.js.map +1 -1
- package/dist/image/uri.d.ts.map +1 -1
- package/dist/image/uri.js +13 -15
- package/dist/image/uri.js.map +1 -1
- package/dist/image/util.d.ts +1 -1
- package/dist/image/util.d.ts.map +1 -1
- package/dist/image/util.js +1 -0
- package/dist/image/util.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/util/uris.d.ts +1 -1
- package/dist/util/uris.d.ts.map +1 -1
- package/dist/views/index.js +1 -1
- package/dist/views/index.js.map +1 -1
- package/package.json +9 -9
- package/src/config.ts +1 -0
- package/src/feature-gates/types.ts +2 -1
- package/src/feature-gates/utils.ts +4 -2
- package/src/hydration/actor.ts +7 -4
- package/src/hydration/hydrator.ts +29 -3
- package/src/hydration/util.ts +14 -2
- package/src/image/sharp.ts +2 -2
- package/src/image/uri.ts +16 -17
- package/src/image/util.ts +2 -1
- package/src/index.ts +14 -10
- package/src/views/index.ts +1 -1
- package/tests/__snapshots__/feed-generation.test.ts.snap +52 -52
- package/tests/_util.ts +6 -4
- package/tests/data-plane/__snapshots__/indexing.test.ts.snap +7 -7
- package/tests/hydration/util.test.ts +40 -0
- package/tests/image/server.test.ts +4 -4
- package/tests/image/sharp.test.ts +7 -7
- package/tests/image/uri.test.ts +24 -10
- package/tests/views/__snapshots__/author-feed.test.ts.snap +110 -110
- package/tests/views/__snapshots__/block-lists.test.ts.snap +14 -14
- package/tests/views/__snapshots__/blocks.test.ts.snap +6 -6
- package/tests/views/__snapshots__/bookmarks.test.ts.snap +10 -10
- package/tests/views/__snapshots__/follows.test.ts.snap +34 -34
- package/tests/views/__snapshots__/labeler-service.test.ts.snap +4 -4
- package/tests/views/__snapshots__/likes.test.ts.snap +1 -1
- package/tests/views/__snapshots__/list-feed.test.ts.snap +16 -16
- package/tests/views/__snapshots__/lists.test.ts.snap +8 -8
- package/tests/views/__snapshots__/mute-lists.test.ts.snap +19 -19
- package/tests/views/__snapshots__/mutes.test.ts.snap +10 -10
- package/tests/views/__snapshots__/notifications.test.ts.snap +36 -36
- package/tests/views/__snapshots__/posts.test.ts.snap +17 -17
- package/tests/views/__snapshots__/profile.test.ts.snap +15 -15
- package/tests/views/__snapshots__/quotes.test.ts.snap +6 -6
- package/tests/views/__snapshots__/reposts.test.ts.snap +1 -1
- package/tests/views/__snapshots__/starter-packs.test.ts.snap +16 -16
- package/tests/views/__snapshots__/thread.test.ts.snap +36 -36
- package/tests/views/__snapshots__/timeline.test.ts.snap +133 -133
- package/tests/views/profile.test.ts +35 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/hydration/util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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"]}
|
package/dist/image/sharp.js
CHANGED
|
@@ -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 === '
|
|
46
|
-
return processor.
|
|
45
|
+
else if (format === 'webp') {
|
|
46
|
+
return processor.webp({ quality });
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
49
49
|
throw new Error(`Unhandled case: ${format}`);
|
package/dist/image/sharp.js.map
CHANGED
|
@@ -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,
|
|
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"]}
|
package/dist/image/uri.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
-
|
|
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 !==
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
89
|
+
format: 'webp',
|
|
92
90
|
fit: 'inside',
|
|
93
91
|
height: 1000,
|
|
94
92
|
width: 1000,
|
package/dist/image/uri.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/image/uri.ts"],"names":[],"mappings":";;;AASA,MAAM,UAAU,GAAG,
|
|
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"]}
|
package/dist/image/util.d.ts
CHANGED
package/dist/image/util.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/image/util.js
CHANGED
package/dist/image/util.js.map
CHANGED
|
@@ -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;
|
|
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"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgC;AAGhC,8DAAqC;AACrC,gDAAuB;AACvB,iCAA6B;AAC7B,sDAA6B;AAC7B,qDAAsE;AACtE,sCAAuC;AACvC,4CAA6C;AAE7C,gDAA8C;AAC9C,6CAA+E;AAC/E,2DAA4D;AAC5D,mDAAqE;AACrE,mCAAwE;AAExE,uCAAsC;AACtC,uCAA8E;AAC9E,gDAI4B;AAC5B,+CAAgC;AAChC,mDAAoD;AACpD,mDAA+C;AAC/C,4DAA6C;AAC7C,qCAA6C;AAC7C,+BAAuC;AACvC,uCAAwC;AACxC,qCAA2C;AAC3C,uCAA8E;AAC9E,mCAA2C;AAC3C,mCAA+B;AAC/B,uCAA8C;AAE9C,mCAAuC;AAA9B,sGAAA,YAAY,OAAA;AAErB,qCAAsC;AAA7B,qGAAA,UAAU,OAAA;AACnB,+CAA4B;AAC5B,6DAAgE;AAAvD,6GAAA,eAAe,OAAA;AACxB,6CAAiD;AAAxC,8FAAA,QAAQ,OAAA;AACjB,iCAA+B;AAAtB,8FAAA,KAAK,OAAA;AAEd,MAAa,WAAW;IAMtB,YAAY,IAAmD;QALxD;;;;;WAAe;QACf;;;;;WAAwB;QACxB;;;;;WAAoB;QACnB;;;;;WAA2B;QAGjC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAGb;QACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;QACnC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;QACrB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAC5B,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,EAAC,EAAE,MAAM,EAAE,YAAG,GAAG,eAAM,EAAE,CAAC,CAAC,CAAA;QACvC,GAAG,CAAC,GAAG,CAAC,yBAAgB,CAAC,CAAA;QACzB,GAAG,CAAC,GAAG,CAAC,IAAA,qBAAW,GAAE,CAAC,CAAA;QAEtB,yEAAyE;QACzE,MAAM,UAAU,GAAG,IAAI,qBAAU,CAAC;YAChC,MAAM,EAAE,MAAM,CAAC,SAAS;YACxB,iBAAiB,EAAE,MAAM,CAAC,wBAAwB;SACnD,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,IAAI,qBAAe,CACvC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,MAAM,CAC3C,CAAA;QACD,MAAM,eAAe,GAAG,IAAI,sBAAe,CAAC;YAC1C,kBAAkB,EAChB,MAAM,CAAC,uBAAuB;gBAC9B,GAAG,MAAM,CAAC,SAAS,0BAA0B;YAC/C,mBAAmB,EACjB,MAAM,CAAC,wBAAwB;gBAC/B,GAAG,MAAM,CAAC,SAAS,0BAA0B;SAChD,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS;YAClC,CAAC,CAAC,IAAI,cAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc;YAC5C,CAAC,CAAC,IAAI,cAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;YAClD,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,gBAAgB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACjD,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAC5B,eAAe,EACf,UAAU,MAAM,CAAC,iBAAiB,EAAE,CACrC,CAAA;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS;YAClC,CAAC,CAAC,IAAI,cAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACvC,WAAW,CAAC,GAAG,CAAC,SAAS,CACvB,eAAe,EACf,UAAU,MAAM,CAAC,YAAY,EAAE,CAChC,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM;YAClC,CAAC,CAAC,IAAI,aAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,iBAAiB,GACrB,IAAI,IAAI,MAAM,CAAC,0BAA0B;YACvC,CAAC,CAAC,IAAI,qBAAY,CACd,IAAI,EACJ,MAAM,CAAC,0BAA0B,EACjC,MAAM,CAAC,aAAa,CACrB;YACH,CAAC,CAAC,IAAI,sBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAE7C,MAAM,SAAS,GAAG,IAAA,8BAAqB,EAAC,iBAAiB,EAAE;YACzD,WAAW,EAAE,MAAM,CAAC,oBAAoB;YACxC,kBAAkB,EAAE,CAAC,MAAM,CAAC,qBAAqB;SAClD,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,oBAAoB,EAAE;YACpE,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,IAAI,aAAK,CAAC;YACtB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,eAAe;YAChC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,kBAAkB,EAAE,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC;YAClD,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;YAC1C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;SACxD,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,IAAA,yBAAiB,EAAC;YACpC,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,WAAW,EAAE,MAAM,CAAC,gBAAgB,IAAI,GAAG;YAC3C,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE;YAC9D,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAA,sBAAS,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,IAAA,yBAAiB,EAAC,WAAW,CAAC,CAAA;QAElD,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU;YACrC,CAAC,CAAC,IAAA,6BAAmB,EAAC;gBAClB,OAAO,EAAE,MAAM,CAAC,UAAU;gBAC1B,WAAW,EAAE,MAAM,CAAC,kBAAkB,IAAI,GAAG;gBAC7C,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE;gBAChE,YAAY,EAAE,MAAM,CAAC,aAAa;oBAChC,CAAC,CAAC,CAAC,IAAA,wBAAW,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBACrC,CAAC,CAAC,EAAE;aACP,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU;YACrC,CAAC,CAAC,IAAA,6BAAmB,EAAC;gBAClB,OAAO,EAAE,MAAM,CAAC,UAAU;gBAC1B,WAAW,EAAE,MAAM,CAAC,kBAAkB,IAAI,GAAG;gBAC7C,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE;gBAChE,YAAY,EAAE,MAAM,CAAC,aAAa;oBAChC,CAAC,CAAC,CAAC,IAAA,wBAAW,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBACrC,CAAC,CAAC,EAAE;aACP,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,qBAAe,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAEtE,MAAM,oBAAoB,GAAG,MAAM,CAAC,uBAAuB;YACzD,CAAC,CAAC,IAAA,qCAAqB,EAAC,MAAM,CAAC,uBAAuB,CAAC;YACvD,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,YAAY,GAAG,IAAI,4BAAY,CAAC,SAAS,EAAE;YAC/C,MAAM,EAAE,MAAM,CAAC,SAAS;YACxB,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,WAAW,EAAE,MAAM,CAAC,cAAc;YAClC,oBAAoB;SACrB,CAAC,CAAA;QAEF,MAAM,kBAAkB,GAAG,IAAI,kCAAkB,CAAC;YAChD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,0BAA0B,EAAE,MAAM,CAAC,0BAA0B;SAC9D,CAAC,CAAA;QAEF,MAAM,cAAc,GAAG,IAAA,sCAAoB,EAAC,MAAM,CAAC,CAAA;QAEnD,MAAM,GAAG,GAAG,IAAI,oBAAU,CAAC;YACzB,GAAG,EAAE,MAAM;YACX,IAAI;YACJ,SAAS;YACT,iBAAiB;YACjB,WAAW;YACX,gBAAgB;YAChB,WAAW;YACX,QAAQ;YACR,KAAK;YACL,UAAU;YACV,UAAU;YACV,WAAW;YACX,WAAW;YACX,aAAa;YACb,aAAa;YACb,YAAY;YACZ,kBAAkB;YAClB,cAAc;YACd,SAAS;SACV,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,IAAA,sBAAY,EAAC;YACxB,gBAAgB,EAAE,MAAM,CAAC,SAAS;YAClC,OAAO,EAAE;gBACP,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ;gBAC/B,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,QAAQ;gBAC/B,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM;aACnC;SACF,CAAC,CAAA;QAEF,MAAM,GAAG,IAAA,aAAG,EAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAEzB,GAAG,CAAC,GAAG,CAAC,YAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QACjC,GAAG,CAAC,GAAG,CAAC,eAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,GAAG,CAAC,GAAG,CAAC,kBAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3C,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAE/D,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,0BAA0B,EAAE,CAAC;YACzE,GAAG,CAAC,GAAG,CAAC,aAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,cAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QAEhD,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,YAAY,qBAAY,EAAE,CAAC;YACvD,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAA;QAC5C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA,CAAC,iBAAiB;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAA;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAA,sCAAoB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAClD,MAAM,qBAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC7B,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAA;QACrC,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAA;QAClC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;IAC9B,CAAC;CACF;AAvND,kCAuNC;AAED,kBAAe,WAAW,CAAA","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"]}
|
package/dist/util/uris.d.ts
CHANGED
|
@@ -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):
|
|
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
|
package/dist/util/uris.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/views/index.js
CHANGED
|
@@ -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?.
|
|
869
|
+
createdAt: bookmark.indexedAt?.toISOString(),
|
|
870
870
|
subject: {
|
|
871
871
|
uri: bookmark.subjectUri,
|
|
872
872
|
cid: bookmark.subjectCid,
|