Skip to content

Commit 1f67ba8

Browse files
committed
Merge branch 'main' into feat/initial-download
* main: chore: fix Brittle type definitions (#383) feat: dbMigrationPathOpt - add db migration path to `MapeoProject` and `MapeoManager` (#384) [OPTIC-RELEASE-AUTOMATION] release/v9.0.0-alpha.2 (#382)
2 parents cd89ec4 + 46c0c52 commit 1f67ba8

13 files changed

Lines changed: 141 additions & 55 deletions

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mapeo/core",
3-
"version": "9.0.0-alpha.1",
3+
"version": "9.0.0-alpha.2",
44
"description": "Offline p2p mapping library",
55
"main": "src/index.js",
66
"types": "dist/index.d.ts",

src/mapeo-manager.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export class MapeoManager extends TypedEmitter {
6969
/** @type {import('./types.js').CoreStorage} */
7070
#coreStorage
7171
#dbFolder
72+
/** @type {string} */
73+
#projectMigrationsFolder
7274
#deviceId
7375
#localPeers
7476
#invite
@@ -81,25 +83,33 @@ export class MapeoManager extends TypedEmitter {
8183
* @param {Object} opts
8284
* @param {Buffer} opts.rootKey 16-bytes of random data that uniquely identify the device, used to derive a 32-byte master key, which is used to derive all the keypairs used for Mapeo
8385
* @param {string} opts.dbFolder Folder for sqlite Dbs. Folder must exist. Use ':memory:' to store everything in-memory
86+
* @param {string} opts.projectMigrationsFolder path for drizzle migrations folder for project database
87+
* @param {string} opts.clientMigrationsFolder path for drizzle migrations folder for client database
8488
* @param {string | import('./types.js').CoreStorage} opts.coreStorage Folder for hypercore storage or a function that returns a RandomAccessStorage instance
8589
* @param {{ port?: number, logger: import('fastify').FastifyServerOptions['logger'] }} [opts.mediaServerOpts]
8690
*/
87-
constructor({ rootKey, dbFolder, coreStorage, mediaServerOpts }) {
91+
constructor({
92+
rootKey,
93+
dbFolder,
94+
projectMigrationsFolder,
95+
clientMigrationsFolder,
96+
coreStorage,
97+
mediaServerOpts,
98+
}) {
8899
super()
89100
this.#keyManager = new KeyManager(rootKey)
90101
this.#deviceId = getDeviceId(this.#keyManager)
91102
const logger = (this.#loggerBase = new Logger({ deviceId: this.#deviceId }))
92103
this.#l = Logger.create('manager', logger)
93104
this.#dbFolder = dbFolder
105+
this.#projectMigrationsFolder = projectMigrationsFolder
94106
const sqlite = new Database(
95107
dbFolder === ':memory:'
96108
? ':memory:'
97109
: path.join(dbFolder, CLIENT_SQLITE_FILE_NAME)
98110
)
99111
this.#db = drizzle(sqlite)
100-
migrate(this.#db, {
101-
migrationsFolder: new URL('../drizzle/client', import.meta.url).pathname,
102-
})
112+
migrate(this.#db, { migrationsFolder: clientMigrationsFolder })
103113

104114
this.#localPeers = new LocalPeers({ logger })
105115
this.#localPeers.on('peers', (peers) => {
@@ -371,6 +381,7 @@ export class MapeoManager extends TypedEmitter {
371381
return new MapeoProject({
372382
...this.#projectStorage(projectId),
373383
...projectKeys,
384+
projectMigrationsFolder: this.#projectMigrationsFolder,
374385
keyManager: this.#keyManager,
375386
sharedDb: this.#db,
376387
sharedIndexWriter: this.#projectSettingsIndexWriter,

src/mapeo-project.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export class MapeoProject {
7272
/**
7373
* @param {Object} opts
7474
* @param {string} opts.dbPath Path to store project sqlite db. Use `:memory:` for memory storage
75+
* @param {string} opts.projectMigrationsFolder path for drizzle migration folder for project
7576
* @param {import('@mapeo/crypto').KeyManager} opts.keyManager mapeo/crypto KeyManager instance
7677
* @param {Buffer} opts.projectKey 32-byte public key of the project creator core
7778
* @param {Buffer} [opts.projectSecretKey] 32-byte secret key of the project creator core
@@ -86,6 +87,7 @@ export class MapeoProject {
8687
*/
8788
constructor({
8889
dbPath,
90+
projectMigrationsFolder,
8991
sharedDb,
9092
sharedIndexWriter,
9193
coreStorage,
@@ -104,9 +106,7 @@ export class MapeoProject {
104106
///////// 1. Setup database
105107
const sqlite = new Database(dbPath)
106108
const db = drizzle(sqlite)
107-
migrate(db, {
108-
migrationsFolder: new URL('../drizzle/project', import.meta.url).pathname,
109-
})
109+
migrate(db, { migrationsFolder: projectMigrationsFolder })
110110

111111
///////// 2. Setup random-access-storage functions
112112

test-e2e/capabilities.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,17 @@ import {
1212
} from '../src/capabilities.js'
1313
import { randomBytes } from 'crypto'
1414

15+
const projectMigrationsFolder = new URL('../drizzle/project', import.meta.url)
16+
.pathname
17+
const clientMigrationsFolder = new URL('../drizzle/client', import.meta.url)
18+
.pathname
19+
1520
test('Creator capabilities and role assignment', async (t) => {
1621
const rootKey = KeyManager.generateRootKey()
1722
const manager = new MapeoManager({
1823
rootKey,
24+
projectMigrationsFolder,
25+
clientMigrationsFolder,
1926
dbFolder: ':memory:',
2027
coreStorage: () => new RAM(),
2128
})
@@ -44,6 +51,8 @@ test('Creator capabilities and role assignment', async (t) => {
4451
test('New device without capabilities', async (t) => {
4552
const rootKey = KeyManager.generateRootKey()
4653
const manager = new MapeoManager({
54+
projectMigrationsFolder,
55+
clientMigrationsFolder,
4756
rootKey,
4857
dbFolder: ':memory:',
4958
coreStorage: () => new RAM(),
@@ -84,6 +93,8 @@ test('getMany() - on invitor device', async (t) => {
8493
const creatorDeviceId = km.getIdentityKeypair().publicKey.toString('hex')
8594
const manager = new MapeoManager({
8695
rootKey,
96+
projectMigrationsFolder,
97+
clientMigrationsFolder,
8798
dbFolder: ':memory:',
8899
coreStorage: () => new RAM(),
89100
})
@@ -121,6 +132,8 @@ test('getMany() - on newly invited device before sync', async (t) => {
121132
const km = new KeyManager(rootKey)
122133
const deviceId = km.getIdentityKeypair().publicKey.toString('hex')
123134
const manager = new MapeoManager({
135+
projectMigrationsFolder,
136+
clientMigrationsFolder,
124137
rootKey,
125138
dbFolder: ':memory:',
126139
coreStorage: () => new RAM(),

test-e2e/core-ownership.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ test('CoreOwnership', async (t) => {
1111
const km = new KeyManager(rootKey)
1212
const manager = new MapeoManager({
1313
rootKey,
14+
projectMigrationsFolder: new URL('../drizzle/project', import.meta.url)
15+
.pathname,
16+
clientMigrationsFolder: new URL('../drizzle/client', import.meta.url)
17+
.pathname,
1418
dbFolder: ':memory:',
1519
coreStorage: () => new RAM(),
1620
})

test-e2e/device-info.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,17 @@ import RAM from 'random-access-memory'
55

66
import { MapeoManager } from '../src/mapeo-manager.js'
77

8+
const projectMigrationsFolder = new URL('../drizzle/project', import.meta.url)
9+
.pathname
10+
const clientMigrationsFolder = new URL('../drizzle/client', import.meta.url)
11+
.pathname
12+
813
test('write and read deviceInfo', async (t) => {
914
const rootKey = KeyManager.generateRootKey()
1015
const manager = new MapeoManager({
1116
rootKey,
17+
projectMigrationsFolder,
18+
clientMigrationsFolder,
1219
dbFolder: ':memory:',
1320
coreStorage: () => new RAM(),
1421
})
@@ -27,6 +34,8 @@ test('device info written to projects', (t) => {
2734
t.test('when creating project', async (st) => {
2835
const manager = new MapeoManager({
2936
rootKey: KeyManager.generateRootKey(),
37+
projectMigrationsFolder,
38+
clientMigrationsFolder,
3039
dbFolder: ':memory:',
3140
coreStorage: () => new RAM(),
3241
})
@@ -47,6 +56,8 @@ test('device info written to projects', (t) => {
4756
t.test('when adding project', async (st) => {
4857
const manager = new MapeoManager({
4958
rootKey: KeyManager.generateRootKey(),
59+
projectMigrationsFolder,
60+
clientMigrationsFolder,
5061
dbFolder: ':memory:',
5162
coreStorage: () => new RAM(),
5263
})
@@ -73,6 +84,8 @@ test('device info written to projects', (t) => {
7384
t.test('after updating global device info', async (st) => {
7485
const manager = new MapeoManager({
7586
rootKey: KeyManager.generateRootKey(),
87+
projectMigrationsFolder,
88+
clientMigrationsFolder,
7689
dbFolder: ':memory:',
7790
coreStorage: () => new RAM(),
7891
})

test-e2e/manager-basic.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,16 @@ import { KeyManager } from '@mapeo/crypto'
44
import RAM from 'random-access-memory'
55
import { MapeoManager } from '../src/mapeo-manager.js'
66

7+
const projectMigrationsFolder = new URL('../drizzle/project', import.meta.url)
8+
.pathname
9+
const clientMigrationsFolder = new URL('../drizzle/client', import.meta.url)
10+
.pathname
11+
712
test('Managing created projects', async (t) => {
813
const manager = new MapeoManager({
914
rootKey: KeyManager.generateRootKey(),
15+
projectMigrationsFolder,
16+
clientMigrationsFolder,
1017
dbFolder: ':memory:',
1118
coreStorage: () => new RAM(),
1219
})
@@ -109,6 +116,8 @@ test('Managing created projects', async (t) => {
109116
test('Managing added projects', async (t) => {
110117
const manager = new MapeoManager({
111118
rootKey: KeyManager.generateRootKey(),
119+
projectMigrationsFolder,
120+
clientMigrationsFolder,
112121
dbFolder: ':memory:',
113122
coreStorage: () => new RAM(),
114123
})
@@ -181,6 +190,8 @@ test('Managing added projects', async (t) => {
181190
test('Managing both created and added projects', async (t) => {
182191
const manager = new MapeoManager({
183192
rootKey: KeyManager.generateRootKey(),
193+
projectMigrationsFolder,
194+
clientMigrationsFolder,
184195
dbFolder: ':memory:',
185196
coreStorage: () => new RAM(),
186197
})
@@ -222,6 +233,8 @@ test('Managing both created and added projects', async (t) => {
222233
test('Manager cannot add project that already exists', async (t) => {
223234
const manager = new MapeoManager({
224235
rootKey: KeyManager.generateRootKey(),
236+
projectMigrationsFolder,
237+
clientMigrationsFolder,
225238
dbFolder: ':memory:',
226239
coreStorage: () => new RAM(),
227240
})
@@ -249,6 +262,8 @@ test('Consistent storage folders', async (t) => {
249262
const storageNames = []
250263
const manager = new MapeoManager({
251264
rootKey: randomBytesSeed('root_key').subarray(0, 16),
265+
projectMigrationsFolder,
266+
clientMigrationsFolder,
252267
dbFolder: ':memory:',
253268
coreStorage: (name) => {
254269
storageNames.push(name)
@@ -275,6 +290,8 @@ test('Consistent storage folders', async (t) => {
275290
test('manager.start() and manager.stop()', async (t) => {
276291
const manager = new MapeoManager({
277292
rootKey: KeyManager.generateRootKey(),
293+
projectMigrationsFolder,
294+
clientMigrationsFolder,
278295
dbFolder: ':memory:',
279296
coreStorage: () => new RAM(),
280297
})

test-e2e/media-server.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@ const BLOB_FIXTURES_DIR = fileURLToPath(
1414
new URL('../tests/fixtures/blob-api/', import.meta.url)
1515
)
1616

17+
const projectMigrationsFolder = new URL('../drizzle/project', import.meta.url)
18+
.pathname
19+
const clientMigrationsFolder = new URL('../drizzle/client', import.meta.url)
20+
.pathname
21+
1722
test('retrieving blobs using url', async (t) => {
1823
const clock = FakeTimers.install({ shouldAdvanceTime: true })
1924
t.teardown(() => clock.uninstall())
2025

2126
const manager = new MapeoManager({
2227
rootKey: KeyManager.generateRootKey(),
28+
projectMigrationsFolder,
29+
clientMigrationsFolder,
2330
dbFolder: ':memory:',
2431
coreStorage: () => new RAM(),
2532
})
@@ -111,6 +118,8 @@ test('retrieving icons using url', async (t) => {
111118

112119
const manager = new MapeoManager({
113120
rootKey: KeyManager.generateRootKey(),
121+
projectMigrationsFolder,
122+
clientMigrationsFolder,
114123
dbFolder: ':memory:',
115124
coreStorage: () => new RAM(),
116125
})

test-e2e/project-crud.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ function getUpdateFixture(value) {
6767
test('CRUD operations', async (t) => {
6868
const manager = new MapeoManager({
6969
rootKey: KeyManager.generateRootKey(),
70+
projectMigrationsFolder: new URL('../drizzle/project', import.meta.url)
71+
.pathname,
72+
clientMigrationsFolder: new URL('../drizzle/client', import.meta.url)
73+
.pathname,
7074
dbFolder: ':memory:',
7175
coreStorage: () => new RAM(),
7276
})

test-e2e/project-settings.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import RAM from 'random-access-memory'
88
test('Project settings create, read, and update operations', async (t) => {
99
const manager = new MapeoManager({
1010
rootKey: KeyManager.generateRootKey(),
11+
projectMigrationsFolder: new URL('../drizzle/project', import.meta.url)
12+
.pathname,
13+
clientMigrationsFolder: new URL('../drizzle/client', import.meta.url)
14+
.pathname,
1115
dbFolder: ':memory:',
1216
coreStorage: () => new RAM(),
1317
})

0 commit comments

Comments
 (0)