@misofm/platform 0.19.0 → 0.21.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 +15 -15
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/contracts.d.ts +1 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +1 -0
- package/dist/contracts.js.map +1 -1
- package/dist/cover.d.ts +5 -8
- package/dist/cover.d.ts.map +1 -1
- package/dist/cover.js +5 -17
- package/dist/cover.js.map +1 -1
- package/dist/deployments.d.ts +7 -3
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +3 -1
- package/dist/deployments.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +11 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +18 -1
- package/dist/internal.js.map +1 -1
- package/dist/publication.d.ts +14 -0
- package/dist/publication.d.ts.map +1 -1
- package/dist/publication.js +17 -5
- package/dist/publication.js.map +1 -1
- package/dist/read/catalog.d.ts +1 -1
- package/dist/read/catalog.d.ts.map +1 -1
- package/dist/read/catalog.js +6 -23
- package/dist/read/catalog.js.map +1 -1
- package/dist/read/config.d.ts +0 -2
- package/dist/read/config.d.ts.map +1 -1
- package/dist/read/config.js.map +1 -1
- package/dist/read/internal/walrus.js +1 -1
- package/dist/read/internal/walrus.js.map +1 -1
- package/dist/read/types.d.ts +0 -2
- package/dist/read/types.d.ts.map +1 -1
- package/dist/recording-extensions.d.ts +49 -3
- package/dist/recording-extensions.d.ts.map +1 -1
- package/dist/recording-extensions.js +126 -10
- package/dist/recording-extensions.js.map +1 -1
- package/dist/walrus-ids.d.ts +11 -0
- package/dist/walrus-ids.d.ts.map +1 -0
- package/dist/walrus-ids.js +96 -0
- package/dist/walrus-ids.js.map +1 -0
- package/package.json +2 -8
- package/src/client.ts +1 -1
- package/src/contracts.ts +1 -0
- package/src/cover.ts +21 -41
- package/src/deployments.ts +9 -4
- package/src/index.ts +1 -2
- package/src/internal.ts +25 -0
- package/src/publication.ts +36 -4
- package/src/read/catalog.ts +4 -29
- package/src/read/config.ts +0 -2
- package/src/read/internal/walrus.ts +1 -1
- package/src/read/types.ts +0 -2
- package/src/recording-extensions.ts +177 -18
- package/src/walrus-ids.ts +102 -0
- package/dist/mix.d.ts +0 -144
- package/dist/mix.d.ts.map +0 -1
- package/dist/mix.js +0 -656
- package/dist/mix.js.map +0 -1
- package/src/mix.ts +0 -910
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
/** Cap-authorized builders and reads for data-only Recording metadata extensions. */
|
|
4
4
|
import { bcs } from "@mysten/sui/bcs";
|
|
5
|
-
import { deriveDynamicFieldID } from "@mysten/sui/utils";
|
|
5
|
+
import { deriveDynamicFieldID, fromHex, toHex } from "@mysten/sui/utils";
|
|
6
|
+
import { isNotFound } from "@misofm/protocol";
|
|
6
7
|
import { invokeWithAdminCap } from "./vault.js";
|
|
7
8
|
import * as advisory from "@misofm/protocol/contracts/recording_advisory/recording_advisory";
|
|
8
9
|
import * as language from "@misofm/protocol/contracts/recording_language/recording_language";
|
|
9
|
-
import * as walrusData from "@misofm/protocol/contracts/recording_master_reference/deps/ori/
|
|
10
|
+
import * as walrusData from "@misofm/protocol/contracts/recording_master_reference/deps/ori/data";
|
|
10
11
|
import * as masterReference from "@misofm/protocol/contracts/recording_master_reference/recording_master_reference";
|
|
12
|
+
import * as engineSession from "@misofm/protocol/contracts/recording_engine_session/recording_engine_session";
|
|
11
13
|
import * as streamingTranscode from "@misofm/protocol/contracts/recording_streaming_transcode/recording_streaming_transcode";
|
|
14
|
+
import { unencryptedWalrusBlob } from "./internal.js";
|
|
12
15
|
function object(tx, value) {
|
|
13
16
|
return typeof value === "string" ? tx.object(value) : value;
|
|
14
17
|
}
|
|
@@ -74,6 +77,73 @@ export function setRecordingStreamingTranscode(p) {
|
|
|
74
77
|
});
|
|
75
78
|
};
|
|
76
79
|
}
|
|
80
|
+
const STEM_DIGEST_BYTES = 32;
|
|
81
|
+
function stemDigestBytes(digest) {
|
|
82
|
+
const bytes = typeof digest === "string" ? fromHex(digest) : digest;
|
|
83
|
+
if (bytes.length !== STEM_DIGEST_BYTES) {
|
|
84
|
+
throw new Error(`stem digest must be ${STEM_DIGEST_BYTES} bytes`);
|
|
85
|
+
}
|
|
86
|
+
return bytes;
|
|
87
|
+
}
|
|
88
|
+
function compareBytes(a, b) {
|
|
89
|
+
for (let index = 0; index < a.length; index += 1) {
|
|
90
|
+
if (a[index] !== b[index])
|
|
91
|
+
return a[index] - b[index];
|
|
92
|
+
}
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Sets or replaces the Miso Engine session attached to a Recording: the
|
|
97
|
+
* Session V1 blob plus one `Stem` per source. Stems are sorted by digest and
|
|
98
|
+
* checked for duplicates here, mirroring `recording_engine_session::new`, so a
|
|
99
|
+
* bad input fails before signing rather than on chain.
|
|
100
|
+
*/
|
|
101
|
+
export function setRecordingEngineSession(p) {
|
|
102
|
+
const stems = p.stems
|
|
103
|
+
.map((stem) => ({ digest: stemDigestBytes(stem.digest), blobId: stem.blobId }))
|
|
104
|
+
.sort((a, b) => compareBytes(a.digest, b.digest));
|
|
105
|
+
for (let index = 1; index < stems.length; index += 1) {
|
|
106
|
+
if (compareBytes(stems[index - 1].digest, stems[index].digest) === 0) {
|
|
107
|
+
throw new Error(`duplicate stem digest ${toHex(stems[index].digest)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return (tx) => {
|
|
111
|
+
const pkg = p.recordingEngineSessionPackageId;
|
|
112
|
+
const sessionBlob = unencryptedWalrusBlob(tx, p.oriPackageId, p.sessionBlobId);
|
|
113
|
+
const stemValues = stems.map((stem) => tx.add(engineSession.newStem({
|
|
114
|
+
package: pkg,
|
|
115
|
+
arguments: [
|
|
116
|
+
tx.pure.vector("u8", Array.from(stem.digest)),
|
|
117
|
+
unencryptedWalrusBlob(tx, p.oriPackageId, stem.blobId),
|
|
118
|
+
],
|
|
119
|
+
})));
|
|
120
|
+
const stemVector = tx.makeMoveVec({
|
|
121
|
+
type: `${pkg}::recording_engine_session::Stem`,
|
|
122
|
+
elements: stemValues,
|
|
123
|
+
});
|
|
124
|
+
const session = tx.add(engineSession._new({
|
|
125
|
+
package: pkg,
|
|
126
|
+
arguments: [sessionBlob, stemVector],
|
|
127
|
+
}));
|
|
128
|
+
invokeWithAdminCap(tx, p.authority, {
|
|
129
|
+
target: `${pkg}::recording_engine_session::set_engine_session`,
|
|
130
|
+
typeArguments: [p.recordingShareType, p.compositionShareType],
|
|
131
|
+
arguments: [object(tx, p.recordingId), session],
|
|
132
|
+
adminCapIndex: 1,
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** Removes the Recording's Miso Engine session reference, if present. */
|
|
137
|
+
export function unsetRecordingEngineSession(p) {
|
|
138
|
+
return (tx) => {
|
|
139
|
+
invokeWithAdminCap(tx, p.authority, {
|
|
140
|
+
target: `${p.recordingEngineSessionPackageId}::recording_engine_session::unset_engine_session`,
|
|
141
|
+
typeArguments: [p.recordingShareType, p.compositionShareType],
|
|
142
|
+
arguments: [object(tx, p.recordingId)],
|
|
143
|
+
adminCapIndex: 1,
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
}
|
|
77
147
|
/** Removes the Recording's streaming-transcode reference, if present. */
|
|
78
148
|
export function unsetRecordingStreamingTranscode(p) {
|
|
79
149
|
return (tx) => {
|
|
@@ -85,23 +155,71 @@ export function unsetRecordingStreamingTranscode(p) {
|
|
|
85
155
|
});
|
|
86
156
|
};
|
|
87
157
|
}
|
|
158
|
+
const EngineSessionField = bcs.struct("Field", {
|
|
159
|
+
id: bcs.Address,
|
|
160
|
+
name: engineSession.ExtensionKey,
|
|
161
|
+
value: engineSession.EngineSession,
|
|
162
|
+
});
|
|
163
|
+
const ENGINE_SESSION_KEY_BYTES = engineSession.ExtensionKey.serialize([false]).toBytes();
|
|
164
|
+
/** Parse an engine-session dynamic field's BCS content. */
|
|
165
|
+
export function parseRecordingEngineSessionContent(content) {
|
|
166
|
+
const { value } = EngineSessionField.parse(content);
|
|
167
|
+
if (value.data.confidentiality.$kind !== "Unencrypted") {
|
|
168
|
+
throw new Error("Recording engine session is unexpectedly encrypted");
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
sessionBlobId: String(value.data.blob_id),
|
|
172
|
+
stems: value.stems.map((stem) => {
|
|
173
|
+
if (stem.data.confidentiality.$kind !== "Unencrypted") {
|
|
174
|
+
throw new Error("Recording engine session stem is unexpectedly encrypted");
|
|
175
|
+
}
|
|
176
|
+
return { digest: toHex(Uint8Array.from(stem.digest)), blobId: String(stem.data.blob_id) };
|
|
177
|
+
}),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/** Deterministic dynamic-field id for a Recording's engine session. */
|
|
181
|
+
export function recordingEngineSessionFieldId(recordingId, recordingEngineSessionPackageId) {
|
|
182
|
+
return deriveDynamicFieldID(recordingId, `${recordingEngineSessionPackageId}::recording_engine_session::ExtensionKey`, ENGINE_SESSION_KEY_BYTES);
|
|
183
|
+
}
|
|
184
|
+
/** Read one Recording's engine session, or null when none is attached. */
|
|
185
|
+
export async function getRecordingEngineSession(client, recordingId, recordingEngineSessionPackageId) {
|
|
186
|
+
const fieldId = recordingEngineSessionFieldId(recordingId, recordingEngineSessionPackageId);
|
|
187
|
+
const { objects } = await client.core.getObjects({
|
|
188
|
+
objectIds: [fieldId],
|
|
189
|
+
include: { content: true },
|
|
190
|
+
});
|
|
191
|
+
const field = objects[0];
|
|
192
|
+
if (!field)
|
|
193
|
+
throw new Error("Recording engine-session read returned no result");
|
|
194
|
+
if (field instanceof Error) {
|
|
195
|
+
if (isNotFound(field))
|
|
196
|
+
return null;
|
|
197
|
+
throw field;
|
|
198
|
+
}
|
|
199
|
+
if (!field.content)
|
|
200
|
+
throw new Error("Recording engine-session field is missing BCS content");
|
|
201
|
+
return parseRecordingEngineSessionContent(field.content);
|
|
202
|
+
}
|
|
88
203
|
// ── Master-reference reads ───────────────────────────────────────────────────
|
|
89
|
-
// recording_master_reference stores the ori::
|
|
204
|
+
// recording_master_reference stores the ori::data::WalrusBlob value inline in a
|
|
90
205
|
// dynamic field on the Recording. Its empty ExtensionKey serializes to one false
|
|
91
206
|
// byte, so the field object id can be derived without listing the Recording's
|
|
92
207
|
// dynamic fields.
|
|
93
208
|
const MasterReferenceField = bcs.struct("Field", {
|
|
94
209
|
id: bcs.Address,
|
|
95
210
|
name: masterReference.ExtensionKey,
|
|
96
|
-
value: walrusData.
|
|
211
|
+
value: walrusData.WalrusBlob,
|
|
97
212
|
});
|
|
98
213
|
const MASTER_REFERENCE_KEY_BYTES = masterReference.ExtensionKey.serialize([
|
|
99
214
|
false,
|
|
100
215
|
]).toBytes();
|
|
101
|
-
/**
|
|
216
|
+
/**
|
|
217
|
+
* Parse an attached master reference's standalone Walrus blob id (decimal
|
|
218
|
+
* `u256`). Encrypted masters are returned as-is: the reference is the same
|
|
219
|
+
* either way, and access control belongs to the caller.
|
|
220
|
+
*/
|
|
102
221
|
export function parseRecordingMasterReferenceContent(content) {
|
|
103
|
-
|
|
104
|
-
return reference.$kind === "Blob" ? String(reference.Blob[0]) : null;
|
|
222
|
+
return String(MasterReferenceField.parse(content).value.blob_id);
|
|
105
223
|
}
|
|
106
224
|
/** Deterministic dynamic-field id for a Recording's master reference. */
|
|
107
225
|
export function recordingMasterReferenceFieldId(recordingId, recordingMasterReferencePackageId) {
|
|
@@ -135,9 +253,7 @@ export async function getRecordingMasterReferencesByIds(client, recordingIdsInpu
|
|
|
135
253
|
if (!target || object instanceof Error || !object.content)
|
|
136
254
|
return;
|
|
137
255
|
try {
|
|
138
|
-
|
|
139
|
-
if (blobId)
|
|
140
|
-
out[target.recordingId] = blobId;
|
|
256
|
+
out[target.recordingId] = parseRecordingMasterReferenceContent(object.content);
|
|
141
257
|
}
|
|
142
258
|
catch {
|
|
143
259
|
// Extension metadata is soft: retain valid tracks when one field is stale.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording-extensions.js","sourceRoot":"","sources":["../src/recording-extensions.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,sCAAsC;AAEtC,qFAAqF;AAErF,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"recording-extensions.js","sourceRoot":"","sources":["../src/recording-extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Parse a `bigint` or decimal string as an exact `u256`. */
|
|
2
|
+
export declare function walrusU256(label: string, value: bigint | string): bigint;
|
|
3
|
+
/** The base64url Walrus blob id for an on-chain `u256` blob id. */
|
|
4
|
+
export declare function walrusBlobIdFromU256(value: bigint | string): string;
|
|
5
|
+
/** The on-chain `u256` for a base64url Walrus blob id (43 characters). */
|
|
6
|
+
export declare function walrusBlobIdToU256(blobId: string): bigint;
|
|
7
|
+
/** Unpadded base64url. */
|
|
8
|
+
export declare function bytesToBase64Url(bytes: Uint8Array): string;
|
|
9
|
+
/** Strict inverse of {@link bytesToBase64Url}: no padding, no stray bits. */
|
|
10
|
+
export declare function base64UrlToBytes(value: string): Uint8Array;
|
|
11
|
+
//# sourceMappingURL=walrus-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walrus-ids.d.ts","sourceRoot":"","sources":["../src/walrus-ids.ts"],"names":[],"mappings":"AAgBA,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAWxE;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAQnE;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED,0BAA0B;AAC1B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAc1D;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA6B1D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Walrus blob id conversions.
|
|
5
|
+
*
|
|
6
|
+
* On chain a blob id is a `u256` (BCS little-endian). Off chain it is the
|
|
7
|
+
* unpadded base64url encoding of those same 32 little-endian bytes, which is
|
|
8
|
+
* also its key in a `miso-sources` staging bucket and its path on an
|
|
9
|
+
* aggregator. Both directions here are canonical: a value that does not
|
|
10
|
+
* round-trip byte for byte is rejected.
|
|
11
|
+
*/
|
|
12
|
+
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
13
|
+
/** Parse a `bigint` or decimal string as an exact `u256`. */
|
|
14
|
+
export function walrusU256(label, value) {
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = typeof value === "bigint" ? value : BigInt(value);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error(`${label} must be an exact u256 integer`);
|
|
21
|
+
}
|
|
22
|
+
if (parsed < 0n || parsed >= 1n << 256n) {
|
|
23
|
+
throw new Error(`${label} is outside u256 range`);
|
|
24
|
+
}
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
/** The base64url Walrus blob id for an on-chain `u256` blob id. */
|
|
28
|
+
export function walrusBlobIdFromU256(value) {
|
|
29
|
+
let remaining = walrusU256("Walrus blob id", value);
|
|
30
|
+
const bytes = new Uint8Array(32);
|
|
31
|
+
for (let index = 0; index < 32; index += 1) {
|
|
32
|
+
bytes[index] = Number(remaining & 0xffn);
|
|
33
|
+
remaining >>= 8n;
|
|
34
|
+
}
|
|
35
|
+
return bytesToBase64Url(bytes);
|
|
36
|
+
}
|
|
37
|
+
/** The on-chain `u256` for a base64url Walrus blob id (43 characters). */
|
|
38
|
+
export function walrusBlobIdToU256(blobId) {
|
|
39
|
+
const bytes = base64UrlToBytes(blobId);
|
|
40
|
+
if (bytes.length !== 32) {
|
|
41
|
+
throw new Error("Walrus blob id must decode to exactly 32 bytes");
|
|
42
|
+
}
|
|
43
|
+
let value = 0n;
|
|
44
|
+
for (let index = 31; index >= 0; index -= 1) {
|
|
45
|
+
value = (value << 8n) | BigInt(bytes[index]);
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
/** Unpadded base64url. */
|
|
50
|
+
export function bytesToBase64Url(bytes) {
|
|
51
|
+
let output = "";
|
|
52
|
+
for (let index = 0; index < bytes.length; index += 3) {
|
|
53
|
+
const a = bytes[index] ?? 0;
|
|
54
|
+
const b = bytes[index + 1] ?? 0;
|
|
55
|
+
const c = bytes[index + 2] ?? 0;
|
|
56
|
+
output += ALPHABET[a >>> 2];
|
|
57
|
+
output += ALPHABET[((a & 3) << 4) | (b >>> 4)];
|
|
58
|
+
if (index + 1 < bytes.length) {
|
|
59
|
+
output += ALPHABET[((b & 15) << 2) | (c >>> 6)];
|
|
60
|
+
}
|
|
61
|
+
if (index + 2 < bytes.length)
|
|
62
|
+
output += ALPHABET[c & 63];
|
|
63
|
+
}
|
|
64
|
+
return output;
|
|
65
|
+
}
|
|
66
|
+
/** Strict inverse of {@link bytesToBase64Url}: no padding, no stray bits. */
|
|
67
|
+
export function base64UrlToBytes(value) {
|
|
68
|
+
if (typeof value !== "string" ||
|
|
69
|
+
value.length % 4 === 1 ||
|
|
70
|
+
value.includes("=") ||
|
|
71
|
+
!/^[A-Za-z0-9_-]*$/.test(value)) {
|
|
72
|
+
throw new Error("invalid canonical base64url");
|
|
73
|
+
}
|
|
74
|
+
const bytes = new Uint8Array(Math.floor((value.length * 6) / 8));
|
|
75
|
+
let accumulator = 0;
|
|
76
|
+
let bits = 0;
|
|
77
|
+
let outputIndex = 0;
|
|
78
|
+
for (const character of value) {
|
|
79
|
+
const digit = ALPHABET.indexOf(character);
|
|
80
|
+
if (digit < 0)
|
|
81
|
+
throw new Error("invalid canonical base64url");
|
|
82
|
+
accumulator = (accumulator << 6) | digit;
|
|
83
|
+
bits += 6;
|
|
84
|
+
if (bits >= 8) {
|
|
85
|
+
bits -= 8;
|
|
86
|
+
bytes[outputIndex] = (accumulator >>> bits) & 0xff;
|
|
87
|
+
outputIndex += 1;
|
|
88
|
+
accumulator &= (1 << bits) - 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (bytesToBase64Url(bytes) !== value) {
|
|
92
|
+
throw new Error("invalid canonical base64url padding bits");
|
|
93
|
+
}
|
|
94
|
+
return bytes;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=walrus-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walrus-ids.js","sourceRoot":"","sources":["../src/walrus-ids.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misofm/platform",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"packageManager": "bun@1.4.0",
|
|
5
5
|
"description": "Complete client SDK for the Miso platform on Sui \u2014 high-level reads, pressings, listings, records, and work publishing.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -89,10 +89,6 @@
|
|
|
89
89
|
"types": "./dist/recording-extensions.d.ts",
|
|
90
90
|
"default": "./dist/recording-extensions.js"
|
|
91
91
|
},
|
|
92
|
-
"./mix": {
|
|
93
|
-
"types": "./dist/mix.d.ts",
|
|
94
|
-
"default": "./dist/mix.js"
|
|
95
|
-
},
|
|
96
92
|
"./read": {
|
|
97
93
|
"types": "./dist/read/index.d.ts",
|
|
98
94
|
"default": "./dist/read/index.js"
|
|
@@ -129,20 +125,18 @@
|
|
|
129
125
|
"prepare": "rm -rf dist && tsc -p tsconfig.build.json --noCheck"
|
|
130
126
|
},
|
|
131
127
|
"dependencies": {
|
|
132
|
-
"@misofm/protocol": "0.
|
|
128
|
+
"@misofm/protocol": "0.15.0",
|
|
133
129
|
"@mysten/bcs": "^2.1.1"
|
|
134
130
|
},
|
|
135
131
|
"devDependencies": {
|
|
136
132
|
"@mysten/codegen": "^0.11.14",
|
|
137
133
|
"@mysten/move-bytecode-template": "^0.4.0",
|
|
138
|
-
"@mysten/seal": "1.4.6",
|
|
139
134
|
"@mysten/sui": "2.29.0",
|
|
140
135
|
"@types/bun": "^1.3.14",
|
|
141
136
|
"typescript": "^7.0.2"
|
|
142
137
|
},
|
|
143
138
|
"peerDependencies": {
|
|
144
139
|
"@mysten/move-bytecode-template": "^0.4.0",
|
|
145
|
-
"@mysten/seal": "1.4.6",
|
|
146
140
|
"@mysten/sui": "2.29.0",
|
|
147
141
|
"typescript": "^5.7 || ^6 || ^7"
|
|
148
142
|
},
|
package/src/client.ts
CHANGED
|
@@ -310,7 +310,7 @@ export interface MisoPlatformConfig {
|
|
|
310
310
|
/** Curated genre vocabulary package and its shared derivation parent. */
|
|
311
311
|
genrePackageId?: string;
|
|
312
312
|
genreRegistryId?: string;
|
|
313
|
-
/** External ori package used to create
|
|
313
|
+
/** External ori package used to create `data::WalrusBlob` values. */
|
|
314
314
|
oriPackageId?: string;
|
|
315
315
|
}
|
|
316
316
|
|
package/src/contracts.ts
CHANGED
|
@@ -42,6 +42,7 @@ export * as releaseRevenueDistributor from "@misofm/protocol/contracts/release_r
|
|
|
42
42
|
export * as recordingAdvisory from "@misofm/protocol/contracts/recording_advisory/recording_advisory";
|
|
43
43
|
export * as recordingLanguage from "@misofm/protocol/contracts/recording_language/recording_language";
|
|
44
44
|
export * as recordingMasterReference from "@misofm/protocol/contracts/recording_master_reference/recording_master_reference";
|
|
45
|
+
export * as recordingEngineSession from "@misofm/protocol/contracts/recording_engine_session/recording_engine_session";
|
|
45
46
|
export * as recordingStreamingTranscode from "@misofm/protocol/contracts/recording_streaming_transcode/recording_streaming_transcode";
|
|
46
47
|
|
|
47
48
|
// Credits extensions (per-work credit stores + their role vocabularies).
|
package/src/cover.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
// Release cover art. A cover is a still image (optionally an animation) stored as
|
|
5
|
-
// a Walrus blob and referenced on-chain via `ori::
|
|
6
|
-
// (`ori::
|
|
7
|
-
// `cover_art::CoverArt`, and attach it to the Release with
|
|
5
|
+
// a Walrus blob and referenced on-chain via `ori::data::WalrusBlob`. We build the
|
|
6
|
+
// plaintext ref (`ori::data::new_blob`, a raw call — ori is an external dep), wrap
|
|
7
|
+
// it in a `cover_art::CoverArt`, and attach it to the Release with
|
|
8
8
|
// `release_cover_art::set_cover` (gated by the ReleaseAdminCap).
|
|
9
9
|
//
|
|
10
10
|
// Blob ids are passed as `u256` (decimal string or bigint) — the CLI converts the
|
|
@@ -20,7 +20,7 @@ import { deriveDynamicFieldID } from "@mysten/sui/utils";
|
|
|
20
20
|
import type { Transaction, TransactionObjectArgument } from "@mysten/sui/transactions";
|
|
21
21
|
import type { TxThunk } from "./transactions.ts";
|
|
22
22
|
import { asU64, directAdminCap, invokeWithAdminCap, type AdminCapAuthority, type ObjectInput, type U64Input } from "./vault.ts";
|
|
23
|
-
import { OPTION_NONE, OPTION_SOME } from "./internal.ts";
|
|
23
|
+
import { OPTION_NONE, OPTION_SOME, unencryptedWalrusBlob } from "./internal.ts";
|
|
24
24
|
import * as coverArt from "@misofm/protocol/contracts/cover_art/cover_art";
|
|
25
25
|
import * as releaseCoverArt from "@misofm/protocol/contracts/release_cover_art/release_cover_art";
|
|
26
26
|
|
|
@@ -44,7 +44,7 @@ interface SetReleaseCoverParamsBase {
|
|
|
44
44
|
coverArtPackageId: string;
|
|
45
45
|
/** `release_cover_art` package — home of the `set_cover` extension entry point. */
|
|
46
46
|
releaseCoverArtPackageId: string;
|
|
47
|
-
/** `ori` package (home of `
|
|
47
|
+
/** `ori` package (home of `data::new_blob` / the `WalrusBlob` type). */
|
|
48
48
|
oriPackageId: string;
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -59,12 +59,8 @@ export type SetReleaseTrackCoverParams = SetReleaseCoverParams & {
|
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
function buildCover(tx: Parameters<TxThunk>[0], p: SetReleaseCoverParams) {
|
|
62
|
-
const walrusType = `${p.oriPackageId}::
|
|
63
|
-
const blob = (id: bigint | string) =>
|
|
64
|
-
tx.moveCall({
|
|
65
|
-
target: `${p.oriPackageId}::walrus_data::new_blob`,
|
|
66
|
-
arguments: [tx.pure.u256(id)],
|
|
67
|
-
});
|
|
62
|
+
const walrusType = `${p.oriPackageId}::data::WalrusBlob`;
|
|
63
|
+
const blob = (id: bigint | string) => unencryptedWalrusBlob(tx, p.oriPackageId, id);
|
|
68
64
|
|
|
69
65
|
const still = blob(p.stillBlobId);
|
|
70
66
|
const animated =
|
|
@@ -113,17 +109,12 @@ export function setReleaseTrackCover(p: SetReleaseTrackCoverParams): TxThunk {
|
|
|
113
109
|
/**
|
|
114
110
|
* A normalized reference to a cover image's Walrus data. Blob ids are returned as
|
|
115
111
|
* `u256` decimal strings (the on-chain form); callers convert to a base64url
|
|
116
|
-
* aggregator URL with `@unconfirmed/ori` (`u256ToB64Url` / `
|
|
112
|
+
* aggregator URL with `@unconfirmed/ori` (`u256ToB64Url` / `walrusBlobUrl`).
|
|
113
|
+
*
|
|
114
|
+
* The current `cover_art` generation stores standalone `ori::data::WalrusBlob`
|
|
115
|
+
* values only, so every cover image is a `blob` reference.
|
|
117
116
|
*/
|
|
118
|
-
export type CoverImageRef =
|
|
119
|
-
| { kind: "blob"; blobId: string }
|
|
120
|
-
| {
|
|
121
|
-
kind: "quiltPatch";
|
|
122
|
-
quiltId: string;
|
|
123
|
-
version: number;
|
|
124
|
-
startIndex: number;
|
|
125
|
-
endIndex: number;
|
|
126
|
-
};
|
|
117
|
+
export type CoverImageRef = { kind: "blob"; blobId: string };
|
|
127
118
|
|
|
128
119
|
/** A release's album-level cover: a still image and an optional animation. */
|
|
129
120
|
export interface ReleaseCoverView {
|
|
@@ -143,24 +134,13 @@ const COVER_ART_KEY_BYTES = releaseCoverArt.ExtensionKey.serialize([
|
|
|
143
134
|
false,
|
|
144
135
|
]).toBytes();
|
|
145
136
|
|
|
146
|
-
/** A parsed `ori::
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
function toCoverImageRef(wd: ParsedWalrusData): CoverImageRef {
|
|
155
|
-
if (wd.$kind === "Blob") return { kind: "blob", blobId: String(wd.Blob[0]) };
|
|
156
|
-
const [quiltId, version, startIndex, endIndex] = wd.QuiltPatch;
|
|
157
|
-
return {
|
|
158
|
-
kind: "quiltPatch",
|
|
159
|
-
quiltId: String(quiltId),
|
|
160
|
-
version,
|
|
161
|
-
startIndex,
|
|
162
|
-
endIndex,
|
|
163
|
-
};
|
|
137
|
+
/** A parsed `ori::data::WalrusBlob` value. */
|
|
138
|
+
interface ParsedWalrusBlob {
|
|
139
|
+
blob_id: string | number | bigint;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function toCoverImageRef(blob: ParsedWalrusBlob): CoverImageRef {
|
|
143
|
+
return { kind: "blob", blobId: String(blob.blob_id) };
|
|
164
144
|
}
|
|
165
145
|
|
|
166
146
|
/**
|
|
@@ -185,8 +165,8 @@ export function parseReleaseCoverContent(
|
|
|
185
165
|
content: Uint8Array,
|
|
186
166
|
): ReleaseCoverView | null {
|
|
187
167
|
const cover = CoverArtField.parse(content).value.cover as {
|
|
188
|
-
still:
|
|
189
|
-
animated:
|
|
168
|
+
still: ParsedWalrusBlob;
|
|
169
|
+
animated: ParsedWalrusBlob | null;
|
|
190
170
|
} | null;
|
|
191
171
|
if (!cover) return null;
|
|
192
172
|
|
package/src/deployments.ts
CHANGED
|
@@ -216,11 +216,15 @@ export interface MisoPlatformDeployment {
|
|
|
216
216
|
readonly recordingMasterReference: string;
|
|
217
217
|
/** Complete Walrus Quilt containing the Recording's streaming transcodes. */
|
|
218
218
|
readonly recordingStreamingTranscode?: string;
|
|
219
|
-
/**
|
|
219
|
+
/**
|
|
220
|
+
* Miso Engine session: the Session V1 blob plus each stem's PCM digest and
|
|
221
|
+
* blob. Absent until the stems generation of `recording_engine_session` is
|
|
222
|
+
* published; the retired single-blob generation is not a substitute.
|
|
223
|
+
*/
|
|
220
224
|
readonly recordingEngineSession?: string;
|
|
221
225
|
/** Original immutable Record-gated Seal policy; absent before publication. */
|
|
222
226
|
readonly recordSealPolicy?: string;
|
|
223
|
-
/** External `ori::
|
|
227
|
+
/** External `ori` package (`data::WalrusBlob`, `data::WalrusQuilt`) used by Walrus-backed extensions. */
|
|
224
228
|
readonly ori: string;
|
|
225
229
|
};
|
|
226
230
|
readonly objects: {
|
|
@@ -317,8 +321,9 @@ export const MISO_PLATFORM_DEPLOYMENTS = immutableSnapshot({
|
|
|
317
321
|
"0xd6b7f206f838018a28d33b77bade2b8476ccafab5fe526345c375d3b47bb892f",
|
|
318
322
|
recordingMasterReference:
|
|
319
323
|
"0x65309bf315f3e035b0f10c706eb5c327af5038be1637a0cee74f4ae62872f6ce",
|
|
320
|
-
|
|
321
|
-
|
|
324
|
+
// 0x2fcb9ab9… is the retired single-blob generation. Fill in the stems
|
|
325
|
+
// generation's identity from Published.toml once it is published.
|
|
326
|
+
recordingEngineSession: undefined,
|
|
322
327
|
recordingStreamingTranscode:
|
|
323
328
|
"0x622cd2a9e49ee2639f5c1d922d2fc75e89e810e80da8dd6d4a843bcefa0aacb0",
|
|
324
329
|
recordSealPolicy:
|
package/src/index.ts
CHANGED
|
@@ -49,7 +49,7 @@ export * from "./share-template.ts";
|
|
|
49
49
|
export * from "./release-graph.ts";
|
|
50
50
|
export * from "./publication.ts";
|
|
51
51
|
export * from "./catalog.ts";
|
|
52
|
-
export * from "./
|
|
52
|
+
export * from "./walrus-ids.ts";
|
|
53
53
|
|
|
54
54
|
// High-level, JSON-safe platform projections used directly by clients and by
|
|
55
55
|
// the thin HTTP read service. Namespaced because these composed view types are
|
|
@@ -62,7 +62,6 @@ export * from "./credits.ts";
|
|
|
62
62
|
export * from "./cover.ts";
|
|
63
63
|
export * from "./release-extensions.ts";
|
|
64
64
|
export * from "./recording-extensions.ts";
|
|
65
|
-
export * from "./mix.ts";
|
|
66
65
|
export * from "./vault.ts";
|
|
67
66
|
|
|
68
67
|
// Generated, ABI-bound bindings (BCS structs + type-safe Move calls).
|
package/src/internal.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
// Internal shared helpers (deliberately NOT exported from the package root).
|
|
5
|
+
|
|
6
|
+
import type { Transaction, TransactionArgument } from "@mysten/sui/transactions";
|
|
5
7
|
//
|
|
6
8
|
// PTB building blocks — the `0x1::option` move-call targets used when a generated
|
|
7
9
|
// call needs an `Option` argument built inline. Consumed by `./cover` and
|
|
@@ -18,6 +20,29 @@
|
|
|
18
20
|
export const OPTION_NONE = "0x1::option::none";
|
|
19
21
|
export const OPTION_SOME = "0x1::option::some";
|
|
20
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Build a plaintext `ori::data::WalrusBlob` in the PTB: `confidentiality::new_unencrypted()`
|
|
25
|
+
* followed by `data::new_blob(blob_id, confidentiality)`. `ori` is an external
|
|
26
|
+
* dependency, so these are raw calls against the deployment's `ori` package.
|
|
27
|
+
*
|
|
28
|
+
* Every platform extension that stores a standalone blob (cover art, master
|
|
29
|
+
* reference, engine session) builds its reference here so the ori ABI is pinned
|
|
30
|
+
* in exactly one place.
|
|
31
|
+
*/
|
|
32
|
+
export function unencryptedWalrusBlob(
|
|
33
|
+
tx: Transaction,
|
|
34
|
+
oriPackageId: string,
|
|
35
|
+
blobId: bigint | string,
|
|
36
|
+
): TransactionArgument {
|
|
37
|
+
const confidentiality = tx.moveCall({
|
|
38
|
+
target: `${oriPackageId}::confidentiality::new_unencrypted`,
|
|
39
|
+
});
|
|
40
|
+
return tx.moveCall({
|
|
41
|
+
target: `${oriPackageId}::data::new_blob`,
|
|
42
|
+
arguments: [tx.pure.u256(blobId), confidentiality],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
21
46
|
/**
|
|
22
47
|
* Clone arrays and plain records recursively, then freeze the clone.
|
|
23
48
|
*
|