@misofm/sdk 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +31 -0
  2. package/dist/auth.d.ts +73 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +193 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/catalog.d.ts +4 -17
  7. package/dist/catalog.d.ts.map +1 -1
  8. package/dist/catalog.js +46 -58
  9. package/dist/catalog.js.map +1 -1
  10. package/dist/cover.d.ts +10 -0
  11. package/dist/cover.d.ts.map +1 -1
  12. package/dist/cover.js +66 -19
  13. package/dist/cover.js.map +1 -1
  14. package/dist/credits.d.ts +10 -0
  15. package/dist/credits.d.ts.map +1 -1
  16. package/dist/credits.js +149 -39
  17. package/dist/credits.js.map +1 -1
  18. package/dist/drop.d.ts +7 -0
  19. package/dist/drop.d.ts.map +1 -1
  20. package/dist/drop.js +84 -34
  21. package/dist/drop.js.map +1 -1
  22. package/dist/pressing.d.ts.map +1 -1
  23. package/dist/pressing.js +59 -16
  24. package/dist/pressing.js.map +1 -1
  25. package/dist/read/artist.d.ts +1 -6
  26. package/dist/read/artist.d.ts.map +1 -1
  27. package/dist/read/artist.js +39 -22
  28. package/dist/read/artist.js.map +1 -1
  29. package/dist/read/catalog.d.ts +24 -3
  30. package/dist/read/catalog.d.ts.map +1 -1
  31. package/dist/read/catalog.js +190 -89
  32. package/dist/read/catalog.js.map +1 -1
  33. package/dist/read/index.d.ts +5 -3
  34. package/dist/read/index.d.ts.map +1 -1
  35. package/dist/read/index.js +2 -2
  36. package/dist/read/index.js.map +1 -1
  37. package/dist/read/types.d.ts +12 -1
  38. package/dist/read/types.d.ts.map +1 -1
  39. package/dist/read/works.d.ts +3 -2
  40. package/dist/read/works.d.ts.map +1 -1
  41. package/dist/read/works.js +158 -48
  42. package/dist/read/works.js.map +1 -1
  43. package/package.json +5 -1
  44. package/src/auth.ts +275 -0
  45. package/src/catalog.ts +71 -77
  46. package/src/cover.ts +107 -26
  47. package/src/credits.ts +353 -89
  48. package/src/drop.ts +150 -40
  49. package/src/pressing.ts +146 -36
  50. package/src/read/artist.ts +73 -34
  51. package/src/read/catalog.ts +324 -89
  52. package/src/read/index.ts +23 -2
  53. package/src/read/types.ts +16 -2
  54. package/src/read/works.ts +224 -59
package/README.md CHANGED
@@ -124,6 +124,37 @@ const miso = read.createMisoClient({ network: "testnet" });
124
124
  const artist = await read.getArtistProfile(miso, partyId);
