cojson 0.7.0-alpha.7 → 0.7.9

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 (114) hide show
  1. package/.eslintrc.cjs +3 -2
  2. package/.prettierrc.js +9 -0
  3. package/.turbo/turbo-build.log +3 -30
  4. package/.turbo/turbo-lint.log +4 -0
  5. package/.turbo/turbo-test.log +1106 -0
  6. package/CHANGELOG.md +118 -14
  7. package/LICENSE.txt +1 -1
  8. package/README.md +3 -1
  9. package/dist/base64url.test.js +25 -0
  10. package/dist/base64url.test.js.map +1 -0
  11. package/dist/coValueCore.js +60 -37
  12. package/dist/coValueCore.js.map +1 -1
  13. package/dist/coValues/account.js +20 -15
  14. package/dist/coValues/account.js.map +1 -1
  15. package/dist/coValues/coList.js +1 -1
  16. package/dist/coValues/coList.js.map +1 -1
  17. package/dist/coValues/coMap.js +17 -8
  18. package/dist/coValues/coMap.js.map +1 -1
  19. package/dist/coValues/group.js +13 -14
  20. package/dist/coValues/group.js.map +1 -1
  21. package/dist/coreToCoValue.js.map +1 -1
  22. package/dist/crypto/PureJSCrypto.js +89 -0
  23. package/dist/crypto/PureJSCrypto.js.map +1 -0
  24. package/dist/crypto/WasmCrypto.js +127 -0
  25. package/dist/crypto/WasmCrypto.js.map +1 -0
  26. package/dist/crypto/crypto.js +151 -0
  27. package/dist/crypto/crypto.js.map +1 -0
  28. package/dist/ids.js +4 -2
  29. package/dist/ids.js.map +1 -1
  30. package/dist/index.js +6 -8
  31. package/dist/index.js.map +1 -1
  32. package/dist/jsonStringify.js.map +1 -1
  33. package/dist/localNode.js +41 -38
  34. package/dist/localNode.js.map +1 -1
  35. package/dist/permissions.js +6 -6
  36. package/dist/permissions.js.map +1 -1
  37. package/dist/storage/FileSystem.js +61 -0
  38. package/dist/storage/FileSystem.js.map +1 -0
  39. package/dist/storage/chunksAndKnownStates.js +97 -0
  40. package/dist/storage/chunksAndKnownStates.js.map +1 -0
  41. package/dist/storage/index.js +265 -0
  42. package/dist/storage/index.js.map +1 -0
  43. package/dist/sync.js +29 -25
  44. package/dist/sync.js.map +1 -1
  45. package/dist/tests/account.test.js +58 -0
  46. package/dist/tests/account.test.js.map +1 -0
  47. package/dist/tests/coList.test.js +76 -0
  48. package/dist/tests/coList.test.js.map +1 -0
  49. package/dist/tests/coMap.test.js +136 -0
  50. package/dist/tests/coMap.test.js.map +1 -0
  51. package/dist/tests/coStream.test.js +172 -0
  52. package/dist/tests/coStream.test.js.map +1 -0
  53. package/dist/tests/coValueCore.test.js +114 -0
  54. package/dist/tests/coValueCore.test.js.map +1 -0
  55. package/dist/tests/crypto.test.js +118 -0
  56. package/dist/tests/crypto.test.js.map +1 -0
  57. package/dist/tests/cryptoImpl.test.js +113 -0
  58. package/dist/tests/cryptoImpl.test.js.map +1 -0
  59. package/dist/tests/group.test.js +34 -0
  60. package/dist/tests/group.test.js.map +1 -0
  61. package/dist/tests/permissions.test.js +1060 -0
  62. package/dist/tests/permissions.test.js.map +1 -0
  63. package/dist/tests/sync.test.js +816 -0
  64. package/dist/tests/sync.test.js.map +1 -0
  65. package/dist/tests/testUtils.js +12 -11
  66. package/dist/tests/testUtils.js.map +1 -1
  67. package/dist/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -1
  68. package/dist/typeUtils/isAccountID.js.map +1 -1
  69. package/dist/typeUtils/isCoValue.js.map +1 -1
  70. package/package.json +14 -27
  71. package/src/base64url.test.ts +6 -5
  72. package/src/coValue.ts +1 -1
  73. package/src/coValueCore.ts +179 -126
  74. package/src/coValues/account.ts +37 -32
  75. package/src/coValues/coList.ts +11 -11
  76. package/src/coValues/coMap.ts +27 -17
  77. package/src/coValues/coStream.ts +17 -17
  78. package/src/coValues/group.ts +93 -109
  79. package/src/coreToCoValue.ts +5 -2
  80. package/src/crypto/PureJSCrypto.ts +200 -0
  81. package/src/crypto/WasmCrypto.ts +259 -0
  82. package/src/crypto/crypto.ts +336 -0
  83. package/src/ids.ts +8 -7
  84. package/src/index.ts +24 -24
  85. package/src/jsonStringify.ts +6 -4
  86. package/src/jsonValue.ts +2 -2
  87. package/src/localNode.ts +103 -109
  88. package/src/media.ts +3 -3
  89. package/src/permissions.ts +19 -21
  90. package/src/storage/FileSystem.ts +152 -0
  91. package/src/storage/chunksAndKnownStates.ts +139 -0
  92. package/src/storage/index.ts +479 -0
  93. package/src/streamUtils.ts +12 -12
  94. package/src/sync.ts +79 -63
  95. package/src/tests/account.test.ts +15 -15
  96. package/src/tests/coList.test.ts +94 -0
  97. package/src/tests/coMap.test.ts +162 -0
  98. package/src/tests/coStream.test.ts +246 -0
  99. package/src/tests/coValueCore.test.ts +36 -37
  100. package/src/tests/crypto.test.ts +66 -72
  101. package/src/tests/cryptoImpl.test.ts +183 -0
  102. package/src/tests/group.test.ts +16 -17
  103. package/src/tests/permissions.test.ts +269 -283
  104. package/src/tests/sync.test.ts +122 -123
  105. package/src/tests/testUtils.ts +24 -21
  106. package/src/typeUtils/accountOrAgentIDfromSessionID.ts +1 -2
  107. package/src/typeUtils/expectGroup.ts +1 -1
  108. package/src/typeUtils/isAccountID.ts +0 -1
  109. package/src/typeUtils/isCoValue.ts +1 -2
  110. package/tsconfig.json +0 -1
  111. package/dist/crypto.js +0 -254
  112. package/dist/crypto.js.map +0 -1
  113. package/src/crypto.ts +0 -484
  114. package/src/tests/coValue.test.ts +0 -497
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.test.js","sourceRoot":"","sources":["../../src/tests/account.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;AAEzC,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC3E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,GAC/C,MAAM,SAAS,CAAC,uBAAuB,CAAC;QACpC,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;QAC5C,MAAM,EAAE,MAAM;KACjB,CAAC,CAAC;IAEP,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAC3D,mBAAmB,CACtB,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,uBAAuB,CAAC;QAChE,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;QAC5C,MAAM,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE7B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,GACpC,MAAM,SAAS,CAAC,uBAAuB,CAAC;QACpC,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;QAC5C,MAAM,EAAE,MAAM;KACjB,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAE7B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE;QAChE,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC;QAC5C,SAAS;QACT,aAAa;QACb,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,eAAe,EAAE,CAAC,WAAW,CAAC;QAC9B,MAAM,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE/D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { expect, test } from "vitest";
2
+ import { expectList } from "../coValue.js";
3
+ import { WasmCrypto } from "../index.js";
4
+ import { LocalNode } from "../localNode.js";
5
+ import { randomAnonymousAccountAndSessionID } from "./testUtils.js";
6
+ const Crypto = await WasmCrypto.create();
7
+ test("Empty CoList works", () => {
8
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
9
+ const coValue = node.createCoValue({
10
+ type: "colist",
11
+ ruleset: { type: "unsafeAllowAll" },
12
+ meta: null,
13
+ ...Crypto.createdNowUnique(),
14
+ });
15
+ const content = expectList(coValue.getCurrentContent());
16
+ expect(content.type).toEqual("colist");
17
+ expect(content.toJSON()).toEqual([]);
18
+ });
19
+ test("Can append, prepend, delete and replace items in CoList", () => {
20
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
21
+ const coValue = node.createCoValue({
22
+ type: "colist",
23
+ ruleset: { type: "unsafeAllowAll" },
24
+ meta: null,
25
+ ...Crypto.createdNowUnique(),
26
+ });
27
+ const content = expectList(coValue.getCurrentContent());
28
+ content.append("hello", 0, "trusting");
29
+ expect(content.toJSON()).toEqual(["hello"]);
30
+ content.append("world", 0, "trusting");
31
+ expect(content.toJSON()).toEqual(["hello", "world"]);
32
+ content.prepend("beautiful", 1, "trusting");
33
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "world"]);
34
+ content.prepend("hooray", 3, "trusting");
35
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "world", "hooray"]);
36
+ content.replace(2, "universe", "trusting");
37
+ expect(content.toJSON()).toEqual([
38
+ "hello",
39
+ "beautiful",
40
+ "universe",
41
+ "hooray",
42
+ ]);
43
+ content.delete(2, "trusting");
44
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "hooray"]);
45
+ });
46
+ test("Push is equivalent to append after last item", () => {
47
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
48
+ const coValue = node.createCoValue({
49
+ type: "colist",
50
+ ruleset: { type: "unsafeAllowAll" },
51
+ meta: null,
52
+ ...Crypto.createdNowUnique(),
53
+ });
54
+ const content = expectList(coValue.getCurrentContent());
55
+ expect(content.type).toEqual("colist");
56
+ content.append("hello", 0, "trusting");
57
+ expect(content.toJSON()).toEqual(["hello"]);
58
+ content.append("world", undefined, "trusting");
59
+ expect(content.toJSON()).toEqual(["hello", "world"]);
60
+ content.append("hooray", undefined, "trusting");
61
+ expect(content.toJSON()).toEqual(["hello", "world", "hooray"]);
62
+ });
63
+ test("Can push into empty list", () => {
64
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
65
+ const coValue = node.createCoValue({
66
+ type: "colist",
67
+ ruleset: { type: "unsafeAllowAll" },
68
+ meta: null,
69
+ ...Crypto.createdNowUnique(),
70
+ });
71
+ const content = expectList(coValue.getCurrentContent());
72
+ expect(content.type).toEqual("colist");
73
+ content.append("hello", undefined, "trusting");
74
+ expect(content.toJSON()).toEqual(["hello"]);
75
+ });
76
+ //# sourceMappingURL=coList.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coList.test.js","sourceRoot":"","sources":["../../src/tests/coList.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { expect, test } from "vitest";
2
+ import { expectMap } from "../coValue.js";
3
+ import { WasmCrypto } from "../index.js";
4
+ import { LocalNode } from "../localNode.js";
5
+ import { accountOrAgentIDfromSessionID } from "../typeUtils/accountOrAgentIDfromSessionID.js";
6
+ import { randomAnonymousAccountAndSessionID } from "./testUtils.js";
7
+ const Crypto = await WasmCrypto.create();
8
+ test("Empty CoMap works", () => {
9
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
10
+ const coValue = node.createCoValue({
11
+ type: "comap",
12
+ ruleset: { type: "unsafeAllowAll" },
13
+ meta: null,
14
+ ...Crypto.createdNowUnique(),
15
+ });
16
+ const content = expectMap(coValue.getCurrentContent());
17
+ expect(content.type).toEqual("comap");
18
+ expect([...content.keys()]).toEqual([]);
19
+ expect(content.toJSON()).toEqual({});
20
+ });
21
+ test("Can insert and delete CoMap entries in edit()", () => {
22
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
23
+ const coValue = node.createCoValue({
24
+ type: "comap",
25
+ ruleset: { type: "unsafeAllowAll" },
26
+ meta: null,
27
+ ...Crypto.createdNowUnique(),
28
+ });
29
+ const content = expectMap(coValue.getCurrentContent());
30
+ expect(content.type).toEqual("comap");
31
+ content.set("hello", "world", "trusting");
32
+ expect(content.get("hello")).toEqual("world");
33
+ content.set("foo", "bar", "trusting");
34
+ expect(content.get("foo")).toEqual("bar");
35
+ expect([...content.keys()]).toEqual(["hello", "foo"]);
36
+ content.delete("foo", "trusting");
37
+ expect(content.get("foo")).toEqual(undefined);
38
+ expect(content.keys()).toEqual(["hello"]);
39
+ });
40
+ test("Can get CoMap entry values at different points in time", () => {
41
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
42
+ const coValue = node.createCoValue({
43
+ type: "comap",
44
+ ruleset: { type: "unsafeAllowAll" },
45
+ meta: null,
46
+ ...Crypto.createdNowUnique(),
47
+ });
48
+ const content = expectMap(coValue.getCurrentContent());
49
+ expect(content.type).toEqual("comap");
50
+ const beforeA = Date.now();
51
+ while (Date.now() < beforeA + 10) {
52
+ /* hot sleep */
53
+ }
54
+ content.set("hello", "A", "trusting");
55
+ const beforeB = Date.now();
56
+ while (Date.now() < beforeB + 10) {
57
+ /* hot sleep */
58
+ }
59
+ content.set("hello", "B", "trusting");
60
+ const beforeC = Date.now();
61
+ while (Date.now() < beforeC + 10) {
62
+ /* hot sleep */
63
+ }
64
+ content.set("hello", "C", "trusting");
65
+ expect(content.get("hello")).toEqual("C");
66
+ expect(content.atTime(Date.now()).get("hello")).toEqual("C");
67
+ expect(content.atTime(beforeA).get("hello")).toEqual(undefined);
68
+ expect(content.atTime(beforeB).get("hello")).toEqual("A");
69
+ expect(content.atTime(beforeC).get("hello")).toEqual("B");
70
+ });
71
+ test("Can get all historic values of key in CoMap", () => {
72
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
73
+ const coValue = node.createCoValue({
74
+ type: "comap",
75
+ ruleset: { type: "unsafeAllowAll" },
76
+ meta: null,
77
+ ...Crypto.createdNowUnique(),
78
+ });
79
+ const content = expectMap(coValue.getCurrentContent());
80
+ expect(content.type).toEqual("comap");
81
+ content.set("hello", "A", "trusting");
82
+ const editA = content.lastEditAt("hello");
83
+ content.set("hello", "B", "trusting");
84
+ const editB = content.lastEditAt("hello");
85
+ content.delete("hello", "trusting");
86
+ const editDel = content.lastEditAt("hello");
87
+ content.set("hello", "C", "trusting");
88
+ const editC = content.lastEditAt("hello");
89
+ expect([...content.editsAt("hello")]).toEqual([
90
+ {
91
+ tx: editA.tx,
92
+ by: node.account.id,
93
+ value: "A",
94
+ at: editA?.at,
95
+ },
96
+ {
97
+ tx: editB.tx,
98
+ by: node.account.id,
99
+ value: "B",
100
+ at: editB?.at,
101
+ },
102
+ {
103
+ tx: editDel.tx,
104
+ by: node.account.id,
105
+ value: undefined,
106
+ at: editDel?.at,
107
+ },
108
+ {
109
+ tx: editC.tx,
110
+ by: node.account.id,
111
+ value: "C",
112
+ at: editC?.at,
113
+ },
114
+ ]);
115
+ });
116
+ test("Can get last tx ID for a key in CoMap", () => {
117
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
118
+ const coValue = node.createCoValue({
119
+ type: "comap",
120
+ ruleset: { type: "unsafeAllowAll" },
121
+ meta: null,
122
+ ...Crypto.createdNowUnique(),
123
+ });
124
+ const content = expectMap(coValue.getCurrentContent());
125
+ expect(content.type).toEqual("comap");
126
+ expect(content.lastEditAt("hello")).toEqual(undefined);
127
+ content.set("hello", "A", "trusting");
128
+ const sessionID = content.lastEditAt("hello")?.tx.sessionID;
129
+ expect(sessionID && accountOrAgentIDfromSessionID(sessionID)).toEqual(node.account.id);
130
+ expect(content.lastEditAt("hello")?.tx.txIndex).toEqual(0);
131
+ content.set("hello", "B", "trusting");
132
+ expect(content.lastEditAt("hello")?.tx.txIndex).toEqual(1);
133
+ content.set("hello", "C", "trusting");
134
+ expect(content.lastEditAt("hello")?.tx.txIndex).toEqual(2);
135
+ });
136
+ //# sourceMappingURL=coMap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coMap.test.js","sourceRoot":"","sources":["../../src/tests/coMap.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { expect, test } from "vitest";
2
+ import { expectStream } from "../coValue.js";
3
+ import { RawBinaryCoStream } from "../coValues/coStream.js";
4
+ import { MAX_RECOMMENDED_TX_SIZE, WasmCrypto } from "../index.js";
5
+ import { LocalNode } from "../localNode.js";
6
+ import { randomAnonymousAccountAndSessionID } from "./testUtils.js";
7
+ const Crypto = await WasmCrypto.create();
8
+ test("Empty CoStream works", () => {
9
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
10
+ const coValue = node.createCoValue({
11
+ type: "costream",
12
+ ruleset: { type: "unsafeAllowAll" },
13
+ meta: null,
14
+ ...Crypto.createdNowUnique(),
15
+ });
16
+ const content = expectStream(coValue.getCurrentContent());
17
+ expect(content.type).toEqual("costream");
18
+ expect(content.toJSON()).toEqual({});
19
+ expect(content.getSingleStream()).toEqual(undefined);
20
+ });
21
+ test("Can push into CoStream", () => {
22
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
23
+ const coValue = node.createCoValue({
24
+ type: "costream",
25
+ ruleset: { type: "unsafeAllowAll" },
26
+ meta: null,
27
+ ...Crypto.createdNowUnique(),
28
+ });
29
+ const content = expectStream(coValue.getCurrentContent());
30
+ content.push({ hello: "world" }, "trusting");
31
+ expect(content.toJSON()).toEqual({
32
+ [node.currentSessionID]: [{ hello: "world" }],
33
+ });
34
+ content.push({ foo: "bar" }, "trusting");
35
+ expect(content.toJSON()).toEqual({
36
+ [node.currentSessionID]: [{ hello: "world" }, { foo: "bar" }],
37
+ });
38
+ expect(content.getSingleStream()).toEqual([
39
+ { hello: "world" },
40
+ { foo: "bar" },
41
+ ]);
42
+ });
43
+ test("Empty RawBinaryCoStream works", () => {
44
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
45
+ const coValue = node.createCoValue({
46
+ type: "costream",
47
+ ruleset: { type: "unsafeAllowAll" },
48
+ meta: { type: "binary" },
49
+ ...Crypto.createdNowUnique(),
50
+ });
51
+ const content = coValue.getCurrentContent();
52
+ if (content.type !== "costream" ||
53
+ content.headerMeta?.type !== "binary" ||
54
+ !(content instanceof RawBinaryCoStream)) {
55
+ throw new Error("Expected binary stream");
56
+ }
57
+ expect(content.type).toEqual("costream");
58
+ expect(content.headerMeta.type).toEqual("binary");
59
+ expect(content.toJSON()).toEqual({});
60
+ expect(content.getBinaryChunks()).toEqual(undefined);
61
+ });
62
+ test("Can push into RawBinaryCoStream", () => {
63
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
64
+ const coValue = node.createCoValue({
65
+ type: "costream",
66
+ ruleset: { type: "unsafeAllowAll" },
67
+ meta: { type: "binary" },
68
+ ...Crypto.createdNowUnique(),
69
+ });
70
+ const content = coValue.getCurrentContent();
71
+ if (content.type !== "costream" ||
72
+ content.headerMeta?.type !== "binary" ||
73
+ !(content instanceof RawBinaryCoStream)) {
74
+ throw new Error("Expected binary stream");
75
+ }
76
+ content.startBinaryStream({ mimeType: "text/plain", fileName: "test.txt" }, "trusting");
77
+ content.pushBinaryStreamChunk(new Uint8Array([1, 2, 3]), "trusting");
78
+ content.pushBinaryStreamChunk(new Uint8Array([4, 5, 6]), "trusting");
79
+ content.endBinaryStream("trusting");
80
+ expect(content.getBinaryChunks()).toEqual({
81
+ mimeType: "text/plain",
82
+ fileName: "test.txt",
83
+ chunks: [new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6])],
84
+ finished: true,
85
+ });
86
+ });
87
+ test("When adding large transactions (small fraction of MAX_RECOMMENDED_TX_SIZE), we store an inbetween signature every time we reach MAX_RECOMMENDED_TX_SIZE and split up newContentSince accordingly", () => {
88
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
89
+ const coValue = node.createCoValue({
90
+ type: "costream",
91
+ ruleset: { type: "unsafeAllowAll" },
92
+ meta: { type: "binary" },
93
+ ...Crypto.createdNowUnique(),
94
+ });
95
+ const content = coValue.getCurrentContent();
96
+ if (content.type !== "costream" ||
97
+ content.headerMeta?.type !== "binary" ||
98
+ !(content instanceof RawBinaryCoStream)) {
99
+ throw new Error("Expected binary stream");
100
+ }
101
+ content.startBinaryStream({ mimeType: "text/plain", fileName: "test.txt" }, "trusting");
102
+ for (let i = 0; i < 10; i++) {
103
+ const chunk = new Uint8Array(MAX_RECOMMENDED_TX_SIZE / 3 + 100);
104
+ content.pushBinaryStreamChunk(chunk, "trusting");
105
+ }
106
+ content.endBinaryStream("trusting");
107
+ const sessionEntry = coValue.sessionLogs.get(node.currentSessionID);
108
+ expect(sessionEntry.transactions.length).toEqual(12);
109
+ expect(sessionEntry.signatureAfter[0]).not.toBeDefined();
110
+ expect(sessionEntry.signatureAfter[1]).not.toBeDefined();
111
+ expect(sessionEntry.signatureAfter[2]).not.toBeDefined();
112
+ expect(sessionEntry.signatureAfter[3]).toBeDefined();
113
+ expect(sessionEntry.signatureAfter[4]).not.toBeDefined();
114
+ expect(sessionEntry.signatureAfter[5]).not.toBeDefined();
115
+ expect(sessionEntry.signatureAfter[6]).toBeDefined();
116
+ expect(sessionEntry.signatureAfter[7]).not.toBeDefined();
117
+ expect(sessionEntry.signatureAfter[8]).not.toBeDefined();
118
+ expect(sessionEntry.signatureAfter[9]).toBeDefined();
119
+ expect(sessionEntry.signatureAfter[10]).not.toBeDefined();
120
+ expect(sessionEntry.signatureAfter[11]).not.toBeDefined();
121
+ const newContent = coValue.newContentSince({
122
+ id: coValue.id,
123
+ header: false,
124
+ sessions: {},
125
+ });
126
+ expect(newContent.length).toEqual(5);
127
+ expect(newContent[0].header).toBeDefined();
128
+ expect(newContent[1].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[3]);
129
+ expect(newContent[2].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[6]);
130
+ expect(newContent[3].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[9]);
131
+ expect(newContent[4].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.lastSignature);
132
+ });
133
+ test("When adding large transactions (bigger than MAX_RECOMMENDED_TX_SIZE), we store an inbetween signature after every large transaction and split up newContentSince accordingly", () => {
134
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
135
+ const coValue = node.createCoValue({
136
+ type: "costream",
137
+ ruleset: { type: "unsafeAllowAll" },
138
+ meta: { type: "binary" },
139
+ ...Crypto.createdNowUnique(),
140
+ });
141
+ const content = coValue.getCurrentContent();
142
+ if (content.type !== "costream" ||
143
+ content.headerMeta?.type !== "binary" ||
144
+ !(content instanceof RawBinaryCoStream)) {
145
+ throw new Error("Expected binary stream");
146
+ }
147
+ content.startBinaryStream({ mimeType: "text/plain", fileName: "test.txt" }, "trusting");
148
+ const chunk = new Uint8Array(MAX_RECOMMENDED_TX_SIZE + 100);
149
+ for (let i = 0; i < 3; i++) {
150
+ content.pushBinaryStreamChunk(chunk, "trusting");
151
+ }
152
+ content.endBinaryStream("trusting");
153
+ const sessionEntry = coValue.sessionLogs.get(node.currentSessionID);
154
+ expect(sessionEntry.transactions.length).toEqual(5);
155
+ expect(sessionEntry.signatureAfter[0]).not.toBeDefined();
156
+ expect(sessionEntry.signatureAfter[1]).toBeDefined();
157
+ expect(sessionEntry.signatureAfter[2]).toBeDefined();
158
+ expect(sessionEntry.signatureAfter[3]).toBeDefined();
159
+ expect(sessionEntry.signatureAfter[4]).not.toBeDefined();
160
+ const newContent = coValue.newContentSince({
161
+ id: coValue.id,
162
+ header: false,
163
+ sessions: {},
164
+ });
165
+ expect(newContent.length).toEqual(5);
166
+ expect(newContent[0].header).toBeDefined();
167
+ expect(newContent[1].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[1]);
168
+ expect(newContent[2].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[2]);
169
+ expect(newContent[3].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.signatureAfter[3]);
170
+ expect(newContent[4].new[node.currentSessionID].lastSignature).toEqual(sessionEntry.lastSignature);
171
+ });
172
+ //# sourceMappingURL=coStream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coStream.test.js","sourceRoot":"","sources":["../../src/tests/coStream.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { expect, test, vi } from "vitest";
2
+ import { LocalNode } from "../localNode.js";
3
+ import { randomAnonymousAccountAndSessionID } from "./testUtils.js";
4
+ import { stableStringify } from "../jsonStringify.js";
5
+ import { WasmCrypto } from "../crypto/WasmCrypto.js";
6
+ const Crypto = await WasmCrypto.create();
7
+ test("Can create coValue with new agent credentials and add transaction to it", () => {
8
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
9
+ const node = new LocalNode(account, sessionID, Crypto);
10
+ const coValue = node.createCoValue({
11
+ type: "costream",
12
+ ruleset: { type: "unsafeAllowAll" },
13
+ meta: null,
14
+ ...Crypto.createdNowUnique(),
15
+ });
16
+ const transaction = {
17
+ privacy: "trusting",
18
+ madeAt: Date.now(),
19
+ changes: stableStringify([
20
+ {
21
+ hello: "world",
22
+ },
23
+ ]),
24
+ };
25
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [transaction]);
26
+ expect(coValue.tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(account.currentSignerSecret(), expectedNewHash))).toBe(true);
27
+ });
28
+ test("transactions with wrong signature are rejected", () => {
29
+ const wrongAgent = Crypto.newRandomAgentSecret();
30
+ const [agentSecret, sessionID] = randomAnonymousAccountAndSessionID();
31
+ const node = new LocalNode(agentSecret, sessionID, Crypto);
32
+ const coValue = node.createCoValue({
33
+ type: "costream",
34
+ ruleset: { type: "unsafeAllowAll" },
35
+ meta: null,
36
+ ...Crypto.createdNowUnique(),
37
+ });
38
+ const transaction = {
39
+ privacy: "trusting",
40
+ madeAt: Date.now(),
41
+ changes: stableStringify([
42
+ {
43
+ hello: "world",
44
+ },
45
+ ]),
46
+ };
47
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [transaction]);
48
+ expect(coValue.tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(Crypto.getAgentSignerSecret(wrongAgent), expectedNewHash))).toBe(false);
49
+ });
50
+ test("transactions with correctly signed, but wrong hash are rejected", () => {
51
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
52
+ const node = new LocalNode(account, sessionID, Crypto);
53
+ const coValue = node.createCoValue({
54
+ type: "costream",
55
+ ruleset: { type: "unsafeAllowAll" },
56
+ meta: null,
57
+ ...Crypto.createdNowUnique(),
58
+ });
59
+ const transaction = {
60
+ privacy: "trusting",
61
+ madeAt: Date.now(),
62
+ changes: stableStringify([
63
+ {
64
+ hello: "world",
65
+ },
66
+ ]),
67
+ };
68
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [
69
+ {
70
+ privacy: "trusting",
71
+ madeAt: Date.now(),
72
+ changes: stableStringify([
73
+ {
74
+ hello: "wrong",
75
+ },
76
+ ]),
77
+ },
78
+ ]);
79
+ expect(coValue.tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(account.currentSignerSecret(), expectedNewHash))).toBe(false);
80
+ });
81
+ test("New transactions in a group correctly update owned values, including subscriptions", async () => {
82
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
83
+ const node = new LocalNode(account, sessionID, Crypto);
84
+ const group = node.createGroup();
85
+ const timeBeforeEdit = Date.now();
86
+ await new Promise((resolve) => setTimeout(resolve, 10));
87
+ const map = group.createMap();
88
+ map.set("hello", "world");
89
+ const listener = vi.fn();
90
+ map.subscribe(listener);
91
+ expect(listener.mock.calls[0][0].get("hello")).toBe("world");
92
+ const resignationThatWeJustLearnedAbout = {
93
+ privacy: "trusting",
94
+ madeAt: timeBeforeEdit,
95
+ changes: stableStringify([
96
+ {
97
+ op: "set",
98
+ key: account.id,
99
+ value: "revoked",
100
+ },
101
+ ]),
102
+ };
103
+ const { expectedNewHash } = group.core.expectedNewHashAfter(sessionID, [
104
+ resignationThatWeJustLearnedAbout,
105
+ ]);
106
+ const signature = Crypto.sign(node.account.currentSignerSecret(), expectedNewHash);
107
+ expect(map.core.getValidSortedTransactions().length).toBe(1);
108
+ const manuallyAdddedTxSuccess = group.core.tryAddTransactions(node.currentSessionID, [resignationThatWeJustLearnedAbout], expectedNewHash, signature);
109
+ expect(manuallyAdddedTxSuccess).toBe(true);
110
+ expect(listener.mock.calls.length).toBe(2);
111
+ expect(listener.mock.calls[1][0].get("hello")).toBe(undefined);
112
+ expect(map.core.getValidSortedTransactions().length).toBe(0);
113
+ });
114
+ //# sourceMappingURL=coValueCore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coValueCore.test.js","sourceRoot":"","sources":["../../src/tests/coValueCore.test.ts"],"names":[],"mappings":"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"}