@calimero-network/mero-js 2.3.0 → 2.4.1

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/dist/index.mjs CHANGED
@@ -638,6 +638,24 @@ function createAuthApiClientFromHttpClient(httpClient, _config) {
638
638
  function unwrap(response) {
639
639
  return response.data;
640
640
  }
641
+ function compareSemver(a, b) {
642
+ const pa = a.split(".");
643
+ const pb = b.split(".");
644
+ const n = Math.max(pa.length, pb.length);
645
+ for (let i = 0; i < n; i++) {
646
+ const sa = pa[i] ?? "0";
647
+ const sb = pb[i] ?? "0";
648
+ const na = Number.parseInt(sa, 10);
649
+ const nb = Number.parseInt(sb, 10);
650
+ if (Number.isNaN(na) || Number.isNaN(nb)) {
651
+ const c = sa.localeCompare(sb);
652
+ if (c !== 0) return c;
653
+ } else if (na !== nb) {
654
+ return na - nb;
655
+ }
656
+ }
657
+ return 0;
658
+ }
641
659
  var AdminApiClient = class {
642
660
  constructor(httpClient) {
643
661
  this.httpClient = httpClient;
@@ -653,6 +671,57 @@ var AdminApiClient = class {
653
671
  async installApplication(request) {
654
672
  return unwrap(await this.httpClient.post("/admin-api/install-application", request));
655
673
  }
674
+ /**
675
+ * Resolve a `package@version` to its registry artifact URL and install it.
676
+ * Node install is URL-based (no node-side package+version resolution), so this
677
+ * fetches the bundle manifest from the registry, derives the `.mpk` artifact
678
+ * URL, then calls {@link installApplication}. `registryUrl` is the registry
679
+ * origin. This is the discrete "download" step an Updates flow pairs with a
680
+ * subsequent `upgradeGroup`.
681
+ */
682
+ async installFromRegistry(registryUrl, packageName, version) {
683
+ const base = new URL(registryUrl).origin;
684
+ const manifestUrl = new URL(
685
+ `/api/v2/bundles/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}`,
686
+ base
687
+ ).toString();
688
+ const resp = await fetch(manifestUrl);
689
+ if (!resp.ok) {
690
+ throw new Error(
691
+ `registry manifest fetch failed (${resp.status}) for ${packageName}@${version}`
692
+ );
693
+ }
694
+ const bundle = await resp.json();
695
+ const pkg = encodeURIComponent(bundle.package);
696
+ const ver = encodeURIComponent(bundle.appVersion);
697
+ const artifactUrl = `${base}/artifacts/${pkg}/${ver}/${pkg}-${ver}.mpk`;
698
+ return this.installApplication({
699
+ url: artifactUrl,
700
+ package: bundle.package,
701
+ version: bundle.appVersion,
702
+ metadata: []
703
+ });
704
+ }
705
+ /**
706
+ * List a package's published versions from the registry, newest-first by
707
+ * semver. Reads the registry's V2 bundle listing
708
+ * (`GET {registry}/api/v2/bundles?package={package}`), taking each bundle's
709
+ * `appVersion`. Registry-side data — distinct from the node's
710
+ * installed-version list — and the source an Updates view compares against
711
+ * the running `Context.applicationVersion` to detect "a new version exists".
712
+ */
713
+ async getRegistryVersions(registryUrl, packageName) {
714
+ const url = new URL("/api/v2/bundles", new URL(registryUrl).origin);
715
+ url.searchParams.set("package", packageName);
716
+ const resp = await fetch(url.toString());
717
+ if (!resp.ok) {
718
+ throw new Error(
719
+ `registry versions fetch failed (${resp.status}) for ${packageName}`
720
+ );
721
+ }
722
+ const bundles = await resp.json();
723
+ return (Array.isArray(bundles) ? bundles : []).map((b) => b.appVersion).filter((v) => typeof v === "string").sort((a, b) => compareSemver(b, a));
724
+ }
656
725
  async installDevApplication(request) {
657
726
  return unwrap(await this.httpClient.post("/admin-api/install-dev-application", request));
658
727
  }
@@ -968,7 +1037,7 @@ var AdminApiClient = class {
968
1037
  await this.httpClient.put(`/admin-api/groups/${groupId}/metadata`, request);
969
1038
  }
970
1039
  async getGroupMetadata(groupId) {
971
- return unwrap(await this.httpClient.get(`/admin-api/groups/${groupId}/metadata`)).data;
1040
+ return unwrap(await this.httpClient.get(`/admin-api/groups/${groupId}/metadata`))?.data ?? null;
972
1041
  }
973
1042
  async setMemberMetadata(groupId, identity, request) {
974
1043
  await this.httpClient.put(`/admin-api/groups/${groupId}/members/${identity}/metadata`, request);
@@ -976,7 +1045,7 @@ var AdminApiClient = class {
976
1045
  async getMemberMetadata(groupId, identity) {
977
1046
  return unwrap(
978
1047
  await this.httpClient.get(`/admin-api/groups/${groupId}/members/${identity}/metadata`)
979
- ).data;
1048
+ )?.data ?? null;
980
1049
  }
981
1050
  async setContextMetadata(groupId, contextId, request) {
982
1051
  await this.httpClient.put(`/admin-api/groups/${groupId}/contexts/${contextId}/metadata`, request);
@@ -984,7 +1053,7 @@ var AdminApiClient = class {
984
1053
  async getContextMetadata(groupId, contextId) {
985
1054
  return unwrap(
986
1055
  await this.httpClient.get(`/admin-api/groups/${groupId}/contexts/${contextId}/metadata`)
987
- ).data;
1056
+ )?.data ?? null;
988
1057
  }
989
1058
  async syncGroup(groupId, request) {
990
1059
  return unwrap(await this.httpClient.post(`/admin-api/groups/${groupId}/sync`, request ?? {}));
@@ -2007,6 +2076,7 @@ export {
2007
2076
  WsClient,
2008
2077
  buildAuthLoginUrl,
2009
2078
  combineSignals,
2079
+ compareSemver,
2010
2080
  createAdminApiClient,
2011
2081
  createAdminApiClientFromHttpClient,
2012
2082
  createAuthApiClient,