125
125
  ```
126
126
 
127
+ ### Authenticated platform mutations
128
+
129
+ `@misofm/sdk/auth` implements Miso's Enoki + Sui personal-message authorization
130
+ protocol without owning session state or private credentials. It asks the API
131
+ for a short-lived, method/path-bound challenge, validates the response, signs
132
+ the exact bytes with the caller's Sui signer, and sends the authenticated
133
+ mutation.
134
+
135
+ ```ts
136
+ import { authenticatedFetch } from "@misofm/sdk/auth";
137
+
138
+ await authenticatedFetch(
139
+ "https://api.testnet.miso.fm/platform/usernames/alice",
140
+ {
141
+ method: "PUT",
142
+ body: JSON.stringify({}),
143
+ headers: { "Content-Type": "application/json" },
144
+ auth: {
145
+ token: enokiOidcToken,
146
+ address: suiAddress,
147
+ signer: await enokiFlow.getKeypair({ network: "testnet" }),
148
+ network: "testnet",
149
+ },
150
+ },
151
+ );
152
+ ```
153
+
154
+ The SDK is only a client and shared wire contract. The API remains the security
155
+ boundary: it verifies Enoki membership, challenge freshness, the recovered Sui
156
+ address, and the exact authorized route on every protected request.
157
+
127
158
  ### Payment
128
159
 
129
160
  `listing::buy` takes a bare `Balance<Currency>`, and `buyRecord` sources it with
package/dist/auth.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ export type AuthNetwork = "testnet" | "mainnet";
2
+ export interface ApiAuthorizationFields {
3
+ method: string;
4
+ path: string;
5
+ address: string;
6
+ network: AuthNetwork;
7
+ issuedAt: string;
8
+ }
9
+ export interface AuthorizationChallenge extends ApiAuthorizationFields {
10
+ payload: string;
11
+ expiresAt: string;
12
+ }
13
+ export interface PersonalMessageSigner {
14
+ signPersonalMessage(message: Uint8Array): Promise<{
15
+ signature: string;
16
+ bytes?: string;
17
+ }>;
18
+ }
19
+ export declare const AUTHORIZATION_MAX_AGE_MS: number;
20
+ export declare const AUTHORIZATION_FUTURE_SKEW_MS: number;
21
+ export declare const MISO_AUTH_HEADERS: {
22
+ readonly address: "X-Sui-Address";
23
+ readonly signature: "X-Sui-Signature";
24
+ readonly issuedAt: "X-Sui-Issued-At";
25
+ };
26
+ export type MisoAuthErrorCode = "invalid_target" | "challenge_rejected" | "invalid_challenge" | "signing_failed";
27
+ export declare class MisoAuthError extends Error {
28
+ readonly code: MisoAuthErrorCode;
29
+ readonly status?: number;
30
+ constructor(code: MisoAuthErrorCode, message: string, options?: {
31
+ status?: number;
32
+ cause?: unknown;
33
+ });
34
+ }
35
+ /** The byte-exact Sui personal message required for an authenticated API mutation. */
36
+ export declare function buildApiAuthorizationPayload(fields: ApiAuthorizationFields): string;
37
+ export declare function isValidAuthorizationTarget(method: string, path: string): boolean;
38
+ /** Accept only fresh timestamps in one canonical spelling. */
39
+ export declare function parseFreshAuthorizationIssuedAt(input: unknown, nowMs?: number): string | null;
40
+ export interface RequestAuthorizationChallengeOptions {
41
+ apiUrl: string | URL;
42
+ token: string;
43
+ address: string;
44
+ method: string;
45
+ path: string;
46
+ network?: AuthNetwork;
47
+ challengeUrl?: string | URL;
48
+ fetch?: typeof globalThis.fetch;
49
+ nowMs?: number;
50
+ }
51
+ /** Ask Miso to verify the Enoki account and issue the exact message to sign. */
52
+ export declare function requestAuthorizationChallenge(options: RequestAuthorizationChallengeOptions): Promise<AuthorizationChallenge>;
53
+ export interface CreateAuthorizationHeadersOptions extends RequestAuthorizationChallengeOptions {
54
+ signer: PersonalMessageSigner;
55
+ }
56
+ /** Verify the challenge locally, sign it as a Sui personal message, and produce API headers. */
57
+ export declare function createAuthorizationHeaders(options: CreateAuthorizationHeadersOptions): Promise<{
58
+ challenge: AuthorizationChallenge;
59
+ headers: Headers;
60
+ }>;
61
+ export interface AuthenticatedFetchOptions extends RequestInit {
62
+ auth: {
63
+ token: string;
64
+ address: string;
65
+ signer: PersonalMessageSigner;
66
+ network?: AuthNetwork;
67
+ };
68
+ challengeUrl?: string | URL;
69
+ fetch?: typeof globalThis.fetch;
70
+ }
71
+ /** Perform a protected Miso API mutation with a fresh Enoki-verified Sui signature. */
72
+ export declare function authenticatedFetch(input: string | URL, options: AuthenticatedFetchOptions): Promise<Response>;
73
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/auth.js ADDED
@@ -0,0 +1,193 @@
1
+ // Copyright (c) Miso Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { isValidSuiAddress, normalizeSuiAddress } from "@mysten/sui/utils";
4
+ export const AUTHORIZATION_MAX_AGE_MS = 5 * 60 * 1_000;
5
+ export const AUTHORIZATION_FUTURE_SKEW_MS = 60 * 1_000;
6
+ export const MISO_AUTH_HEADERS = {
7
+ address: "X-Sui-Address",
8
+ signature: "X-Sui-Signature",
9
+ issuedAt: "X-Sui-Issued-At",
10
+ };
11
+ export class MisoAuthError extends Error {
12
+ code;
13
+ status;
14
+ constructor(code, message, options = {}) {
15
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
16
+ this.name = "MisoAuthError";
17
+ this.code = code;
18
+ this.status = options.status;
19
+ }
20
+ }
21
+ /** The byte-exact Sui personal message required for an authenticated API mutation. */
22
+ export function buildApiAuthorizationPayload(fields) {
23
+ return [
24
+ "miso.fm API authorization v1",
25
+ "",
26
+ `Method: ${fields.method.toUpperCase()}`,
27
+ `Path: ${fields.path}`,
28
+ `Address: ${fields.address}`,
29
+ `Network: ${fields.network}`,
30
+ `Issued At: ${fields.issuedAt}`,
31
+ ].join("\n");
32
+ }
33
+ export function isValidAuthorizationTarget(method, path) {
34
+ return (["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase()) &&
35
+ path.startsWith("/platform/") &&
36
+ path.length <= 2_048 &&
37
+ !/[\r\n?#]/.test(path));
38
+ }
39
+ /** Accept only fresh timestamps in one canonical spelling. */
40
+ export function parseFreshAuthorizationIssuedAt(input, nowMs = Date.now()) {
41
+ if (typeof input !== "string")
42
+ return null;
43
+ const issuedAtMs = Date.parse(input);
44
+ if (!Number.isFinite(issuedAtMs))
45
+ return null;
46
+ if (issuedAtMs > nowMs + AUTHORIZATION_FUTURE_SKEW_MS ||
47
+ nowMs - issuedAtMs > AUTHORIZATION_MAX_AGE_MS) {
48
+ return null;
49
+ }
50
+ const canonical = new Date(issuedAtMs).toISOString();
51
+ return input === canonical ? canonical : null;
52
+ }
53
+ function target(method, path) {
54
+ const normalized = { method: method.toUpperCase(), path };
55
+ if (!isValidAuthorizationTarget(normalized.method, normalized.path)) {
56
+ throw new MisoAuthError("invalid_target", "Authenticated requests require a mutation under /platform/.");
57
+ }
58
+ return normalized;
59
+ }
60
+ function parseChallenge(input, expected) {
61
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
62
+ throw new MisoAuthError("invalid_challenge", "The API returned an invalid authorization challenge.");
63
+ }
64
+ const body = input;
65
+ if (typeof body.payload !== "string" ||
66
+ typeof body.method !== "string" ||
67
+ typeof body.path !== "string" ||
68
+ typeof body.address !== "string" ||
69
+ typeof body.network !== "string" ||
70
+ typeof body.issuedAt !== "string" ||
71
+ typeof body.expiresAt !== "string" ||
72
+ !isValidSuiAddress(body.address) ||
73
+ (body.network !== "testnet" && body.network !== "mainnet")) {
74
+ throw new MisoAuthError("invalid_challenge", "The API returned an invalid authorization challenge.");
75
+ }
76
+ const nowMs = expected.nowMs ?? Date.now();
77
+ const issuedAt = parseFreshAuthorizationIssuedAt(body.issuedAt, nowMs);
78
+ const expiresAtMs = Date.parse(body.expiresAt);
79
+ const canonicalAddress = normalizeSuiAddress(body.address);
80
+ const expectedAddress = normalizeSuiAddress(expected.address);
81
+ const challenge = {
82
+ payload: body.payload,
83
+ method: body.method,
84
+ path: body.path,
85
+ address: canonicalAddress,
86
+ network: body.network,
87
+ issuedAt: body.issuedAt,
88
+ expiresAt: body.expiresAt,
89
+ };
90
+ const canonicalExpiresAt = Number.isFinite(expiresAtMs) ? new Date(expiresAtMs).toISOString() : "";
91
+ if (!issuedAt ||
92
+ body.method !== expected.method ||
93
+ body.path !== expected.path ||
94
+ canonicalAddress !== expectedAddress ||
95
+ (expected.network !== undefined && body.network !== expected.network) ||
96
+ body.expiresAt !== canonicalExpiresAt ||
97
+ expiresAtMs <= nowMs ||
98
+ expiresAtMs > Date.parse(issuedAt) + AUTHORIZATION_MAX_AGE_MS ||
99
+ body.payload !== buildApiAuthorizationPayload(challenge)) {
100
+ throw new MisoAuthError("invalid_challenge", "The authorization challenge did not match this request.");
101
+ }
102
+ return challenge;
103
+ }
104
+ async function responseMessage(response) {
105
+ const body = await response.clone().json().catch(() => null);
106
+ if (typeof body?.error === "object" && typeof body.error.message === "string")
107
+ return body.error.message;
108
+ if (typeof body?.error === "string")
109
+ return body.error;
110
+ if (typeof body?.message === "string")
111
+ return body.message;
112
+ return `Authorization challenge failed (${response.status}).`;
113
+ }
114
+ /** Ask Miso to verify the Enoki account and issue the exact message to sign. */
115
+ export async function requestAuthorizationChallenge(options) {
116
+ const expected = target(options.method, options.path);
117
+ if (!options.token || !isValidSuiAddress(options.address)) {
118
+ throw new MisoAuthError("challenge_rejected", "A valid Enoki token and Sui address are required.");
119
+ }
120
+ const apiUrl = new URL(options.apiUrl);
121
+ const challengeUrl = options.challengeUrl === undefined
122
+ ? new URL("/platform/auth/challenge", apiUrl.origin)
123
+ : new URL(options.challengeUrl, apiUrl);
124
+ const fetcher = options.fetch ?? globalThis.fetch;
125
+ const response = await fetcher(challengeUrl, {
126
+ method: "POST",
127
+ headers: {
128
+ Authorization: `Bearer ${options.token}`,
129
+ [MISO_AUTH_HEADERS.address]: normalizeSuiAddress(options.address),
130
+ "Content-Type": "application/json",
131
+ },
132
+ body: JSON.stringify(expected),
133
+ });
134
+ if (!response.ok) {
135
+ throw new MisoAuthError("challenge_rejected", await responseMessage(response), { status: response.status });
136
+ }
137
+ const body = await response.json().catch(() => null);
138
+ return parseChallenge(body, {
139
+ ...expected,
140
+ address: options.address,
141
+ network: options.network,
142
+ nowMs: options.nowMs,
143
+ });
144
+ }
145
+ /** Verify the challenge locally, sign it as a Sui personal message, and produce API headers. */
146
+ export async function createAuthorizationHeaders(options) {
147
+ const challenge = await requestAuthorizationChallenge(options);
148
+ let signature;
149
+ try {
150
+ const signed = await options.signer.signPersonalMessage(new TextEncoder().encode(challenge.payload));
151
+ signature = signed.signature;
152
+ }
153
+ catch (cause) {
154
+ throw new MisoAuthError("signing_failed", "The authorization request was not signed.", { cause });
155
+ }
156
+ if (!signature) {
157
+ throw new MisoAuthError("signing_failed", "The signer returned an empty authorization signature.");
158
+ }
159
+ return {
160
+ challenge,
161
+ headers: new Headers({
162
+ Authorization: `Bearer ${options.token}`,
163
+ [MISO_AUTH_HEADERS.address]: challenge.address,
164
+ [MISO_AUTH_HEADERS.signature]: signature,
165
+ [MISO_AUTH_HEADERS.issuedAt]: challenge.issuedAt,
166
+ }),
167
+ };
168
+ }
169
+ /** Perform a protected Miso API mutation with a fresh Enoki-verified Sui signature. */
170
+ export async function authenticatedFetch(input, options) {
171
+ const { auth, challengeUrl, fetch: fetchOption, ...init } = options;
172
+ const url = new URL(input);
173
+ const method = (init.method ?? "").toUpperCase();
174
+ if (url.search || url.hash) {
175
+ throw new MisoAuthError("invalid_target", "Authenticated request URLs cannot include a query or fragment.");
176
+ }
177
+ const fetcher = fetchOption ?? globalThis.fetch;
178
+ const authorization = await createAuthorizationHeaders({
179
+ apiUrl: url,
180
+ challengeUrl,
181
+ fetch: fetcher,
182
+ token: auth.token,
183
+ address: auth.address,
184
+ signer: auth.signer,
185
+ network: auth.network,
186
+ method,
187
+ path: url.pathname,
188
+ });
189
+ const headers = new Headers(init.headers);
190
+ authorization.headers.forEach((value, name) => headers.set(name, value));
191
+ return fetcher(url, { ...init, method, headers });
192
+ }
193
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,sCAAsC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAqB3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AACvD,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,KAAK,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,eAAe;IACxB,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,iBAAiB;CACnB,CAAC;AAQX,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAoB;IACxB,MAAM,CAAU;IAEzB,YAAY,IAAuB,EAAE,OAAe,EAAE,UAAgD,EAAE;QACtG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAED,sFAAsF;AACtF,MAAM,UAAU,4BAA4B,CAAC,MAA8B;IACzE,OAAO;QACL,8BAA8B;QAC9B,EAAE;QACF,WAAW,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;QACxC,SAAS,MAAM,CAAC,IAAI,EAAE;QACtB,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,cAAc,MAAM,CAAC,QAAQ,EAAE;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,IAAY;IACrE,OAAO,CACL,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,KAAK;QACpB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,+BAA+B,CAAC,KAAc,EAAE,QAAgB,IAAI,CAAC,GAAG,EAAE;IACxF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IACE,UAAU,GAAG,KAAK,GAAG,4BAA4B;QACjD,KAAK,GAAG,UAAU,GAAG,wBAAwB,EAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,IAAY;IAC1C,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,6DAA6D,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CACrB,KAAc,EACd,QAAkG;IAElG,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,sDAAsD,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,IAAI,GAAG,KAA+D,CAAC;IAC7E,IACE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;QACjC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;QAClC,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,EAC1D,CAAC;QACD,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,sDAAsD,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,SAAS,GAA2B;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IACF,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnG,IACE,CAAC,QAAQ;QACT,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAC/B,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAC3B,gBAAgB,KAAK,eAAe;QACpC,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC;QACrE,IAAI,CAAC,SAAS,KAAK,kBAAkB;QACrC,WAAW,IAAI,KAAK;QACpB,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,wBAAwB;QAC7D,IAAI,CAAC,OAAO,KAAK,4BAA4B,CAAC,SAAS,CAAC,EACxD,CAAC;QACD,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,yDAAyD,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAkB;IAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAGnD,CAAC;IACT,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACzG,IAAI,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IACvD,IAAI,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAC3D,OAAO,mCAAmC,QAAQ,CAAC,MAAM,IAAI,CAAC;AAChE,CAAC;AAcD,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAA6C;IAE7C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,mDAAmD,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS;QACrD,CAAC,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC;QACpD,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;YACxC,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC;YACjE,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,MAAM,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,cAAc,CAAC,IAAI,EAAE;QAC1B,GAAG,QAAQ;QACX,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC;AAMD,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA0C;IAE1C,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACrG,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,2CAA2C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,uDAAuD,CAAC,CAAC;IACrG,CAAC;IACD,OAAO;QACL,SAAS;QACT,OAAO,EAAE,IAAI,OAAO,CAAC;YACnB,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;YACxC,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO;YAC9C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,SAAS;YACxC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,QAAQ;SACjD,CAAC;KACH,CAAC;AACJ,CAAC;AAaD,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,OAAkC;IAElC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,gEAAgE,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,IAAI,UAAU,CAAC,KAAK,CAAC;IAChD,MAAM,aAAa,GAAG,MAAM,0BAA0B,CAAC;QACrD,MAAM,EAAE,GAAG;QACX,YAAY;QACZ,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,QAAQ;KACnB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC"}
package/dist/catalog.d.ts CHANGED
@@ -33,29 +33,16 @@ export declare function getReleaseTrackCredits(client: ClientWithCoreApi, graphq
33
33
  export declare function getTrackCreditsByRecordingIds(client: ClientWithCoreApi, graphqlClient: SuiGraphQLClient, recordingIdsInput: readonly string[], options: GetReleaseTrackCreditsOptions): Promise<Record<string, ReleaseTrackCredits>>;
34
34
  export interface GetAdministeredRecordingsOptions {
35
35
  /**
36
- * Maximum lookups in flight at once. The traversal is one lookup per admin
37
- * cap, so an artist with a large catalog would otherwise open as many
38
- * concurrent requests as they have recordings. Defaults to 10.
36
+ * @deprecated Resolution is batched; this option is retained for source
37
+ * compatibility and no longer affects request concurrency.
39
38
  */
40
39
  concurrency?: number;
41
40
  }
42
41
  /**
43
42
  * Every `Recording` administered by `owner`.
44
43
  *
45
- * Two stages: list the owner's `RecordingAdminCap`s over the Core API, then
46
- * resolve each cap's share type back to its recording.
47
- *
48
- * The second stage needs GraphQL and is inherently one lookup per cap, because
49
- * `RecordingAdminCap` carries no back-pointer to its recording — unlike
50
- * `ReleaseAdminCap`, which stores `release_id` and can therefore be resolved
51
- * entirely over the Core API. The caps are derived objects (recording → cap via
52
- * `deriveObjectID`), and that derivation cannot be inverted, so the share type
53
- * is the only link back. Adding a `recording_id: ID` field to
54
- * `RecordingAdminCap` on the protocol side would make this a pure Core-API
55
- * batch read and remove both the GraphQL dependency and the fan-out.
56
- *
57
- * Until then the lookups run concurrently in bounded batches rather than
58
- * serially.
44
+ * Three bounded stages: list the owner's `RecordingAdminCap`s, resolve every
45
+ * share type in one aliased GraphQL query, then batch-fetch the recordings.
59
46
  */
60
47
  export declare function getAdministeredRecordings(client: ClientWithCoreApi, graphqlClient: SuiGraphQLClient, owner: string, misoPackageId: string, options?: GetAdministeredRecordingsOptions): Promise<Recording[]>;
61
48
  //# sourceMappingURL=catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAML,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,6BAA6B;IAC5C,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,2BAA2B,EAAE,MAAM,CAAC;IACpC,gEAAgE;IAChE,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAQD;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAQ9C;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAoD9C;AAED,MAAM,WAAW,gCAAgC;IAC/C;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,SAAS,EAAE,CAAC,CAsBtB"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,6BAA6B;IAC5C,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,2BAA2B,EAAE,MAAM,CAAC;IACpC,gEAAgE;IAChE,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAQD;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAQ9C;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CA6D9C;AAED,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,gBAAgB,EAC/B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,SAAS,EAAE,CAAC,CAoBtB"}
package/dist/catalog.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // Copyright (c) Miso Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { getCompositionAddressByShareType, getOwnedRecordingAdminCaps, getRecordingByShareType, getRecordingShareTypes, getReleaseById, } from "@misonetwork/sdk";
4
- import { getCompositionCredits, getRecordingCredits, } from "./credits.js";
3
+ import { extractTypeParams2, getOwnedRecordingAdminCaps, getRecordingsByIds, getReleaseById, } from "@misonetwork/sdk";
4
+ import { getWorkAddressesByShareTypes } from "./read/works.js";
5
+ import { getCompositionCreditsByIds, getRecordingCreditsByIds, } from "./credits.js";
5
6
  const EMPTY_RECORDING_CREDITS = {
6
7
  credits: [],
7
8
  primaryArtistIds: [],
@@ -28,33 +29,42 @@ export async function getReleaseTrackCredits(client, graphqlClient, releaseId, o
28
29
  */
29
30
  export async function getTrackCreditsByRecordingIds(client, graphqlClient, recordingIdsInput, options) {
30
31
  const recordingIds = [...new Set(recordingIdsInput)];
31
- const recordingReads = await Promise.all(recordingIds.map(async (recordingId) => {
32
- const [recordingCredits, [, compositionShareType]] = await Promise.all([
33
- getRecordingCredits(client, recordingId, options.recordingCreditsPackageId),
34
- getRecordingShareTypes(client, recordingId),
35
- ]);
36
- return { recordingId, recordingCredits, compositionShareType };
37
- }));
38
- const compositionShareTypes = [...new Set(recordingReads.map((read) => read.compositionShareType))];
39
- const compositionAddressEntries = await Promise.all(compositionShareTypes.map(async (shareType) => {
40
- const compositionId = await getCompositionAddressByShareType(graphqlClient, shareType, options.misoPackageId);
41
- if (!compositionId)
32
+ if (recordingIds.length === 0)
33
+ return {};
34
+ const [recordingCreditsById, recordingObjects] = await Promise.all([
35
+ getRecordingCreditsByIds(client, recordingIds, options.recordingCreditsPackageId),
36
+ client.core.getObjects({ objectIds: recordingIds }),
37
+ ]);
38
+ const recordingReads = recordingObjects.objects.map((object, index) => {
39
+ const recordingId = recordingIds[index];
40
+ if (object instanceof Error)
41
+ throw object;
42
+ const [, compositionShareType] = extractTypeParams2(object.type);
43
+ return {
44
+ recordingId,
45
+ recordingCredits: recordingCreditsById[recordingId] ?? null,
46
+ compositionShareType,
47
+ };
48
+ });
49
+ const compositionShareTypes = [
50
+ ...new Set(recordingReads.map((read) => read.compositionShareType)),
51
+ ];
52
+ const addresses = await getWorkAddressesByShareTypes(graphqlClient, { compositions: compositionShareTypes, recordings: [] }, options.misoPackageId);
53
+ for (const shareType of compositionShareTypes) {
54
+ if (!addresses.compositions[shareType]) {
42
55
  throw new Error(`Composition not found for share type: ${shareType}`);
43
- return [shareType, compositionId];
44
- }));
45
- const compositionAddressByShareType = new Map(compositionAddressEntries);
46
- const compositionIds = [...new Set(compositionAddressEntries.map(([, compositionId]) => compositionId))];
47
- const compositionCreditEntries = await Promise.all(compositionIds.map(async (compositionId) => {
48
- const credits = await getCompositionCredits(client, compositionId, options.compositionCreditsPackageId);
49
- return [compositionId, credits ?? []];
50
- }));
51
- const compositionCreditsById = new Map(compositionCreditEntries);
56
+ }
57
+ }
58
+ const compositionIds = [
59
+ ...new Set(Object.values(addresses.compositions).filter((id) => id !== undefined)),
60
+ ];
61
+ const compositionCreditsById = await getCompositionCreditsByIds(client, compositionIds, options.compositionCreditsPackageId);
52
62
  return Object.fromEntries(recordingReads.map((read) => {
53
- const compositionId = compositionAddressByShareType.get(read.compositionShareType);
63
+ const compositionId = addresses.compositions[read.compositionShareType];
54
64
  return [
55
65
  read.recordingId,
56
66
  {
57
- compositionCredits: compositionCreditsById.get(compositionId) ?? [],
67
+ compositionCredits: compositionCreditsById[compositionId] ?? [],
58
68
  recordingCredits: read.recordingCredits ?? EMPTY_RECORDING_CREDITS,
59
69
  },
60
70
  ];
@@ -63,42 +73,20 @@ export async function getTrackCreditsByRecordingIds(client, graphqlClient, recor
63
73
  /**
64
74
  * Every `Recording` administered by `owner`.
65
75
  *
66
- * Two stages: list the owner's `RecordingAdminCap`s over the Core API, then
67
- * resolve each cap's share type back to its recording.
68
- *
69
- * The second stage needs GraphQL and is inherently one lookup per cap, because
70
- * `RecordingAdminCap` carries no back-pointer to its recording — unlike
71
- * `ReleaseAdminCap`, which stores `release_id` and can therefore be resolved
72
- * entirely over the Core API. The caps are derived objects (recording → cap via
73
- * `deriveObjectID`), and that derivation cannot be inverted, so the share type
74
- * is the only link back. Adding a `recording_id: ID` field to
75
- * `RecordingAdminCap` on the protocol side would make this a pure Core-API
76
- * batch read and remove both the GraphQL dependency and the fan-out.
77
- *
78
- * Until then the lookups run concurrently in bounded batches rather than
79
- * serially.
76
+ * Three bounded stages: list the owner's `RecordingAdminCap`s, resolve every
77
+ * share type in one aliased GraphQL query, then batch-fetch the recordings.
80
78
  */
81
79
  export async function getAdministeredRecordings(client, graphqlClient, owner, misoPackageId, options = {}) {
82
- const concurrency = Math.max(1, options.concurrency ?? 10);
80
+ void options;
83
81
  const caps = await getOwnedRecordingAdminCaps(client, owner, misoPackageId);
84
- const recordings = [];
85
- for (let i = 0; i < caps.length; i += concurrency) {
86
- const batch = caps.slice(i, i + concurrency);
87
- const settled = await Promise.all(batch.map(async (cap) => {
88
- try {
89
- return await getRecordingByShareType(client, graphqlClient, cap.shareType, misoPackageId);
90
- }
91
- catch {
92
- // A cap whose recording cannot be resolved is skipped rather than
93
- // failing the whole catalog — matching the previous behavior, where a
94
- // missing address was silently passed over.
95
- return null;
96
- }
97
- }));
98
- for (const rec of settled)
99
- if (rec)
100
- recordings.push(rec);
101
- }
102
- return recordings;
82
+ if (caps.length === 0)
83
+ return [];
84
+ const addresses = await getWorkAddressesByShareTypes(graphqlClient, { compositions: [], recordings: caps.map((cap) => cap.shareType) }, misoPackageId);
85
+ const byId = await getRecordingsByIds(client, Object.values(addresses.recordings).filter((id) => id !== undefined));
86
+ return caps.flatMap((cap) => {
87
+ const id = addresses.recordings[cap.shareType];
88
+ const recording = id ? byId[id] : undefined;
89
+ return recording ? [recording] : [];
90
+ });
103
91
  }
104
92
  //# sourceMappingURL=catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
package/dist/cover.d.ts CHANGED
@@ -45,4 +45,14 @@ export interface ReleaseCoverView {
45
45
  * animation) as normalized Walrus refs for the app's featured-pressing card.
46
46
  */
47
47
  export declare function getReleaseCover(client: ClientWithCoreApi, releaseId: string, releaseCoverArtPackageId: string): Promise<ReleaseCoverView | null>;
48
+ export declare function parseReleaseCoverContent(content: Uint8Array): ReleaseCoverView | null;
49
+ /** Deterministic dynamic-field id for one release-cover package generation. */
50
+ export declare function releaseCoverFieldId(releaseId: string, releaseCoverArtPackageId: string): string;
51
+ /**
52
+ * Read covers for many releases and package generations in one Core request.
53
+ *
54
+ * Package IDs are ordered newest to oldest. If both fields exist, the newest
55
+ * wins; legacy fallbacks add bytes to the same bulk request, not serial probes.
56
+ */
57
+ export declare function getReleaseCoversByIds(client: ClientWithCoreApi, releaseIdsInput: readonly string[], releaseCoverArtPackageIds: readonly string[]): Promise<Partial<Record<string, ReleaseCoverView>>>;
48
58
  //# sourceMappingURL=cover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cover.d.ts","sourceRoot":"","sources":["../src/cover.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAMjD,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qFAAqF;IACrF,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,wBAAwB,EAAE,MAAM,CAAC;IACjC,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAoBjE;AAID;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAuBD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,EACjB,wBAAwB,EAAE,MAAM,GAC/B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0BlC"}
1
+ {"version":3,"file":"cover.d.ts","sourceRoot":"","sources":["../src/cover.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qFAAqF;IACrF,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,kFAAkF;IAClF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,wBAAwB,EAAE,MAAM,CAAC;IACjC,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAgCjE;AAID;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAkCD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,EACjB,wBAAwB,EAAE,MAAM,GAC/B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUlC;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,UAAU,GAClB,gBAAgB,GAAG,IAAI,CAWzB;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,wBAAwB,EAAE,MAAM,GAC/B,MAAM,CAMR;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,yBAAyB,EAAE,SAAS,MAAM,EAAE,GAC3C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CA8BpD"}