@misofm/platform 0.0.0 → 0.18.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.
- package/LICENSE +201 -0
- package/README.md +686 -3
- package/dist/auth.d.ts +73 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +193 -0
- package/dist/auth.js.map +1 -0
- package/dist/catalog.d.ts +48 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +92 -0
- package/dist/catalog.js.map +1 -0
- package/dist/client.d.ts +462 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +788 -0
- package/dist/client.js.map +1 -0
- package/dist/contracts.d.ts +34 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +49 -0
- package/dist/contracts.js.map +1 -0
- package/dist/cover.d.ts +69 -0
- package/dist/cover.d.ts.map +1 -0
- package/dist/cover.js +132 -0
- package/dist/cover.js.map +1 -0
- package/dist/credits.d.ts +200 -0
- package/dist/credits.d.ts.map +1 -0
- package/dist/credits.js +465 -0
- package/dist/credits.js.map +1 -0
- package/dist/deployments.d.ts +224 -0
- package/dist/deployments.d.ts.map +1 -0
- package/dist/deployments.js +177 -0
- package/dist/deployments.js.map +1 -0
- package/dist/execute.d.ts +30 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +31 -0
- package/dist/execute.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +13 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +41 -0
- package/dist/internal.js.map +1 -0
- package/dist/mix.d.ts +144 -0
- package/dist/mix.d.ts.map +1 -0
- package/dist/mix.js +656 -0
- package/dist/mix.js.map +1 -0
- package/dist/pressing.d.ts +137 -0
- package/dist/pressing.d.ts.map +1 -0
- package/dist/pressing.js +390 -0
- package/dist/pressing.js.map +1 -0
- package/dist/publication.d.ts +216 -0
- package/dist/publication.d.ts.map +1 -0
- package/dist/publication.js +872 -0
- package/dist/publication.js.map +1 -0
- package/dist/queries.d.ts +2 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +8 -0
- package/dist/queries.js.map +1 -0
- package/dist/read/artist.d.ts +18 -0
- package/dist/read/artist.d.ts.map +1 -0
- package/dist/read/artist.js +86 -0
- package/dist/read/artist.js.map +1 -0
- package/dist/read/catalog.d.ts +93 -0
- package/dist/read/catalog.d.ts.map +1 -0
- package/dist/read/catalog.js +441 -0
- package/dist/read/catalog.js.map +1 -0
- package/dist/read/client.d.ts +37 -0
- package/dist/read/client.d.ts.map +1 -0
- package/dist/read/client.js +50 -0
- package/dist/read/client.js.map +1 -0
- package/dist/read/config.d.ts +68 -0
- package/dist/read/config.d.ts.map +1 -0
- package/dist/read/config.js +63 -0
- package/dist/read/config.js.map +1 -0
- package/dist/read/genres.d.ts +7 -0
- package/dist/read/genres.d.ts.map +1 -0
- package/dist/read/genres.js +38 -0
- package/dist/read/genres.js.map +1 -0
- package/dist/read/index.d.ts +14 -0
- package/dist/read/index.d.ts.map +1 -0
- package/dist/read/index.js +23 -0
- package/dist/read/index.js.map +1 -0
- package/dist/read/internal/scalars.d.ts +23 -0
- package/dist/read/internal/scalars.d.ts.map +1 -0
- package/dist/read/internal/scalars.js +57 -0
- package/dist/read/internal/scalars.js.map +1 -0
- package/dist/read/internal/walrus.d.ts +6 -0
- package/dist/read/internal/walrus.d.ts.map +1 -0
- package/dist/read/internal/walrus.js +29 -0
- package/dist/read/internal/walrus.js.map +1 -0
- package/dist/read/receipts.d.ts +41 -0
- package/dist/read/receipts.d.ts.map +1 -0
- package/dist/read/receipts.js +398 -0
- package/dist/read/receipts.js.map +1 -0
- package/dist/read/types.d.ts +328 -0
- package/dist/read/types.d.ts.map +1 -0
- package/dist/read/types.js +21 -0
- package/dist/read/types.js.map +1 -0
- package/dist/read/wallet.d.ts +74 -0
- package/dist/read/wallet.d.ts.map +1 -0
- package/dist/read/wallet.js +578 -0
- package/dist/read/wallet.js.map +1 -0
- package/dist/read/works.d.ts +29 -0
- package/dist/read/works.d.ts.map +1 -0
- package/dist/read/works.js +191 -0
- package/dist/read/works.js.map +1 -0
- package/dist/recording-extensions.d.ts +62 -0
- package/dist/recording-extensions.d.ts.map +1 -0
- package/dist/recording-extensions.js +159 -0
- package/dist/recording-extensions.js.map +1 -0
- package/dist/release-extensions.d.ts +93 -0
- package/dist/release-extensions.d.ts.map +1 -0
- package/dist/release-extensions.js +190 -0
- package/dist/release-extensions.js.map +1 -0
- package/dist/release-graph.d.ts +65 -0
- package/dist/release-graph.d.ts.map +1 -0
- package/dist/release-graph.js +136 -0
- package/dist/release-graph.js.map +1 -0
- package/dist/share-template.d.ts +3 -0
- package/dist/share-template.d.ts.map +1 -0
- package/dist/share-template.js +46 -0
- package/dist/share-template.js.map +1 -0
- package/dist/share.d.ts +67 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/share.js +157 -0
- package/dist/share.js.map +1 -0
- package/dist/transactions.d.ts +216 -0
- package/dist/transactions.d.ts.map +1 -0
- package/dist/transactions.js +314 -0
- package/dist/transactions.js.map +1 -0
- package/dist/vault.d.ts +364 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +507 -0
- package/dist/vault.js.map +1 -0
- package/package.json +145 -5
- package/src/auth.ts +275 -0
- package/src/catalog.ts +189 -0
- package/src/client.ts +1320 -0
- package/src/contracts.ts +54 -0
- package/src/cover.ts +240 -0
- package/src/credits.ts +906 -0
- package/src/deployments.ts +357 -0
- package/src/execute.ts +52 -0
- package/src/index.ts +69 -0
- package/src/internal.ts +46 -0
- package/src/mix.ts +910 -0
- package/src/pressing.ts +705 -0
- package/src/publication.ts +1214 -0
- package/src/queries.ts +9 -0
- package/src/read/artist.ts +118 -0
- package/src/read/catalog.ts +668 -0
- package/src/read/client.ts +87 -0
- package/src/read/config.ts +138 -0
- package/src/read/genres.ts +37 -0
- package/src/read/index.ts +85 -0
- package/src/read/internal/scalars.ts +59 -0
- package/src/read/internal/walrus.ts +42 -0
- package/src/read/receipts.ts +476 -0
- package/src/read/types.ts +415 -0
- package/src/read/wallet.ts +687 -0
- package/src/read/works.ts +297 -0
- package/src/recording-extensions.ts +256 -0
- package/src/release-extensions.ts +311 -0
- package/src/release-graph.ts +219 -0
- package/src/share-template.ts +55 -0
- package/src/share.ts +261 -0
- package/src/transactions.ts +542 -0
- package/src/vault.ts +1009 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
//
|
|
4
|
+
// Catalog reads: pressings, releases, covers, credits, tracklists, and the
|
|
5
|
+
// Discover shelf. Everything here is PUBLIC — no address is involved and no two
|
|
6
|
+
// callers get different answers, which is what makes this layer edge-cacheable.
|
|
7
|
+
//
|
|
8
|
+
// The composition of these reads is the point. A pressing page used to cost the
|
|
9
|
+
// browser five sequential round-trips to the chain (pressing → release → cover →
|
|
10
|
+
// credits → recordings); the same work happens once here, inside one datacenter,
|
|
11
|
+
// and every subsequent visitor is served from cache.
|
|
12
|
+
import { deriveListingId, getListing, getPressing, getRecord, getSale, } from "../pressing.js";
|
|
13
|
+
import { requireRecordSalesDeployment } from "../deployments.js";
|
|
14
|
+
import { getReleaseCoversByIds, parseReleaseCoverContent, releaseCoverFieldId, } from "../cover.js";
|
|
15
|
+
import { getReleaseCreditsByIds, parseReleaseCreditsContent, releaseCreditsFieldId, } from "../credits.js";
|
|
16
|
+
import { parseReleaseKindContent, releaseKindFieldId, } from "../release-extensions.js";
|
|
17
|
+
import { getRecordingMasterReferencesByIds } from "../recording-extensions.js";
|
|
18
|
+
import { getReleaseMixReferences, walrusBlobIdFromU256, } from "../mix.js";
|
|
19
|
+
import { getTrackCreditsByRecordingIds } from "../catalog.js";
|
|
20
|
+
import { getReleaseById, getReleasesByIds, isNotFound } from "@misofm/protocol";
|
|
21
|
+
import { getRecordingTitles, parseReleaseObject } from "./works.js";
|
|
22
|
+
import { int } from "./internal/scalars.js";
|
|
23
|
+
import { quiltPatchId, u256ToB64Url, walrusBlobReadUrl, } from "./internal/walrus.js";
|
|
24
|
+
// ── Walrus URLs ──────────────────────────────────────────────────────────────
|
|
25
|
+
/** Aggregator URL for a cover image ref, whichever Walrus variant it is. */
|
|
26
|
+
function imageUrl(aggregator, ref) {
|
|
27
|
+
const base = aggregator.replace(/\/$/, "");
|
|
28
|
+
if (ref.kind === "blob")
|
|
29
|
+
return walrusBlobReadUrl(base, ref.blobId);
|
|
30
|
+
const patch = quiltPatchId(ref.quiltId, ref.version, ref.startIndex, ref.endIndex);
|
|
31
|
+
return `${base}/v1/blobs/by-quilt-patch-id/${patch}`;
|
|
32
|
+
}
|
|
33
|
+
function toCover(aggregator, view) {
|
|
34
|
+
if (!view)
|
|
35
|
+
return null;
|
|
36
|
+
const image = (ref) => ({
|
|
37
|
+
kind: ref.kind,
|
|
38
|
+
url: imageUrl(aggregator, ref),
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
still: image(view.still),
|
|
42
|
+
animated: view.animated ? image(view.animated) : null,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// ── Currency ─────────────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Symbol + decimals for a coin type. FakeUsd (the testnet dollar) is 6dp; SUI is
|
|
48
|
+
* 9dp; anything else falls back to its module name at 9dp, which is the Sui
|
|
49
|
+
* default and the honest guess for a coin we have no table entry for.
|
|
50
|
+
*/
|
|
51
|
+
export function currencyInfo(type) {
|
|
52
|
+
if (!type)
|
|
53
|
+
return { type: null, symbol: "COIN", decimals: 9 };
|
|
54
|
+
if (/::fakeusd::/i.test(type))
|
|
55
|
+
return { type, symbol: "FAKEUSD", decimals: 6 };
|
|
56
|
+
if (type === "0x2::sui::SUI")
|
|
57
|
+
return { type, symbol: "SUI", decimals: 9 };
|
|
58
|
+
return {
|
|
59
|
+
type,
|
|
60
|
+
symbol: (type.split("::").pop() ?? "COIN").toUpperCase(),
|
|
61
|
+
decimals: 9,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ── Projections ──────────────────────────────────────────────────────────────
|
|
65
|
+
function toPressingView(pressing) {
|
|
66
|
+
return {
|
|
67
|
+
id: pressing.id,
|
|
68
|
+
releaseId: pressing.releaseId,
|
|
69
|
+
edition: pressing.edition,
|
|
70
|
+
supply: pressing.supply,
|
|
71
|
+
maxSupply: pressing.maxSupply,
|
|
72
|
+
distributors: [...pressing.distributors],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function toListingView(listing) {
|
|
76
|
+
const price = {
|
|
77
|
+
kind: listing.pricing.kind,
|
|
78
|
+
amount: listing.pricing.amount,
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
id: listing.id,
|
|
82
|
+
pressingId: listing.pressingId,
|
|
83
|
+
releaseId: listing.releaseId,
|
|
84
|
+
pricing: price,
|
|
85
|
+
currency: currencyInfo(listing.currencyType),
|
|
86
|
+
state: listing.state,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function toSaleView(pressing, listing) {
|
|
90
|
+
return { pressing: toPressingView(pressing), listing: toListingView(listing) };
|
|
91
|
+
}
|
|
92
|
+
/** One permanent pressing, projected to the JSON-safe read boundary. */
|
|
93
|
+
export async function getPressingView(client, pressingId) {
|
|
94
|
+
const sales = requireRecordSalesDeployment(client.config.recordSales);
|
|
95
|
+
const pressing = await getPressing(client.protocol, pressingId, sales.recordPackageId);
|
|
96
|
+
return pressing ? toPressingView(pressing) : null;
|
|
97
|
+
}
|
|
98
|
+
/** One currency-specific listing derived from its permanent pressing. */
|
|
99
|
+
export async function getListingView(client, pressingId, currencyType) {
|
|
100
|
+
const sales = requireRecordSalesDeployment(client.config.recordSales);
|
|
101
|
+
const listingId = deriveListingId(pressingId, currencyType, sales.recordShopPackageId);
|
|
102
|
+
const listing = await getListing(client.protocol, listingId, sales.recordShopPackageId);
|
|
103
|
+
return listing ? toListingView(listing) : null;
|
|
104
|
+
}
|
|
105
|
+
function toWorkState(state) {
|
|
106
|
+
return state.type === "Published"
|
|
107
|
+
? { type: "Published", timestampMs: state.timestampMs }
|
|
108
|
+
: { type: "Initialized" };
|
|
109
|
+
}
|
|
110
|
+
function toCredits(credits) {
|
|
111
|
+
return (credits ?? []).map((c) => ({
|
|
112
|
+
partyId: c.partyId,
|
|
113
|
+
displayName: c.displayName,
|
|
114
|
+
roles: [...c.roles],
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
/** The release's PRIMARY credits, in chain order — a release's artist line. */
|
|
118
|
+
export function primaryArtistNames(credits) {
|
|
119
|
+
return credits
|
|
120
|
+
.filter((c) => c.roles.includes("Primary"))
|
|
121
|
+
.map((c) => c.displayName);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Number the protocol's flat tracklist. Display grouping such as discs belongs
|
|
125
|
+
* to metadata extensions and can be layered onto this projection later.
|
|
126
|
+
*/
|
|
127
|
+
export function toTracks(release, titles, masterBlobIds, mixBlobIds = {}) {
|
|
128
|
+
return release.tracks.map((track, index) => {
|
|
129
|
+
const masterBlobId = masterBlobIds[track.recordingId];
|
|
130
|
+
const mixBlobId = mixBlobIds[index];
|
|
131
|
+
return {
|
|
132
|
+
no: `${index + 1}`,
|
|
133
|
+
title: titles[track.recordingId] ?? "Untitled",
|
|
134
|
+
recordingId: track.recordingId,
|
|
135
|
+
compositionId: track.compositionId,
|
|
136
|
+
splitBps: int(track.splitBps.value),
|
|
137
|
+
disc: 1,
|
|
138
|
+
...(masterBlobId ? { masterBlobId } : {}),
|
|
139
|
+
...(mixBlobId ? { mixBlobId } : {}),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// ── Cover ────────────────────────────────────────────────────────────────────
|
|
144
|
+
/** A release's cover from the configured `release_cover_art` package. */
|
|
145
|
+
export async function readReleaseCover(client, releaseId) {
|
|
146
|
+
const { releaseCoverArt } = client.config.protocol;
|
|
147
|
+
const covers = await getReleaseCoversByIds(client.protocol, [releaseId], releaseCoverArt).catch(() => ({}));
|
|
148
|
+
return toCover(client.config.walrusAggregatorUrl, covers[releaseId] ?? null);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A release plus selected derived resources in one heterogeneous Core batch.
|
|
152
|
+
* Every extension id is deterministic, so separate object calls only add
|
|
153
|
+
* network round trips without discovering anything new.
|
|
154
|
+
*/
|
|
155
|
+
export async function getReleaseResources(client, releaseId, include = []) {
|
|
156
|
+
const wantsCover = include.includes("cover");
|
|
157
|
+
const wantsCredits = include.includes("credits");
|
|
158
|
+
const wantsKind = include.includes("kind");
|
|
159
|
+
const coverFieldIds = wantsCover
|
|
160
|
+
? [releaseCoverFieldId(releaseId, client.config.protocol.releaseCoverArt)]
|
|
161
|
+
: [];
|
|
162
|
+
const creditsFieldId = wantsCredits
|
|
163
|
+
? releaseCreditsFieldId(releaseId, client.config.protocol.releaseCredits)
|
|
164
|
+
: null;
|
|
165
|
+
const kindFieldId = wantsKind
|
|
166
|
+
? releaseKindFieldId(releaseId, client.config.protocol.releaseKind)
|
|
167
|
+
: null;
|
|
168
|
+
const objectIds = [
|
|
169
|
+
releaseId,
|
|
170
|
+
...coverFieldIds,
|
|
171
|
+
...(creditsFieldId ? [creditsFieldId] : []),
|
|
172
|
+
...(kindFieldId ? [kindFieldId] : []),
|
|
173
|
+
];
|
|
174
|
+
const { objects } = await client.protocol.core.getObjects({
|
|
175
|
+
objectIds,
|
|
176
|
+
include: { content: true },
|
|
177
|
+
});
|
|
178
|
+
const releaseObject = objects[0];
|
|
179
|
+
if (!releaseObject)
|
|
180
|
+
throw new Error(`Release not found: ${releaseId}`);
|
|
181
|
+
if (releaseObject instanceof Error)
|
|
182
|
+
throw releaseObject;
|
|
183
|
+
if (!releaseObject.content)
|
|
184
|
+
throw new Error(`Release has no content: ${releaseId}`);
|
|
185
|
+
const release = parseReleaseObject(releaseObject.objectId, releaseObject.content);
|
|
186
|
+
let cover;
|
|
187
|
+
if (wantsCover) {
|
|
188
|
+
let view = null;
|
|
189
|
+
for (let index = 0; index < coverFieldIds.length; index += 1) {
|
|
190
|
+
const object = objects[index + 1];
|
|
191
|
+
if (!object || object instanceof Error || !object.content)
|
|
192
|
+
continue;
|
|
193
|
+
try {
|
|
194
|
+
view = parseReleaseCoverContent(object.content);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
view = null;
|
|
198
|
+
}
|
|
199
|
+
if (view)
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
cover = toCover(client.config.walrusAggregatorUrl, view);
|
|
203
|
+
}
|
|
204
|
+
let credits;
|
|
205
|
+
if (wantsCredits) {
|
|
206
|
+
const object = objects[1 + coverFieldIds.length];
|
|
207
|
+
let view = [];
|
|
208
|
+
if (object && !(object instanceof Error) && object.content) {
|
|
209
|
+
try {
|
|
210
|
+
view = parseReleaseCreditsContent(object.content);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
view = [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
credits = toCredits(view);
|
|
217
|
+
}
|
|
218
|
+
let kind;
|
|
219
|
+
if (wantsKind) {
|
|
220
|
+
const object = objects[1 + coverFieldIds.length + (creditsFieldId ? 1 : 0)];
|
|
221
|
+
kind =
|
|
222
|
+
object && !(object instanceof Error) && object.content
|
|
223
|
+
? parseReleaseKindContent(object.content)
|
|
224
|
+
: null;
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
release,
|
|
228
|
+
...(wantsCover ? { cover: cover ?? null } : {}),
|
|
229
|
+
...(wantsCredits ? { credits: credits ?? [] } : {}),
|
|
230
|
+
...(wantsKind ? { kind: kind ?? null } : {}),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
export async function getReleaseDetail(client, releaseId, options = {}) {
|
|
234
|
+
const { release, cover, credits, kind } = await getReleaseResources(client, releaseId, ["cover", "credits", "kind"]);
|
|
235
|
+
const recordingIds = release.tracks.map((track) => track.recordingId);
|
|
236
|
+
const mixPackageId = client.config.protocol.releaseMixReference;
|
|
237
|
+
const [titles, masterReferences, mixReferences, trackCredits] = await Promise.all([
|
|
238
|
+
getRecordingTitles(client.protocol, client.graphql, recordingIds, client.config.deployment.miso),
|
|
239
|
+
getRecordingMasterReferencesByIds(client.protocol, recordingIds, client.config.protocol.recordingMasterReference).catch(() => ({})),
|
|
240
|
+
mixPackageId
|
|
241
|
+
? getReleaseMixReferences(client.protocol, releaseId, mixPackageId).catch(() => null)
|
|
242
|
+
: Promise.resolve(null),
|
|
243
|
+
options.include?.includes("trackCredits")
|
|
244
|
+
? getTrackCreditsForRecordingIds(client, recordingIds)
|
|
245
|
+
: Promise.resolve(undefined),
|
|
246
|
+
]);
|
|
247
|
+
const masterBlobIds = {};
|
|
248
|
+
for (const [recordingId, blobId] of Object.entries(masterReferences)) {
|
|
249
|
+
if (blobId)
|
|
250
|
+
masterBlobIds[recordingId] = u256ToB64Url(blobId);
|
|
251
|
+
}
|
|
252
|
+
const mixBlobIds = {};
|
|
253
|
+
for (let index = 0; index < (mixReferences?.length ?? 0); index += 1) {
|
|
254
|
+
const reference = mixReferences?.[index];
|
|
255
|
+
if (reference)
|
|
256
|
+
mixBlobIds[index] = walrusBlobIdFromU256(reference.blobId);
|
|
257
|
+
}
|
|
258
|
+
const creditViews = credits ?? [];
|
|
259
|
+
return {
|
|
260
|
+
id: release.id,
|
|
261
|
+
title: release.title,
|
|
262
|
+
subtitle: null,
|
|
263
|
+
kind: kind ?? null,
|
|
264
|
+
state: toWorkState(release.state),
|
|
265
|
+
publishedAtMs: release.state.type === "Published" ? release.state.timestampMs : null,
|
|
266
|
+
cover: cover ?? null,
|
|
267
|
+
credits: creditViews,
|
|
268
|
+
primaryArtists: primaryArtistNames(creditViews),
|
|
269
|
+
discCount: release.tracks.length > 0 ? 1 : 0,
|
|
270
|
+
tracks: toTracks(release, titles, masterBlobIds, mixBlobIds),
|
|
271
|
+
...(trackCredits !== undefined ? { trackCredits } : {}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
async function getTrackCreditsForRecordingIds(client, recordingIds) {
|
|
275
|
+
const { compositionCredits, recordingCredits } = client.config.protocol;
|
|
276
|
+
const tracks = await getTrackCreditsByRecordingIds(client.protocol, client.graphql, recordingIds, {
|
|
277
|
+
misoPackageId: client.config.deployment.miso,
|
|
278
|
+
compositionCreditsPackageId: compositionCredits,
|
|
279
|
+
recordingCreditsPackageId: recordingCredits,
|
|
280
|
+
});
|
|
281
|
+
return Object.fromEntries(Object.entries(tracks).map(([id, track]) => [
|
|
282
|
+
id,
|
|
283
|
+
{
|
|
284
|
+
compositionCredits: toCredits(track.compositionCredits),
|
|
285
|
+
recordingCredits: {
|
|
286
|
+
credits: toCredits(track.recordingCredits.credits),
|
|
287
|
+
primaryArtistIds: [...track.recordingCredits.primaryArtistIds],
|
|
288
|
+
featuredArtistIds: [...track.recordingCredits.featuredArtistIds],
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
]));
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Per-track credits for a release, keyed by recording id. A track with no credits
|
|
295
|
+
* set maps to an empty entry rather than being absent, so a caller can tell
|
|
296
|
+
* "nothing credited" from "no such track".
|
|
297
|
+
*/
|
|
298
|
+
export async function getTrackCredits(client, releaseId) {
|
|
299
|
+
const release = await getReleaseById(client.protocol, releaseId);
|
|
300
|
+
const recordingIds = release.tracks.map((track) => track.recordingId);
|
|
301
|
+
return getTrackCreditsForRecordingIds(client, recordingIds);
|
|
302
|
+
}
|
|
303
|
+
// ── Pressing ─────────────────────────────────────────────────────────────────
|
|
304
|
+
/** Everything a Pressing page renders. `null` when no such Pressing exists. */
|
|
305
|
+
export async function getPressingDetail(client, pressingId, options = {}) {
|
|
306
|
+
const pressing = await getPressingView(client, pressingId);
|
|
307
|
+
if (!pressing)
|
|
308
|
+
return null;
|
|
309
|
+
const release = await getReleaseDetail(client, pressing.releaseId, options);
|
|
310
|
+
return { pressing, release };
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* A Pressing page plus one currency-specific Listing. Unlike `getSaleDetail`,
|
|
314
|
+
* this starts from a Pressing id, which is the durable route and Party-feature
|
|
315
|
+
* reference exposed to users.
|
|
316
|
+
*/
|
|
317
|
+
export async function getPressingSaleDetail(client, pressingId, currencyType, options = {}) {
|
|
318
|
+
const pressing = await getPressingView(client, pressingId);
|
|
319
|
+
if (!pressing)
|
|
320
|
+
return null;
|
|
321
|
+
const [listing, release] = await Promise.all([
|
|
322
|
+
getListingView(client, pressing.id, currencyType),
|
|
323
|
+
getReleaseDetail(client, pressing.releaseId, options),
|
|
324
|
+
]);
|
|
325
|
+
if (!listing)
|
|
326
|
+
return null;
|
|
327
|
+
return { sale: { pressing, listing }, release };
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* The confirmation preview behind "paste a pressing id to pin it". Verifies the
|
|
331
|
+
* object really is a `Pressing` before spending reads on it — a release id or a
|
|
332
|
+
* record id pasted by mistake must come back as `null`, not as a half-built card.
|
|
333
|
+
*/
|
|
334
|
+
export async function getPressingPreview(client, pressingId) {
|
|
335
|
+
const pressing = await getPressingView(client, pressingId);
|
|
336
|
+
if (!pressing)
|
|
337
|
+
return null;
|
|
338
|
+
const { release, cover } = await getReleaseResources(client, pressing.releaseId, ["cover"]);
|
|
339
|
+
return {
|
|
340
|
+
pressingId,
|
|
341
|
+
title: release.title,
|
|
342
|
+
subtitle: null,
|
|
343
|
+
coverUrl: cover?.still.url ?? null,
|
|
344
|
+
edition: pressing.edition,
|
|
345
|
+
supply: pressing.supply,
|
|
346
|
+
maxSupply: pressing.maxSupply,
|
|
347
|
+
trackCount: release.tracks.length,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Everything a currency-specific buy page renders. The Listing is derived from
|
|
352
|
+
* the release's Pressing and the requested currency, never found through mutable
|
|
353
|
+
* lookup state.
|
|
354
|
+
*/
|
|
355
|
+
export async function getSaleDetail(client, releaseId, edition, currencyType, options = {}) {
|
|
356
|
+
const sales = requireRecordSalesDeployment(client.config.recordSales);
|
|
357
|
+
const sale = await getSale(client.protocol, {
|
|
358
|
+
releaseId,
|
|
359
|
+
edition,
|
|
360
|
+
currencyType,
|
|
361
|
+
recordPackageId: sales.recordPackageId,
|
|
362
|
+
recordShopPackageId: sales.recordShopPackageId,
|
|
363
|
+
});
|
|
364
|
+
if (!sale.pressing || !sale.listing)
|
|
365
|
+
return null;
|
|
366
|
+
const release = await getReleaseDetail(client, sale.pressing.releaseId, options);
|
|
367
|
+
return { sale: toSaleView(sale.pressing, sale.listing), release };
|
|
368
|
+
}
|
|
369
|
+
// ── Discover ─────────────────────────────────────────────────────────────────
|
|
370
|
+
/**
|
|
371
|
+
* The records currently on sale.
|
|
372
|
+
*
|
|
373
|
+
* Configured by release + edition + currency: both addresses are deterministic.
|
|
374
|
+
*/
|
|
375
|
+
export async function getDiscoverShelf(client) {
|
|
376
|
+
const configuredSales = [...client.config.discoverSales];
|
|
377
|
+
const sales = requireRecordSalesDeployment(client.config.recordSales);
|
|
378
|
+
const settled = await Promise.all(configuredSales.map(async (configured) => ({
|
|
379
|
+
configured,
|
|
380
|
+
result: await getSale(client.protocol, {
|
|
381
|
+
...configured,
|
|
382
|
+
recordPackageId: sales.recordPackageId,
|
|
383
|
+
recordShopPackageId: sales.recordShopPackageId,
|
|
384
|
+
}),
|
|
385
|
+
})));
|
|
386
|
+
const available = settled.filter((item) => item.result.pressing !== null && item.result.listing !== null);
|
|
387
|
+
const releaseIds = [...new Set(available.map((item) => item.result.pressing.releaseId))];
|
|
388
|
+
if (releaseIds.length === 0)
|
|
389
|
+
return [];
|
|
390
|
+
const [releases, coverViews, credits] = await Promise.all([
|
|
391
|
+
getReleasesByIds(client.protocol, releaseIds),
|
|
392
|
+
getReleaseCoversByIds(client.protocol, releaseIds, client.config.protocol.releaseCoverArt).catch(() => ({})),
|
|
393
|
+
getReleaseCreditsByIds(client.protocol, releaseIds, client.config.protocol.releaseCredits).catch(() => ({})),
|
|
394
|
+
]);
|
|
395
|
+
return available.flatMap(({ result }) => {
|
|
396
|
+
const releaseId = result.pressing.releaseId;
|
|
397
|
+
const release = releases[releaseId];
|
|
398
|
+
if (!release)
|
|
399
|
+
return [];
|
|
400
|
+
const cover = toCover(client.config.walrusAggregatorUrl, coverViews[releaseId] ?? null);
|
|
401
|
+
return [
|
|
402
|
+
{
|
|
403
|
+
sale: toSaleView(result.pressing, result.listing),
|
|
404
|
+
releaseId,
|
|
405
|
+
title: release.title,
|
|
406
|
+
artist: primaryArtistNames(toCredits(credits[releaseId] ?? null)).join(", "),
|
|
407
|
+
coverUrl: cover?.still.url ?? null,
|
|
408
|
+
},
|
|
409
|
+
];
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
export async function getRecordAlbum(client, recordId, options = {}) {
|
|
413
|
+
try {
|
|
414
|
+
const sales = requireRecordSalesDeployment(client.config.recordSales);
|
|
415
|
+
const record = await getRecord(client.protocol, recordId, sales.recordPackageId);
|
|
416
|
+
if (!record)
|
|
417
|
+
return null;
|
|
418
|
+
const releaseId = record.releaseId;
|
|
419
|
+
const includeRelease = options.include?.some((part) => part === "release" || part === "trackCredits") ?? false;
|
|
420
|
+
const release = includeRelease && releaseId
|
|
421
|
+
? await getReleaseDetail(client, releaseId, {
|
|
422
|
+
include: options.include?.includes("trackCredits")
|
|
423
|
+
? ["trackCredits"]
|
|
424
|
+
: [],
|
|
425
|
+
})
|
|
426
|
+
: includeRelease
|
|
427
|
+
? null
|
|
428
|
+
: undefined;
|
|
429
|
+
return {
|
|
430
|
+
recordId,
|
|
431
|
+
releaseId,
|
|
432
|
+
...(includeRelease ? { release } : {}),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
catch (e) {
|
|
436
|
+
if (isNotFound(e))
|
|
437
|
+
return null;
|
|
438
|
+
throw e;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/read/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SuiGrpcClient } from "@mysten/sui/grpc";
|
|
2
|
+
import { SuiGraphQLClient } from "@mysten/sui/graphql";
|
|
3
|
+
import { type MisoProtocolClient } from "@misofm/protocol/client";
|
|
4
|
+
import { type MisoConfig, type MisoConfigOverrides, type Network } from "./config.ts";
|
|
5
|
+
/**
|
|
6
|
+
* The structural slice of a Sui client the protocol SDK's read helpers want. They
|
|
7
|
+
* declare `ClientWithCoreApi` against their own @mysten/sui; this alias names the
|
|
8
|
+
* same shape from our side so the one cast in `createMisoClient` is explicit
|
|
9
|
+
* rather than an `any` smeared across the codebase.
|
|
10
|
+
*/
|
|
11
|
+
export type ProtocolClient = Parameters<typeof import("@misofm/protocol").getReleaseById>[0];
|
|
12
|
+
/** A GraphQL client in the shape the protocol SDK's type-discovery queries want. */
|
|
13
|
+
export type ProtocolGraphQLClient = SuiGraphQLClient;
|
|
14
|
+
export interface MisoClient {
|
|
15
|
+
config: MisoConfig;
|
|
16
|
+
/** gRPC data plane, including Party at `sui.miso.party`. */
|
|
17
|
+
sui: SuiGrpcClient & {
|
|
18
|
+
miso: MisoProtocolClient;
|
|
19
|
+
};
|
|
20
|
+
/** The same client, typed for the protocol SDK's read helpers. */
|
|
21
|
+
protocol: ProtocolClient;
|
|
22
|
+
/** GraphQL RPC, typed for the protocol SDK's type-discovery queries. */
|
|
23
|
+
graphql: ProtocolGraphQLClient;
|
|
24
|
+
/** The raw GraphQL client, for this SDK's own queries (the pruned-transaction read). */
|
|
25
|
+
graphqlRaw: SuiGraphQLClient;
|
|
26
|
+
}
|
|
27
|
+
export interface CreateMisoClientOptions extends MisoConfigOverrides {
|
|
28
|
+
/** "testnet" | "mainnet". A bare string (e.g. a Worker's `NETWORK` var) is accepted. */
|
|
29
|
+
network?: Network | string;
|
|
30
|
+
/** Complete verified configuration for a custom or unbundled deployment. */
|
|
31
|
+
config?: MisoConfig;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build the client from a bundled network or a complete verified custom config.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createMisoClient(options?: CreateMisoClientOptions): MisoClient;
|
|
37
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/read/client.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAQ,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAA2B,KAAK,UAAU,EAAE,KAAK,mBAAmB,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAM/G;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7F,oFAAoF;AACpF,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,4DAA4D;IAC5D,GAAG,EAAE,aAAa,GAAG;QAAE,IAAI,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAClD,kEAAkE;IAClE,QAAQ,EAAE,cAAc,CAAC;IACzB,wEAAwE;IACxE,OAAO,EAAE,qBAAqB,CAAC;IAC/B,wFAAwF;IACxF,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CA0BlF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
//
|
|
4
|
+
// The one client every read in this SDK goes through.
|
|
5
|
+
//
|
|
6
|
+
// Two transports, because Sui splits the job:
|
|
7
|
+
// core (gRPC) the data plane — objects by id, objects by owner, balances,
|
|
8
|
+
// transactions. Everything cheap and current.
|
|
9
|
+
// graphql the two questions gRPC cannot answer: "which object has type X"
|
|
10
|
+
// (share type → work id, for the studio catalog and the receipt's
|
|
11
|
+
// royalty hop) and "what did this pruned transaction do".
|
|
12
|
+
//
|
|
13
|
+
// It also carries the resolved `MisoConfig`, so a read function takes ONE argument
|
|
14
|
+
// and never has a package id threaded through its signature.
|
|
15
|
+
//
|
|
16
|
+
// Party now shares the same network SDK registration and deployment as protocol
|
|
17
|
+
// core, so every read hangs off one `sui.miso` namespace.
|
|
18
|
+
import { SuiGrpcClient } from "@mysten/sui/grpc";
|
|
19
|
+
import { SuiGraphQLClient } from "@mysten/sui/graphql";
|
|
20
|
+
import { miso } from "@misofm/protocol/client";
|
|
21
|
+
import { misoConfig, networkFrom } from "./config.js";
|
|
22
|
+
function definedOverrides(value) {
|
|
23
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the client from a bundled network or a complete verified custom config.
|
|
27
|
+
*/
|
|
28
|
+
export function createMisoClient(options = {}) {
|
|
29
|
+
const { network, config: providedConfig, ...overrides } = options;
|
|
30
|
+
const requestedNetwork = networkFrom(network);
|
|
31
|
+
// A caller-supplied verified deployment may still override transport URLs or
|
|
32
|
+
// the discover shelf; undefined fields never erase verified config values.
|
|
33
|
+
const config = providedConfig
|
|
34
|
+
? { ...providedConfig, ...definedOverrides(overrides) }
|
|
35
|
+
: misoConfig(requestedNetwork, overrides);
|
|
36
|
+
if (network !== undefined && config.network !== requestedNetwork) {
|
|
37
|
+
throw new Error(`@misofm/platform/read: provided config is for ${config.network}, not ${requestedNetwork}.`);
|
|
38
|
+
}
|
|
39
|
+
const grpc = new SuiGrpcClient({ baseUrl: config.grpcUrl, network: config.network });
|
|
40
|
+
const graphqlRaw = new SuiGraphQLClient({ url: config.graphqlUrl, network: config.network });
|
|
41
|
+
const sui = grpc.$extend(miso({ deployment: config.deployment }));
|
|
42
|
+
return {
|
|
43
|
+
config,
|
|
44
|
+
sui,
|
|
45
|
+
protocol: sui,
|
|
46
|
+
graphql: graphqlRaw,
|
|
47
|
+
graphqlRaw,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/read/client.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,sCAAsC;AACtC,EAAE;AACF,sDAAsD;AACtD,EAAE;AACF,8CAA8C;AAC9C,6EAA6E;AAC7E,6DAA6D;AAC7D,iFAAiF;AACjF,iFAAiF;AACjF,yEAAyE;AACzE,EAAE;AACF,mFAAmF;AACnF,6DAA6D;AAC7D,EAAE;AACF,gFAAgF;AAChF,0DAA0D;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,IAAI,EAA2B,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAA2D,MAAM,aAAa,CAAC;AAE/G,SAAS,gBAAgB,CAAmB,KAAQ;IAClD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAe,CAAC;AAC1G,CAAC;AAgCD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAA4B,EAAE;IACpE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IAClE,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,MAAM,GAAG,cAAc;QAC3B,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,EAAE;QACvD,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,iDAAiD,MAAM,CAAC,OAAO,SAAS,gBAAgB,GAAG,CAC5F,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7F,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAElE,OAAO;QACL,MAAM;QACN,GAAG;QACH,QAAQ,EAAE,GAAgC;QAC1C,OAAO,EAAE,UAA8C;QACvD,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MisoDeployment } from "@misofm/protocol/deployments";
|
|
2
|
+
import { type RecordSalesDeployment } from "../deployments.ts";
|
|
3
|
+
export type Network = "testnet" | "mainnet";
|
|
4
|
+
/** Missing defaults to Testnet for local development; invalid values fail closed. */
|
|
5
|
+
export declare function networkFrom(value: string | undefined): Network;
|
|
6
|
+
/** Package ids for the miso protocol core and the extensions the read layer touches. */
|
|
7
|
+
export interface ProtocolIds {
|
|
8
|
+
/** `vault` — shared custody for protocol admin capabilities. */
|
|
9
|
+
vault: string;
|
|
10
|
+
/** `release_cover_art` — the release cover extension. */
|
|
11
|
+
releaseCoverArt: string;
|
|
12
|
+
/** `release_kind` — the Release's optional self-declared kind. */
|
|
13
|
+
releaseKind: string;
|
|
14
|
+
/** `recording_master_reference` — optional Walrus master pointers. */
|
|
15
|
+
recordingMasterReference: string;
|
|
16
|
+
/** `release_mix_reference` — optional per-track delivery descriptor pointers. */
|
|
17
|
+
releaseMixReference?: string;
|
|
18
|
+
/** `composition_credits` / `recording_credits` / `release_credits` extensions. */
|
|
19
|
+
compositionCredits: string;
|
|
20
|
+
recordingCredits: string;
|
|
21
|
+
releaseCredits: string;
|
|
22
|
+
/** `miso_credit` — the shared `Credit<Role>` value type credits are built from. */
|
|
23
|
+
credit: string;
|
|
24
|
+
}
|
|
25
|
+
/** The currency the app prices records in, and where test dollars come from. */
|
|
26
|
+
export interface MoneyIds {
|
|
27
|
+
/** Coin type balances, listings, and purchases are denominated in. */
|
|
28
|
+
usdCoinType: string;
|
|
29
|
+
usdDecimals: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MisoConfig {
|
|
32
|
+
network: Network;
|
|
33
|
+
/** Complete package set used by the integrated `client.miso` SDK. */
|
|
34
|
+
deployment: MisoDeployment;
|
|
35
|
+
protocol: ProtocolIds;
|
|
36
|
+
/** Final Record/Record Shop deployment, or an explicit unavailable legacy state. */
|
|
37
|
+
recordSales: RecordSalesDeployment;
|
|
38
|
+
money: MoneyIds;
|
|
39
|
+
/** Sui gRPC-web endpoint the data plane reads through. */
|
|
40
|
+
grpcUrl: string;
|
|
41
|
+
/**
|
|
42
|
+
* Sui GraphQL RPC endpoint. Needed for the two things gRPC cannot answer:
|
|
43
|
+
* "which object has type X" (share type → work id) and reading a transaction
|
|
44
|
+
* the fullnode has already pruned.
|
|
45
|
+
*/
|
|
46
|
+
graphqlUrl: string;
|
|
47
|
+
/** Walrus aggregator serving cover art and party media for this network. */
|
|
48
|
+
walrusAggregatorUrl: string;
|
|
49
|
+
/**
|
|
50
|
+
* Public origin of the Miso API, used to build avatar URLs (`/media/avatar/…`).
|
|
51
|
+
* Avatars are an R2-backed API lane, not on-chain data, so the SDK needs the
|
|
52
|
+
* public host to hand back a URL a browser can actually fetch.
|
|
53
|
+
*/
|
|
54
|
+
apiBaseUrl: string;
|
|
55
|
+
/** Explicit currency offers on the Discover shelf, in display order. */
|
|
56
|
+
discoverSales: readonly DiscoverSale[];
|
|
57
|
+
}
|
|
58
|
+
/** One release/currency pair to resolve by Pressing and Listing derived address. */
|
|
59
|
+
export interface DiscoverSale {
|
|
60
|
+
releaseId: string;
|
|
61
|
+
edition: number;
|
|
62
|
+
currencyType: string;
|
|
63
|
+
}
|
|
64
|
+
/** Fields a deployment may override without forking the whole config (endpoints, shelf). */
|
|
65
|
+
export type MisoConfigOverrides = Partial<Pick<MisoConfig, "grpcUrl" | "graphqlUrl" | "walrusAggregatorUrl" | "apiBaseUrl" | "discoverSales">>;
|
|
66
|
+
/** The config for `network`, derived from this SDK's verified deployment map. */
|
|
67
|
+
export declare function misoConfig(network: Network, overrides?: MisoConfigOverrides): MisoConfig;
|
|
68
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/read/config.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1F,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5C,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI9D;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,wBAAwB,EAAE,MAAM,CAAC;IACjC,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACvB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,oFAAoF;IACpF,WAAW,EAAE,qBAAqB,CAAC;IACnC,KAAK,EAAE,QAAQ,CAAC;IAChB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4FAA4F;AAC5F,MAAM,MAAM,mBAAmB,GAAG,OAAO,CACvC,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,YAAY,GAAG,qBAAqB,GAAG,YAAY,GAAG,eAAe,CAAC,CACpG,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAE,mBAAwB,GAAG,UAAU,CAuC5F"}
|