@misofm/platform 0.25.0 → 0.26.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/README.md +144 -45
- package/dist/auth.d.ts +8 -13
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +78 -59
- package/dist/auth.js.map +1 -1
- package/dist/catalog.d.ts +5 -5
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +33 -21
- package/dist/catalog.js.map +1 -1
- package/dist/client.d.ts +17 -30
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +53 -75
- package/dist/client.js.map +1 -1
- package/dist/cover.d.ts +4 -3
- package/dist/cover.d.ts.map +1 -1
- package/dist/cover.js +28 -17
- package/dist/cover.js.map +1 -1
- package/dist/credits.d.ts +12 -10
- package/dist/credits.d.ts.map +1 -1
- package/dist/credits.js +60 -33
- package/dist/credits.js.map +1 -1
- package/dist/deployments.d.ts +21 -13
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +84 -37
- package/dist/deployments.js.map +1 -1
- package/dist/errors.d.ts +91 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +111 -0
- package/dist/errors.js.map +1 -0
- package/dist/execute.d.ts +3 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +9 -4
- package/dist/execute.js.map +1 -1
- package/dist/genre.d.ts +25 -41
- package/dist/genre.d.ts.map +1 -1
- package/dist/genre.js +71 -20
- package/dist/genre.js.map +1 -1
- package/dist/party/client.d.ts +16 -13
- package/dist/party/client.d.ts.map +1 -1
- package/dist/party/client.js +33 -22
- package/dist/party/client.js.map +1 -1
- package/dist/party/extensions/links.d.ts +2 -1
- package/dist/party/extensions/links.d.ts.map +1 -1
- package/dist/party/extensions/links.js +2 -1
- package/dist/party/extensions/links.js.map +1 -1
- package/dist/party/queries.d.ts +12 -11
- package/dist/party/queries.d.ts.map +1 -1
- package/dist/party/queries.js +63 -57
- package/dist/party/queries.js.map +1 -1
- package/dist/party/types.d.ts +31 -20
- package/dist/party/types.d.ts.map +1 -1
- package/dist/party/types.js +82 -1
- package/dist/party/types.js.map +1 -1
- package/dist/pressing.d.ts +55 -35
- package/dist/pressing.d.ts.map +1 -1
- package/dist/pressing.js +99 -76
- package/dist/pressing.js.map +1 -1
- package/dist/queries.d.ts +1 -1
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +5 -4
- package/dist/queries.js.map +1 -1
- package/dist/read/artist.d.ts +6 -4
- package/dist/read/artist.d.ts.map +1 -1
- package/dist/read/artist.js +29 -27
- package/dist/read/artist.js.map +1 -1
- package/dist/read/catalog.d.ts +20 -17
- package/dist/read/catalog.d.ts.map +1 -1
- package/dist/read/catalog.js +120 -141
- package/dist/read/catalog.js.map +1 -1
- package/dist/read/client.d.ts +10 -9
- package/dist/read/client.d.ts.map +1 -1
- package/dist/read/client.js.map +1 -1
- package/dist/read/genres.d.ts +5 -3
- package/dist/read/genres.d.ts.map +1 -1
- package/dist/read/genres.js +18 -15
- package/dist/read/genres.js.map +1 -1
- package/dist/read/index.d.ts.map +1 -1
- package/dist/read/index.js +7 -1
- package/dist/read/index.js.map +1 -1
- package/dist/read/receipts.d.ts +15 -6
- package/dist/read/receipts.d.ts.map +1 -1
- package/dist/read/receipts.js +73 -60
- package/dist/read/receipts.js.map +1 -1
- package/dist/read/wallet.d.ts +11 -9
- package/dist/read/wallet.d.ts.map +1 -1
- package/dist/read/wallet.js +117 -132
- package/dist/read/wallet.js.map +1 -1
- package/dist/read/works.d.ts +9 -16
- package/dist/read/works.d.ts.map +1 -1
- package/dist/read/works.js +48 -117
- package/dist/read/works.js.map +1 -1
- package/dist/recording-extensions.d.ts +8 -7
- package/dist/recording-extensions.d.ts.map +1 -1
- package/dist/recording-extensions.js +30 -63
- package/dist/recording-extensions.js.map +1 -1
- package/dist/release-extensions.d.ts +3 -2
- package/dist/release-extensions.d.ts.map +1 -1
- package/dist/release-extensions.js +9 -10
- package/dist/release-extensions.js.map +1 -1
- package/dist/royalty.d.ts +51 -51
- package/dist/royalty.d.ts.map +1 -1
- package/dist/royalty.js +93 -11
- package/dist/royalty.js.map +1 -1
- package/dist/share.d.ts +7 -6
- package/dist/share.d.ts.map +1 -1
- package/dist/share.js +37 -30
- package/dist/share.js.map +1 -1
- package/dist/vault.d.ts +20 -8
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +31 -15
- package/dist/vault.js.map +1 -1
- package/package.json +11 -4
- package/src/auth.ts +89 -70
- package/src/catalog.ts +33 -49
- package/src/client.ts +117 -97
- package/src/cover.ts +17 -26
- package/src/credits.ts +43 -75
- package/src/deployments.ts +103 -69
- package/src/errors.ts +156 -0
- package/src/execute.ts +10 -6
- package/src/genre.ts +38 -23
- package/src/party/client.ts +35 -23
- package/src/party/extensions/links.ts +3 -2
- package/src/party/queries.ts +77 -65
- package/src/party/types.ts +52 -48
- package/src/pressing.ts +158 -161
- package/src/queries.ts +5 -5
- package/src/read/artist.ts +47 -42
- package/src/read/catalog.ts +200 -223
- package/src/read/client.ts +12 -11
- package/src/read/genres.ts +24 -16
- package/src/read/index.ts +7 -1
- package/src/read/receipts.ts +128 -67
- package/src/read/wallet.ts +194 -162
- package/src/read/works.ts +75 -194
- package/src/recording-extensions.ts +38 -92
- package/src/release-extensions.ts +7 -12
- package/src/royalty.ts +117 -20
- package/src/share.ts +44 -29
- package/src/vault.ts +47 -24
package/README.md
CHANGED
|
@@ -98,7 +98,14 @@ singletons.
|
|
|
98
98
|
Register the client extension on any client implementing Sui's Core API
|
|
99
99
|
([SDK building guidelines](https://sdk.mystenlabs.com/sui/sdk-building)):
|
|
100
100
|
|
|
101
|
+
Every method that performs I/O — a chain read, a signed execution — returns an
|
|
102
|
+
`Effect.Effect<A, E>` (`R = never`: the client already provided `SuiClient`
|
|
103
|
+
internally). Run a program with `Effect.runPromise` (or compose it further
|
|
104
|
+
with other Effects) at your own boundary; PTB builders (`tx.*`) stay plain
|
|
105
|
+
synchronous functions.
|
|
106
|
+
|
|
101
107
|
```ts
|
|
108
|
+
import { Effect } from "effect";
|
|
102
109
|
import { SuiGrpcClient } from "@mysten/sui/grpc";
|
|
103
110
|
import { Transaction } from "@mysten/sui/transactions";
|
|
104
111
|
import { miso } from "@misofm/platform";
|
|
@@ -107,40 +114,58 @@ const client = new SuiGrpcClient({ network: "testnet", baseUrl }).$extend(
|
|
|
107
114
|
miso({ deployment: verifiedDeployment }),
|
|
108
115
|
);
|
|
109
116
|
|
|
110
|
-
|
|
111
|
-
//
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
117
|
+
const program = Effect.gen(function* () {
|
|
118
|
+
// One memoized Core API read proves this endpoint is the deployment's exact
|
|
119
|
+
// ledger before any synchronous client-bound builder can be used.
|
|
120
|
+
yield* client.miso.ready();
|
|
121
|
+
|
|
122
|
+
// The permissionless object-model SDK is part of the same facade.
|
|
123
|
+
const release = yield* client.miso.protocol!.getReleaseById(releaseId); // protocol is set once ready() succeeded
|
|
124
|
+
// Party identity comes from @misofm/partyos; platform adds the extensions.
|
|
125
|
+
// client.miso.party is a PartyPlatformClient wrapping a PartyosClient (core
|
|
126
|
+
// reads/builders delegate straight through) bound to this deployment's
|
|
127
|
+
// `partyos` (core) and `party` (extensions) sections — also importable
|
|
128
|
+
// standalone from `@misofm/platform/party`.
|
|
129
|
+
const party = yield* client.miso.party.getPartyById(partyId);
|
|
130
|
+
|
|
131
|
+
// Read: run + one currency's offer, one round trip, no registry lookup.
|
|
132
|
+
const { pressing, listing } = yield* client.miso.getSale({
|
|
133
|
+
releaseId,
|
|
134
|
+
edition,
|
|
135
|
+
currencyType: USD_COIN_TYPE,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return { release, party, pressing, listing };
|
|
128
139
|
});
|
|
129
140
|
|
|
130
|
-
|
|
141
|
+
const { pressing, listing } = await Effect.runPromise(program);
|
|
142
|
+
|
|
143
|
+
// Write: a thunk, so it composes with protocol calls in the same PTB. `tx`
|
|
144
|
+
// builders never touch the network — no Effect involved.
|
|
131
145
|
const tx = new Transaction();
|
|
132
146
|
tx.add(
|
|
133
147
|
client.miso.tx.purchaseRecord({
|
|
134
148
|
releaseId,
|
|
135
149
|
edition,
|
|
136
150
|
currencyType: USD_COIN_TYPE,
|
|
137
|
-
paymentAmount: listing
|
|
138
|
-
expectedPricing: listing
|
|
151
|
+
paymentAmount: listing!.pricing.amount,
|
|
152
|
+
expectedPricing: listing!.pricing,
|
|
139
153
|
recipient: buyer,
|
|
140
154
|
}),
|
|
141
155
|
);
|
|
142
156
|
```
|
|
143
157
|
|
|
158
|
+
A read that can fail closed (a missing release, a mismatched chain identifier)
|
|
159
|
+
fails with one of this SDK's tagged errors — see [Errors](#errors) — so
|
|
160
|
+
recover with `Effect.catchTag`/`Effect.catchTags` instead of inspecting a
|
|
161
|
+
thrown message:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
const releaseOrNull = client.miso.protocol!
|
|
165
|
+
.getReleaseById(releaseId)
|
|
166
|
+
.pipe(Effect.catchTag("ObjectNotFoundError", () => Effect.succeed(null)));
|
|
167
|
+
```
|
|
168
|
+
|
|
144
169
|
The bundled Testnet deployment includes both verified immutable package IDs.
|
|
145
170
|
Custom deployments can still mark sales unavailable explicitly; sales builders
|
|
146
171
|
and readers fail closed whenever either package is unavailable.
|
|
@@ -173,11 +198,16 @@ it. `PartyPlatformClient` wraps a `PartyosClient` — every core method
|
|
|
173
198
|
standalone (the same class `client.miso.party` returns):
|
|
174
199
|
|
|
175
200
|
```ts
|
|
201
|
+
import { Effect } from "effect";
|
|
176
202
|
import { PartyosClient } from "@misofm/partyos";
|
|
177
203
|
import { PartyPlatformClient } from "@misofm/platform/party";
|
|
178
204
|
|
|
179
205
|
const core = new PartyosClient(client, verifiedDeployment.partyos);
|
|
180
206
|
const party = new PartyPlatformClient(client, core, verifiedDeployment.party);
|
|
207
|
+
|
|
208
|
+
// Every read method returns Effect<A, E> (R = never) — the class already
|
|
209
|
+
// carries the ClientWithCoreApi it was constructed with.
|
|
210
|
+
const profile = await Effect.runPromise(party.getProfile(partyId)); // Option<Profile>
|
|
181
211
|
```
|
|
182
212
|
|
|
183
213
|
Every generated Move package on this side of the boundary — the Party
|
|
@@ -200,7 +230,14 @@ objects into the JSON-safe views a client actually renders. It works in browsers
|
|
|
200
230
|
Workers, and servers. Miso's HTTP API is a thin validated and cached transport over
|
|
201
231
|
this same surface, not a separate domain implementation.
|
|
202
232
|
|
|
233
|
+
Every read here takes the resolved `MisoConfig` (package ids, not a transport)
|
|
234
|
+
and declares `SuiClient`/`SuiGraphQL` in its Requirements — `createMisoClient`
|
|
235
|
+
still bundles the transport, config, and Party client the way it always did;
|
|
236
|
+
provide its `sui`/`graphqlRaw` as the Effect services once, at the boundary:
|
|
237
|
+
|
|
203
238
|
```ts
|
|
239
|
+
import { Effect, Layer } from "effect";
|
|
240
|
+
import { SuiClient, SuiGraphQL } from "@misofm/effect";
|
|
204
241
|
import {
|
|
205
242
|
createMisoClient,
|
|
206
243
|
getDiscoverShelf,
|
|
@@ -209,10 +246,16 @@ import {
|
|
|
209
246
|
} from "@misofm/platform/read";
|
|
210
247
|
|
|
211
248
|
const miso = createMisoClient({ config: verifiedReadConfig });
|
|
249
|
+
const layer = Layer.mergeAll(SuiClient.layer(miso.sui), SuiGraphQL.layer(miso.graphqlRaw));
|
|
212
250
|
|
|
213
|
-
const
|
|
214
|
-
const
|
|
215
|
-
const
|
|
251
|
+
const program = Effect.gen(function* () {
|
|
252
|
+
const discover = yield* getDiscoverShelf(miso.config);
|
|
253
|
+
const release = yield* getReleaseDetail(releaseId, miso.config);
|
|
254
|
+
const library = yield* getOwnedRecords(walletAddress, miso.config);
|
|
255
|
+
return { discover, release, library };
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const { discover, release, library } = await Effect.runPromise(program.pipe(Effect.provide(layer)));
|
|
216
259
|
```
|
|
217
260
|
|
|
218
261
|
The package root also exposes the same functions under the `read` namespace:
|
|
@@ -221,7 +264,9 @@ The package root also exposes the same functions under the `read` namespace:
|
|
|
221
264
|
import { read } from "@misofm/platform";
|
|
222
265
|
|
|
223
266
|
const miso = read.createMisoClient({ config: verifiedReadConfig });
|
|
224
|
-
const artist = await
|
|
267
|
+
const artist = await Effect.runPromise(
|
|
268
|
+
read.getArtistProfile(partyId, miso.config).pipe(Effect.provide(SuiClient.layer(miso.sui))),
|
|
269
|
+
);
|
|
225
270
|
```
|
|
226
271
|
|
|
227
272
|
### Authenticated platform mutations
|
|
@@ -418,6 +463,7 @@ Recording creator remainder; lower-level routed-stake builders remain
|
|
|
418
463
|
available for the Move layer's 100% composition-cut case.
|
|
419
464
|
|
|
420
465
|
```ts
|
|
466
|
+
import { Effect } from "effect";
|
|
421
467
|
import {
|
|
422
468
|
assertAtomicPublicationBounds,
|
|
423
469
|
parseAtomicPublicationResult,
|
|
@@ -437,9 +483,8 @@ const publication = {
|
|
|
437
483
|
// PTB exceeds the SDK's command/input safety limits or has an invalid graph.
|
|
438
484
|
assertAtomicPublicationBounds(publication);
|
|
439
485
|
|
|
440
|
-
const executed = await
|
|
441
|
-
executor,
|
|
442
|
-
publishAtomicCatalog(publication),
|
|
486
|
+
const executed = await Effect.runPromise(
|
|
487
|
+
client.miso.executeViaExecutor(executor, publishAtomicCatalog(publication)),
|
|
443
488
|
);
|
|
444
489
|
const result = parseAtomicPublicationResult(publication, executed);
|
|
445
490
|
```
|
|
@@ -466,29 +511,30 @@ embedded as `SHARE_TEMPLATE`, initializer patched via `patchInitializer`).
|
|
|
466
511
|
Publish and initialize are necessarily two transactions:
|
|
467
512
|
|
|
468
513
|
```ts
|
|
514
|
+
import { Effect } from "effect";
|
|
515
|
+
|
|
469
516
|
// Sequential (one currency, two txs):
|
|
470
|
-
const currency = await
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
517
|
+
const currency = await Effect.runPromise(
|
|
518
|
+
client.miso.createShareCurrency(signer, {
|
|
519
|
+
name: "Song Shares",
|
|
520
|
+
description: "…",
|
|
521
|
+
}),
|
|
522
|
+
);
|
|
474
523
|
// → { packageId, currencyId, shareType, treasuryCapId, gasUsed }
|
|
475
524
|
|
|
476
|
-
// Batched (many currencies, via a ParallelTransactionExecutor)
|
|
525
|
+
// Batched (many currencies, via a ParallelTransactionExecutor). Both submit
|
|
526
|
+
// exclusively through the executor (R = never), unlike `createShareCurrency`
|
|
527
|
+
// above, which needs `SuiClient` for its sequential `execThunks` calls.
|
|
477
528
|
import { publishShareCurrencies, initializeShareCurrencies } from "@misofm/platform";
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
initializerAddress,
|
|
481
|
-
|
|
482
|
-
);
|
|
483
|
-
const { currencies } = await initializeShareCurrencies(
|
|
484
|
-
executor,
|
|
485
|
-
signerAddress,
|
|
486
|
-
packageIds,
|
|
487
|
-
(pkg) => ({
|
|
529
|
+
|
|
530
|
+
const program = Effect.gen(function* () {
|
|
531
|
+
const { packageIds } = yield* publishShareCurrencies(executor, initializerAddress, 10);
|
|
532
|
+
return yield* initializeShareCurrencies(executor, signerAddress, packageIds, (pkg) => ({
|
|
488
533
|
name: "…",
|
|
489
534
|
description: "…",
|
|
490
|
-
})
|
|
491
|
-
);
|
|
535
|
+
}));
|
|
536
|
+
});
|
|
537
|
+
const { currencies } = await Effect.runPromise(program);
|
|
492
538
|
```
|
|
493
539
|
|
|
494
540
|
`executeViaExecutor(executor, ...thunks)` (`execute.ts`) submits a
|
|
@@ -670,6 +716,59 @@ carry an optional `RecordingRoleLevel` (`Producer`, `Vocalist`, `Engineer`,
|
|
|
670
716
|
(`Instrumentalist`, `Custom`, and the unleveled `ArtistsAndRepertoire` /
|
|
671
717
|
`Copyist`) are spelled out separately in `RecordingRole`.
|
|
672
718
|
|
|
719
|
+
## Errors
|
|
720
|
+
|
|
721
|
+
Every typed failure is a `Schema.TaggedError` (`@misofm/platform/errors`),
|
|
722
|
+
recoverable with `Effect.catchTag`/`Effect.catchTags` instead of message
|
|
723
|
+
sniffing. The foundation's Sui read/write vocabulary
|
|
724
|
+
(`ObjectNotFoundError { objectId }`, `ObjectTypeMismatchError { objectId,
|
|
725
|
+
expected, actual }`, `SuiRpcError { operation, cause }`, `BcsDecodeError {
|
|
726
|
+
type, objectId?, cause }`, `TransactionFailedError { digest, status }`,
|
|
727
|
+
`GraphQLUnavailableError {}`, `DeploymentError { message }`) is re-exported
|
|
728
|
+
from `@misofm/effect/errors` so this is the only import a consumer needs:
|
|
729
|
+
|
|
730
|
+
```ts
|
|
731
|
+
import {
|
|
732
|
+
ObjectNotFoundError,
|
|
733
|
+
ReleaseNotFoundError,
|
|
734
|
+
RecordSalesUnavailableError,
|
|
735
|
+
OperationsUnavailableError,
|
|
736
|
+
MisoChainIdentifierMismatchError,
|
|
737
|
+
MisoClientNotReadyError,
|
|
738
|
+
MisoNetworkMismatchError,
|
|
739
|
+
} from "@misofm/platform/errors";
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
Platform-specific tags:
|
|
743
|
+
|
|
744
|
+
| Error | Fields | Raised by |
|
|
745
|
+
| --- | --- | --- |
|
|
746
|
+
| `RecordSalesUnavailableError` | `reason` | `requireRecordSalesDeployment`, every sales read/builder on a legacy or unconfigured deployment |
|
|
747
|
+
| `OperationsUnavailableError` | `reason` | `requireOperationsDeployment`, `client.miso.vault`/`call.*` operations surfaces |
|
|
748
|
+
| `MisoPlatformDeploymentInvalidError` | `message` | `assertMisoPlatformDeployment` / `normalizeMisoPlatformDeployment` |
|
|
749
|
+
| `MisoNetworkMismatchError` | `clientNetwork`, `deploymentNetwork` | `miso()`/`misoPlatform()` registration (synchronous) |
|
|
750
|
+
| `MisoChainIdentifierMismatchError` | `actual`, `expected` | `client.miso.ready()` |
|
|
751
|
+
| `MisoClientNotReadyError` | `operation` | synchronous client-bound surfaces (`tx`, `ids`, `call`, `vault`, `party`, `protocol`) used before `ready()` |
|
|
752
|
+
| `MalformedRecordSoldEventError` | `digest?`, `reason?` | `findRecordSales`/`getPurchaseReceipt(s)` on a malformed `RecordSoldEvent` |
|
|
753
|
+
| `MisoAuthError` | `code`, `reason`, `status?`, `cause?` | `@misofm/platform/auth` (`requestAuthorizationChallenge`, `authenticatedFetch`, …) |
|
|
754
|
+
| `ReleaseNotFoundError` | `releaseId` | `@misofm/platform/read` (`getReleaseResources`, `getReleaseDetail`, …) — the typed replacement for the api read service's old `isMissingRelease` message bridge |
|
|
755
|
+
| `ReceiptNotFoundError` | `digest` | `getPurchaseReceipt(s)` when neither the fullnode nor the indexer has the transaction |
|
|
756
|
+
| `RecordPurchaseNotFoundError` | `digest` | `getPurchaseReceipt(s)` when the transaction exists but carries no `RecordSoldEvent` |
|
|
757
|
+
| `ForeignPressingError` | `pressingId`, `actualType?` | reserved for read-layer Pressing type-mismatch bridging |
|
|
758
|
+
|
|
759
|
+
```ts
|
|
760
|
+
import { Effect } from "effect";
|
|
761
|
+
|
|
762
|
+
const release = client.miso.protocol!
|
|
763
|
+
.getReleaseById(releaseId)
|
|
764
|
+
.pipe(
|
|
765
|
+
Effect.catchTags({
|
|
766
|
+
ObjectNotFoundError: () => Effect.succeed(null),
|
|
767
|
+
SuiRpcError: (e) => Effect.die(e), // transport failure: not recoverable here
|
|
768
|
+
}),
|
|
769
|
+
);
|
|
770
|
+
```
|
|
771
|
+
|
|
673
772
|
## Layout
|
|
674
773
|
|
|
675
774
|
```
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { MisoAuthError, type MisoAuthErrorCode } from "./errors.ts";
|
|
3
|
+
export type { MisoAuthErrorCode };
|
|
4
|
+
export { MisoAuthError };
|
|
1
5
|
export type AuthNetwork = "testnet" | "mainnet";
|
|
2
6
|
export interface ApiAuthorizationFields {
|
|
3
7
|
method: string;
|
|
@@ -23,15 +27,6 @@ export declare const MISO_AUTH_HEADERS: {
|
|
|
23
27
|
readonly signature: "X-Sui-Signature";
|
|
24
28
|
readonly issuedAt: "X-Sui-Issued-At";
|
|
25
29
|
};
|
|
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
30
|
/** The byte-exact Sui personal message required for an authenticated API mutation. */
|
|
36
31
|
export declare function buildApiAuthorizationPayload(fields: ApiAuthorizationFields): string;
|
|
37
32
|
export declare function isValidAuthorizationTarget(method: string, path: string): boolean;
|
|
@@ -49,15 +44,15 @@ export interface RequestAuthorizationChallengeOptions {
|
|
|
49
44
|
nowMs?: number;
|
|
50
45
|
}
|
|
51
46
|
/** Ask Miso to verify the Enoki account and issue the exact message to sign. */
|
|
52
|
-
export declare
|
|
47
|
+
export declare const requestAuthorizationChallenge: (options: RequestAuthorizationChallengeOptions) => Effect.Effect<AuthorizationChallenge, MisoAuthError, never>;
|
|
53
48
|
export interface CreateAuthorizationHeadersOptions extends RequestAuthorizationChallengeOptions {
|
|
54
49
|
signer: PersonalMessageSigner;
|
|
55
50
|
}
|
|
56
51
|
/** Verify the challenge locally, sign it as a Sui personal message, and produce API headers. */
|
|
57
|
-
export declare
|
|
52
|
+
export declare const createAuthorizationHeaders: (options: CreateAuthorizationHeadersOptions) => Effect.Effect<{
|
|
58
53
|
challenge: AuthorizationChallenge;
|
|
59
54
|
headers: Headers;
|
|
60
|
-
}>;
|
|
55
|
+
}, MisoAuthError, never>;
|
|
61
56
|
export interface AuthenticatedFetchOptions extends RequestInit {
|
|
62
57
|
auth: {
|
|
63
58
|
token: string;
|
|
@@ -69,5 +64,5 @@ export interface AuthenticatedFetchOptions extends RequestInit {
|
|
|
69
64
|
fetch?: typeof globalThis.fetch;
|
|
70
65
|
}
|
|
71
66
|
/** Perform a protected Miso API mutation with a fresh Enoki-verified Sui signature. */
|
|
72
|
-
export declare
|
|
67
|
+
export declare const authenticatedFetch: (input: string | URL, options: AuthenticatedFetchOptions) => Effect.Effect<Response, MisoAuthError, never>;
|
|
73
68
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1F;AAED,eAAO,MAAM,wBAAwB,QAAiB,CAAC;AACvD,eAAO,MAAM,4BAA4B,QAAa,CAAC;AAEvD,eAAO,MAAM,iBAAiB;aAC5B,OAAO,EAAE,eAAe;aACxB,SAAS,EAAE,iBAAiB;aAC5B,QAAQ,EAAE,iBAAiB;CACnB,CAAC;AAEX,sFAAsF;AACtF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAUnF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOhF;AAED,8DAA8D;AAC9D,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAmB,GAAG,MAAM,GAAG,IAAI,CAYzG;AA4FD,MAAM,WAAW,oCAAoC;IACnD,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,gHAwCxC,CAAC;AAEH,MAAM,WAAW,iCAAkC,SAAQ,oCAAoC;IAC7F,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED,gGAAgG;AAChG,eAAO,MAAM,0BAA0B;eAEN,sBAAsB;aAAW,OAAO;wBAqBvE,CAAC;AAEH,MAAM,WAAW,yBAA0B,SAAQ,WAAW;IAC5D,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,qBAAqB,CAAC;QAC9B,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,4GA+B7B,CAAC"}
|
package/dist/auth.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// Copyright (c) Miso Labs, Inc.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { isValidSuiAddress, normalizeSuiAddress } from "@mysten/sui/utils";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { MisoAuthError } from "./errors.js";
|
|
6
|
+
export { MisoAuthError };
|
|
4
7
|
export const AUTHORIZATION_MAX_AGE_MS = 5 * 60 * 1_000;
|
|
5
8
|
export const AUTHORIZATION_FUTURE_SKEW_MS = 60 * 1_000;
|
|
6
9
|
export const MISO_AUTH_HEADERS = {
|
|
@@ -8,16 +11,6 @@ export const MISO_AUTH_HEADERS = {
|
|
|
8
11
|
signature: "X-Sui-Signature",
|
|
9
12
|
issuedAt: "X-Sui-Issued-At",
|
|
10
13
|
};
|
|
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
14
|
/** The byte-exact Sui personal message required for an authenticated API mutation. */
|
|
22
15
|
export function buildApiAuthorizationPayload(fields) {
|
|
23
16
|
return [
|
|
@@ -50,16 +43,22 @@ export function parseFreshAuthorizationIssuedAt(input, nowMs = Date.now()) {
|
|
|
50
43
|
const canonical = new Date(issuedAtMs).toISOString();
|
|
51
44
|
return input === canonical ? canonical : null;
|
|
52
45
|
}
|
|
53
|
-
|
|
46
|
+
const target = Effect.fn("target")(function* (method, path) {
|
|
54
47
|
const normalized = { method: method.toUpperCase(), path };
|
|
55
48
|
if (!isValidAuthorizationTarget(normalized.method, normalized.path)) {
|
|
56
|
-
|
|
49
|
+
return yield* new MisoAuthError({
|
|
50
|
+
code: "invalid_target",
|
|
51
|
+
reason: "Authenticated requests require a mutation under /platform/.",
|
|
52
|
+
});
|
|
57
53
|
}
|
|
58
54
|
return normalized;
|
|
59
|
-
}
|
|
60
|
-
|
|
55
|
+
});
|
|
56
|
+
const parseChallenge = Effect.fn("parseChallenge")(function* (input, expected) {
|
|
61
57
|
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
62
|
-
|
|
58
|
+
return yield* new MisoAuthError({
|
|
59
|
+
code: "invalid_challenge",
|
|
60
|
+
reason: "The API returned an invalid authorization challenge.",
|
|
61
|
+
});
|
|
63
62
|
}
|
|
64
63
|
const body = input;
|
|
65
64
|
if (typeof body.payload !== "string" ||
|
|
@@ -71,7 +70,10 @@ function parseChallenge(input, expected) {
|
|
|
71
70
|
typeof body.expiresAt !== "string" ||
|
|
72
71
|
!isValidSuiAddress(body.address) ||
|
|
73
72
|
(body.network !== "testnet" && body.network !== "mainnet")) {
|
|
74
|
-
|
|
73
|
+
return yield* new MisoAuthError({
|
|
74
|
+
code: "invalid_challenge",
|
|
75
|
+
reason: "The API returned an invalid authorization challenge.",
|
|
76
|
+
});
|
|
75
77
|
}
|
|
76
78
|
const nowMs = expected.nowMs ?? Date.now();
|
|
77
79
|
const issuedAt = parseFreshAuthorizationIssuedAt(body.issuedAt, nowMs);
|
|
@@ -97,64 +99,75 @@ function parseChallenge(input, expected) {
|
|
|
97
99
|
expiresAtMs <= nowMs ||
|
|
98
100
|
expiresAtMs > Date.parse(issuedAt) + AUTHORIZATION_MAX_AGE_MS ||
|
|
99
101
|
body.payload !== buildApiAuthorizationPayload(challenge)) {
|
|
100
|
-
|
|
102
|
+
return yield* new MisoAuthError({
|
|
103
|
+
code: "invalid_challenge",
|
|
104
|
+
reason: "The authorization challenge did not match this request.",
|
|
105
|
+
});
|
|
101
106
|
}
|
|
102
107
|
return challenge;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
108
|
+
});
|
|
109
|
+
function responseMessage(response) {
|
|
110
|
+
return Effect.tryPromise(() => response.clone().json()).pipe(Effect.map((body) => body), Effect.orElseSucceed(() => null), Effect.map((body) => {
|
|
111
|
+
if (typeof body?.error === "object" && typeof body.error.message === "string")
|
|
112
|
+
return body.error.message;
|
|
113
|
+
if (typeof body?.error === "string")
|
|
114
|
+
return body.error;
|
|
115
|
+
if (typeof body?.message === "string")
|
|
116
|
+
return body.message;
|
|
117
|
+
return `Authorization challenge failed (${response.status}).`;
|
|
118
|
+
}));
|
|
113
119
|
}
|
|
114
120
|
/** Ask Miso to verify the Enoki account and issue the exact message to sign. */
|
|
115
|
-
export
|
|
116
|
-
const expected = target(options.method, options.path);
|
|
121
|
+
export const requestAuthorizationChallenge = Effect.fn("requestAuthorizationChallenge")(function* (options) {
|
|
122
|
+
const expected = yield* target(options.method, options.path);
|
|
117
123
|
if (!options.token || !isValidSuiAddress(options.address)) {
|
|
118
|
-
|
|
124
|
+
return yield* new MisoAuthError({
|
|
125
|
+
code: "challenge_rejected",
|
|
126
|
+
reason: "A valid Enoki token and Sui address are required.",
|
|
127
|
+
});
|
|
119
128
|
}
|
|
120
129
|
const apiUrl = new URL(options.apiUrl);
|
|
121
130
|
const challengeUrl = options.challengeUrl === undefined
|
|
122
131
|
? new URL("/platform/auth/challenge", apiUrl.origin)
|
|
123
132
|
: new URL(options.challengeUrl, apiUrl);
|
|
124
133
|
const fetcher = options.fetch ?? globalThis.fetch;
|
|
125
|
-
const response =
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
134
|
+
const response = yield* Effect.tryPromise({
|
|
135
|
+
try: (signal) => fetcher(challengeUrl, {
|
|
136
|
+
method: "POST",
|
|
137
|
+
headers: {
|
|
138
|
+
Authorization: `Bearer ${options.token}`,
|
|
139
|
+
[MISO_AUTH_HEADERS.address]: normalizeSuiAddress(options.address),
|
|
140
|
+
"Content-Type": "application/json",
|
|
141
|
+
},
|
|
142
|
+
body: JSON.stringify(expected),
|
|
143
|
+
signal,
|
|
144
|
+
}),
|
|
145
|
+
catch: (cause) => new MisoAuthError({ code: "challenge_rejected", reason: "The authorization challenge request failed.", cause }),
|
|
133
146
|
});
|
|
134
147
|
if (!response.ok) {
|
|
135
|
-
|
|
148
|
+
const reason = yield* responseMessage(response);
|
|
149
|
+
return yield* new MisoAuthError({ code: "challenge_rejected", reason, status: response.status });
|
|
136
150
|
}
|
|
137
|
-
const body =
|
|
138
|
-
return parseChallenge(body, {
|
|
151
|
+
const body = yield* Effect.tryPromise(() => response.json()).pipe(Effect.orElseSucceed(() => null));
|
|
152
|
+
return yield* parseChallenge(body, {
|
|
139
153
|
...expected,
|
|
140
154
|
address: options.address,
|
|
141
155
|
network: options.network,
|
|
142
156
|
nowMs: options.nowMs,
|
|
143
157
|
});
|
|
144
|
-
}
|
|
158
|
+
});
|
|
145
159
|
/** Verify the challenge locally, sign it as a Sui personal message, and produce API headers. */
|
|
146
|
-
export
|
|
147
|
-
const challenge =
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
catch (cause) {
|
|
154
|
-
throw new MisoAuthError("signing_failed", "The authorization request was not signed.", { cause });
|
|
155
|
-
}
|
|
160
|
+
export const createAuthorizationHeaders = Effect.fn("createAuthorizationHeaders")(function* (options) {
|
|
161
|
+
const challenge = yield* requestAuthorizationChallenge(options);
|
|
162
|
+
const signature = yield* Effect.tryPromise({
|
|
163
|
+
try: () => options.signer.signPersonalMessage(new TextEncoder().encode(challenge.payload)),
|
|
164
|
+
catch: (cause) => new MisoAuthError({ code: "signing_failed", reason: "The authorization request was not signed.", cause }),
|
|
165
|
+
}).pipe(Effect.map((signed) => signed.signature));
|
|
156
166
|
if (!signature) {
|
|
157
|
-
|
|
167
|
+
return yield* new MisoAuthError({
|
|
168
|
+
code: "signing_failed",
|
|
169
|
+
reason: "The signer returned an empty authorization signature.",
|
|
170
|
+
});
|
|
158
171
|
}
|
|
159
172
|
return {
|
|
160
173
|
challenge,
|
|
@@ -165,17 +178,20 @@ export async function createAuthorizationHeaders(options) {
|
|
|
165
178
|
[MISO_AUTH_HEADERS.issuedAt]: challenge.issuedAt,
|
|
166
179
|
}),
|
|
167
180
|
};
|
|
168
|
-
}
|
|
181
|
+
});
|
|
169
182
|
/** Perform a protected Miso API mutation with a fresh Enoki-verified Sui signature. */
|
|
170
|
-
export
|
|
183
|
+
export const authenticatedFetch = Effect.fn("authenticatedFetch")(function* (input, options) {
|
|
171
184
|
const { auth, challengeUrl, fetch: fetchOption, ...init } = options;
|
|
172
185
|
const url = new URL(input);
|
|
173
186
|
const method = (init.method ?? "").toUpperCase();
|
|
174
187
|
if (url.search || url.hash) {
|
|
175
|
-
|
|
188
|
+
return yield* new MisoAuthError({
|
|
189
|
+
code: "invalid_target",
|
|
190
|
+
reason: "Authenticated request URLs cannot include a query or fragment.",
|
|
191
|
+
});
|
|
176
192
|
}
|
|
177
193
|
const fetcher = fetchOption ?? globalThis.fetch;
|
|
178
|
-
const authorization =
|
|
194
|
+
const authorization = yield* createAuthorizationHeaders({
|
|
179
195
|
apiUrl: url,
|
|
180
196
|
challengeUrl,
|
|
181
197
|
fetch: fetcher,
|
|
@@ -188,6 +204,9 @@ export async function authenticatedFetch(input, options) {
|
|
|
188
204
|
});
|
|
189
205
|
const headers = new Headers(init.headers);
|
|
190
206
|
authorization.headers.forEach((value, name) => headers.set(name, value));
|
|
191
|
-
return
|
|
192
|
-
}
|
|
207
|
+
return yield* Effect.tryPromise({
|
|
208
|
+
try: (signal) => fetcher(url, { ...init, method, headers, signal }),
|
|
209
|
+
catch: (cause) => new MisoAuthError({ code: "invalid_target", reason: "The authenticated request failed.", cause }),
|
|
210
|
+
});
|
|
211
|
+
});
|
|
193
212
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { SuiGraphQLClient } from "@mysten/sui/graphql";
|
|
1
|
+
import { Effect } from "effect";
|
|
3
2
|
import { type Recording } from "@misofm/musicos";
|
|
3
|
+
import { SuiClient, SuiGraphQL, SuiRpcError, type BcsDecodeError, type ObjectNotFoundError } from "@misofm/effect";
|
|
4
4
|
import { type CreditView, type RecordingCreditsView } from "./credits.ts";
|
|
5
5
|
export interface GetReleaseTrackCreditsOptions {
|
|
6
6
|
/** Core Miso package that defines Composition and Recording. */
|
|
@@ -24,13 +24,13 @@ export interface ReleaseTrackCredits {
|
|
|
24
24
|
* are then resolved concurrently, deduplicated, and all composition credit
|
|
25
25
|
* fields are fetched concurrently as well.
|
|
26
26
|
*/
|
|
27
|
-
export declare
|
|
27
|
+
export declare const getReleaseTrackCredits: (releaseId: string, options: GetReleaseTrackCreditsOptions) => Effect.Effect<Record<string, ReleaseTrackCredits>, BcsDecodeError | ObjectNotFoundError | SuiRpcError, SuiClient | SuiGraphQL>;
|
|
28
28
|
/**
|
|
29
29
|
* Composition and recording credits for the supplied recordings, keyed by
|
|
30
30
|
* recording id. This form is intended for consumers that already loaded a
|
|
31
31
|
* release and do not need to fetch it again.
|
|
32
32
|
*/
|
|
33
|
-
export declare
|
|
33
|
+
export declare const getTrackCreditsByRecordingIds: (recordingIdsInput: readonly string[], options: GetReleaseTrackCreditsOptions) => Effect.Effect<Record<string, ReleaseTrackCredits>, BcsDecodeError | SuiRpcError, SuiClient | SuiGraphQL>;
|
|
34
34
|
export interface GetAdministeredRecordingsOptions {
|
|
35
35
|
/**
|
|
36
36
|
* @deprecated Resolution is batched; this option is retained for source
|
|
@@ -44,5 +44,5 @@ export interface GetAdministeredRecordingsOptions {
|
|
|
44
44
|
* Three bounded stages: list the owner's `RecordingAdminCap`s, resolve every
|
|
45
45
|
* share type in one aliased GraphQL query, then batch-fetch the recordings.
|
|
46
46
|
*/
|
|
47
|
-
export declare
|
|
47
|
+
export declare const getAdministeredRecordings: (owner: string, misoPackageId: string, options?: GetAdministeredRecordingsOptions | undefined) => Effect.Effect<Recording[], BcsDecodeError | SuiRpcError, SuiClient | SuiGraphQL>;
|
|
48
48
|
//# sourceMappingURL=catalog.d.ts.map
|