@arcadiasystems/morse-sdk 0.6.0 → 0.7.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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `morse-sdk` will be documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [0.7.0] - 2026-09-09
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **`RecipientFilesReader.getRecipientFileSealPrefix(id, signal?)`**, returning the file's Seal id prefix or `null`. Presence of the prefix is the only reliable "this file is encrypted" signal.
|
|
10
|
+
|
|
11
|
+
There was previously no way to tell an encrypted `RecipientFile` from a public one. Consumers reached for `RecipientFile.members`, which cannot work: the Move contract auto-includes the owner on creation, so `members` is non-empty for every file. A public file and an encrypted file both report exactly one member. morse-cli was using that check and refused to download any public file as a result.
|
|
12
|
+
|
|
13
|
+
The prefix lives in a `SealPrefixKey` dynamic field, attached only by `createEncryptedRecipientFile` and `uploadEncryptedRecipientFileFromBytes`. It is deliberately a separate call rather than a field on `RecipientFile`: detecting it costs one extra round trip and reading its bytes a second, and callers that only render metadata should not pay for either. The marker is matched by type suffix, not full type string, because the package id in that type moves on any upgrade that redefines the module; pinning it would silently make every encrypted file read as public after an upgrade.
|
|
14
|
+
|
|
15
|
+
Verified against live objects on both networks: a mainnet public file reports `members: 1, sealPrefix: null`, a testnet encrypted file reports `members: 1, sealPrefix: 32 bytes`.
|
|
16
|
+
|
|
5
17
|
## [0.6.0] - 2026-09-09
|
|
6
18
|
|
|
7
19
|
Fixes a mainnet Seal default shipped in 0.5.0 that could produce permanently unreadable ciphertext. Upgrade if you use `morseConfig({ network: "mainnet" })` with any encrypted path.
|
|
@@ -11,6 +11,7 @@ import type { PackageId, RecipientFile, RecipientFileId } from "../types.js";
|
|
|
11
11
|
/** Interface for reading `RecipientFile` objects. */
|
|
12
12
|
export interface RecipientFilesReader {
|
|
13
13
|
getRecipientFile(id: RecipientFileId, signal?: AbortSignal): Promise<RecipientFile>;
|
|
14
|
+
getRecipientFileSealPrefix(id: RecipientFileId, signal?: AbortSignal): Promise<Uint8Array | null>;
|
|
14
15
|
}
|
|
15
16
|
/** Configuration accepted by `RpcRecipientFilesReader.fromConfig`. */
|
|
16
17
|
export interface RpcRecipientFilesReaderConfig {
|
|
@@ -23,5 +24,18 @@ export declare class RpcRecipientFilesReader implements RecipientFilesReader {
|
|
|
23
24
|
private constructor();
|
|
24
25
|
static fromConfig(client: ObjectReader, config: RpcRecipientFilesReaderConfig): RpcRecipientFilesReader;
|
|
25
26
|
getRecipientFile(id: RecipientFileId, signal?: AbortSignal): Promise<RecipientFile>;
|
|
27
|
+
/**
|
|
28
|
+
* Read the file's Seal id prefix, or `null` when it has none. Presence of
|
|
29
|
+
* the prefix is the only reliable "this file is encrypted" signal.
|
|
30
|
+
*
|
|
31
|
+
* Do NOT infer encryption from `RecipientFile.members`. The Move contract
|
|
32
|
+
* auto-includes the owner on creation, so `members` is non-empty for every
|
|
33
|
+
* file, public ones included.
|
|
34
|
+
*
|
|
35
|
+
* Kept off `getRecipientFile` because the prefix lives in a dynamic field:
|
|
36
|
+
* detecting it costs one extra round trip, and reading its bytes costs a
|
|
37
|
+
* second. Callers that only render metadata should not pay for either.
|
|
38
|
+
*/
|
|
39
|
+
getRecipientFileSealPrefix(id: RecipientFileId, signal?: AbortSignal): Promise<Uint8Array | null>;
|
|
26
40
|
}
|
|
27
41
|
//# sourceMappingURL=recipient-files-reader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipient-files-reader.d.ts","sourceRoot":"","sources":["../../src/read/recipient-files-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"recipient-files-reader.d.ts","sourceRoot":"","sources":["../../src/read/recipient-files-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQlD,OAAO,KAAK,EAEX,SAAS,EACT,aAAa,EACb,eAAe,EAGf,MAAM,aAAa,CAAC;AAUrB,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,CACf,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,0BAA0B,CACzB,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC9B;AAED,sEAAsE;AACtE,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC9B;AAOD,iCAAiC;AACjC,qBAAa,uBAAwB,YAAW,oBAAoB;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO;IAKP,MAAM,CAAC,UAAU,CAChB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,6BAA6B,GACnC,uBAAuB;IAIpB,gBAAgB,CACrB,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC;IA6BzB;;;;;;;;;;;OAWG;IACG,0BAA0B,CAC/B,EAAE,EAAE,eAAe,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAuB7B"}
|
|
@@ -6,8 +6,20 @@
|
|
|
6
6
|
* filter and the move-call target paths use `config.packageId` (current
|
|
7
7
|
* published-at), not `originalPackageId` (publication-modules genesis).
|
|
8
8
|
*/
|
|
9
|
+
import { bcs } from "@mysten/sui/bcs";
|
|
9
10
|
import { toBlobObjectId, toRecipientFileId, toSuiAddress, toWalrusBlobId, } from "../codecs.js";
|
|
10
11
|
import { NotFoundError, TransportError, ValidationError } from "../errors.js";
|
|
12
|
+
/**
|
|
13
|
+
* Dynamic-field name type that marks a `RecipientFile` as encrypted. Matched
|
|
14
|
+
* by suffix rather than by full type string: the package id in the type is
|
|
15
|
+
* wherever `SealPrefixKey` was defined (the v4 upgrade on testnet, the genesis
|
|
16
|
+
* publish on mainnet) and moves again on any upgrade that redefines it.
|
|
17
|
+
*/
|
|
18
|
+
const SEAL_PREFIX_KEY_SUFFIX = "::recipient_file::SealPrefixKey";
|
|
19
|
+
/** The seal prefix dynamic field's value is a bare `vector<u8>`. */
|
|
20
|
+
const SealPrefixBcs = bcs.vector(bcs.u8()).transform({
|
|
21
|
+
output: (value) => new Uint8Array(value),
|
|
22
|
+
});
|
|
11
23
|
/** RPC-backed implementation. */
|
|
12
24
|
export class RpcRecipientFilesReader {
|
|
13
25
|
client;
|
|
@@ -44,6 +56,35 @@ export class RpcRecipientFilesReader {
|
|
|
44
56
|
}
|
|
45
57
|
return parseRecipientFile(object, this.packageId);
|
|
46
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the file's Seal id prefix, or `null` when it has none. Presence of
|
|
61
|
+
* the prefix is the only reliable "this file is encrypted" signal.
|
|
62
|
+
*
|
|
63
|
+
* Do NOT infer encryption from `RecipientFile.members`. The Move contract
|
|
64
|
+
* auto-includes the owner on creation, so `members` is non-empty for every
|
|
65
|
+
* file, public ones included.
|
|
66
|
+
*
|
|
67
|
+
* Kept off `getRecipientFile` because the prefix lives in a dynamic field:
|
|
68
|
+
* detecting it costs one extra round trip, and reading its bytes costs a
|
|
69
|
+
* second. Callers that only render metadata should not pay for either.
|
|
70
|
+
*/
|
|
71
|
+
async getRecipientFileSealPrefix(id, signal) {
|
|
72
|
+
const validated = toRecipientFileId(id);
|
|
73
|
+
const listed = await callClient("listDynamicFields", () => this.client.listDynamicFields({
|
|
74
|
+
parentId: validated,
|
|
75
|
+
...(signal === undefined ? {} : { signal }),
|
|
76
|
+
}));
|
|
77
|
+
const field = listed.dynamicFields.find((entry) => entry.name?.type?.endsWith(SEAL_PREFIX_KEY_SUFFIX));
|
|
78
|
+
if (!field?.name) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const response = await callClient("getDynamicField", () => this.client.getDynamicField({
|
|
82
|
+
parentId: validated,
|
|
83
|
+
name: { type: field.name.type, bcs: field.name.bcs },
|
|
84
|
+
...(signal === undefined ? {} : { signal }),
|
|
85
|
+
}));
|
|
86
|
+
return SealPrefixBcs.parse(response.dynamicField.value.bcs);
|
|
87
|
+
}
|
|
47
88
|
}
|
|
48
89
|
function parseRecipientFile(object, _expectedPackageId) {
|
|
49
90
|
const json = object.json;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipient-files-reader.js","sourceRoot":"","sources":["../../src/read/recipient-files-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"recipient-files-reader.js","sourceRoot":"","sources":["../../src/read/recipient-files-reader.ts"],"names":[],"mappings":"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"}
|