@dxos/echo-db 2.33.9-dev.d70ac9ee → 2.33.9-dev.d7113edd

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 (117) hide show
  1. package/dist/src/api/result-set.js +4 -4
  2. package/dist/src/api/result-set.js.map +1 -1
  3. package/dist/src/echo.js +2 -2
  4. package/dist/src/echo.js.map +1 -1
  5. package/dist/src/echo.test.js +3 -3
  6. package/dist/src/echo.test.js.map +1 -1
  7. package/dist/src/halo/halo-factory.js +8 -8
  8. package/dist/src/halo/halo-factory.js.map +1 -1
  9. package/dist/src/halo/halo-party.js +3 -3
  10. package/dist/src/halo/halo-party.js.map +1 -1
  11. package/dist/src/halo/halo.js +9 -9
  12. package/dist/src/halo/halo.js.map +1 -1
  13. package/dist/src/halo/identity-manager.js +6 -6
  14. package/dist/src/halo/identity-manager.js.map +1 -1
  15. package/dist/src/halo/identity.js +2 -2
  16. package/dist/src/halo/identity.js.map +1 -1
  17. package/dist/src/halo/preferences.js +6 -6
  18. package/dist/src/halo/preferences.js.map +1 -1
  19. package/dist/src/invitations/greeting-initiator.js +6 -6
  20. package/dist/src/invitations/greeting-initiator.js.map +1 -1
  21. package/dist/src/invitations/greeting-responder.js +5 -5
  22. package/dist/src/invitations/greeting-responder.js.map +1 -1
  23. package/dist/src/invitations/halo-recovery-initiator.js +6 -6
  24. package/dist/src/invitations/halo-recovery-initiator.js.map +1 -1
  25. package/dist/src/invitations/invitation-descriptor.js +9 -9
  26. package/dist/src/invitations/invitation-descriptor.js.map +1 -1
  27. package/dist/src/invitations/invitation-factory.js +3 -3
  28. package/dist/src/invitations/invitation-factory.js.map +1 -1
  29. package/dist/src/invitations/offline-invitation-claimer.js +7 -7
  30. package/dist/src/invitations/offline-invitation-claimer.js.map +1 -1
  31. package/dist/src/packlets/database/data-mirror.js +8 -8
  32. package/dist/src/packlets/database/data-mirror.js.map +1 -1
  33. package/dist/src/packlets/database/data-service-host.js +3 -3
  34. package/dist/src/packlets/database/data-service-host.js.map +1 -1
  35. package/dist/src/packlets/database/data-service-router.js +5 -5
  36. package/dist/src/packlets/database/data-service-router.js.map +1 -1
  37. package/dist/src/packlets/database/database-backend.js +3 -3
  38. package/dist/src/packlets/database/database-backend.js.map +1 -1
  39. package/dist/src/packlets/database/database.js +2 -2
  40. package/dist/src/packlets/database/database.js.map +1 -1
  41. package/dist/src/packlets/database/item-demuxer.js +14 -14
  42. package/dist/src/packlets/database/item-demuxer.js.map +1 -1
  43. package/dist/src/packlets/database/item-manager.js +18 -18
  44. package/dist/src/packlets/database/item-manager.js.map +1 -1
  45. package/dist/src/packlets/database/link.js +3 -3
  46. package/dist/src/packlets/database/link.js.map +1 -1
  47. package/dist/src/packlets/database/selection/result.js +2 -2
  48. package/dist/src/packlets/database/selection/result.js.map +1 -1
  49. package/dist/src/parties/data-party.js +11 -11
  50. package/dist/src/parties/data-party.js.map +1 -1
  51. package/dist/src/parties/party-factory.js +4 -4
  52. package/dist/src/parties/party-factory.js.map +1 -1
  53. package/dist/src/parties/party-manager.js +6 -6
  54. package/dist/src/parties/party-manager.js.map +1 -1
  55. package/dist/src/parties/party-manager.test.js +6 -6
  56. package/dist/src/parties/party-manager.test.js.map +1 -1
  57. package/dist/src/parties/party-preferences.js +2 -2
  58. package/dist/src/parties/party-preferences.js.map +1 -1
  59. package/dist/src/pipeline/feed-muxer.js +3 -3
  60. package/dist/src/pipeline/feed-muxer.js.map +1 -1
  61. package/dist/src/pipeline/message-selector.js +2 -2
  62. package/dist/src/pipeline/message-selector.js.map +1 -1
  63. package/dist/src/pipeline/metadata-store.d.ts.map +1 -1
  64. package/dist/src/pipeline/metadata-store.js +35 -32
  65. package/dist/src/pipeline/metadata-store.js.map +1 -1
  66. package/dist/src/pipeline/party-feed-provider.js +3 -3
  67. package/dist/src/pipeline/party-feed-provider.js.map +1 -1
  68. package/dist/src/pipeline/party-pipeline.js +13 -13
  69. package/dist/src/pipeline/party-pipeline.js.map +1 -1
  70. package/dist/src/pipeline/party-processor.js +3 -3
  71. package/dist/src/pipeline/party-processor.js.map +1 -1
  72. package/dist/src/protocol/authenticator.test.js +53 -12
  73. package/dist/src/protocol/authenticator.test.js.map +1 -1
  74. package/dist/src/snapshots/snapshot-store.js +2 -2
  75. package/dist/src/snapshots/snapshot-store.js.map +1 -1
  76. package/dist/src/testing/testing-factories.js +2 -2
  77. package/dist/src/testing/testing-factories.js.map +1 -1
  78. package/dist/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +21 -17
  80. package/src/api/result-set.ts +1 -1
  81. package/src/echo.test.ts +2 -2
  82. package/src/echo.ts +1 -1
  83. package/src/halo/halo-factory.ts +1 -1
  84. package/src/halo/halo-party.ts +1 -1
  85. package/src/halo/halo.ts +1 -1
  86. package/src/halo/identity-manager.ts +1 -1
  87. package/src/halo/identity.ts +1 -1
  88. package/src/halo/preferences.ts +1 -1
  89. package/src/invitations/greeting-initiator.ts +1 -1
  90. package/src/invitations/greeting-responder.ts +1 -1
  91. package/src/invitations/halo-recovery-initiator.ts +1 -1
  92. package/src/invitations/invitation-descriptor.ts +1 -1
  93. package/src/invitations/invitation-factory.ts +1 -1
  94. package/src/invitations/offline-invitation-claimer.ts +1 -1
  95. package/src/packlets/database/data-mirror.ts +1 -1
  96. package/src/packlets/database/data-service-host.ts +1 -1
  97. package/src/packlets/database/data-service-router.ts +1 -1
  98. package/src/packlets/database/database-backend.ts +1 -1
  99. package/src/packlets/database/database.ts +1 -1
  100. package/src/packlets/database/item-demuxer.ts +1 -1
  101. package/src/packlets/database/item-manager.ts +1 -1
  102. package/src/packlets/database/link.ts +1 -1
  103. package/src/packlets/database/selection/result.ts +1 -1
  104. package/src/parties/data-party.ts +1 -1
  105. package/src/parties/party-factory.ts +1 -1
  106. package/src/parties/party-manager.test.ts +1 -1
  107. package/src/parties/party-manager.ts +1 -1
  108. package/src/parties/party-preferences.ts +1 -1
  109. package/src/pipeline/feed-muxer.ts +1 -1
  110. package/src/pipeline/message-selector.ts +1 -1
  111. package/src/pipeline/metadata-store.ts +38 -29
  112. package/src/pipeline/party-feed-provider.ts +1 -1
  113. package/src/pipeline/party-pipeline.ts +1 -1
  114. package/src/pipeline/party-processor.ts +1 -1
  115. package/src/protocol/authenticator.test.ts +102 -17
  116. package/src/snapshots/snapshot-store.ts +1 -1
  117. package/src/testing/testing-factories.ts +1 -1
