@ownables/platform-browser 0.1.0 → 0.5.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.
Files changed (118) hide show
  1. package/README.md +42 -0
  2. package/dist/core/src/index.d.ts +21 -0
  3. package/dist/core/src/index.d.ts.map +1 -0
  4. package/dist/core/src/index.js +20 -0
  5. package/dist/core/src/index.js.map +1 -0
  6. package/dist/core/src/interfaces/core.d.ts +53 -0
  7. package/dist/core/src/interfaces/core.d.ts.map +1 -0
  8. package/dist/core/src/interfaces/core.js +2 -0
  9. package/dist/core/src/interfaces/core.js.map +1 -0
  10. package/dist/core/src/logger.d.ts +3 -0
  11. package/dist/core/src/logger.d.ts.map +1 -0
  12. package/dist/core/src/logger.js +2 -0
  13. package/dist/core/src/logger.js.map +1 -0
  14. package/dist/core/src/ownableErrorMessage.d.ts +2 -0
  15. package/dist/core/src/ownableErrorMessage.d.ts.map +1 -0
  16. package/dist/core/src/ownableErrorMessage.js +20 -0
  17. package/dist/core/src/ownableErrorMessage.js.map +1 -0
  18. package/dist/core/src/progress.d.ts +3 -0
  19. package/dist/core/src/progress.d.ts.map +1 -0
  20. package/dist/core/src/progress.js +8 -0
  21. package/dist/core/src/progress.js.map +1 -0
  22. package/dist/core/src/services/EventChain.service.d.ts +47 -0
  23. package/dist/core/src/services/EventChain.service.d.ts.map +1 -0
  24. package/dist/core/src/services/EventChain.service.js +113 -0
  25. package/dist/core/src/services/EventChain.service.js.map +1 -0
  26. package/dist/core/src/services/Ownable.service.d.ts +60 -0
  27. package/dist/core/src/services/Ownable.service.d.ts.map +1 -0
  28. package/dist/core/src/services/Ownable.service.js +421 -0
  29. package/dist/core/src/services/Ownable.service.js.map +1 -0
  30. package/dist/core/src/services/Polling.service.d.ts +31 -0
  31. package/dist/core/src/services/Polling.service.d.ts.map +1 -0
  32. package/dist/core/src/services/Polling.service.js +109 -0
  33. package/dist/core/src/services/Polling.service.js.map +1 -0
  34. package/dist/core/src/services/SIWE.service.d.ts +16 -0
  35. package/dist/core/src/services/SIWE.service.d.ts.map +1 -0
  36. package/dist/core/src/services/SIWE.service.js +123 -0
  37. package/dist/core/src/services/SIWE.service.js.map +1 -0
  38. package/dist/core/src/services/StateStoreRecordStore.service.d.ts +13 -0
  39. package/dist/core/src/services/StateStoreRecordStore.service.d.ts.map +1 -0
  40. package/dist/core/src/services/StateStoreRecordStore.service.js +76 -0
  41. package/dist/core/src/services/StateStoreRecordStore.service.js.map +1 -0
  42. package/dist/core/src/services/WorkerRPC.service.d.ts +37 -0
  43. package/dist/core/src/services/WorkerRPC.service.d.ts.map +1 -0
  44. package/dist/core/src/services/WorkerRPC.service.js +219 -0
  45. package/dist/core/src/services/WorkerRPC.service.js.map +1 -0
  46. package/dist/core/src/services/workerSource.d.ts +2 -0
  47. package/dist/core/src/services/workerSource.d.ts.map +1 -0
  48. package/dist/core/src/services/workerSource.js +72 -0
  49. package/dist/core/src/services/workerSource.js.map +1 -0
  50. package/dist/core/src/types/Authority.d.ts +40 -0
  51. package/dist/core/src/types/Authority.d.ts.map +1 -0
  52. package/dist/core/src/types/Authority.js +2 -0
  53. package/dist/core/src/types/Authority.js.map +1 -0
  54. package/dist/core/src/types/EventChainStore.d.ts +12 -0
  55. package/dist/core/src/types/EventChainStore.d.ts.map +1 -0
  56. package/dist/core/src/types/EventChainStore.js +2 -0
  57. package/dist/core/src/types/EventChainStore.js.map +1 -0
  58. package/dist/core/src/types/MessageInfo.d.ts +19 -0
  59. package/dist/core/src/types/MessageInfo.d.ts.map +1 -0
  60. package/dist/core/src/types/MessageInfo.js +2 -0
  61. package/dist/core/src/types/MessageInfo.js.map +1 -0
  62. package/dist/core/src/types/OwnableRuntime.d.ts +40 -0
  63. package/dist/core/src/types/OwnableRuntime.d.ts.map +1 -0
  64. package/dist/core/src/types/OwnableRuntime.js +2 -0
  65. package/dist/core/src/types/OwnableRuntime.js.map +1 -0
  66. package/dist/core/src/types/Polling.d.ts +14 -0
  67. package/dist/core/src/types/Polling.d.ts.map +1 -0
  68. package/dist/core/src/types/Polling.js +2 -0
  69. package/dist/core/src/types/Polling.js.map +1 -0
  70. package/dist/core/src/types/SIWE.d.ts +30 -0
  71. package/dist/core/src/types/SIWE.d.ts.map +1 -0
  72. package/dist/core/src/types/SIWE.js +2 -0
  73. package/dist/core/src/types/SIWE.js.map +1 -0
  74. package/dist/core/src/types/TypedCosmWasmMsg.d.ts +12 -0
  75. package/dist/core/src/types/TypedCosmWasmMsg.d.ts.map +1 -0
  76. package/dist/core/src/types/TypedCosmWasmMsg.js +2 -0
  77. package/dist/core/src/types/TypedCosmWasmMsg.js.map +1 -0
  78. package/dist/core/src/types/TypedDict.d.ts +4 -0
  79. package/dist/core/src/types/TypedDict.d.ts.map +1 -0
  80. package/dist/core/src/types/TypedDict.js +2 -0
  81. package/dist/core/src/types/TypedDict.js.map +1 -0
  82. package/dist/core/src/types/TypedOwnableInfo.d.ts +34 -0
  83. package/dist/core/src/types/TypedOwnableInfo.d.ts.map +1 -0
  84. package/dist/core/src/types/TypedOwnableInfo.js +2 -0
  85. package/dist/core/src/types/TypedOwnableInfo.js.map +1 -0
  86. package/dist/core/src/types/TypedPackage.d.ts +35 -0
  87. package/dist/core/src/types/TypedPackage.d.ts.map +1 -0
  88. package/dist/core/src/types/TypedPackage.js +2 -0
  89. package/dist/core/src/types/TypedPackage.js.map +1 -0
  90. package/dist/platform-browser/src/index.d.ts +11 -0
  91. package/dist/platform-browser/src/index.d.ts.map +1 -0
  92. package/dist/platform-browser/src/index.js +11 -0
  93. package/dist/platform-browser/src/index.js.map +1 -0
  94. package/dist/platform-browser/src/services/IDB.service.d.ts +29 -0
  95. package/dist/platform-browser/src/services/IDB.service.d.ts.map +1 -0
  96. package/dist/platform-browser/src/services/IDB.service.js +192 -0
  97. package/dist/platform-browser/src/services/IDB.service.js.map +1 -0
  98. package/dist/platform-browser/src/services/LocalStorage.service.d.ts +14 -0
  99. package/dist/platform-browser/src/services/LocalStorage.service.d.ts.map +1 -0
  100. package/dist/platform-browser/src/services/LocalStorage.service.js +57 -0
  101. package/dist/platform-browser/src/services/LocalStorage.service.js.map +1 -0
  102. package/dist/platform-browser/src/services/Package.service.d.ts +49 -0
  103. package/dist/platform-browser/src/services/Package.service.d.ts.map +1 -0
  104. package/dist/platform-browser/src/services/Package.service.js +466 -0
  105. package/dist/platform-browser/src/services/Package.service.js.map +1 -0
  106. package/dist/platform-browser/src/services/Relay.service.d.ts +59 -0
  107. package/dist/platform-browser/src/services/Relay.service.d.ts.map +1 -0
  108. package/dist/platform-browser/src/services/Relay.service.js +299 -0
  109. package/dist/platform-browser/src/services/Relay.service.js.map +1 -0
  110. package/dist/platform-browser/src/services/SessionStorage.service.d.ts +7 -0
  111. package/dist/platform-browser/src/services/SessionStorage.service.d.ts.map +1 -0
  112. package/dist/platform-browser/src/services/SessionStorage.service.js +16 -0
  113. package/dist/platform-browser/src/services/SessionStorage.service.js.map +1 -0
  114. package/dist/platform-browser/src/utils/calculateCid.d.ts +2 -0
  115. package/dist/platform-browser/src/utils/calculateCid.d.ts.map +1 -0
  116. package/dist/platform-browser/src/utils/calculateCid.js +18 -0
  117. package/dist/platform-browser/src/utils/calculateCid.js.map +1 -0
  118. package/package.json +7 -2
