@ewanc26/atproto 0.2.10 → 0.2.12
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/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +17 -3
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/jetstream.d.ts +100 -0
- package/dist/jetstream.d.ts.map +1 -0
- package/dist/jetstream.js +270 -0
- package/dist/musicbrainz.d.ts +1 -0
- package/dist/musicbrainz.d.ts.map +1 -1
- package/dist/musicbrainz.js +23 -3
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/agents.ts +30 -4
- package/src/documents.ts +1 -0
- package/src/index.ts +8 -1
- package/src/musicbrainz.ts +29 -3
- package/src/types.ts +44 -0
package/dist/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuBnD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,QAAQ,CAqB7E;AAED,eAAO,MAAM,kBAAkB,UAAsD,CAAC;AACtF,eAAO,MAAM,YAAY,UAA6C,CAAC;AAKvE,wBAAsB,eAAe,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwB3F;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAKxF;AAED,wBAAsB,YAAY,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,WAAW,UAAQ,EACnB,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
|
package/dist/agents.js
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { AtpAgent } from '@atproto/api';
|
|
2
2
|
import { cache } from './cache.js';
|
|
3
|
+
/** Default timeout for individual AT Protocol XRPC calls (ms). */
|
|
4
|
+
const XRPC_TIMEOUT = 8_000;
|
|
5
|
+
/** Default timeout for identity resolution (ms). */
|
|
6
|
+
const IDENTITY_TIMEOUT = 5_000;
|
|
7
|
+
/**
|
|
8
|
+
* Wraps a promise with a timeout. Rejects with a TimeoutError if the promise
|
|
9
|
+
* doesn't settle within `ms` milliseconds.
|
|
10
|
+
*/
|
|
11
|
+
function withTimeout(promise, ms) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const timer = setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms);
|
|
14
|
+
promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err); });
|
|
15
|
+
});
|
|
16
|
+
}
|
|
3
17
|
export function createAgent(service, fetchFn) {
|
|
4
18
|
const wrappedFetch = fetchFn
|
|
5
19
|
? async (url, init) => {
|
|
@@ -31,7 +45,7 @@ export async function resolveIdentity(did, fetchFn) {
|
|
|
31
45
|
if (cached)
|
|
32
46
|
return cached;
|
|
33
47
|
const _fetch = fetchFn ?? globalThis.fetch;
|
|
34
|
-
const response = await _fetch(`https://slingshot.microcosm.blue/xrpc/com.bad-example.identity.resolveMiniDoc?identifier=${encodeURIComponent(did)}`);
|
|
48
|
+
const response = await withTimeout(_fetch(`https://slingshot.microcosm.blue/xrpc/com.bad-example.identity.resolveMiniDoc?identifier=${encodeURIComponent(did)}`), IDENTITY_TIMEOUT);
|
|
35
49
|
if (!response.ok) {
|
|
36
50
|
throw new Error(`Failed to resolve identifier via Slingshot: ${response.status} ${response.statusText}`);
|
|
37
51
|
}
|
|
@@ -54,7 +68,7 @@ export async function getPublicAgent(did, fetchFn) {
|
|
|
54
68
|
return resolvedAgent;
|
|
55
69
|
try {
|
|
56
70
|
try {
|
|
57
|
-
const response = await constellationAgent.getProfile({ actor: did });
|
|
71
|
+
const response = await withTimeout(constellationAgent.getProfile({ actor: did }), XRPC_TIMEOUT);
|
|
58
72
|
if (response.success) {
|
|
59
73
|
resolvedAgent = constellationAgent;
|
|
60
74
|
return resolvedAgent;
|
|
@@ -88,7 +102,7 @@ export async function withFallback(did, operation, usePDSFirst = false, fetchFn)
|
|
|
88
102
|
for (const getAgent of agents) {
|
|
89
103
|
try {
|
|
90
104
|
const agent = await getAgent();
|
|
91
|
-
return await operation(agent);
|
|
105
|
+
return await withTimeout(operation(agent), XRPC_TIMEOUT);
|
|
92
106
|
}
|
|
93
107
|
catch (error) {
|
|
94
108
|
lastError = error;
|
package/dist/documents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EAIzB,QAAQ,EACR,MAAM,YAAY,CAAC;AAiEpB,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAwDvC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,yBAAyB,CAAC,CAuEpC;AAED,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EAIzB,QAAQ,EACR,MAAM,YAAY,CAAC;AAiEpB,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAwDvC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,yBAAyB,CAAC,CAuEpC;AAED,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CAkBhC"}
|
package/dist/documents.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { PopfeedReview, PopfeedCreativeWorkType, PopfeedMainCreditRole, ProfileData, StatusData, SiteInfoData, LinkData, LinkCard, BlueskyPost, BlogPost, BlogPostsData, PostAuthor, ExternalLink, Facet, Technology, License, BasedOnItem, RelatedService, Repository, Credit, SectionLicense, ResolvedIdentity, CacheEntry, MusicStatusData, MusicArtist, KibunStatusData, TangledRepo, TangledReposData, StandardSitePublication, StandardSitePublicationsData, StandardSiteDocument, StandardSiteDocumentsData, StandardSiteBasicTheme, StandardSiteThemeColor, SifaProfileData, SifaSkill, SifaProject, SifaLanguage, SifaCertification, SifaExternalAccount, SifaLocation, SifaPosition, SifaEducation, SifaVolunteering, SifaHonor, SifaCourse, SifaPublication, SifaPublicationAuthor } from './types.js';
|
|
1
|
+
export type { PopfeedReview, PopfeedCreativeWorkType, PopfeedMainCreditRole, ProfileData, StatusData, SiteInfoData, LinkData, LinkCard, BlueskyPost, BlogPost, BlogPostsData, PostAuthor, ExternalLink, Facet, Technology, License, BasedOnItem, RelatedService, Repository, Credit, SectionLicense, ResolvedIdentity, CacheEntry, MusicStatusData, MusicArtist, KibunStatusData, TangledRepo, TangledReposData, StandardSitePublication, StandardSitePublicationsData, StandardSiteDocument, StandardSiteDocumentsData, StandardSiteBasicTheme, StandardSiteThemeColor, SifaProfileData, SifaSkill, SifaProject, SifaLanguage, SifaCertification, SifaExternalAccount, SifaLocation, SifaPosition, SifaEducation, SifaVolunteering, SifaHonor, SifaCourse, SifaPublication, SifaPublicationAuthor, ToolkitUseMalachite, ToolkitUseJasper, ToolkitUseBismuth, ToolkitUseOpal, ToolkitUseTourmaline, ToolkitUseTool, ToolkitUseRecord } from './types.js';
|
|
2
2
|
export { fetchProfile, fetchSiteInfo, fetchLinks, fetchMusicStatus, fetchKibunStatus, fetchTangledRepos, fetchRecentPopfeedReviews, fetchSifaProfile, fetchSifaSkills, fetchSifaProjects, fetchSifaLanguages, fetchSifaCertifications, fetchSifaExternalAccounts, fetchSifaPositions, fetchSifaEducation, fetchSifaVolunteering, fetchSifaHonors, fetchSifaCourses, fetchSifaPublications } from './fetch.js';
|
|
3
3
|
export { fetchPublications, fetchDocuments, fetchRecentDocuments, fetchBlogPosts } from './documents.js';
|
|
4
4
|
export { fetchLatestBlueskyPost, fetchPostFromUri } from './posts.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACX,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,EACL,UAAU,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,eAAe,EACf,qBAAqB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErJ,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACX,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,KAAK,EACL,UAAU,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErJ,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jetstream WebSocket client for AT Protocol real-time event streaming.
|
|
3
|
+
*
|
|
4
|
+
* Jetstream is a simplified JSON event stream that converts the CBOR-encoded
|
|
5
|
+
* AT Protocol firehose into lightweight, friendly JSON objects.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/bluesky-social/jetstream
|
|
8
|
+
*/
|
|
9
|
+
import type { JetstreamOptions, JetstreamEventHandler, JetstreamErrorHandler, JetstreamConnectionState } from './types.js';
|
|
10
|
+
/** Public Jetstream instances operated by Bluesky */
|
|
11
|
+
export declare const JETSTREAM_INSTANCES: {
|
|
12
|
+
readonly 'us-east-1': "wss://jetstream1.us-east.bsky.network";
|
|
13
|
+
readonly 'us-east-2': "wss://jetstream2.us-east.bsky.network";
|
|
14
|
+
readonly 'us-west-1': "wss://jetstream1.us-west.bsky.network";
|
|
15
|
+
readonly 'us-west-2': "wss://jetstream2.us-west.bsky.network";
|
|
16
|
+
};
|
|
17
|
+
export type JetstreamInstance = keyof typeof JETSTREAM_INSTANCES;
|
|
18
|
+
/**
|
|
19
|
+
* Client for connecting to AT Protocol Jetstream real-time event stream.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const client = new JetstreamClient({
|
|
24
|
+
* wantedCollections: ['app.bsky.feed.post'],
|
|
25
|
+
* wantedDids: ['did:plc:...'],
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* client.onEvent((event) => {
|
|
29
|
+
* console.log('Received event:', event.kind, event.commit?.collection);
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* client.connect();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class JetstreamClient {
|
|
36
|
+
private ws;
|
|
37
|
+
private url;
|
|
38
|
+
private options;
|
|
39
|
+
private eventHandlers;
|
|
40
|
+
private errorHandlers;
|
|
41
|
+
private stateHandlers;
|
|
42
|
+
private reconnectAttempts;
|
|
43
|
+
private cursor;
|
|
44
|
+
private isConnecting;
|
|
45
|
+
private shouldReconnect;
|
|
46
|
+
private reconnectTimeout;
|
|
47
|
+
private _connectionState;
|
|
48
|
+
constructor(options?: JetstreamOptions);
|
|
49
|
+
/** Current connection state */
|
|
50
|
+
get connectionState(): JetstreamConnectionState;
|
|
51
|
+
/** Get current cursor (last seen time_us) */
|
|
52
|
+
getCursor(): number | undefined;
|
|
53
|
+
/** Connect to Jetstream and start receiving events */
|
|
54
|
+
connect(): void;
|
|
55
|
+
/** Disconnect from Jetstream */
|
|
56
|
+
disconnect(): void;
|
|
57
|
+
/** Subscribe to events */
|
|
58
|
+
onEvent(handler: JetstreamEventHandler): () => void;
|
|
59
|
+
/** Subscribe to errors */
|
|
60
|
+
onError(handler: JetstreamErrorHandler): () => void;
|
|
61
|
+
/** Subscribe to connection state changes */
|
|
62
|
+
onStateChange(handler: (state: JetstreamConnectionState) => void): () => void;
|
|
63
|
+
/** Update subscription filters after connecting */
|
|
64
|
+
updateFilters(options: Partial<JetstreamOptions>): void;
|
|
65
|
+
/** Set cursor for replay */
|
|
66
|
+
setCursor(cursor: number): void;
|
|
67
|
+
private buildUrl;
|
|
68
|
+
private setState;
|
|
69
|
+
private handleError;
|
|
70
|
+
private scheduleReconnect;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a Jetstream client for a specific DID's data.
|
|
74
|
+
* Filters events to only include records from the specified DID.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createDidJetstreamClient(did: string, options?: Omit<JetstreamOptions, 'wantedDids'>): JetstreamClient;
|
|
77
|
+
/**
|
|
78
|
+
* Create a Jetstream client for specific collections.
|
|
79
|
+
* Receives events for all DIDs but only for the specified collections.
|
|
80
|
+
*/
|
|
81
|
+
export declare function createCollectionJetstreamClient(collections: string[], options?: Omit<JetstreamOptions, 'wantedCollections'>): JetstreamClient;
|
|
82
|
+
/**
|
|
83
|
+
* Create a Jetstream client for the full firehose (all collections, all DIDs).
|
|
84
|
+
* Use with caution - this receives a high volume of events.
|
|
85
|
+
*/
|
|
86
|
+
export declare function createFullFirehoseClient(options?: JetstreamOptions): JetstreamClient;
|
|
87
|
+
/**
|
|
88
|
+
* Get the current time as a Unix microseconds cursor.
|
|
89
|
+
* Useful for starting live-tail mode.
|
|
90
|
+
*/
|
|
91
|
+
export declare function getCurrentCursor(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Convert a Unix timestamp (ms) to Jetstream cursor (microseconds).
|
|
94
|
+
*/
|
|
95
|
+
export declare function timestampToCursor(timestampMs: number): number;
|
|
96
|
+
/**
|
|
97
|
+
* Convert a Jetstream cursor (microseconds) to Unix timestamp (ms).
|
|
98
|
+
*/
|
|
99
|
+
export declare function cursorToTimestamp(cursor: number): number;
|
|
100
|
+
//# sourceMappingURL=jetstream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jetstream.d.ts","sourceRoot":"","sources":["../src/jetstream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEX,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,MAAM,YAAY,CAAC;AAEpB,qDAAqD;AACrD,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAUjE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,aAAa,CAA6D;IAClF,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,gBAAgB,CAA4C;gBAExD,OAAO,GAAE,gBAAqB;IAM1C,+BAA+B;IAC/B,IAAI,eAAe,IAAI,wBAAwB,CAE9C;IAED,6CAA6C;IAC7C,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,sDAAsD;IACtD,OAAO,IAAI,IAAI;IA0Df,gCAAgC;IAChC,UAAU,IAAI,IAAI;IAalB,0BAA0B;IAC1B,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAKnD,0BAA0B;IAC1B,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAKnD,4CAA4C;IAC5C,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,GAAG,MAAM,IAAI;IAK7E,mDAAmD;IACnD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAgBvD,4BAA4B;IAC5B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,OAAO,CAAC,QAAQ;IAqChB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,iBAAiB;CAWzB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAM,GAChD,eAAe,CAKjB;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC9C,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAM,GACvD,eAAe,CAKjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAExF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jetstream WebSocket client for AT Protocol real-time event streaming.
|
|
3
|
+
*
|
|
4
|
+
* Jetstream is a simplified JSON event stream that converts the CBOR-encoded
|
|
5
|
+
* AT Protocol firehose into lightweight, friendly JSON objects.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/bluesky-social/jetstream
|
|
8
|
+
*/
|
|
9
|
+
/** Public Jetstream instances operated by Bluesky */
|
|
10
|
+
export const JETSTREAM_INSTANCES = {
|
|
11
|
+
'us-east-1': 'wss://jetstream1.us-east.bsky.network',
|
|
12
|
+
'us-east-2': 'wss://jetstream2.us-east.bsky.network',
|
|
13
|
+
'us-west-1': 'wss://jetstream1.us-west.bsky.network',
|
|
14
|
+
'us-west-2': 'wss://jetstream2.us-west.bsky.network',
|
|
15
|
+
};
|
|
16
|
+
/** Default instance to use */
|
|
17
|
+
const DEFAULT_INSTANCE = 'us-west-2';
|
|
18
|
+
/** Reconnection settings */
|
|
19
|
+
const RECONNECT_DELAY_MS = 1000;
|
|
20
|
+
const MAX_RECONNECT_DELAY_MS = 30000;
|
|
21
|
+
const CURSOR_BUFFER_US = 5_000_000; // 5 seconds in microseconds
|
|
22
|
+
/**
|
|
23
|
+
* Client for connecting to AT Protocol Jetstream real-time event stream.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const client = new JetstreamClient({
|
|
28
|
+
* wantedCollections: ['app.bsky.feed.post'],
|
|
29
|
+
* wantedDids: ['did:plc:...'],
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* client.onEvent((event) => {
|
|
33
|
+
* console.log('Received event:', event.kind, event.commit?.collection);
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* client.connect();
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export class JetstreamClient {
|
|
40
|
+
ws = null;
|
|
41
|
+
url;
|
|
42
|
+
options;
|
|
43
|
+
eventHandlers = new Set();
|
|
44
|
+
errorHandlers = new Set();
|
|
45
|
+
stateHandlers = new Set();
|
|
46
|
+
reconnectAttempts = 0;
|
|
47
|
+
cursor;
|
|
48
|
+
isConnecting = false;
|
|
49
|
+
shouldReconnect = true;
|
|
50
|
+
reconnectTimeout = null;
|
|
51
|
+
_connectionState = 'disconnected';
|
|
52
|
+
constructor(options = {}) {
|
|
53
|
+
this.url = options.url || JETSTREAM_INSTANCES[DEFAULT_INSTANCE];
|
|
54
|
+
this.options = options;
|
|
55
|
+
this.cursor = options.cursor;
|
|
56
|
+
}
|
|
57
|
+
/** Current connection state */
|
|
58
|
+
get connectionState() {
|
|
59
|
+
return this._connectionState;
|
|
60
|
+
}
|
|
61
|
+
/** Get current cursor (last seen time_us) */
|
|
62
|
+
getCursor() {
|
|
63
|
+
return this.cursor;
|
|
64
|
+
}
|
|
65
|
+
/** Connect to Jetstream and start receiving events */
|
|
66
|
+
connect() {
|
|
67
|
+
if (this.ws?.readyState === WebSocket.OPEN || this.isConnecting) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.isConnecting = true;
|
|
71
|
+
this.shouldReconnect = true;
|
|
72
|
+
this.setState('connecting');
|
|
73
|
+
const wsUrl = this.buildUrl();
|
|
74
|
+
try {
|
|
75
|
+
this.ws = new WebSocket(wsUrl);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
this.isConnecting = false;
|
|
79
|
+
this.handleError(new Error(`Failed to create WebSocket: ${err}`));
|
|
80
|
+
this.scheduleReconnect();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.ws.onopen = () => {
|
|
84
|
+
this.isConnecting = false;
|
|
85
|
+
this.reconnectAttempts = 0;
|
|
86
|
+
this.setState('connected');
|
|
87
|
+
};
|
|
88
|
+
this.ws.onmessage = (event) => {
|
|
89
|
+
try {
|
|
90
|
+
const data = JSON.parse(event.data.toString());
|
|
91
|
+
this.cursor = data.time_us;
|
|
92
|
+
this.eventHandlers.forEach((handler) => {
|
|
93
|
+
try {
|
|
94
|
+
handler(data);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error('[Jetstream] Handler error:', err);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error('[Jetstream] Failed to parse message:', err);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
this.ws.onerror = () => {
|
|
106
|
+
this.isConnecting = false;
|
|
107
|
+
this.handleError(new Error('WebSocket error'));
|
|
108
|
+
};
|
|
109
|
+
this.ws.onclose = (event) => {
|
|
110
|
+
this.isConnecting = false;
|
|
111
|
+
if (this.shouldReconnect) {
|
|
112
|
+
this.setState('reconnecting');
|
|
113
|
+
this.scheduleReconnect();
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.setState('disconnected');
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Disconnect from Jetstream */
|
|
121
|
+
disconnect() {
|
|
122
|
+
this.shouldReconnect = false;
|
|
123
|
+
if (this.reconnectTimeout) {
|
|
124
|
+
clearTimeout(this.reconnectTimeout);
|
|
125
|
+
this.reconnectTimeout = null;
|
|
126
|
+
}
|
|
127
|
+
if (this.ws) {
|
|
128
|
+
this.ws.close();
|
|
129
|
+
this.ws = null;
|
|
130
|
+
}
|
|
131
|
+
this.setState('disconnected');
|
|
132
|
+
}
|
|
133
|
+
/** Subscribe to events */
|
|
134
|
+
onEvent(handler) {
|
|
135
|
+
this.eventHandlers.add(handler);
|
|
136
|
+
return () => this.eventHandlers.delete(handler);
|
|
137
|
+
}
|
|
138
|
+
/** Subscribe to errors */
|
|
139
|
+
onError(handler) {
|
|
140
|
+
this.errorHandlers.add(handler);
|
|
141
|
+
return () => this.errorHandlers.delete(handler);
|
|
142
|
+
}
|
|
143
|
+
/** Subscribe to connection state changes */
|
|
144
|
+
onStateChange(handler) {
|
|
145
|
+
this.stateHandlers.add(handler);
|
|
146
|
+
return () => this.stateHandlers.delete(handler);
|
|
147
|
+
}
|
|
148
|
+
/** Update subscription filters after connecting */
|
|
149
|
+
updateFilters(options) {
|
|
150
|
+
this.options = { ...this.options, ...options };
|
|
151
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
152
|
+
const message = {
|
|
153
|
+
type: 'options_update',
|
|
154
|
+
payload: {
|
|
155
|
+
wantedCollections: this.options.wantedCollections ?? [],
|
|
156
|
+
wantedDids: this.options.wantedDids ?? [],
|
|
157
|
+
maxMessageSizeBytes: this.options.maxMessageSizeBytes ?? 0,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
this.ws.send(JSON.stringify(message));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Set cursor for replay */
|
|
164
|
+
setCursor(cursor) {
|
|
165
|
+
this.cursor = cursor;
|
|
166
|
+
}
|
|
167
|
+
buildUrl() {
|
|
168
|
+
const params = new URLSearchParams();
|
|
169
|
+
if (this.options.wantedCollections?.length) {
|
|
170
|
+
for (const collection of this.options.wantedCollections) {
|
|
171
|
+
params.append('wantedCollections', collection);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (this.options.wantedDids?.length) {
|
|
175
|
+
for (const did of this.options.wantedDids) {
|
|
176
|
+
params.append('wantedDids', did);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (this.options.maxMessageSizeBytes) {
|
|
180
|
+
params.set('maxMessageSizeBytes', String(this.options.maxMessageSizeBytes));
|
|
181
|
+
}
|
|
182
|
+
if (this.options.compress) {
|
|
183
|
+
params.set('compress', 'true');
|
|
184
|
+
}
|
|
185
|
+
if (this.options.requireHello) {
|
|
186
|
+
params.set('requireHello', 'true');
|
|
187
|
+
}
|
|
188
|
+
// Use cursor with buffer for gapless replay
|
|
189
|
+
if (this.cursor) {
|
|
190
|
+
const bufferedCursor = Math.max(0, this.cursor - CURSOR_BUFFER_US);
|
|
191
|
+
params.set('cursor', String(bufferedCursor));
|
|
192
|
+
}
|
|
193
|
+
const queryString = params.toString();
|
|
194
|
+
return queryString ? `${this.url}/subscribe?${queryString}` : `${this.url}/subscribe`;
|
|
195
|
+
}
|
|
196
|
+
setState(state) {
|
|
197
|
+
this._connectionState = state;
|
|
198
|
+
this.stateHandlers.forEach((handler) => {
|
|
199
|
+
try {
|
|
200
|
+
handler(state);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
console.error('[Jetstream] State handler error:', err);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
handleError(error) {
|
|
208
|
+
this.errorHandlers.forEach((handler) => {
|
|
209
|
+
try {
|
|
210
|
+
handler(error);
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.error('[Jetstream] Error handler error:', err);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
scheduleReconnect() {
|
|
218
|
+
const delay = Math.min(RECONNECT_DELAY_MS * Math.pow(2, this.reconnectAttempts), MAX_RECONNECT_DELAY_MS);
|
|
219
|
+
this.reconnectAttempts++;
|
|
220
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
221
|
+
this.connect();
|
|
222
|
+
}, delay);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Create a Jetstream client for a specific DID's data.
|
|
227
|
+
* Filters events to only include records from the specified DID.
|
|
228
|
+
*/
|
|
229
|
+
export function createDidJetstreamClient(did, options = {}) {
|
|
230
|
+
return new JetstreamClient({
|
|
231
|
+
...options,
|
|
232
|
+
wantedDids: [did],
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Create a Jetstream client for specific collections.
|
|
237
|
+
* Receives events for all DIDs but only for the specified collections.
|
|
238
|
+
*/
|
|
239
|
+
export function createCollectionJetstreamClient(collections, options = {}) {
|
|
240
|
+
return new JetstreamClient({
|
|
241
|
+
...options,
|
|
242
|
+
wantedCollections: collections,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create a Jetstream client for the full firehose (all collections, all DIDs).
|
|
247
|
+
* Use with caution - this receives a high volume of events.
|
|
248
|
+
*/
|
|
249
|
+
export function createFullFirehoseClient(options = {}) {
|
|
250
|
+
return new JetstreamClient(options);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the current time as a Unix microseconds cursor.
|
|
254
|
+
* Useful for starting live-tail mode.
|
|
255
|
+
*/
|
|
256
|
+
export function getCurrentCursor() {
|
|
257
|
+
return Date.now() * 1000;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Convert a Unix timestamp (ms) to Jetstream cursor (microseconds).
|
|
261
|
+
*/
|
|
262
|
+
export function timestampToCursor(timestampMs) {
|
|
263
|
+
return timestampMs * 1000;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Convert a Jetstream cursor (microseconds) to Unix timestamp (ms).
|
|
267
|
+
*/
|
|
268
|
+
export function cursorToTimestamp(cursor) {
|
|
269
|
+
return Math.floor(cursor / 1000);
|
|
270
|
+
}
|
package/dist/musicbrainz.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare function searchDeezerArtwork(trackName: string, artistName: strin
|
|
|
5
5
|
export declare function searchLastFmArtwork(trackName: string, artistName: string, releaseName?: string): Promise<string | null>;
|
|
6
6
|
/**
|
|
7
7
|
* Cascading artwork search: Cover Art Archive → MusicBrainz+CAA → iTunes → Last.fm
|
|
8
|
+
* Each step is bounded by ARTWORK_TIMEOUT to prevent serverless function timeouts.
|
|
8
9
|
*/
|
|
9
10
|
export declare function findArtwork(trackName: string, artistName: string, releaseName?: string, releaseMbId?: string, fetchFn?: typeof fetch): Promise<string | null>;
|
|
10
11
|
//# sourceMappingURL=musicbrainz.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"musicbrainz.d.ts","sourceRoot":"","sources":["../src/musicbrainz.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"musicbrainz.d.ts","sourceRoot":"","sources":["../src/musicbrainz.ts"],"names":[],"mappings":"AAyCA,wBAAsB,wBAAwB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAkCD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,GAAG,GAAG,GAAG,GAAG,IAAU,GAAG,MAAM,CAG1F;AAED,wBAAsB,mBAAmB,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED,wBAAsB,mBAAmB,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB;AAED,wBAAsB,mBAAmB,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BxB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB"}
|
package/dist/musicbrainz.js
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
import { cache } from './cache.js';
|
|
2
|
+
/** Timeout for individual artwork API calls (ms). */
|
|
3
|
+
const ARTWORK_TIMEOUT = 5_000;
|
|
4
|
+
/**
|
|
5
|
+
* Wraps a promise with a timeout. Rejects with a TimeoutError if the promise
|
|
6
|
+
* doesn't settle within `ms` milliseconds.
|
|
7
|
+
*/
|
|
8
|
+
function withTimeout(promise, ms) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const timer = setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms);
|
|
11
|
+
promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err); });
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
// Teal stores MusicBrainz IDs as URI strings (`mbid:<uuid>`), while Cover Art
|
|
15
|
+
// Archive release URLs still require the raw UUID path segment.
|
|
16
|
+
function toMusicBrainzUuid(value) {
|
|
17
|
+
const match = value.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);
|
|
18
|
+
return match?.[0].toLowerCase() ?? null;
|
|
19
|
+
}
|
|
2
20
|
export async function searchMusicBrainzRelease(trackName, artistName, releaseName) {
|
|
3
21
|
const cacheKey = `mb:release:${trackName}:${artistName}:${releaseName || 'none'}`;
|
|
4
22
|
const cached = cache.get(cacheKey);
|
|
@@ -67,7 +85,8 @@ async function searchByTrackName(trackName, artistName) {
|
|
|
67
85
|
}
|
|
68
86
|
}
|
|
69
87
|
export function buildCoverArtUrl(releaseMbId, size = 500) {
|
|
70
|
-
|
|
88
|
+
const mbid = toMusicBrainzUuid(releaseMbId) ?? releaseMbId;
|
|
89
|
+
return `https://coverartarchive.org/release/${mbid}/front-${size}`;
|
|
71
90
|
}
|
|
72
91
|
export async function searchiTunesArtwork(trackName, artistName, releaseName) {
|
|
73
92
|
const cacheKey = `itunes:artwork:${trackName}:${artistName}:${releaseName || 'none'}`;
|
|
@@ -140,6 +159,7 @@ export async function searchLastFmArtwork(trackName, artistName, releaseName) {
|
|
|
140
159
|
}
|
|
141
160
|
/**
|
|
142
161
|
* Cascading artwork search: Cover Art Archive → MusicBrainz+CAA → iTunes → Last.fm
|
|
162
|
+
* Each step is bounded by ARTWORK_TIMEOUT to prevent serverless function timeouts.
|
|
143
163
|
*/
|
|
144
164
|
export async function findArtwork(trackName, artistName, releaseName, releaseMbId, fetchFn) {
|
|
145
165
|
const _fetch = fetchFn || globalThis.fetch;
|
|
@@ -147,7 +167,7 @@ export async function findArtwork(trackName, artistName, releaseName, releaseMbI
|
|
|
147
167
|
if (releaseMbId) {
|
|
148
168
|
const caaUrl = buildCoverArtUrl(releaseMbId, 500);
|
|
149
169
|
try {
|
|
150
|
-
const res = await _fetch(caaUrl, { method: 'HEAD' });
|
|
170
|
+
const res = await withTimeout(_fetch(caaUrl, { method: 'HEAD' }), ARTWORK_TIMEOUT);
|
|
151
171
|
if (res.ok)
|
|
152
172
|
return caaUrl;
|
|
153
173
|
}
|
|
@@ -158,7 +178,7 @@ export async function findArtwork(trackName, artistName, releaseName, releaseMbI
|
|
|
158
178
|
if (mbId) {
|
|
159
179
|
const caaUrl = buildCoverArtUrl(mbId, 500);
|
|
160
180
|
try {
|
|
161
|
-
const res = await _fetch(caaUrl, { method: 'HEAD' });
|
|
181
|
+
const res = await withTimeout(_fetch(caaUrl, { method: 'HEAD' }), ARTWORK_TIMEOUT);
|
|
162
182
|
if (res.ok)
|
|
163
183
|
return caaUrl;
|
|
164
184
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -98,6 +98,7 @@ export interface BlogPost {
|
|
|
98
98
|
tags?: string[];
|
|
99
99
|
coverImage?: string;
|
|
100
100
|
textContent?: string;
|
|
101
|
+
content?: unknown;
|
|
101
102
|
updatedAt?: string;
|
|
102
103
|
}
|
|
103
104
|
export interface BlogPostsData {
|
|
@@ -393,4 +394,33 @@ export interface SifaPublication {
|
|
|
393
394
|
publishedAt?: string;
|
|
394
395
|
uri: string;
|
|
395
396
|
}
|
|
397
|
+
export interface ToolkitUseMalachite {
|
|
398
|
+
$type: 'click.croft.tools.malachite';
|
|
399
|
+
recordsImported?: number;
|
|
400
|
+
mode?: string;
|
|
401
|
+
}
|
|
402
|
+
export interface ToolkitUseJasper {
|
|
403
|
+
$type: 'click.croft.tools.jasper';
|
|
404
|
+
recordsImported?: number;
|
|
405
|
+
}
|
|
406
|
+
export interface ToolkitUseBismuth {
|
|
407
|
+
$type: 'click.croft.tools.bismuth';
|
|
408
|
+
documentsConverted?: number;
|
|
409
|
+
}
|
|
410
|
+
export interface ToolkitUseOpal {
|
|
411
|
+
$type: 'click.croft.tools.opal';
|
|
412
|
+
postsImported?: number;
|
|
413
|
+
}
|
|
414
|
+
export interface ToolkitUseTourmaline {
|
|
415
|
+
$type: 'click.croft.tools.tourmaline';
|
|
416
|
+
scrobblesAnalyzed?: number;
|
|
417
|
+
sharedToBluesky?: boolean;
|
|
418
|
+
}
|
|
419
|
+
export type ToolkitUseTool = ToolkitUseMalachite | ToolkitUseJasper | ToolkitUseBismuth | ToolkitUseOpal | ToolkitUseTourmaline;
|
|
420
|
+
export interface ToolkitUseRecord {
|
|
421
|
+
$type: 'click.croft.toolkit.use';
|
|
422
|
+
tool: ToolkitUseTool;
|
|
423
|
+
createdAt: string;
|
|
424
|
+
context?: string;
|
|
425
|
+
}
|
|
396
426
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC5B,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;QACnC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;KAClC,CAAC;CACF;AAED,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,4BAA4B,GAAG,yBAAyB,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,qBAAqB,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,sBAAsB;IACtC,UAAU,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,sBAAsB,CAAC;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,sBAAsB,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC5C,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACzC,SAAS,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,uBAAuB,GAChC,OAAO,GACP,SAAS,GACT,YAAY,GACZ,OAAO,GACP,MAAM,GACN,aAAa,GACb,SAAS,GACT,IAAI,GACJ,WAAW,GACX,YAAY,GACZ,OAAO,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC9B,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,QAAQ,GACR,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,CAAC;AAEb,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACZ"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC5B,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;QACnC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;KAClC,CAAC;CACF;AAED,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,4BAA4B,GAAG,yBAAyB,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,qBAAqB,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,sBAAsB;IACtC,UAAU,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,sBAAsB,CAAC;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,sBAAsB,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC5C,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACzC,SAAS,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,uBAAuB,GAChC,OAAO,GACP,SAAS,GACT,YAAY,GACZ,OAAO,GACP,MAAM,GACN,aAAa,GACb,SAAS,GACT,IAAI,GACJ,WAAW,GACX,YAAY,GACZ,OAAO,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC9B,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,QAAQ,GACR,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,CAAC;AAEb,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACZ;AAID,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,6BAA6B,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,0BAA0B,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,2BAA2B,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,wBAAwB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,8BAA8B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GACvB,mBAAmB,GACnB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,oBAAoB,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,yBAAyB,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ewanc26/atproto",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "AT Protocol service layer extracted from ewancroft.uk",
|
|
5
5
|
"author": "Ewan Croft",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -35,16 +35,16 @@
|
|
|
35
35
|
},
|
|
36
36
|
"main": "./dist/index.js",
|
|
37
37
|
"types": "./dist/index.d.ts",
|
|
38
|
-
"scripts": {
|
|
39
|
-
"build": "tsc --project tsconfig.json",
|
|
40
|
-
"dev": "tsc --project tsconfig.json --watch",
|
|
41
|
-
"check": "tsc --noEmit"
|
|
42
|
-
},
|
|
43
38
|
"peerDependencies": {
|
|
44
39
|
"@atproto/api": ">=0.13.0"
|
|
45
40
|
},
|
|
46
41
|
"devDependencies": {
|
|
47
42
|
"@atproto/api": "^0.19.3",
|
|
48
43
|
"typescript": "^5.9.3"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc --project tsconfig.json",
|
|
47
|
+
"dev": "tsc --project tsconfig.json --watch",
|
|
48
|
+
"check": "tsc --noEmit"
|
|
49
49
|
}
|
|
50
|
-
}
|
|
50
|
+
}
|
package/src/agents.ts
CHANGED
|
@@ -2,6 +2,26 @@ import { AtpAgent } from '@atproto/api';
|
|
|
2
2
|
import type { ResolvedIdentity } from './types.js';
|
|
3
3
|
import { cache } from './cache.js';
|
|
4
4
|
|
|
5
|
+
/** Default timeout for individual AT Protocol XRPC calls (ms). */
|
|
6
|
+
const XRPC_TIMEOUT = 8_000;
|
|
7
|
+
|
|
8
|
+
/** Default timeout for identity resolution (ms). */
|
|
9
|
+
const IDENTITY_TIMEOUT = 5_000;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wraps a promise with a timeout. Rejects with a TimeoutError if the promise
|
|
13
|
+
* doesn't settle within `ms` milliseconds.
|
|
14
|
+
*/
|
|
15
|
+
function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
|
|
16
|
+
return new Promise<T>((resolve, reject) => {
|
|
17
|
+
const timer = setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms);
|
|
18
|
+
promise.then(
|
|
19
|
+
(value) => { clearTimeout(timer); resolve(value); },
|
|
20
|
+
(err) => { clearTimeout(timer); reject(err); }
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
5
25
|
export function createAgent(service: string, fetchFn?: typeof fetch): AtpAgent {
|
|
6
26
|
const wrappedFetch = fetchFn
|
|
7
27
|
? async (url: URL | RequestInfo, init?: RequestInit) => {
|
|
@@ -40,8 +60,11 @@ export async function resolveIdentity(
|
|
|
40
60
|
if (cached) return cached;
|
|
41
61
|
|
|
42
62
|
const _fetch = fetchFn ?? globalThis.fetch;
|
|
43
|
-
const response = await
|
|
44
|
-
|
|
63
|
+
const response = await withTimeout(
|
|
64
|
+
_fetch(
|
|
65
|
+
`https://slingshot.microcosm.blue/xrpc/com.bad-example.identity.resolveMiniDoc?identifier=${encodeURIComponent(did)}`
|
|
66
|
+
),
|
|
67
|
+
IDENTITY_TIMEOUT
|
|
45
68
|
);
|
|
46
69
|
|
|
47
70
|
if (!response.ok) {
|
|
@@ -71,7 +94,10 @@ export async function getPublicAgent(did: string, fetchFn?: typeof fetch): Promi
|
|
|
71
94
|
|
|
72
95
|
try {
|
|
73
96
|
try {
|
|
74
|
-
const response = await
|
|
97
|
+
const response = await withTimeout(
|
|
98
|
+
constellationAgent.getProfile({ actor: did }),
|
|
99
|
+
XRPC_TIMEOUT
|
|
100
|
+
);
|
|
75
101
|
if (response.success) {
|
|
76
102
|
resolvedAgent = constellationAgent;
|
|
77
103
|
return resolvedAgent;
|
|
@@ -113,7 +139,7 @@ export async function withFallback<T>(
|
|
|
113
139
|
for (const getAgent of agents) {
|
|
114
140
|
try {
|
|
115
141
|
const agent = await getAgent();
|
|
116
|
-
return await operation(agent);
|
|
142
|
+
return await withTimeout(operation(agent), XRPC_TIMEOUT);
|
|
117
143
|
} catch (error) {
|
|
118
144
|
lastError = error;
|
|
119
145
|
}
|
package/src/documents.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -51,7 +51,14 @@ export type {
|
|
|
51
51
|
SifaHonor,
|
|
52
52
|
SifaCourse,
|
|
53
53
|
SifaPublication,
|
|
54
|
-
SifaPublicationAuthor
|
|
54
|
+
SifaPublicationAuthor,
|
|
55
|
+
ToolkitUseMalachite,
|
|
56
|
+
ToolkitUseJasper,
|
|
57
|
+
ToolkitUseBismuth,
|
|
58
|
+
ToolkitUseOpal,
|
|
59
|
+
ToolkitUseTourmaline,
|
|
60
|
+
ToolkitUseTool,
|
|
61
|
+
ToolkitUseRecord
|
|
55
62
|
} from './types.js';
|
|
56
63
|
|
|
57
64
|
export {
|
package/src/musicbrainz.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import { cache } from './cache.js';
|
|
2
2
|
|
|
3
|
+
/** Timeout for individual artwork API calls (ms). */
|
|
4
|
+
const ARTWORK_TIMEOUT = 5_000;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a promise with a timeout. Rejects with a TimeoutError if the promise
|
|
8
|
+
* doesn't settle within `ms` milliseconds.
|
|
9
|
+
*/
|
|
10
|
+
function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
|
|
11
|
+
return new Promise<T>((resolve, reject) => {
|
|
12
|
+
const timer = setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms);
|
|
13
|
+
promise.then(
|
|
14
|
+
(value) => { clearTimeout(timer); resolve(value); },
|
|
15
|
+
(err) => { clearTimeout(timer); reject(err); }
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
3
20
|
interface MusicBrainzRelease {
|
|
4
21
|
id: string;
|
|
5
22
|
score: number;
|
|
@@ -15,6 +32,13 @@ interface iTunesSearchResponse {
|
|
|
15
32
|
results: Array<{ artworkUrl100?: string }>;
|
|
16
33
|
}
|
|
17
34
|
|
|
35
|
+
// Teal stores MusicBrainz IDs as URI strings (`mbid:<uuid>`), while Cover Art
|
|
36
|
+
// Archive release URLs still require the raw UUID path segment.
|
|
37
|
+
function toMusicBrainzUuid(value: string): string | null {
|
|
38
|
+
const match = value.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);
|
|
39
|
+
return match?.[0].toLowerCase() ?? null;
|
|
40
|
+
}
|
|
41
|
+
|
|
18
42
|
export async function searchMusicBrainzRelease(
|
|
19
43
|
trackName: string,
|
|
20
44
|
artistName: string,
|
|
@@ -71,7 +95,8 @@ async function searchByTrackName(trackName: string, artistName: string): Promise
|
|
|
71
95
|
}
|
|
72
96
|
|
|
73
97
|
export function buildCoverArtUrl(releaseMbId: string, size: 250 | 500 | 1200 = 500): string {
|
|
74
|
-
|
|
98
|
+
const mbid = toMusicBrainzUuid(releaseMbId) ?? releaseMbId;
|
|
99
|
+
return `https://coverartarchive.org/release/${mbid}/front-${size}`;
|
|
75
100
|
}
|
|
76
101
|
|
|
77
102
|
export async function searchiTunesArtwork(
|
|
@@ -147,6 +172,7 @@ export async function searchLastFmArtwork(
|
|
|
147
172
|
|
|
148
173
|
/**
|
|
149
174
|
* Cascading artwork search: Cover Art Archive → MusicBrainz+CAA → iTunes → Last.fm
|
|
175
|
+
* Each step is bounded by ARTWORK_TIMEOUT to prevent serverless function timeouts.
|
|
150
176
|
*/
|
|
151
177
|
export async function findArtwork(
|
|
152
178
|
trackName: string,
|
|
@@ -161,7 +187,7 @@ export async function findArtwork(
|
|
|
161
187
|
if (releaseMbId) {
|
|
162
188
|
const caaUrl = buildCoverArtUrl(releaseMbId, 500);
|
|
163
189
|
try {
|
|
164
|
-
const res = await _fetch(caaUrl, { method: 'HEAD' });
|
|
190
|
+
const res = await withTimeout(_fetch(caaUrl, { method: 'HEAD' }), ARTWORK_TIMEOUT);
|
|
165
191
|
if (res.ok) return caaUrl;
|
|
166
192
|
} catch { /* continue */ }
|
|
167
193
|
}
|
|
@@ -171,7 +197,7 @@ export async function findArtwork(
|
|
|
171
197
|
if (mbId) {
|
|
172
198
|
const caaUrl = buildCoverArtUrl(mbId, 500);
|
|
173
199
|
try {
|
|
174
|
-
const res = await _fetch(caaUrl, { method: 'HEAD' });
|
|
200
|
+
const res = await withTimeout(_fetch(caaUrl, { method: 'HEAD' }), ARTWORK_TIMEOUT);
|
|
175
201
|
if (res.ok) return caaUrl;
|
|
176
202
|
} catch { /* continue */ }
|
|
177
203
|
}
|
package/src/types.ts
CHANGED
|
@@ -111,6 +111,7 @@ export interface BlogPost {
|
|
|
111
111
|
tags?: string[];
|
|
112
112
|
coverImage?: string;
|
|
113
113
|
textContent?: string;
|
|
114
|
+
content?: unknown;
|
|
114
115
|
updatedAt?: string;
|
|
115
116
|
}
|
|
116
117
|
|
|
@@ -449,3 +450,46 @@ export interface SifaPublication {
|
|
|
449
450
|
publishedAt?: string;
|
|
450
451
|
uri: string;
|
|
451
452
|
}
|
|
453
|
+
|
|
454
|
+
// Croft Click Toolkit Use Types
|
|
455
|
+
|
|
456
|
+
export interface ToolkitUseMalachite {
|
|
457
|
+
$type: 'click.croft.tools.malachite';
|
|
458
|
+
recordsImported?: number;
|
|
459
|
+
mode?: string;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
export interface ToolkitUseJasper {
|
|
463
|
+
$type: 'click.croft.tools.jasper';
|
|
464
|
+
recordsImported?: number;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export interface ToolkitUseBismuth {
|
|
468
|
+
$type: 'click.croft.tools.bismuth';
|
|
469
|
+
documentsConverted?: number;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export interface ToolkitUseOpal {
|
|
473
|
+
$type: 'click.croft.tools.opal';
|
|
474
|
+
postsImported?: number;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export interface ToolkitUseTourmaline {
|
|
478
|
+
$type: 'click.croft.tools.tourmaline';
|
|
479
|
+
scrobblesAnalyzed?: number;
|
|
480
|
+
sharedToBluesky?: boolean;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export type ToolkitUseTool =
|
|
484
|
+
| ToolkitUseMalachite
|
|
485
|
+
| ToolkitUseJasper
|
|
486
|
+
| ToolkitUseBismuth
|
|
487
|
+
| ToolkitUseOpal
|
|
488
|
+
| ToolkitUseTourmaline;
|
|
489
|
+
|
|
490
|
+
export interface ToolkitUseRecord {
|
|
491
|
+
$type: 'click.croft.toolkit.use';
|
|
492
|
+
tool: ToolkitUseTool;
|
|
493
|
+
createdAt: string;
|
|
494
|
+
context?: string;
|
|
495
|
+
}
|