package/package.json CHANGED
@@ -1,31 +1,35 @@
1
1
  {
2
2
  "name": "@dxos/echo-db",
3
- "version": "2.33.9-dev.d70ac9ee",
3
+ "version": "2.33.9-dev.d7113edd",
4
4
  "description": "ECHO database.",
5
5
  "license": "MIT",
6
6
  "main": "dist/src/index.js",
7
7
  "types": "dist/src/index.d.ts",
8
+ "browser": {
9
+ "node:assert": "assert"
10
+ },
8
11
  "files": [
9
12
  "dist",
10
13
  "src"
11
14
  ],
12
15
  "dependencies": {
13
- "@dxos/async": "2.33.9-dev.d70ac9ee",
14
- "@dxos/codec-protobuf": "2.33.9-dev.d70ac9ee",
15
- "@dxos/credentials": "2.33.9-dev.d70ac9ee",
16
- "@dxos/crypto": "2.33.9-dev.d70ac9ee",
17
- "@dxos/debug": "2.33.9-dev.d70ac9ee",
18
- "@dxos/echo-protocol": "2.33.9-dev.d70ac9ee",
19
- "@dxos/feed-store": "2.33.9-dev.d70ac9ee",
20
- "@dxos/mesh-protocol": "2.33.9-dev.d70ac9ee",
21
- "@dxos/model-factory": "2.33.9-dev.d70ac9ee",
22
- "@dxos/network-manager": "2.33.9-dev.d70ac9ee",
23
- "@dxos/object-model": "2.33.9-dev.d70ac9ee",
24
- "@dxos/protocol-plugin-presence": "2.33.9-dev.d70ac9ee",
25
- "@dxos/protocol-plugin-replicator": "2.33.9-dev.d70ac9ee",
26
- "@dxos/protocols": "2.33.9-dev.d70ac9ee",
27
- "@dxos/random-access-multi-storage": "2.33.9-dev.d70ac9ee",
28
- "@dxos/util": "2.33.9-dev.d70ac9ee",
16
+ "@dxos/async": "2.33.9-dev.d7113edd",
17
+ "@dxos/codec-protobuf": "2.33.9-dev.d7113edd",
18
+ "@dxos/credentials": "2.33.9-dev.d7113edd",
19
+ "@dxos/crypto": "2.33.9-dev.d7113edd",
20
+ "@dxos/debug": "2.33.9-dev.d7113edd",
21
+ "@dxos/echo-protocol": "2.33.9-dev.d7113edd",
22
+ "@dxos/feed-store": "2.33.9-dev.d7113edd",
23
+ "@dxos/mesh-protocol": "2.33.9-dev.d7113edd",
24
+ "@dxos/model-factory": "2.33.9-dev.d7113edd",
25
+ "@dxos/network-manager": "2.33.9-dev.d7113edd",
26
+ "@dxos/object-model": "2.33.9-dev.d7113edd",
27
+ "@dxos/protocol-plugin-presence": "2.33.9-dev.d7113edd",
28
+ "@dxos/protocol-plugin-replicator": "2.33.9-dev.d7113edd",
29
+ "@dxos/protocols": "2.33.9-dev.d7113edd",
30
+ "@dxos/random-access-multi-storage": "2.33.9-dev.d7113edd",
31
+ "@dxos/util": "2.33.9-dev.d7113edd",
32
+ "assert": "^2.0.0",
29
33
  "base-x": "~3.0.9",
30
34
  "buffer-json-encoding": "^1.0.2",
31
35
  "debug": "^4.3.3",
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { Event, ReadOnlyEvent } from '@dxos/async';
8
8
 
package/src/echo.test.ts CHANGED
@@ -2,10 +2,10 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
7
6
  import expect from 'expect';
8
7
  import { it as test } from 'mocha';
8
+ import assert from 'node:assert';
9
9
 
10
10
  import { latch, promiseTimeout, waitForCondition } from '@dxos/async';
11
11
  import {
@@ -374,7 +374,7 @@ describe('ECHO', () => {
374
374
 
375
375
  }).timeout(10_000);
376
376
 
377
- test.skip('3 devices', async () => {
377
+ test('3 devices', async () => {
378
378
  const a = await setup({ createProfile: true });
379
379
  const b = await setup();
380
380
 
package/src/echo.ts CHANGED
@@ -2,9 +2,9 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
7
6
  import memdown from 'memdown';
7
+ import assert from 'node:assert';
8
8
 
9
9
  import { synchronized } from '@dxos/async';
10
10
  import { Keyring, KeyStore, SecretProvider } from '@dxos/credentials';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import {
9
9
  createDeviceInfoMessage,
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { Event, synchronized } from '@dxos/async';
8
8
  import { timed } from '@dxos/debug';
package/src/halo/halo.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { synchronized } from '@dxos/async';
9
9
  import { KeyRecord, Keyring, KeyType, SecretProvider } from '@dxos/credentials';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event, synchronized, waitForCondition } from '@dxos/async';
9
9
  import { Filter, KeyRecord, Keyring, KeyType, SecretProvider } from '@dxos/credentials';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Filter, KeyChain, KeyRecord, Keyring, KeyType, SignedMessage, Signer } from '@dxos/credentials';
9
9
  import { failUndefined } from '@dxos/debug';
@@ -2,9 +2,9 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import stableStringify from 'json-stable-stringify';
7
6
  import defaultsDeep from 'lodash.defaultsdeep';
7
+ import assert from 'node:assert';
8
8
 
9
9
  import { Event } from '@dxos/async';
10
10
  import { raise } from '@dxos/debug';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { waitForEvent } from '@dxos/async';
9
9
  import {
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event, waitForCondition } from '@dxos/async';
9
9
  import {
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { waitForEvent } from '@dxos/async';
9
9
  import {
@@ -2,9 +2,9 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import base from 'base-x';
7
6
  import stableStringify from 'json-stable-stringify';
7
+ import assert from 'node:assert';
8
8
 
9
9
  import { ripemd160 } from '@dxos/crypto';
10
10
  import { SwarmKey } from '@dxos/echo-protocol';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { createPartyInvitationMessage, Message as HaloMessage } from '@dxos/credentials';
8
8
  import { FeedWriter } from '@dxos/echo-protocol';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { waitForEvent } from '@dxos/async';
9
9
  import {
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { failUndefined } from '@dxos/debug';
9
9
  import { DataService } from '@dxos/echo-protocol';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Stream } from '@dxos/codec-protobuf';
9
9
  import { failUndefined, raise } from '@dxos/debug';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Stream } from '@dxos/codec-protobuf';
9
9
  import { raise } from '@dxos/debug';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { DatabaseSnapshot, DataService, EchoEnvelope, FeedWriter, PartyKey } from '@dxos/echo-protocol';
9
9
  import { ModelFactory } from '@dxos/model-factory';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { Event, synchronized } from '@dxos/async';
8
8
  import { ItemID, ItemType } from '@dxos/echo-protocol';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event } from '@dxos/async';
9
9
  import { failUndefined } from '@dxos/debug';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event, trigger } from '@dxos/async';
9
9
  import { createId } from '@dxos/crypto';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { ItemID, ItemType } from '@dxos/echo-protocol';
8
8
  import { Model, StateManager } from '@dxos/model-factory';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { Event } from '@dxos/async';
8
8
 
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { synchronized, Event } from '@dxos/async';
8
8
  import { timed } from '@dxos/debug';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import {
9
9
  createEnvelopeMessage,
@@ -4,10 +4,10 @@
4
4
 
5
5
  /* eslint-disable jest/no-conditional-expect */
6
6
 
7
- import assert from 'assert';
8
7
  import debug from 'debug';
9
8
  import expect from 'expect';
10
9
  import { it as test } from 'mocha';
10
+ import assert from 'node:assert';
11
11
 
12
12
  import { latch } from '@dxos/async';
13
13
  import {
@@ -2,9 +2,9 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
7
6
  import unionWith from 'lodash.unionwith';
7
+ import assert from 'node:assert';
8
8
 
9
9
  import { Event, synchronized } from '@dxos/async';
10
10
  import { SecretProvider } from '@dxos/credentials';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { PARTY_TITLE_PROPERTY, DataParty } from '.';
8
8
  import { Preferences } from '../halo/preferences';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event } from '@dxos/async';
9
9
  import { Message as HaloMessage } from '@dxos/credentials';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { MessageSelector } from '@dxos/echo-protocol';
9
9
 
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { synchronized } from '@dxos/async';
9
9
  import { failUndefined } from '@dxos/debug';
@@ -25,13 +25,15 @@ export interface AddPartyOptions {
25
25
  genesisFeed: PublicKey
26
26
  }
27
27
 
28
+ const emptyEchoMetadata = (): EchoMetadata => ({
29
+ version: STORAGE_VERSION,
30
+ parties: [],
31
+ created: new Date(),
32
+ updated: new Date()
33
+ });
34
+
28
35
  export class MetadataStore {
29
- private _metadata: EchoMetadata = {
30
- version: STORAGE_VERSION,
31
- parties: [],
32
- created: new Date(),
33
- updated: new Date()
34
- };
36
+ private _metadata: EchoMetadata = emptyEchoMetadata();
35
37
 
36
38
  constructor (
37
39
  private readonly _directory: Directory
@@ -56,19 +58,26 @@ export class MetadataStore {
56
58
  async load (): Promise<void> {
57
59
  const file = this._directory.createOrOpen('EchoMetadata');
58
60
  try {
59
- const { size } = await file.stat();
60
- if (size === 0) {
61
+ const { size: fileLength } = await file.stat();
62
+ if (fileLength < 4) {
61
63
  return;
62
64
  }
65
+ // Loading file size from first 4 bytes.
66
+ const dataSize = fromBytesInt32(await file.read(0, 4));
67
+ log(`Load: data size ${dataSize}`);
68
+
69
+ // Sanity check.
70
+ {
71
+ if (fileLength < dataSize + 4) {
72
+ throw new Error('Metadata storage is corrupted');
73
+ }
74
+ }
63
75
 
64
- const data = await file.read(0, size);
76
+ const data = await file.read(4, dataSize);
65
77
  this._metadata = schema.getCodecForType('dxos.echo.metadata.EchoMetadata').decode(data);
66
78
  } catch (err: any) {
67
- if (err.code === 'ENOENT') {
68
- return;
69
- } else {
70
- throw err;
71
- }
79
+ log(`Error loading metadata: ${err}`);
80
+ this._metadata = emptyEchoMetadata();
72
81
  } finally {
73
82
  await file.close();
74
83
  }
@@ -87,22 +96,14 @@ export class MetadataStore {
87
96
 
88
97
  try {
89
98
  const encoded = Buffer.from(schema.getCodecForType('dxos.echo.metadata.EchoMetadata').encode(data));
90
- await file.write(0, encoded);
91
99
 
92
- // Truncate the rest of the file.
93
- {
94
- const { size } = await file.stat();
95
- if (size > encoded.length) {
96
- await file.truncate(encoded.length, size);
97
- }
98
- }
100
+ // Saving file size at first 4 bytes.
101
+ log(`Save: data size ${encoded.length}`);
102
+ await file.write(0, toBytesInt32(encoded.length));
103
+
104
+ // Saving data.
105
+ await file.write(4, encoded);
99
106
 
100
- // Sanity check.
101
- const { size } = await file.stat();
102
- if (size !== encoded.length) {
103
- console.log('SANITY!');
104
- }
105
- assert(size === encoded.length);
106
107
  } finally {
107
108
  await file.close();
108
109
  }
@@ -196,3 +197,11 @@ export class MetadataStore {
196
197
  await this._save();
197
198
  }
198
199
  }
200
+
201
+ const toBytesInt32 = (num: number) => {
202
+ const buf = Buffer.alloc(4);
203
+ buf.writeInt32LE(num, 0);
204
+ return buf;
205
+ };
206
+
207
+ const fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);
@@ -2,8 +2,8 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event, synchronized } from '@dxos/async';
9
9
  import { Keyring, KeyType } from '@dxos/credentials';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2021 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
5
+ import assert from 'node:assert';
6
6
 
7
7
  import { synchronized } from '@dxos/async';
8
8
  import { KeyType, Message as HaloMessage } from '@dxos/credentials';
@@ -2,8 +2,8 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import assert from 'assert';
6
5
  import debug from 'debug';
6
+ import assert from 'node:assert';
7
7
 
8
8
  import { Event } from '@dxos/async';
9
9
  import {