@@ -0,0 +1,57 @@
1
+ export default class LocalStorageService {
2
+ prefix;
3
+ storage;
4
+ constructor(group = '', storage = localStorage) {
5
+ this.prefix = group ? `${group}:` : '';
6
+ this.storage = storage;
7
+ }
8
+ get(key) {
9
+ const value = this.storage.getItem(`${this.prefix}${key}`);
10
+ return value ? JSON.parse(value) : undefined;
11
+ }
12
+ set(key, value) {
13
+ this.storage.setItem(`${this.prefix}${key}`, JSON.stringify(value));
14
+ }
15
+ append(key, value) {
16
+ const list = this.get(`${this.prefix}${key}`) || [];
17
+ if (!Array.isArray(list))
18
+ throw new Error(`Unable to append value in local storage: "${key} is not an array"`);
19
+ list.push(value);
20
+ this.set(`${this.prefix}${key}`, list);
21
+ }
22
+ remove(key) {
23
+ this.storage.removeItem(`${this.prefix}${key}`);
24
+ }
25
+ clear() {
26
+ const keys = [];
27
+ for (let i = 0; i < this.storage.length; i++) {
28
+ const key = this.storage.key(i);
29
+ if (key && key.startsWith(this.prefix)) {
30
+ keys.push(key);
31
+ }
32
+ }
33
+ for (const key of keys) {
34
+ this.storage.removeItem(key);
35
+ }
36
+ }
37
+ static clearAll(storage = localStorage) {
38
+ storage.clear();
39
+ }
40
+ removeItem(key, value) {
41
+ const list = this.get(`${this.prefix}${key}`);
42
+ if (!Array.isArray(list))
43
+ throw new Error(`"${this.prefix}${key}" is not an array in local storage`);
44
+ const updatedList = typeof list[0] === "object"
45
+ ? list.filter((item) => item[value] !== value)
46
+ : list.filter((item) => item !== value);
47
+ this.set(`${this.prefix}${key}`, updatedList);
48
+ }
49
+ removeByField(key, field, value) {
50
+ const list = this.get(`${this.prefix}${key}`);
51
+ if (!Array.isArray(list))
52
+ throw new Error(`"${this.prefix}${key}" is not an array in local storage`);
53
+ const updatedList = list.filter((item) => item[field] !== value);
54
+ this.set(`${this.prefix}${key}`, updatedList);
55
+ }
56
+ }
57
+ //# sourceMappingURL=LocalStorage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorage.service.js","sourceRoot":"","sources":["../../../../src/services/LocalStorage.service.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACrB,MAAM,CAAS;IACf,OAAO,CAAU;IAElC,YAAY,QAAgB,EAAE,EAAE,UAAmB,YAAY;QAC7D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAU;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,KAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,6CAA6C,GAAG,mBAAmB,CACpE,CAAC;QAEJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK;QACH,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,UAAmB,YAAY;QAC7C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,KAAU;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,oCAAoC,CAAC,CAAC;QAE7E,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YACzB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAEjD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,KAAU;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,oCAAoC,CAAC,CAAC;QAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ import LocalStorageService from "./LocalStorage.service";
2
+ import type { TypedPackage, TypedPackageStub } from "@ownables/core/types/TypedPackage";
3
+ import JSZip from "jszip";
4
+ import IDBService from "./IDB.service";
5
+ import { RelayService } from "./Relay.service";
6
+ import { Buffer } from "buffer";
7
+ import { EventChain } from "eqty-core";
8
+ export default class PackageService {
9
+ private idb;
10
+ private relay;
11
+ private localStorage;
12
+ private readonly exampleUrl;
13
+ private readonly examples;
14
+ private readonly calculateCidFn;
15
+ private readonly fetchFn;
16
+ private readonly fileReaderFactory;
17
+ private readonly logger;
18
+ constructor(idb: IDBService, relay: RelayService, localStorage: LocalStorageService, options?: {
19
+ exampleUrl?: string;
20
+ examples?: TypedPackageStub[];
21
+ calculateCidFn?: (files: File[]) => Promise<string>;
22
+ fetchFn?: (input: string, init?: RequestInit) => Promise<Response>;
23
+ fileReaderFactory?: () => FileReader;
24
+ logger?: Pick<Console, "debug" | "info" | "warn" | "error">;
25
+ });
26
+ list(): Array<TypedPackage | TypedPackageStub>;
27
+ info(nameOrCid: string, uniqueMessageHash?: string): TypedPackage;
28
+ private storePackageInfo;
29
+ extractAssets(zipFile: File, chain?: boolean): Promise<File[]>;
30
+ private storeAssets;
31
+ private verifyStoreExists;
32
+ private retryStoreVerification;
33
+ base64ToBuffer(base64: string): Buffer;
34
+ bufferToString(buffer: Buffer): string;
35
+ getChainJson(filename: string, files: any): Promise<any>;
36
+ private getPackageJson;
37
+ private getCapabilities;
38
+ private validatePackageFormat;
39
+ processPackage(message: any, uniqueMessageHash?: string, isNotLocal?: boolean): Promise<TypedPackage | null>;
40
+ import(zipFile: File): Promise<TypedPackage>;
41
+ importFromRelay(): Promise<(boolean | TypedPackage[])[] | null>;
42
+ isCurrentEvent(chainJson: EventChain): Promise<boolean | undefined>;
43
+ downloadExample(key: string): Promise<TypedPackage>;
44
+ getAsset(cid: string, name: string, read: (fr: FileReader, contents: Blob | File) => void): Promise<string | ArrayBuffer>;
45
+ getAssetAsText(cid: string, name: string): Promise<string>;
46
+ getAssetAsDataUri(cid: string, name: string): Promise<string>;
47
+ zip(cid: string): Promise<JSZip>;
48
+ }
49
+ //# sourceMappingURL=Package.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Package.service.d.ts","sourceRoot":"","sources":["../../../../src/services/Package.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,466 @@
1
+ import JSZip from "jszip";
2
+ import mime from "mime/lite";
3
+ import calculateCid from "../utils/calculateCid";
4
+ import { Buffer } from "buffer";
5
+ import { EventChain } from "eqty-core";
6
+ const getMimeType = (filename) => mime?.getType?.(filename);
7
+ const capabilitiesStaticOwnable = {
8
+ isDynamic: false,
9
+ hasMetadata: false,
10
+ hasWidgetState: false,
11
+ isConsumable: false,
12
+ isConsumer: false,
13
+ isTransferable: false,
14
+ };
15
+ export default class PackageService {
16
+ idb;
17
+ relay;
18
+ localStorage;
19
+ exampleUrl;
20
+ examples;
21
+ calculateCidFn;
22
+ fetchFn;
23
+ fileReaderFactory;
24
+ logger;
25
+ constructor(idb, relay, localStorage, options = {}) {
26
+ this.idb = idb;
27
+ this.relay = relay;
28
+ this.localStorage = localStorage;
29
+ this.exampleUrl = options.exampleUrl;
30
+ this.examples = options.examples ?? [];
31
+ this.calculateCidFn = options.calculateCidFn ?? calculateCid;
32
+ this.fetchFn = options.fetchFn ?? ((input, init) => fetch(input, init));
33
+ this.fileReaderFactory = options.fileReaderFactory ?? (() => new FileReader());
34
+ this.logger = options.logger ?? console;
35
+ }
36
+ list() {
37
+ const local = (this.localStorage.get("packages") || []);
38
+ for (const pkg of local) {
39
+ pkg.versions = pkg.versions.map(({ date, cid }) => ({
40
+ date: new Date(date),
41
+ cid,
42
+ }));
43
+ }
44
+ const set = new Map([...this.examples, ...local].map((pkg) => [pkg.name, pkg])).values();
45
+ return Array.from(set).sort((a, b) => (a.title >= b.title ? 1 : -1));
46
+ }
47
+ info(nameOrCid, uniqueMessageHash) {
48
+ const packages = (this.localStorage.get("packages") ||
49
+ []);
50
+ const found = packages.find((pkg) => (pkg.name === nameOrCid ||
51
+ pkg.versions.some((v) => v.cid === nameOrCid)) &&
52
+ (!uniqueMessageHash ||
53
+ pkg.versions.some((v) => v.uniqueMessageHash === uniqueMessageHash)));
54
+ if (!found)
55
+ throw new Error(`Package not found: ${nameOrCid}`);
56
+ return found;
57
+ }
58
+ storePackageInfo(title, name, version, ownablesAbi, wireFormat, description, cid, keywords, capabilities, isNotLocal, uniqueMessageHash) {
59
+ const packages = (this.localStorage.get("packages") ||
60
+ []);
61
+ // Locate the package with matching cid and uniqueMessageHash
62
+ let pkg = packages.find((pkg) => pkg.name === name &&
63
+ pkg.cid === cid &&
64
+ pkg.uniqueMessageHash === uniqueMessageHash);
65
+ if (!pkg) {
66
+ const versionEntry = uniqueMessageHash
67
+ ? { date: new Date(), cid, uniqueMessageHash }
68
+ : { date: new Date(), cid };
69
+ // Create new package entry if not found
70
+ const createdPkg = {
71
+ title,
72
+ name,
73
+ cid,
74
+ keywords,
75
+ ...capabilities,
76
+ ...(version ? { version } : {}),
77
+ ...(ownablesAbi ? { ownablesAbi } : {}),
78
+ ...(wireFormat ? { wireFormat } : {}),
79
+ ...(description ? { description } : {}),
80
+ ...(isNotLocal ? { isNotLocal } : {}),
81
+ ...(uniqueMessageHash ? { uniqueMessageHash } : {}),
82
+ versions: [versionEntry],
83
+ };
84
+ pkg = createdPkg;
85
+ packages.push(createdPkg);
86
+ }
87
+ else {
88
+ // Update package and add new version info if it's an update
89
+ Object.assign(pkg, {
90
+ keywords,
91
+ ...(version ? { version } : {}),
92
+ ...(ownablesAbi ? { ownablesAbi } : {}),
93
+ ...(wireFormat ? { wireFormat } : {}),
94
+ ...(description ? { description } : {}),
95
+ ...(uniqueMessageHash ? { uniqueMessageHash } : {}),
96
+ ...capabilities,
97
+ });
98
+ const versionEntry = uniqueMessageHash
99
+ ? { date: new Date(), cid, uniqueMessageHash }
100
+ : { date: new Date(), cid };
101
+ pkg.versions.push(versionEntry);
102
+ }
103
+ // Save all packages back to LocalStorage under the single "packages" key
104
+ this.localStorage.set("packages", packages);
105
+ if (!pkg)
106
+ throw new Error("Failed to create package entry");
107
+ return pkg;
108
+ }
109
+ async extractAssets(zipFile, chain) {
110
+ const zip = await JSZip.loadAsync(zipFile);
111
+ if (chain) {
112
+ return await Promise.all(Array.from(Object.entries(zip.files))
113
+ .filter(([filename]) => !filename.startsWith("."))
114
+ .map(async ([filename, file]) => {
115
+ const blob = await file.async("blob");
116
+ const type = getMimeType(filename) || "application/octet-stream";
117
+ return new File([blob], filename, { type });
118
+ }));
119
+ }
120
+ return await Promise.all(Array.from(Object.entries(zip.files))
121
+ .filter(([filename]) => !filename.startsWith(".") && filename !== "chain.json")
122
+ .map(async ([filename, file]) => {
123
+ const blob = await file.async("blob");
124
+ const type = getMimeType(filename) || "application/octet-stream";
125
+ return new File([blob], filename, { type });
126
+ }));
127
+ }
128
+ async storeAssets(cid, files) {
129
+ const storeName = `package:${cid}`;
130
+ try {
131
+ if (!(await this.idb.hasStore(storeName))) {
132
+ await this.idb.createStore(storeName);
133
+ }
134
+ await this.idb.setAll(storeName, Object.fromEntries(files.map((file) => [file.name, file])));
135
+ // Verify store exists and has data
136
+ await this.verifyStoreExists(storeName, files.length);
137
+ }
138
+ catch (error) {
139
+ // Check for quota errors
140
+ if (error instanceof Error) {
141
+ if (error.name === 'QuotaExceededError' ||
142
+ error.message?.includes('quota') ||
143
+ error.message?.includes('QuotaExceeded')) {
144
+ throw new Error(`Device storage quota exceeded. Please free up space on your device and try again.`);
145
+ }
146
+ }
147
+ throw error;
148
+ }
149
+ }
150
+ async verifyStoreExists(storeName, expectedFileCount) {
151
+ const hasStore = await this.idb.hasStore(storeName);
152
+ if (!hasStore) {
153
+ throw new Error(`Store ${storeName} was not created successfully`);
154
+ }
155
+ // Verify data was written
156
+ try {
157
+ const keys = await this.idb.keys(storeName);
158
+ if (keys.length < expectedFileCount) {
159
+ throw new Error(`Store verification failed: expected ${expectedFileCount} files, found ${keys.length}`);
160
+ }
161
+ }
162
+ catch (error) {
163
+ // Check if it's a quota error
164
+ if (error instanceof Error && error.name === 'QuotaExceededError') {
165
+ throw new Error(`Device storage quota exceeded. Please free up space and try again.`);
166
+ }
167
+ throw error;
168
+ }
169
+ }
170
+ async retryStoreVerification(storeName, expectedFileCount, maxRetries = 3, delay = 1000) {
171
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
172
+ try {
173
+ await this.verifyStoreExists(storeName, expectedFileCount);
174
+ return; // Success
175
+ }
176
+ catch (error) {
177
+ this.logger.warn(`Store verification attempt ${attempt}/${maxRetries} failed:`, error);
178
+ if (attempt < maxRetries) {
179
+ // Wait before retry (exponential backoff)
180
+ await new Promise((resolve) => setTimeout(resolve, delay * attempt));
181
+ }
182
+ else {
183
+ // Last attempt failed
184
+ throw error;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ base64ToBuffer(base64) {
190
+ return Buffer.from(base64, "base64");
191
+ }
192
+ bufferToString(buffer) {
193
+ return buffer.toString("utf8");
194
+ }
195
+ async getChainJson(filename, files) {
196
+ const extractedFile = await this.extractAssets(files, true);
197
+ const file = extractedFile.find((file) => file.name === filename);
198
+ if (!file)
199
+ throw new Error(`Invalid package: missing ${filename}`);
200
+ const fileContent = await file.text();
201
+ const json = JSON.parse(fileContent);
202
+ json.events = json.events.map((event) => {
203
+ if (event.data.startsWith("base64:")) {
204
+ const base64Data = event.data.slice(7);
205
+ const bufferData = this.base64ToBuffer(base64Data);
206
+ event.parsedData = JSON.parse(this.bufferToString(bufferData));
207
+ }
208
+ return event;
209
+ });
210
+ return json;
211
+ }
212
+ async getPackageJson(filename, files) {
213
+ const file = files.find((file) => file.name === filename);
214
+ if (!file)
215
+ throw new Error(`Invalid package: missing ${filename}`);
216
+ return JSON.parse(await file.text());
217
+ }
218
+ async getCapabilities(files) {
219
+ if (files.findIndex((file) => file.name === "package.json") < 0)
220
+ throw new Error("Invalid package: missing package.json");
221
+ if (files.findIndex((file) => file.name === "ownable_bg.wasm") < 0)
222
+ return capabilitiesStaticOwnable;
223
+ const query = await this.getPackageJson("query_msg.json", files);
224
+ const execute = await this.getPackageJson("execute_msg.json", files);
225
+ const hasMethod = (schema, find) => schema.oneOf.findIndex((method) => method.required.includes(find)) >= 0;
226
+ if (!hasMethod(query, "get_info"))
227
+ throw new Error("Invalid package: missing `get_info` query method");
228
+ return {
229
+ isDynamic: true,
230
+ hasMetadata: hasMethod(query, "get_metadata"),
231
+ hasWidgetState: hasMethod(query, "get_widget_state"),
232
+ isConsumable: hasMethod(execute, "consume"),
233
+ isConsumer: hasMethod(query, "is_consumer_of"),
234
+ isTransferable: hasMethod(execute, "transfer"),
235
+ };
236
+ }
237
+ validatePackageFormat(packageJson, files) {
238
+ const hasWasm = files.some((file) => file.name === "ownable_bg.wasm");
239
+ if (!hasWasm)
240
+ return;
241
+ const ownablesAbi = packageJson.ownablesAbi;
242
+ const wireFormat = packageJson.wireFormat;
243
+ if (ownablesAbi !== "1") {
244
+ throw new Error(`Invalid package: expected package.json ownablesAbi to be \"1\", got \"${String(ownablesAbi)}\"`);
245
+ }
246
+ if (wireFormat !== "cbor") {
247
+ throw new Error(`Invalid package: expected package.json wireFormat to be \"cbor\", got \"${String(wireFormat)}\"`);
248
+ }
249
+ }
250
+ async processPackage(message, uniqueMessageHash, isNotLocal = false) {
251
+ let chainJson;
252
+ let files;
253
+ let packageJson;
254
+ //Extract files
255
+ if (isNotLocal) {
256
+ files = await this.extractAssets(message.data.buffer, false);
257
+ packageJson = await this.getPackageJson("package.json", files);
258
+ chainJson = await this.getChainJson("chain.json", message.data.buffer);
259
+ }
260
+ else {
261
+ files = message; // Local files
262
+ packageJson = await this.getPackageJson("package.json", files);
263
+ }
264
+ //Check for required JSON files
265
+ if (!packageJson) {
266
+ throw new Error("Missing package.json in extracted assets");
267
+ }
268
+ if (isNotLocal && !chainJson) {
269
+ throw new Error("Missing chain.json for relay package");
270
+ }
271
+ //Calculate CID
272
+ const cid = await this.calculateCidFn(files);
273
+ //Check for duplicates
274
+ if (await this.idb.hasStore(`package:${cid}`)) {
275
+ if (isNotLocal && chainJson && !(await this.isCurrentEvent(chainJson))) {
276
+ this.logger.warn(`Package with CID ${cid} is already current or newer.`);
277
+ return null;
278
+ }
279
+ }
280
+ //Prepare metadata
281
+ const name = packageJson.name || "Unnamed Package";
282
+ const title = name
283
+ .replace(/^ownable-|-ownable$/, "")
284
+ .replace(/[-_]+/, " ")
285
+ .replace(/\b\w/, (c) => c.toUpperCase());
286
+ const description = packageJson.description;
287
+ const version = packageJson.version;
288
+ const ownablesAbi = packageJson.ownablesAbi;
289
+ const wireFormat = packageJson.wireFormat;
290
+ const keywords = packageJson.keywords || [];
291
+ this.validatePackageFormat(packageJson, files);
292
+ const capabilities = await this.getCapabilities(files);
293
+ //Store assets
294
+ await this.storeAssets(cid, files);
295
+ //Store package info
296
+ const pkg = this.storePackageInfo(title, name, version, ownablesAbi, wireFormat, description, cid, keywords, capabilities, isNotLocal, uniqueMessageHash);
297
+ //Attach chain if needed
298
+ if (isNotLocal && chainJson) {
299
+ pkg.chain = EventChain.from(chainJson);
300
+ }
301
+ if (uniqueMessageHash) {
302
+ pkg.uniqueMessageHash = uniqueMessageHash;
303
+ }
304
+ return pkg;
305
+ }
306
+ async import(zipFile) {
307
+ const files = await this.extractAssets(zipFile);
308
+ const pkg = await this.processPackage(files);
309
+ if (!pkg) {
310
+ throw new Error("Failed to process package: duplicate or invalid package.");
311
+ }
312
+ // Verify store exists after import
313
+ const storeName = `package:${pkg.cid}`;
314
+ const hasStore = await this.idb.hasStore(storeName);
315
+ if (!hasStore) {
316
+ // Retry verification in background (non-blocking)
317
+ this.retryStoreVerification(storeName, files.length, 3, 1000)
318
+ .catch((error) => {
319
+ this.logger.error(`Background store verification failed after retries:`, error);
320
+ // Optionally notify user or log to error tracking service
321
+ });
322
+ // Still return the package even if verification is pending
323
+ // The background retry will handle it
324
+ }
325
+ else {
326
+ // Store exists, verify data integrity
327
+ try {
328
+ await this.verifyStoreExists(storeName, files.length);
329
+ }
330
+ catch (error) {
331
+ // If verification fails, start background retry
332
+ this.logger.warn(`Initial store verification failed, retrying in background:`, error);
333
+ this.retryStoreVerification(storeName, files.length, 3, 1000)
334
+ .catch((retryError) => {
335
+ this.logger.error(`Background store verification failed after retries:`, retryError);
336
+ });
337
+ }
338
+ }
339
+ return pkg;
340
+ }
341
+ async importFromRelay() {
342
+ try {
343
+ const relayData = await this.relay.readAll();
344
+ if (!relayData || !Array.isArray(relayData) || relayData.length === 0) {
345
+ return null;
346
+ }
347
+ // Filter out null values and transform to MessageExt format
348
+ const validMessages = relayData
349
+ .filter((data) => data !== null && data.message && data.hash)
350
+ .map((data) => ({
351
+ hash: data.hash,
352
+ recipient: data.message.recipient || "",
353
+ sender: data.message.sender || {},
354
+ size: data.message.data?.length || 0,
355
+ timestamp: new Date(data.message.timestamp || Date.now()),
356
+ type: data.message.meta?.type || "basic",
357
+ data: data.message.data,
358
+ signature: data.message.signature,
359
+ _hash: data.message.hash,
360
+ parsedData: data.message.parsedData || "",
361
+ messageHash: data.hash,
362
+ message: data.message,
363
+ }));
364
+ if (validMessages.length === 0) {
365
+ return null;
366
+ }
367
+ const filteredMessages = await this.relay.checkDuplicateMessage(validMessages);
368
+ let triggerRefresh = false;
369
+ const results = await Promise.all(filteredMessages.map(async (data) => {
370
+ try {
371
+ const { message, messageHash } = data;
372
+ const files = await this.extractAssets(message.data.buffer);
373
+ if (files.length === 0)
374
+ return null;
375
+ // Pass the hash to the processing function
376
+ const pkg = await this.processPackage(files, messageHash, true);
377
+ if (!pkg)
378
+ return;
379
+ if (await this.idb.hasStore(`package:${pkg.cid}`)) {
380
+ triggerRefresh = true;
381
+ }
382
+ return pkg;
383
+ }
384
+ catch (err) {
385
+ this.logger.error("Error processing data:", err);
386
+ return null;
387
+ }
388
+ }));
389
+ const packages = results.filter((pkg) => pkg !== null && pkg !== undefined);
390
+ return [packages, triggerRefresh];
391
+ }
392
+ catch (error) {
393
+ this.logger.error("Error:", error);
394
+ return null;
395
+ }
396
+ }
397
+ async isCurrentEvent(chainJson) {
398
+ let existingChain;
399
+ if (await this.idb.hasStore(`ownable:${chainJson.id}`)) {
400
+ existingChain = await this.idb.get(`ownable:${chainJson.id}`, "chain");
401
+ }
402
+ if (existingChain === undefined || existingChain.events === undefined) {
403
+ return true;
404
+ }
405
+ if (existingChain.events?.length) {
406
+ if (chainJson.events.length > existingChain.events.length) {
407
+ return true;
408
+ }
409
+ }
410
+ else {
411
+ return false;
412
+ }
413
+ }
414
+ async downloadExample(key) {
415
+ if (!this.exampleUrl)
416
+ throw new Error("Unable to download example ownable: URL not configured");
417
+ const filename = key.replace(/^ownable-/, "") + ".zip";
418
+ const response = await this.fetchFn(`${this.exampleUrl}/${filename}`);
419
+ if (!response.ok)
420
+ throw new Error(`Failed to download example ownable: ${response.statusText}`);
421
+ const contentType = response.headers.get("Content-Type")?.trim();
422
+ if (contentType !== "application/zip" &&
423
+ contentType !== "application/x-zip-compressed")
424
+ throw new Error("Failed to download example ownable: invalid content type");
425
+ const zipFile = new File([await response.blob()], `${key}.zip`, {
426
+ type: "application/zip",
427
+ });
428
+ return this.import(zipFile);
429
+ }
430
+ async getAsset(cid, name, read) {
431
+ return new Promise((resolve, reject) => {
432
+ const fileReader = this.fileReaderFactory();
433
+ this.idb.get(`package:${cid}`, name).then((mediaFile) => {
434
+ if (!mediaFile) {
435
+ reject(`Asset "${name}" is not in package ${cid}`);
436
+ }
437
+ fileReader.onload = (event) => {
438
+ const result = event.target?.result;
439
+ if (result === null || result === undefined) {
440
+ reject(new Error(`Failed to read asset "${name}" from package ${cid}`));
441
+ return;
442
+ }
443
+ resolve(result);
444
+ };
445
+ read(fileReader, mediaFile);
446
+ }, (error) => reject(error));
447
+ });
448
+ }
449
+ getAssetAsText(cid, name) {
450
+ const read = (fr, mediaFile) => fr.readAsText(mediaFile);
451
+ return this.getAsset(cid, name, read);
452
+ }
453
+ getAssetAsDataUri(cid, name) {
454
+ const read = (fr, mediaFile) => fr.readAsDataURL(mediaFile);
455
+ return this.getAsset(cid, name, read);
456
+ }
457
+ async zip(cid) {
458
+ const zip = new JSZip();
459
+ const files = await this.idb.getAll(`package:${cid}`);
460
+ for (const file of files) {
461
+ zip.file(file.name, file);
462
+ }
463
+ return zip;
464
+ }
465
+ }
466
+ //# sourceMappingURL=Package.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Package.service.js","sourceRoot":"","sources":["../../../../src/services/Package.service.ts"],"names":[],"mappings":"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"}