From 1ba13b18e9dd336ad1ec7a378e3ce3c374d16a72 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 10:04:49 +0100 Subject: [PATCH 01/24] chore: move files around --- .aegir.js => packages/ipfs-repo/.aegir.js | 0 .gitattributes => packages/ipfs-repo/.gitattributes | 0 CHANGELOG.md => packages/ipfs-repo/CHANGELOG.md | 0 LICENSE => packages/ipfs-repo/LICENSE | 0 README.md => packages/ipfs-repo/README.md | 0 {graphs => packages/ipfs-repo/graphs}/arch.monopic | Bin {graphs => packages/ipfs-repo/graphs}/arch.txt | 0 package.json => packages/ipfs-repo/package.json | 0 {src => packages/ipfs-repo/src}/api-addr.js | 0 {src => packages/ipfs-repo/src}/config.js | 0 {src => packages/ipfs-repo/src}/constants.js | 0 .../ipfs-repo/src}/default-datastore.js | 0 .../ipfs-repo/src}/default-options.browser.js | 0 {src => packages/ipfs-repo/src}/default-options.js | 0 {src => packages/ipfs-repo/src}/errors/index.js | 0 {src => packages/ipfs-repo/src}/gc.js | 0 {src => packages/ipfs-repo/src}/idstore.js | 0 {src => packages/ipfs-repo/src}/index.js | 0 {src => packages/ipfs-repo/src}/locks/fs.js | 0 {src => packages/ipfs-repo/src}/locks/memory.js | 0 .../ipfs-repo/src}/pinned-blockstore.js | 0 {src => packages/ipfs-repo/src}/pins.js | 0 {src => packages/ipfs-repo/src}/spec.js | 0 {src => packages/ipfs-repo/src}/types.d.ts | 0 {src => packages/ipfs-repo/src}/utils/blockstore.js | 0 {src => packages/ipfs-repo/src}/utils/walk-dag.js | 0 {src => packages/ipfs-repo/src}/version.js | 0 {test => packages/ipfs-repo/test}/api-addr-test.js | 0 .../ipfs-repo/test}/blockstore-test.js | 0 .../ipfs-repo/test}/blockstore-utils-test.js | 0 {test => packages/ipfs-repo/test}/browser.js | 0 {test => packages/ipfs-repo/test}/config-test.js | 0 {test => packages/ipfs-repo/test}/datastore-test.js | 0 .../ipfs-repo/test}/fixtures/create-backend.js | 0 .../ipfs-repo/test}/fixtures/load-codec.js | 0 {test => packages/ipfs-repo/test}/is-initialized.js | 0 {test => packages/ipfs-repo/test}/keystore-test.js | 0 {test => packages/ipfs-repo/test}/lock-test.js | 0 .../ipfs-repo/test}/migrations-test.js | 0 {test => packages/ipfs-repo/test}/node.js | 0 {test => packages/ipfs-repo/test}/options-test.js | 0 {test => packages/ipfs-repo/test}/pins-test.js | 0 {test => packages/ipfs-repo/test}/repo-test.js | 0 {test => packages/ipfs-repo/test}/stat-test.js | 0 {test => packages/ipfs-repo/test}/types.test-d.ts | 0 tsconfig.json => packages/ipfs-repo/tsconfig.json | 0 .../ipfs-repo/types}/just-range/index.d.ts | 0 .../ipfs-repo/types}/merge-options/index.d.ts | 0 48 files changed, 0 insertions(+), 0 deletions(-) rename .aegir.js => packages/ipfs-repo/.aegir.js (100%) rename .gitattributes => packages/ipfs-repo/.gitattributes (100%) rename CHANGELOG.md => packages/ipfs-repo/CHANGELOG.md (100%) rename LICENSE => packages/ipfs-repo/LICENSE (100%) rename README.md => packages/ipfs-repo/README.md (100%) rename {graphs => packages/ipfs-repo/graphs}/arch.monopic (100%) rename {graphs => packages/ipfs-repo/graphs}/arch.txt (100%) rename package.json => packages/ipfs-repo/package.json (100%) rename {src => packages/ipfs-repo/src}/api-addr.js (100%) rename {src => packages/ipfs-repo/src}/config.js (100%) rename {src => packages/ipfs-repo/src}/constants.js (100%) rename {src => packages/ipfs-repo/src}/default-datastore.js (100%) rename {src => packages/ipfs-repo/src}/default-options.browser.js (100%) rename {src => packages/ipfs-repo/src}/default-options.js (100%) rename {src => packages/ipfs-repo/src}/errors/index.js (100%) rename {src => packages/ipfs-repo/src}/gc.js (100%) rename {src => packages/ipfs-repo/src}/idstore.js (100%) rename {src => packages/ipfs-repo/src}/index.js (100%) rename {src => packages/ipfs-repo/src}/locks/fs.js (100%) rename {src => packages/ipfs-repo/src}/locks/memory.js (100%) rename {src => packages/ipfs-repo/src}/pinned-blockstore.js (100%) rename {src => packages/ipfs-repo/src}/pins.js (100%) rename {src => packages/ipfs-repo/src}/spec.js (100%) rename {src => packages/ipfs-repo/src}/types.d.ts (100%) rename {src => packages/ipfs-repo/src}/utils/blockstore.js (100%) rename {src => packages/ipfs-repo/src}/utils/walk-dag.js (100%) rename {src => packages/ipfs-repo/src}/version.js (100%) rename {test => packages/ipfs-repo/test}/api-addr-test.js (100%) rename {test => packages/ipfs-repo/test}/blockstore-test.js (100%) rename {test => packages/ipfs-repo/test}/blockstore-utils-test.js (100%) rename {test => packages/ipfs-repo/test}/browser.js (100%) rename {test => packages/ipfs-repo/test}/config-test.js (100%) rename {test => packages/ipfs-repo/test}/datastore-test.js (100%) rename {test => packages/ipfs-repo/test}/fixtures/create-backend.js (100%) rename {test => packages/ipfs-repo/test}/fixtures/load-codec.js (100%) rename {test => packages/ipfs-repo/test}/is-initialized.js (100%) rename {test => packages/ipfs-repo/test}/keystore-test.js (100%) rename {test => packages/ipfs-repo/test}/lock-test.js (100%) rename {test => packages/ipfs-repo/test}/migrations-test.js (100%) rename {test => packages/ipfs-repo/test}/node.js (100%) rename {test => packages/ipfs-repo/test}/options-test.js (100%) rename {test => packages/ipfs-repo/test}/pins-test.js (100%) rename {test => packages/ipfs-repo/test}/repo-test.js (100%) rename {test => packages/ipfs-repo/test}/stat-test.js (100%) rename {test => packages/ipfs-repo/test}/types.test-d.ts (100%) rename tsconfig.json => packages/ipfs-repo/tsconfig.json (100%) rename {types => packages/ipfs-repo/types}/just-range/index.d.ts (100%) rename {types => packages/ipfs-repo/types}/merge-options/index.d.ts (100%) diff --git a/.aegir.js b/packages/ipfs-repo/.aegir.js similarity index 100% rename from .aegir.js rename to packages/ipfs-repo/.aegir.js diff --git a/.gitattributes b/packages/ipfs-repo/.gitattributes similarity index 100% rename from .gitattributes rename to packages/ipfs-repo/.gitattributes diff --git a/CHANGELOG.md b/packages/ipfs-repo/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/ipfs-repo/CHANGELOG.md diff --git a/LICENSE b/packages/ipfs-repo/LICENSE similarity index 100% rename from LICENSE rename to packages/ipfs-repo/LICENSE diff --git a/README.md b/packages/ipfs-repo/README.md similarity index 100% rename from README.md rename to packages/ipfs-repo/README.md diff --git a/graphs/arch.monopic b/packages/ipfs-repo/graphs/arch.monopic similarity index 100% rename from graphs/arch.monopic rename to packages/ipfs-repo/graphs/arch.monopic diff --git a/graphs/arch.txt b/packages/ipfs-repo/graphs/arch.txt similarity index 100% rename from graphs/arch.txt rename to packages/ipfs-repo/graphs/arch.txt diff --git a/package.json b/packages/ipfs-repo/package.json similarity index 100% rename from package.json rename to packages/ipfs-repo/package.json diff --git a/src/api-addr.js b/packages/ipfs-repo/src/api-addr.js similarity index 100% rename from src/api-addr.js rename to packages/ipfs-repo/src/api-addr.js diff --git a/src/config.js b/packages/ipfs-repo/src/config.js similarity index 100% rename from src/config.js rename to packages/ipfs-repo/src/config.js diff --git a/src/constants.js b/packages/ipfs-repo/src/constants.js similarity index 100% rename from src/constants.js rename to packages/ipfs-repo/src/constants.js diff --git a/src/default-datastore.js b/packages/ipfs-repo/src/default-datastore.js similarity index 100% rename from src/default-datastore.js rename to packages/ipfs-repo/src/default-datastore.js diff --git a/src/default-options.browser.js b/packages/ipfs-repo/src/default-options.browser.js similarity index 100% rename from src/default-options.browser.js rename to packages/ipfs-repo/src/default-options.browser.js diff --git a/src/default-options.js b/packages/ipfs-repo/src/default-options.js similarity index 100% rename from src/default-options.js rename to packages/ipfs-repo/src/default-options.js diff --git a/src/errors/index.js b/packages/ipfs-repo/src/errors/index.js similarity index 100% rename from src/errors/index.js rename to packages/ipfs-repo/src/errors/index.js diff --git a/src/gc.js b/packages/ipfs-repo/src/gc.js similarity index 100% rename from src/gc.js rename to packages/ipfs-repo/src/gc.js diff --git a/src/idstore.js b/packages/ipfs-repo/src/idstore.js similarity index 100% rename from src/idstore.js rename to packages/ipfs-repo/src/idstore.js diff --git a/src/index.js b/packages/ipfs-repo/src/index.js similarity index 100% rename from src/index.js rename to packages/ipfs-repo/src/index.js diff --git a/src/locks/fs.js b/packages/ipfs-repo/src/locks/fs.js similarity index 100% rename from src/locks/fs.js rename to packages/ipfs-repo/src/locks/fs.js diff --git a/src/locks/memory.js b/packages/ipfs-repo/src/locks/memory.js similarity index 100% rename from src/locks/memory.js rename to packages/ipfs-repo/src/locks/memory.js diff --git a/src/pinned-blockstore.js b/packages/ipfs-repo/src/pinned-blockstore.js similarity index 100% rename from src/pinned-blockstore.js rename to packages/ipfs-repo/src/pinned-blockstore.js diff --git a/src/pins.js b/packages/ipfs-repo/src/pins.js similarity index 100% rename from src/pins.js rename to packages/ipfs-repo/src/pins.js diff --git a/src/spec.js b/packages/ipfs-repo/src/spec.js similarity index 100% rename from src/spec.js rename to packages/ipfs-repo/src/spec.js diff --git a/src/types.d.ts b/packages/ipfs-repo/src/types.d.ts similarity index 100% rename from src/types.d.ts rename to packages/ipfs-repo/src/types.d.ts diff --git a/src/utils/blockstore.js b/packages/ipfs-repo/src/utils/blockstore.js similarity index 100% rename from src/utils/blockstore.js rename to packages/ipfs-repo/src/utils/blockstore.js diff --git a/src/utils/walk-dag.js b/packages/ipfs-repo/src/utils/walk-dag.js similarity index 100% rename from src/utils/walk-dag.js rename to packages/ipfs-repo/src/utils/walk-dag.js diff --git a/src/version.js b/packages/ipfs-repo/src/version.js similarity index 100% rename from src/version.js rename to packages/ipfs-repo/src/version.js diff --git a/test/api-addr-test.js b/packages/ipfs-repo/test/api-addr-test.js similarity index 100% rename from test/api-addr-test.js rename to packages/ipfs-repo/test/api-addr-test.js diff --git a/test/blockstore-test.js b/packages/ipfs-repo/test/blockstore-test.js similarity index 100% rename from test/blockstore-test.js rename to packages/ipfs-repo/test/blockstore-test.js diff --git a/test/blockstore-utils-test.js b/packages/ipfs-repo/test/blockstore-utils-test.js similarity index 100% rename from test/blockstore-utils-test.js rename to packages/ipfs-repo/test/blockstore-utils-test.js diff --git a/test/browser.js b/packages/ipfs-repo/test/browser.js similarity index 100% rename from test/browser.js rename to packages/ipfs-repo/test/browser.js diff --git a/test/config-test.js b/packages/ipfs-repo/test/config-test.js similarity index 100% rename from test/config-test.js rename to packages/ipfs-repo/test/config-test.js diff --git a/test/datastore-test.js b/packages/ipfs-repo/test/datastore-test.js similarity index 100% rename from test/datastore-test.js rename to packages/ipfs-repo/test/datastore-test.js diff --git a/test/fixtures/create-backend.js b/packages/ipfs-repo/test/fixtures/create-backend.js similarity index 100% rename from test/fixtures/create-backend.js rename to packages/ipfs-repo/test/fixtures/create-backend.js diff --git a/test/fixtures/load-codec.js b/packages/ipfs-repo/test/fixtures/load-codec.js similarity index 100% rename from test/fixtures/load-codec.js rename to packages/ipfs-repo/test/fixtures/load-codec.js diff --git a/test/is-initialized.js b/packages/ipfs-repo/test/is-initialized.js similarity index 100% rename from test/is-initialized.js rename to packages/ipfs-repo/test/is-initialized.js diff --git a/test/keystore-test.js b/packages/ipfs-repo/test/keystore-test.js similarity index 100% rename from test/keystore-test.js rename to packages/ipfs-repo/test/keystore-test.js diff --git a/test/lock-test.js b/packages/ipfs-repo/test/lock-test.js similarity index 100% rename from test/lock-test.js rename to packages/ipfs-repo/test/lock-test.js diff --git a/test/migrations-test.js b/packages/ipfs-repo/test/migrations-test.js similarity index 100% rename from test/migrations-test.js rename to packages/ipfs-repo/test/migrations-test.js diff --git a/test/node.js b/packages/ipfs-repo/test/node.js similarity index 100% rename from test/node.js rename to packages/ipfs-repo/test/node.js diff --git a/test/options-test.js b/packages/ipfs-repo/test/options-test.js similarity index 100% rename from test/options-test.js rename to packages/ipfs-repo/test/options-test.js diff --git a/test/pins-test.js b/packages/ipfs-repo/test/pins-test.js similarity index 100% rename from test/pins-test.js rename to packages/ipfs-repo/test/pins-test.js diff --git a/test/repo-test.js b/packages/ipfs-repo/test/repo-test.js similarity index 100% rename from test/repo-test.js rename to packages/ipfs-repo/test/repo-test.js diff --git a/test/stat-test.js b/packages/ipfs-repo/test/stat-test.js similarity index 100% rename from test/stat-test.js rename to packages/ipfs-repo/test/stat-test.js diff --git a/test/types.test-d.ts b/packages/ipfs-repo/test/types.test-d.ts similarity index 100% rename from test/types.test-d.ts rename to packages/ipfs-repo/test/types.test-d.ts diff --git a/tsconfig.json b/packages/ipfs-repo/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/ipfs-repo/tsconfig.json diff --git a/types/just-range/index.d.ts b/packages/ipfs-repo/types/just-range/index.d.ts similarity index 100% rename from types/just-range/index.d.ts rename to packages/ipfs-repo/types/just-range/index.d.ts diff --git a/types/merge-options/index.d.ts b/packages/ipfs-repo/types/merge-options/index.d.ts similarity index 100% rename from types/merge-options/index.d.ts rename to packages/ipfs-repo/types/merge-options/index.d.ts From 37cacd28199c24e2c6c8647f7b529c8dccf39be9 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 11:41:40 +0100 Subject: [PATCH 02/24] chore: convert to monorepo --- .github/workflows/main.yml | 68 +-- LICENSE-APACHE | 5 + packages/ipfs-repo/LICENSE => LICENSE-MIT | 11 +- README.md | 64 +++ lerna.json | 21 + package.json | 69 +++ packages/ipfs-repo-migrations/.aegir.js | 22 + packages/ipfs-repo-migrations/CHANGELOG.md | 284 ++++++++++ packages/ipfs-repo-migrations/LICENSE-APACHE | 5 + packages/ipfs-repo-migrations/LICENSE-MIT | 19 + packages/ipfs-repo-migrations/README.md | 315 +++++++++++ packages/ipfs-repo-migrations/maintainer.json | 11 + .../ipfs-repo-migrations/migrations/index.js | 27 + .../migrations/migration-10/index.js | 233 ++++++++ .../migrations/migration-11/index.js | 53 ++ .../migrations/migration-8/index.js | 117 ++++ .../migrations/migration-9/index.js | 165 ++++++ .../migrations/migration-9/pin-set.js | 280 +++++++++ .../migrations/migration-9/pin.d.ts | 79 +++ .../migrations/migration-9/pin.js | 210 +++++++ .../migrations/migration-9/pin.proto | 11 + .../migrations/migration-9/utils.js | 31 + packages/ipfs-repo-migrations/package.json | 82 +++ .../scripts/node-globals.js | 3 + packages/ipfs-repo-migrations/src/errors.js | 90 +++ packages/ipfs-repo-migrations/src/index.js | 271 +++++++++ .../ipfs-repo-migrations/src/repo/init.js | 42 ++ .../ipfs-repo-migrations/src/repo/version.js | 51 ++ packages/ipfs-repo-migrations/src/types.d.ts | 84 +++ packages/ipfs-repo-migrations/src/utils.js | 148 +++++ packages/ipfs-repo-migrations/test/browser.js | 150 +++++ .../test/fixtures/generate-car-files.js | 154 +++++ .../test/fixtures/mock-s3.js | 159 ++++++ .../test/fixtures/pinset-basic.car | Bin 0 -> 32719 bytes .../test/fixtures/pinset-multiple-buckets.car | Bin 0 -> 3651923 bytes .../test/fixtures/repo.js | 43 ++ .../test/fixtures/test-repo/config | 99 ++++ .../test/fixtures/test-repo/version | 1 + .../ipfs-repo-migrations/test/index.spec.js | 533 ++++++++++++++++++ .../ipfs-repo-migrations/test/init-test.js | 57 ++ .../test/integration-test.js | 77 +++ .../test/migrations/index.js | 12 + .../test/migrations/migration-10-test.js | 184 ++++++ .../test/migrations/migration-11-test.js | 75 +++ .../test/migrations/migration-8-test.js | 160 ++++++ .../test/migrations/migration-9-test.js | 236 ++++++++ packages/ipfs-repo-migrations/test/node.js | 130 +++++ .../test/test-migrations/index.js | 5 + .../test/test-migrations/migration-2/index.js | 126 +++++ packages/ipfs-repo-migrations/test/types.d.ts | 4 + .../ipfs-repo-migrations/test/version-test.js | 60 ++ packages/ipfs-repo-migrations/tsconfig.json | 15 + packages/ipfs-repo/LICENSE-APACHE | 5 + packages/ipfs-repo/LICENSE-MIT | 19 + packages/ipfs-repo/README.md | 2 +- packages/ipfs-repo/package.json | 57 +- packages/ipfs-repo/src/gc.js | 2 +- .../ipfs-repo/src/{types.d.ts => types.ts} | 0 packages/ipfs-repo/test/blockstore-test.js | 6 +- packages/ipfs-repo/test/browser.js | 4 +- .../ipfs-repo/test/fixtures/create-backend.js | 4 +- packages/ipfs-repo/test/repo-test.js | 6 +- packages/ipfs-repo/test/types.test-d.ts | 18 - 63 files changed, 5151 insertions(+), 123 deletions(-) create mode 100644 LICENSE-APACHE rename packages/ipfs-repo/LICENSE => LICENSE-MIT (89%) create mode 100644 README.md create mode 100644 lerna.json create mode 100644 package.json create mode 100644 packages/ipfs-repo-migrations/.aegir.js create mode 100644 packages/ipfs-repo-migrations/CHANGELOG.md create mode 100644 packages/ipfs-repo-migrations/LICENSE-APACHE create mode 100644 packages/ipfs-repo-migrations/LICENSE-MIT create mode 100644 packages/ipfs-repo-migrations/README.md create mode 100644 packages/ipfs-repo-migrations/maintainer.json create mode 100644 packages/ipfs-repo-migrations/migrations/index.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-10/index.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-11/index.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-8/index.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/index.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/pin-set.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/pin.d.ts create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/pin.js create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/pin.proto create mode 100644 packages/ipfs-repo-migrations/migrations/migration-9/utils.js create mode 100644 packages/ipfs-repo-migrations/package.json create mode 100644 packages/ipfs-repo-migrations/scripts/node-globals.js create mode 100644 packages/ipfs-repo-migrations/src/errors.js create mode 100644 packages/ipfs-repo-migrations/src/index.js create mode 100644 packages/ipfs-repo-migrations/src/repo/init.js create mode 100644 packages/ipfs-repo-migrations/src/repo/version.js create mode 100644 packages/ipfs-repo-migrations/src/types.d.ts create mode 100644 packages/ipfs-repo-migrations/src/utils.js create mode 100644 packages/ipfs-repo-migrations/test/browser.js create mode 100644 packages/ipfs-repo-migrations/test/fixtures/generate-car-files.js create mode 100644 packages/ipfs-repo-migrations/test/fixtures/mock-s3.js create mode 100644 packages/ipfs-repo-migrations/test/fixtures/pinset-basic.car create mode 100644 packages/ipfs-repo-migrations/test/fixtures/pinset-multiple-buckets.car create mode 100644 packages/ipfs-repo-migrations/test/fixtures/repo.js create mode 100644 packages/ipfs-repo-migrations/test/fixtures/test-repo/config create mode 100644 packages/ipfs-repo-migrations/test/fixtures/test-repo/version create mode 100644 packages/ipfs-repo-migrations/test/index.spec.js create mode 100644 packages/ipfs-repo-migrations/test/init-test.js create mode 100644 packages/ipfs-repo-migrations/test/integration-test.js create mode 100644 packages/ipfs-repo-migrations/test/migrations/index.js create mode 100644 packages/ipfs-repo-migrations/test/migrations/migration-10-test.js create mode 100644 packages/ipfs-repo-migrations/test/migrations/migration-11-test.js create mode 100644 packages/ipfs-repo-migrations/test/migrations/migration-8-test.js create mode 100644 packages/ipfs-repo-migrations/test/migrations/migration-9-test.js create mode 100644 packages/ipfs-repo-migrations/test/node.js create mode 100644 packages/ipfs-repo-migrations/test/test-migrations/index.js create mode 100644 packages/ipfs-repo-migrations/test/test-migrations/migration-2/index.js create mode 100644 packages/ipfs-repo-migrations/test/types.d.ts create mode 100644 packages/ipfs-repo-migrations/test/version-test.js create mode 100644 packages/ipfs-repo-migrations/tsconfig.json create mode 100644 packages/ipfs-repo/LICENSE-APACHE create mode 100644 packages/ipfs-repo/LICENSE-MIT rename packages/ipfs-repo/src/{types.d.ts => types.ts} (100%) delete mode 100644 packages/ipfs-repo/test/types.test-d.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03c88726..3be35b5c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,13 +14,9 @@ jobs: - uses: actions/checkout@v2 - run: npm install - run: npm run lint - # or - # - uses: gozala/typescript-error-reporter-action@v1.0.8 - - run: npx aegir build - - run: npx aegir dep-check - - uses: ipfs/aegir/actions/bundle-size@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} + - uses: gozala/typescript-error-reporter-action@v1.0.8 + - run: npm run build + - run: npm run depcheck test-node: needs: check runs-on: ${{ matrix.os }} @@ -28,6 +24,9 @@ jobs: matrix: os: [windows-latest, ubuntu-latest, macos-latest] node: [14, 16] + project: + - packages/ipfs-repo + - packages/ipfs-repo-migrations fail-fast: true steps: - uses: actions/checkout@v2 @@ -35,44 +34,39 @@ jobs: with: node-version: ${{ matrix.node }} - run: npm install - - run: npx aegir test -t node --bail --cov + - run: npm run test -- -- -- --cov -t node - uses: codecov/codecov-action@v1 - test-chrome: - needs: check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: microsoft/playwright-github-action@v1 - - run: npm install - - run: npx aegir test -t browser -t webworker --bail - - uses: codecov/codecov-action@v1 - test-firefox: + with: + project: ${{ matrix.project }} + test-electron-main: needs: check runs-on: ubuntu-latest + strategy: + matrix: + project: + - packages/ipfs-repo + - packages/ipfs-repo-migrations + fail-fast: true steps: - uses: actions/checkout@v2 - - uses: microsoft/playwright-github-action@v1 - run: npm install - - run: npx aegir test -t browser -t webworker --bail -- --browser firefox - test-webkit: + - run: npm run pretest + - run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js + with: + project: ${{ matrix.project }} + test-electron-renderer: needs: check runs-on: ubuntu-latest + strategy: + matrix: + project: + - packages/ipfs-repo + - packages/ipfs-repo-migrations + fail-fast: true steps: - uses: actions/checkout@v2 - - uses: microsoft/playwright-github-action@v1 - run: npm install - - run: npx aegir test -t browser -t webworker --bail -- --browser webkit - # test-electron-main: - # needs: check - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v2 - # - run: npm install - # - run: npx xvfb-maybe aegir test -t electron-main --bail - # test-electron-renderer: - # needs: check - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v2 - # - run: npm install - # - run: npx xvfb-maybe aegir test -t electron-renderer --bail + - run: npm run pretest + - run: npx xvfb-maybe aegir test -t electron-renderer --bail -f dist/cjs/browser-test/*js + with: + project: ${{ matrix.project }} diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 00000000..14478a3b --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/packages/ipfs-repo/LICENSE b/LICENSE-MIT similarity index 89% rename from packages/ipfs-repo/LICENSE rename to LICENSE-MIT index 5ed36143..749aa1ec 100644 --- a/packages/ipfs-repo/LICENSE +++ b/LICENSE-MIT @@ -1,7 +1,5 @@ The MIT License (MIT) -Copyright (c) 2015 IPFS - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights @@ -9,14 +7,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..8c55072d --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# ipfs-repo + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-repo)](https://travis-ci.com/ipfs/js-ipfs-unixfs) +[![Codecov](https://codecov.io/gh/ipfs/js-ipfs-repo/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/js-ipfs-repo) +[![Style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) + +> The repository where blocks are stored and a tool to perform migrations between different versions + +## Lead Maintainer + +[Alex Potsides](https://github.com/achingbrain) + +## Table of Contents + +- [Structure](#structure) +- [Development](#development) + - [Publishing new versions](#publishing-new-versions) + - [Using prerelease versions](#using-prerelease-versions) +- [Contribute](#contribute) +- [License](#license) + +## Structure + +This project is broken into several modules, their purposes are: + +* [`/packages/ipfs-repo`](./packages/ipfs-repo) The repo implementation +* [`/packages/ipfs-repo-migrations`](./packages/ipfs-urepo-migrations) A tool for migrating between different repo versions + +## Development + +1. Clone this repo +2. Run `npm install` + +This will install [lerna](https://www.npmjs.com/package/lerna) and bootstrap the various packages, deduping and hoisting dependencies into the root folder. + +If later you wish to remove all the `node_modules`/`dist` folders and start again, run `npm run reset && npm install` from the root. + +See the scripts section of the root [`package.json`](./package.json) for more commands. + +### Publishing new versions + +1. Ensure you have a `GH_TOKEN` env var containing a GitHub [Personal Access Token](https://github.com/settings/tokens) with `public_repo` permissions +2. From the root of this repo run `npm run release` and follow the on screen prompts. It will use [conventional commits](https://www.conventionalcommits.org) to work out the new package version + +### Using prerelease versions + +Any changed packages from each successful build of master are published to npm as canary builds under the npm tag `next`. + +Canary builds only consider changes to packages in the last built commit so changes to the root config files should not result in new prereleases being published to npm. + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/js-ipfs-repo/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +[Apache-2.0](LICENSE-APACHE) OR [MIT](LICENSE-MIT) diff --git a/lerna.json b/lerna.json new file mode 100644 index 00000000..bf001c38 --- /dev/null +++ b/lerna.json @@ -0,0 +1,21 @@ +{ + "lerna": "3.22.1", + "packages": [ + "packages/*" + ], + "version": "independent", + "command": { + "bootstrap": { + "hoist": true + }, + "run": { + "stream": true + }, + "publish": { + "message": "chore: publish", + "conventionalCommits": true, + "createRelease": "github", + "verifyAccess": false + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..b988be9f --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "ipfs-repo", + "version": "1.0.0", + "description": "The repo and migration tools used by IPFS", + "scripts": { + "reset": "lerna run clean && rimraf packages/*/node_modules node_modules packages/*/package-lock.json package-lock.json", + "test": "lerna run test", + "coverage": "lerna run coverage", + "prepare": "lerna run prepare", + "build": "lerna run build", + "clean": "lerna run clean", + "lint": "lerna run lint", + "depcheck": "lerna run depcheck", + "release": "npm run update-contributors && lerna publish", + "release:rc": "lerna publish --canary --preid rc --dist-tag next", + "update-contributors": "aegir release --lint=false --test=false --bump=false --build=false --changelog=false --commit=false --tag=false --push=false --ghrelease=false --docs=false --publish=false" + }, + "devDependencies": { + "lerna": "^4.0.0", + "rimraf": "^3.0.2" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ipfs/js-ipfs-repo.git" + }, + "private": true, + "license": "(Apache-2.0 OR MIT)", + "contributors": [ + "David Dias ", + "achingbrain ", + "Jacob Heun ", + "dignifiedquire ", + "Hugo Dias ", + "Stephen Whitmore ", + "Adam Uhlíř ", + "Alan Shaw ", + "Vasco Santos ", + "Richard Schneider ", + "Hector Sanjuan ", + "Pau Ramon Revilla ", + "Dmitriy Ryajov ", + "Lars-Magnus Skog ", + "Francisco Baio Dias ", + "Pedro Santos ", + "nginnever ", + "ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ ", + "Andrew Nesbitt ", + "Brian Hoffman ", + "Bryan Stenson ", + "Hannah Howard ", + "Henrique Dias ", + "Jonah Weissman ", + "Jonathan ", + "Justin Chase ", + "Linus Unnebäck ", + "Marcus Bernales ", + "Pedro Teixeira ", + "Richard Littauer ", + "Steef Min ", + "Volker Mische " + ], + "workspaces": [ + "packages/*" + ], + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } +} diff --git a/packages/ipfs-repo-migrations/.aegir.js b/packages/ipfs-repo-migrations/.aegir.js new file mode 100644 index 00000000..e5e14f77 --- /dev/null +++ b/packages/ipfs-repo-migrations/.aegir.js @@ -0,0 +1,22 @@ +'use strict' + +const path = require('path') + +const esbuild = { + // this will inject all the named exports from 'node-globals.js' as globals + inject: [path.join(__dirname, 'scripts/node-globals.js')] +} + +/** @type {import('aegir').PartialOptions} */ +module.exports = { + test: { + browser: { + config: { + buildConfig: esbuild + } + } + }, + build: { + bundlesizeMax: '37kB' + } +} diff --git a/packages/ipfs-repo-migrations/CHANGELOG.md b/packages/ipfs-repo-migrations/CHANGELOG.md new file mode 100644 index 00000000..b3ca0b42 --- /dev/null +++ b/packages/ipfs-repo-migrations/CHANGELOG.md @@ -0,0 +1,284 @@ +# [10.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v9.0.1...v10.0.0) (2021-08-23) + + +### Bug Fixes + +* use new s3 instance for every test ([#124](https://github.com/ipfs/js-ipfs-repo-migrations/issues/124)) ([d3c0056](https://github.com/ipfs/js-ipfs-repo-migrations/commit/d3c0056160d7592da5d89e57f9d9faefa1fadd7d)) + + +### Features + +* migrate mfs root to datastore ([#126](https://github.com/ipfs/js-ipfs-repo-migrations/issues/126)) ([540a077](https://github.com/ipfs/js-ipfs-repo-migrations/commit/540a077528037f00468c09fc15a9f190de283967)) + + +### BREAKING CHANGES + +* adds a new migration, should go out as a major + + + +## [9.0.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v9.0.0...v9.0.1) (2021-07-30) + + +### Bug Fixes + +* remove optional chaining ([#122](https://github.com/ipfs/js-ipfs-repo-migrations/issues/122)) ([242dc8e](https://github.com/ipfs/js-ipfs-repo-migrations/commit/242dc8efcb5e612f01d4d8a6788d9640f21e2325)) + + + +# [9.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v8.0.0...v9.0.0) (2021-07-07) + + +### chore + +* upgrade to new multiformats module ([#98](https://github.com/ipfs/js-ipfs-repo-migrations/issues/98)) ([dad30b6](https://github.com/ipfs/js-ipfs-repo-migrations/commit/dad30b6cd4f3067a1ed86b0971d84b26f42667ce)) + + +### BREAKING CHANGES + +* Uses new CID class + +Co-authored-by: Rod Vagg + + + +# [8.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v7.0.3...v8.0.0) (2021-04-15) + + + +## [7.0.3](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v7.0.2...v7.0.3) (2021-03-21) + + +### Bug Fixes + +* remove hacks from build and test ([#82](https://github.com/ipfs/js-ipfs-repo-migrations/issues/82)) ([18c0793](https://github.com/ipfs/js-ipfs-repo-migrations/commit/18c07937013dd95c53e38bb775aeb44b5eb75bcb)) + + + +## [7.0.2](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v7.0.1...v7.0.2) (2021-03-15) + + + +## [7.0.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v7.0.0...v7.0.1) (2021-03-04) + + +### Bug Fixes + +* add cborg to browser field ([#76](https://github.com/ipfs/js-ipfs-repo-migrations/issues/76)) ([8d6c65d](https://github.com/ipfs/js-ipfs-repo-migrations/commit/8d6c65d75dea367ffeb54d891106211abef68da3)) + + + +# [7.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v6.0.0...v7.0.0) (2021-03-04) + + +### Features + +* add types ([#66](https://github.com/ipfs/js-ipfs-repo-migrations/issues/66)) ([349f3c8](https://github.com/ipfs/js-ipfs-repo-migrations/commit/349f3c842019edfbaed70fa3642fb280359a5aab)) + + +### BREAKING CHANGES + +* where there were previously no types, now there are types + + + +# [6.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.6...v6.0.0) (2021-01-29) + + +### Features + +* migration 10 to allow upgrading level in the browser ([#59](https://github.com/ipfs/js-ipfs-repo-migrations/issues/59)) ([7dc562b](https://github.com/ipfs/js-ipfs-repo-migrations/commit/7dc562b05eeeaa8db2de5a95a4b3bcbab6f17d5c)), closes [Level/level-js#179](https://github.com/Level/level-js/issues/179) + + + +## [5.0.6](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.5...v5.0.6) (2021-01-27) + + + + +## [5.0.5](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.4...v5.0.5) (2020-08-17) + + +### Bug Fixes + +* migrate empty repos ([#35](https://github.com/ipfs/js-ipfs-repo-migrations/issues/35)) ([e48efad](https://github.com/ipfs/js-ipfs-repo-migrations/commit/e48efad)) + + + + +## [5.0.4](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.3...v5.0.4) (2020-08-15) + + +### Bug Fixes + +* only count migrated blocks ([d49f338](https://github.com/ipfs/js-ipfs-repo-migrations/commit/d49f338)) + + + + +## [5.0.3](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.2...v5.0.3) (2020-08-15) + + +### Bug Fixes + +* pass repo options when migration error occurs ([267e718](https://github.com/ipfs/js-ipfs-repo-migrations/commit/267e718)) + + + + +## [5.0.2](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.1...v5.0.2) (2020-08-15) + + +### Bug Fixes + +* null-guard progress and enable migration 9 ([#34](https://github.com/ipfs/js-ipfs-repo-migrations/issues/34)) ([a42e671](https://github.com/ipfs/js-ipfs-repo-migrations/commit/a42e671)) + + + + +## [5.0.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v5.0.0...v5.0.1) (2020-08-15) + + +### Bug Fixes + +* root is not a store inside the store ([e4c9a9f](https://github.com/ipfs/js-ipfs-repo-migrations/commit/e4c9a9f)) + + + + +# [5.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v4.0.0...v5.0.0) (2020-08-15) + + +### Features + +* report migration progress ([#33](https://github.com/ipfs/js-ipfs-repo-migrations/issues/33)) ([051c0a4](https://github.com/ipfs/js-ipfs-repo-migrations/commit/051c0a4)), closes [#32](https://github.com/ipfs/js-ipfs-repo-migrations/issues/32) + + +### BREAKING CHANGES + +* - The signature of the `onProgress` callback has changed + + + + +# [4.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v3.0.0...v4.0.0) (2020-08-06) + + +### Bug Fixes + +* require passing repo options to migrator ([#31](https://github.com/ipfs/js-ipfs-repo-migrations/issues/31)) ([725f821](https://github.com/ipfs/js-ipfs-repo-migrations/commit/725f821)) + + +### BREAKING CHANGES + +* - `migrator.migrate(path, version, opts)` has changed to `migrator.migrate(path, repoOpts, version, opts)` +- `migrator.revert(path, version, opts)` has changed to `migrator.revert(path, repoOpts, version, opts)` + + + + +# [3.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v2.0.1...v3.0.0) (2020-08-05) + + +### Bug Fixes + +* replace node buffers with uint8arrays ([#25](https://github.com/ipfs/js-ipfs-repo-migrations/issues/25)) ([1e7592d](https://github.com/ipfs/js-ipfs-repo-migrations/commit/1e7592d)) + + +### BREAKING CHANGES + +* - node `Buffer`s have been replaced with `Uint8Array`s + + + + +## [2.0.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v2.0.0...v2.0.1) (2020-07-21) + + +### Bug Fixes + +* make recursive pins depth infinity ([ef95579](https://github.com/ipfs/js-ipfs-repo-migrations/commit/ef95579)) + + + + +# [2.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v1.0.0...v2.0.0) (2020-07-21) + + +### Features + +* add migration 9 to migrate pins to the datastore and back ([#15](https://github.com/ipfs/js-ipfs-repo-migrations/issues/15)) ([2b14578](https://github.com/ipfs/js-ipfs-repo-migrations/commit/2b14578)) + + + + +# [1.0.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v0.2.2...v1.0.0) (2020-06-25) + + + + +## [0.2.2](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v0.2.1...v0.2.2) (2020-06-23) + + +### Bug Fixes + +* **ci:** add empty commit to fix lint checks on master ([cf10410](https://github.com/ipfs/js-ipfs-repo-migrations/commit/cf10410)) + + + + +## [0.2.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v0.2.0...v0.2.1) (2020-04-28) + + +### Bug Fixes + +* linter ([2a20542](https://github.com/ipfs/js-ipfs-repo-migrations/commit/2a20542)) + + + + +# [0.2.0](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v0.1.1+migr-7...v0.2.0) (2020-04-14) + + +### Bug Fixes + +* remove datastore-level from the readme and deps ([dabab4e](https://github.com/ipfs/js-ipfs-repo-migrations/commit/dabab4e)) +* remove node globals ([8b51f8d](https://github.com/ipfs/js-ipfs-repo-migrations/commit/8b51f8d)) +* update datastore-idb ([3dc05ef](https://github.com/ipfs/js-ipfs-repo-migrations/commit/3dc05ef)) + + + + +## [0.1.1](https://github.com/ipfs/js-ipfs-repo-migrations/compare/v0.1.0+migr-7...v0.1.1) (2019-11-09) + + +### Bug Fixes + +* provide empty migrations for all previous versions ([6ecba01](https://github.com/ipfs/js-ipfs-repo-migrations/commit/6ecba01)) +* validate presence for all migrations in a range ([076f300](https://github.com/ipfs/js-ipfs-repo-migrations/commit/076f300)) + + + + +# 0.1.0 (2019-11-06) + + +### Bug Fixes + +* async lock-mem ([bc88612](https://github.com/ipfs/js-ipfs-repo-migrations/commit/bc88612)) +* details ([93e0c86](https://github.com/ipfs/js-ipfs-repo-migrations/commit/93e0c86)) +* removing staleness in lock ([e92d057](https://github.com/ipfs/js-ipfs-repo-migrations/commit/e92d057)) +* update src/utils.js ([662d89b](https://github.com/ipfs/js-ipfs-repo-migrations/commit/662d89b)) + + +### Features + +* confirm migration of irreversible migrations ([9477d57](https://github.com/ipfs/js-ipfs-repo-migrations/commit/9477d57)) +* empty 7-th migration ([dc886f0](https://github.com/ipfs/js-ipfs-repo-migrations/commit/dc886f0)) +* initial implementation ([#1](https://github.com/ipfs/js-ipfs-repo-migrations/issues/1)) ([aae9aec](https://github.com/ipfs/js-ipfs-repo-migrations/commit/aae9aec)) +* release metadata mentioned in README ([cf2409a](https://github.com/ipfs/js-ipfs-repo-migrations/commit/cf2409a)) +* require toVersion in migrate() ([1596dfe](https://github.com/ipfs/js-ipfs-repo-migrations/commit/1596dfe)) +* using browser field for browsers environment ([1474d5e](https://github.com/ipfs/js-ipfs-repo-migrations/commit/1474d5e)) + + + diff --git a/packages/ipfs-repo-migrations/LICENSE-APACHE b/packages/ipfs-repo-migrations/LICENSE-APACHE new file mode 100644 index 00000000..14478a3b --- /dev/null +++ b/packages/ipfs-repo-migrations/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/packages/ipfs-repo-migrations/LICENSE-MIT b/packages/ipfs-repo-migrations/LICENSE-MIT new file mode 100644 index 00000000..749aa1ec --- /dev/null +++ b/packages/ipfs-repo-migrations/LICENSE-MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/ipfs-repo-migrations/README.md b/packages/ipfs-repo-migrations/README.md new file mode 100644 index 00000000..83eb3685 --- /dev/null +++ b/packages/ipfs-repo-migrations/README.md @@ -0,0 +1,315 @@ +# Migration tool for JS IPFS Repo + +[![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-repo-migrations)](https://travis-ci.com/ipfs/js-ipfs-repo-migrations) +[![codecov](https://codecov.io/gh/ipfs/js-ipfs-repo-migrations/branch/master/graph/badge.svg)](https://codecov.io/gh/ipfs/js-ipfs-repo-migrations) +[![Dependency Status](https://david-dm.org/ipfs/js-ipfs-repo-migrations.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-repo-migrations) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) +![](https://img.shields.io/badge/npm-%3E%3D6.0.0-orange.svg?style=flat-square) +![](https://img.shields.io/badge/Node.js-%3E%3D10.0.0-orange.svg?style=flat-square) + +> Migration framework for versioning of JS IPFS Repo + +This package is inspired by the [go-ipfs repo migration tool](https://github.com/ipfs/fs-repo-migrations/) + +## Lead Maintainer + +[Alex Potsides](http://github.com/achingbrain) + +## Table of Contents + +- [Background](#background) +- [Install](#install) + - [npm](#npm) + - [Use in Node.js](#use-in-nodejs) + - [Use in a browser with browserify, webpack or any other bundler](#use-in-a-browser-with-browserify-webpack-or-any-other-bundler) +- [Usage](#usage) +- [API](#api) + - [`.migrate(path, repoOptions, toVersion, {ignoreLock, onProgress, isDryRun}) -> Promise`](#migratepath-repooptions-toversion-ignorelock-onprogress-isdryrun---promisevoid) + - [`onProgress(version, percent, message)`](#onprogressversion-percent-message) + - [`.revert(path, repoOptions, toVersion, {ignoreLock, onProgress, isDryRun}) -> Promise`](#revertpath-repooptions-toversion-ignorelock-onprogress-isdryrun---promisevoid) + - [`getLatestMigrationVersion() -> int`](#getlatestmigrationversion---int) +- [Creating a new migration](#creating-a-new-migration) + - [Architecture of a migration](#architecture-of-a-migration) + - [`.migrate(repoPath, repoOptions)`](#migraterepopath-repooptions) + - [`.revert(repoPath, repoOptions)`](#revertrepopath-repooptions) + - [Browser vs. NodeJS environments](#browser-vs-nodejs-environments) + - [Guidelines](#guidelines) + - [Integration with js-ipfs](#integration-with-js-ipfs) + - [Tests](#tests) + - [Empty migrations](#empty-migrations) + - [Migrations matrix](#migrations-matrix) + - [Migrations](#migrations) + - [7](#7) + - [8](#8) + - [9](#9) + - [10](#10) +- [Developer](#developer) + - [Module versioning notes](#module-versioning-notes) +- [Contribute](#contribute) +- [License](#license) + +## Background + +As js-ipfs evolves and new technologies, algorithms and data structures are incorporated it is necessary to +enable users to transition between versions. Different versions of js-ipfs may expect a different IPFS repo structure or content (see: [IPFS repo spec](https://github.com/ipfs/specs/blob/master/REPO.md), [JS implementation](https://github.com/ipfs/js-ipfs-repo) ). +So the IPFS repo is versioned, and this package provides a framework to create migrations to transition +from one version of IPFS repo to the next/previous version. + +This framework: + * Handles locking/unlocking of repository + * Defines migrations API + * Executes and reports migrations in both directions: forward and backward + * Simplifies creation of new migrations + * Works on the browser too! + +## Install + +### npm + +```sh +> npm install ipfs-repo-migrations +``` + +### Use in Node.js + +```js +const migrations = require('ipfs-repo-migrations') +``` + +### Use in a browser with browserify, webpack or any other bundler + +```js +const migrations = require('ipfs-repo-migrations') +``` + +## Usage + +Example: + +```js +const migrations = require('ipfs-repo-migrations') + +const repoPath = 'some/repo/path' +const currentRepoVersion = 7 +const latestVersion = migrations.getLatestMigrationVersion() +const repoOptions = { + ... // the same storage backend/storage options passed to `ipfs-repo` +} + +if(currentRepoVersion < latestVersion){ + // Old repo! Lets migrate to latest version! + await migrations.migrate(repoPath, latestVersion, { + repoOptions + }) +} +``` + +To migrate your repository using the CLI, see the [how to run migrations](./run.md) tutorial. + +## API + +### `.migrate(path, repoOptions, toVersion, {ignoreLock, onProgress, isDryRun}) -> Promise` + +Executes a forward migration to a specific version, or to the latest version if a specific version is not specified. + +**Arguments:** + + * `path` (string, mandatory) - path to the repo to be migrated + * `repoOptions` (object, mandatory) - options that are passed to migrations, that use them to construct the datastore. (options are the same as for IPFSRepo). + * `toVersion` (int, mandatory) - version to which the repo should be migrated. + * `options` (object, optional) - options for the migration + * `options.ignoreLock` (bool, optional) - if true will not lock the repo when applying migrations. Use with caution. + * `options.onProgress` (function, optional) - callback that is called during each migration to report progress. + * `options.isDryRun` (bool, optional) - flag that indicates if it is a dry run that should give the same output as running a migration but without making any actual changes. + +#### `onProgress(version, percent, message)` + +Signature of the progress callback. + +**Arguments:** + * `migration` (object) - object of migration that just successfully finished running. See [Architecture of migrations](#architecture-of-migrations) for details. + * `counter` (int) - index of current migration. + * `totalMigrations` (int) - total count of migrations that will be run. + +### `.revert(path, repoOptions, toVersion, {ignoreLock, onProgress, isDryRun}) -> Promise` + +Executes backward migration to a specific version. + +**Arguments:** + + * `path` (string, mandatory) - path to the repo to be reverted + * `repoOptions` (object, mandatory) - options that are passed to migrations, that use them to construct the datastore. (options are the same as for IPFSRepo). + * `toVersion` (int, mandatory) - version to which the repo should be reverted to. + * `options` (object, optional) - options for the reversion + * `options.ignoreLock` (bool, optional) - if true will not lock the repo when applying migrations. Use with caution. + * `options.onProgress` (function, optional) - callback that is called during each migration to report progress. + * `options.isDryRun` (bool, optional) - flag that indicates if it is a dry run that should give the same output as running a migration but without making any actual changes. + +### `getLatestMigrationVersion() -> int` + +Return the version of the latest migration. + +## Creating a new migration + +Migrations are one of those things that can be extremely painful on users. At the end of the day, we want users never to have to think about it. The process should be: + +- SAFE. No data lost. Ever. +- Revertible. Tools must implement forward and backward (if possible) migrations. +- Tests. Migrations have to be well tested. +- To Spec. The tools must conform to the spec. + +If your migration has several parts, it should be fail-proof enough that if one part of migration fails the previous changes +are reverted before propagating the error. If possible then the outcome should be consistent repo so it migration could +be run again. + +### Architecture of a migration + +All migrations are placed in the `/migrations` folder. Each folder there represents one migration that follows the migration +API. + +All migrations are collected in `/migrations/index.js`, which should not be edited manually. + +**The order of migrations is important and migrations must be sorted in ascending order**. + +Each migration must follow this API. It must export an object in its `index.js` that has following properties: + + * `version` (int) - Number that represents the version which the repo will migrate to (eg. `8` will move the repo to version 8). + * `description` (string) - Brief description of what the migrations does. + * `migrate` (function) - Function that performs the migration (see signature of this function below) + * `revert` (function) - If defined then this function will revert the migration to the previous version. Otherwise it is assumed that it is not possible to revert this migration. + +#### `.migrate(repoPath, repoOptions)` + +_Do not confuse this function with the `require('ipfs-repo-migrations').migrate()` function that drives the whole migration process!_ + +Arguments: + * `repoPath` (string) - absolute path to the root of the repo + * `repoOptions` (object, optional) - object containing `IPFSRepo` options, that should be used to construct a datastore instance. + +#### `.revert(repoPath, repoOptions)` + +_Do not confuse this function with the `require('ipfs-repo-migrations').revert()` function that drives the whole backward migration process!_ + +Arguments: + * `repoPath` (string) - path to the root of the repo + * `repoOptions` (object, optional) - object containing `IPFSRepo` options, that should be used to construct the datastore instance. + +### Browser vs. NodeJS environments + +The migration might need to perform specific tasks in browser or NodeJS environment. In such a case create +migration file `/migrations/migration-/index_browser.js` which have to follow the same API is described before. +Then add entry in `package.json` to the `browser` field as follow: + +``` +'./migrations/migration-/index.js': './migrations/migration-/index_browser.js' +``` + +In browser environments then `index.js` will be replaced with `index_browser.js`. + +Simple migrations should not need to distinguish between +these environments as the datastore implementation will handle the main differences. + +There are currently two main datastore implementations: + 1. [`datastore-fs`](https://github.com/ipfs/js-datastore-fs) that is backed by file system and is used mainly in the NodeJS environment + 2. [`datastore-idb`](https://github.com/ipfs/js-datastore-idb) that is backed by LevelDB and is used mainly in the browser environment + + Both implementations share the same API and hence are interchangeable. + + When the migration is run in a browser environment, `datastore-fs` is automatically replaced with `datastore-idb` even + when it is directly imported (`require('datastore-fs')` will return `datastore-idb` in a browser). + So with simple migrations you shouldn't worry about the difference between `datastore-fs` and `datastore-idb` + and by default use the `datastore-fs` package (as the replace mechanism does not work vice versa). + +### Guidelines + +The recommended way to write a new migration is to first bootstrap a dummy migration using the CLI: + +```sh +> npm run new-migration +``` + +A new folder is created with the bootstrapped migration. You can then simply fill in the required fields and +write the rest of the migration! + +### Integration with js-ipfs + +When a new migration is created, new version of this package have to be released. Afterwards version of this package in [`js-ipfs-repo`](https://github.com/ipfs/js-ipfs-repo) have to be updated +together with the repo version that `IPFSRepo` expects. Then the updated version of `js-ipfs-repo` should be propagated to `js-ipfs`. + +### Tests + +If a migration affects any of the following functionality, it must provide tests for the following functions + to work under the version of the repo that it migrates to: + +* `/src/repo/version.js`:`getVersion()` - retrieving repository's version +* `/src/repo/lock.js`:`lock()` - locking repository that uses file system +* `/src/repo/lock-memory.js`:`lock()` - locking repository that uses memory + +Every migration must have test coverage. Tests for migrations should be placed in the `/test/migrations/` folder. Most probably +you will have to plug the tests into `browser.js`/`node.js` if they require specific bootstrapping on each platform. + +### Empty migrations + +For interop with go-ipfs it might be necessary just to bump a version of a repo without any actual +modification as there might not be any changes needed in the JS implementation. For that purpose you can create an "empty migration". + +The easiest way to do so is with the CLI: + +```sh +> npm run new-migration -- --empty +``` + +This will create an empty migration with the next version. + +### Migrations matrix + +| IPFS repo version | JS IPFS version | +| -----------------: |:----------------:| +| 7 | v0.0.0 | +| 8 | v0.48.0 | +| 9 | v0.49.0 | + +### Migrations + +#### 7 + +This is the initial version of the datastore, inherited from go-IPFS in an attempt to maintain cross-compatibility between the two implementations. + +#### 8 + +Blockstore keys are transformed into base32 representations of the multihash from the CID of the block. + +#### 9 + +Pins were migrated from a DAG to a Datastore - see [ipfs/js-ipfs#2771](https://github.com/ipfs/js-ipfs/pull/2771) + +#### 10 + +`level@6.x.x` upgrades the `level-js` dependency from `4.x.x` to `5.x.x`. This update requires a database migration to convert all string keys/values into buffers. Only runs in the browser, node is unaffected. See [Level/level-js#179](https://github.com/Level/level-js/pull/179) + +## Developer + +### Module versioning notes + +In order to have good overview of what version of package contains what kind of migration, to every release there +should be appended version's metadata in format `migr-`. If for releasing is used `aegir` +you can use the `release --metadata` option. + +## Contribute + +There are some ways you can make this module better: + +- Consult our [open issues](https://github.com/ipfs/js-ipfs-repo/issues) and take on one of them +- Help our tests reach 100% coverage! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md) + +## License + +[Apache-2.0](LICENSE-APACHE) OR [MIT](LICENSE-MIT) diff --git a/packages/ipfs-repo-migrations/maintainer.json b/packages/ipfs-repo-migrations/maintainer.json new file mode 100644 index 00000000..17382c24 --- /dev/null +++ b/packages/ipfs-repo-migrations/maintainer.json @@ -0,0 +1,11 @@ +{ + "repoLeadMaintainer": { + "name": "Adam Uhlíř", + "email": "adam@uhlir.dev", + "username": "auhau" + }, + "workingGroup": { + "name": "JS IPFS", + "entryPoint": "https://github.com/ipfs/js-core" + } +} diff --git a/packages/ipfs-repo-migrations/migrations/index.js b/packages/ipfs-repo-migrations/migrations/index.js new file mode 100644 index 00000000..b1070fa5 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/index.js @@ -0,0 +1,27 @@ +'use strict' + +/** + * @type {import('../src/types').Migration} + */ +const emptyMigration = { + description: 'Empty migration.', + // @ts-ignore + migrate: () => {}, + // @ts-ignore + revert: () => {}, + empty: true +} + +module.exports = [ + Object.assign({ version: 1 }, emptyMigration), + Object.assign({ version: 2 }, emptyMigration), + Object.assign({ version: 3 }, emptyMigration), + Object.assign({ version: 4 }, emptyMigration), + Object.assign({ version: 5 }, emptyMigration), + Object.assign({ version: 6 }, emptyMigration), + Object.assign({ version: 7 }, emptyMigration), + require('./migration-8'), + require('./migration-9'), + require('./migration-10'), + require('./migration-11') +] diff --git a/packages/ipfs-repo-migrations/migrations/migration-10/index.js b/packages/ipfs-repo-migrations/migrations/migration-10/index.js new file mode 100644 index 00000000..e9de5a56 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-10/index.js @@ -0,0 +1,233 @@ +'use strict' + +const { + findLevelJs +} = require('../../src/utils') +const { fromString } = require('uint8arrays/from-string') +const { toString } = require('uint8arrays/to-string') + +/** + * @typedef {import('../../src/types').Migration} Migration + * @typedef {import('interface-datastore').Datastore} Datastore + * @typedef {import('interface-blockstore').Blockstore} Blockstore + * @typedef {import('../../src/types').MigrationProgressCallback} MigrationProgressCallback + * + * @typedef {{ type: 'del', key: string | Uint8Array } | { type: 'put', key: string | Uint8Array, value: Uint8Array }} Operation + * @typedef {function (string, Uint8Array): Operation[]} UpgradeFunction + * @typedef {function (Uint8Array, Uint8Array): Operation[]} DowngradeFunction + */ + +/** + * @param {string} name + * @param {Datastore} store + * @param {(message: string) => void} onProgress + */ +async function keysToBinary (name, store, onProgress = () => {}) { + const db = findLevelJs(store) + + // only interested in level-js + if (!db) { + onProgress(`${name} did not need an upgrade`) + + return + } + + onProgress(`Upgrading ${name}`) + + /** + * @type {UpgradeFunction} + */ + const upgrade = (key, value) => { + return [ + { type: 'del', key: key }, + { type: 'put', key: fromString(key), value: value } + ] + } + + await withEach(db, upgrade) +} + +/** + * @param {string} name + * @param {Datastore} store + * @param {(message: string) => void} onProgress + */ +async function keysToStrings (name, store, onProgress = () => {}) { + const db = findLevelJs(store) + + // only interested in level-js + if (!db) { + onProgress(`${name} did not need a downgrade`) + + return + } + + onProgress(`Downgrading ${name}`) + + /** + * @type {DowngradeFunction} + */ + const downgrade = (key, value) => { + return [ + { type: 'del', key: key }, + { type: 'put', key: toString(key), value: value } + ] + } + + await withEach(db, downgrade) +} + +/** + * @param {any} store + * @returns {Datastore} + */ +function unwrap (store) { + if (store.child) { + return unwrap(store.child) + } + + return store +} + +/** + * @param {import('../../src/types').Backends} backends + * @param {MigrationProgressCallback} onProgress + * @param {*} fn + */ +async function process (backends, onProgress, fn) { + /** + * @type {{ name: string, store: Datastore }[]} + */ + const datastores = Object.entries(backends) + .map(([key, backend]) => ({ key, backend: unwrap(backend) })) + .filter(({ key, backend }) => backend.constructor.name === 'LevelDatastore') + .map(({ key, backend }) => ({ + name: key, + store: backend + })) + + onProgress(0, `Migrating ${datastores.length} dbs`) + let migrated = 0 + + /** + * @param {string} message + */ + const progress = (message) => { + onProgress(Math.round((migrated / datastores.length) * 100), message) + } + + for (const { name, store } of datastores) { + await store.open() + + try { + await fn(name, store, progress) + } finally { + migrated++ + await store.close() + } + } + + onProgress(100, `Migrated ${datastores.length} dbs`) +} + +/** @type {Migration} */ +module.exports = { + version: 10, + description: 'Migrates datastore-level keys to binary', + migrate: (backends, onProgress = () => {}) => { + return process(backends, onProgress, keysToBinary) + }, + revert: (backends, onProgress = () => {}) => { + return process(backends, onProgress, keysToStrings) + } +} + +/** + * Uses the upgrade strategy from level-js@5.x.x - note we can't call the `.upgrade` command + * directly because it will be removed in level-js@6.x.x and we can't guarantee users will + * have migrated by then - e.g. they may jump from level-js@4.x.x straight to level-js@6.x.x + * so we have to duplicate the code here. + * + * @param {any} db + * @param {UpgradeFunction | DowngradeFunction} fn + * @returns {Promise} + */ +function withEach (db, fn) { + /** + * @param {Operation[]} operations + * @param {(error?: Error) => void} next + */ + function batch (operations, next) { + const store = db.store('readwrite') + const transaction = store.transaction + let index = 0 + /** @type {Error | undefined} */ + let error + + transaction.onabort = () => next(error || transaction.error || new Error('aborted by user')) + transaction.oncomplete = () => next() + + function loop () { + const op = operations[index++] + const key = op.key + let req + + try { + req = op.type === 'del' ? store.delete(key) : store.put(op.value, key) + } catch (err) { + error = err + transaction.abort() + return + } + + if (index < operations.length) { + req.onsuccess = loop + } + } + + loop() + } + + return new Promise((resolve, reject) => { + const it = db.iterator() + // raw keys and values only + /** + * @template T + * @param {T} data + */ + const id = (data) => data + it._deserializeKey = it._deserializeValue = id + next() + + function next () { + /** + * @param {Error | undefined} err + * @param {string | undefined} key + * @param {Uint8Array} value + */ + const handleNext = (err, key, value) => { + if (err || key === undefined) { + /** + * @param {Error | undefined} err2 + */ + const handleEnd = (err2) => { + if (err2) { + reject(err2) + return + } + + resolve() + } + + it.end(handleEnd) + + return + } + + // @ts-ignore + batch(fn(key, value), next) + } + it.next(handleNext) + } + }) +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-11/index.js b/packages/ipfs-repo-migrations/migrations/migration-11/index.js new file mode 100644 index 00000000..8bf7152d --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-11/index.js @@ -0,0 +1,53 @@ +'use strict' + +const { Key } = require('interface-datastore') + +const MFS_ROOT_KEY = new Key('/local/filesroot') + +/** + * @param {import('../../src/types').Backends} backends + * @param {import('../../src/types').MigrationProgressCallback} onProgress + */ +async function storeMfsRootInDatastore (backends, onProgress = () => {}) { + onProgress(100, 'Migrating MFS root to repo datastore') + + await backends.root.open() + await backends.datastore.open() + + const root = await backends.root.get(MFS_ROOT_KEY) + await backends.datastore.put(MFS_ROOT_KEY, root) + await backends.root.delete(MFS_ROOT_KEY) + + await backends.datastore.close() + await backends.root.close() + + onProgress(100, 'Stored MFS root in repo datastore') +} + +/** + * @param {import('../../src/types').Backends} backends + * @param {import('../../src/types').MigrationProgressCallback} onProgress + */ +async function storeMfsRootInRoot (backends, onProgress = () => {}) { + onProgress(100, 'Migrating MFS root to repo root datastore') + + await backends.root.open() + await backends.datastore.open() + + const root = await backends.datastore.get(MFS_ROOT_KEY) + await backends.root.put(MFS_ROOT_KEY, root) + await backends.datastore.delete(MFS_ROOT_KEY) + + await backends.datastore.close() + await backends.root.close() + + onProgress(100, 'Stored MFS root in repo root datastore') +} + +/** @type {import('../../src/types').Migration} */ +module.exports = { + version: 11, + description: 'Store mfs root in the datastore', + migrate: storeMfsRootInDatastore, + revert: storeMfsRootInRoot +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-8/index.js b/packages/ipfs-repo-migrations/migrations/migration-8/index.js new file mode 100644 index 00000000..1bfa1c50 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-8/index.js @@ -0,0 +1,117 @@ +'use strict' + +const { CID } = require('multiformats/cid') +const Key = require('interface-datastore').Key +const log = require('debug')('ipfs:repo:migrator:migration-8') + +const length = require('it-length') +const { base32 } = require('multiformats/bases/base32') +const raw = require('multiformats/codecs/raw') +const mhd = require('multiformats/hashes/digest') + +/** + * @typedef {import('../../src/types').Migration} Migration + * @typedef {import('interface-datastore').Datastore} Datastore + */ + +/** + * @param {*} blockstore + * @returns {Datastore} + */ +function unwrap (blockstore) { + if (blockstore.child) { + return unwrap(blockstore.child) + } + + return blockstore +} + +/** + * @param {Key} key + */ +function keyToMultihash (key) { + try { + const buf = base32.decode(`b${key.toString().toLowerCase().slice(1)}`) + + // Extract multihash from CID + const multihash = CID.decode(buf).multihash.bytes + + // Encode and slice off multibase codec + // Should be uppercase for interop with go + const multihashStr = base32.encode(multihash).slice(1).toUpperCase() + + return new Key(`/${multihashStr}`, false) + } catch (err) { + return key + } +} + +/** + * @param {Key} key + */ +function keyToCid (key) { + try { + const buf = base32.decode(`b${key.toString().toLowerCase().slice(1)}`) + const digest = mhd.decode(buf) + + // CID to Key + const multihash = base32.encode(CID.createV1(raw.code, digest).bytes).slice(1) + + return new Key(`/${multihash.toUpperCase()}`, false) + } catch { + return key + } +} + +/** + * @param {import('../../src/types').Backends} backends + * @param {(percent: number, message: string) => void} onProgress + * @param {(key: Key) => Key} keyFunction + */ +async function process (backends, onProgress, keyFunction) { + const blockstore = backends.blocks + await blockstore.open() + + const unwrapped = unwrap(blockstore) + + const blockCount = await length(unwrapped.queryKeys({ + filters: [(key) => { + const newKey = keyFunction(key) + + return newKey.toString() !== key.toString() + }] + })) + + try { + let counter = 0 + + for await (const block of unwrapped.query({})) { + const newKey = keyFunction(block.key) + + // If the Key is base32 CIDv0 then there's nothing to do + if (newKey.toString() !== block.key.toString()) { + counter += 1 + log(`Migrating Block from ${block.key} to ${newKey}`, await unwrapped.has(block.key)) + + await unwrapped.delete(block.key) + await unwrapped.put(newKey, block.value) + + onProgress((counter / blockCount) * 100, `Migrated Block from ${block.key} to ${newKey}`) + } + } + } finally { + await blockstore.close() + } +} + +/** @type {Migration} */ +module.exports = { + version: 8, + description: 'Transforms key names into base32 encoding and converts Block store to use bare multihashes encoded as base32', + migrate: (backends, onProgress = () => {}) => { + return process(backends, onProgress, keyToMultihash) + }, + revert: (backends, onProgress = () => {}) => { + return process(backends, onProgress, keyToCid) + } +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/index.js b/packages/ipfs-repo-migrations/migrations/migration-9/index.js new file mode 100644 index 00000000..0551dd2d --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/index.js @@ -0,0 +1,165 @@ +'use strict' + +const { CID } = require('multiformats/cid') +const dagPb = require('@ipld/dag-pb') +const cbor = require('cborg') +const pinset = require('./pin-set') +const { cidToKey, PIN_DS_KEY, PinTypes } = require('./utils') +const length = require('it-length') +const { sha256 } = require('multiformats/hashes/sha2') +const mhd = require('multiformats/hashes/digest') +const { base32 } = require('multiformats/bases/base32') + +/** + * @typedef {import('../../src/types').Migration} Migration + * @typedef {import('../../src/types').MigrationProgressCallback} MigrationProgressCallback + * @typedef {import('interface-datastore').Datastore} Datastore + * @typedef {import('interface-blockstore').Blockstore} Blockstore + * @typedef {import('multiformats/cid').CIDVersion} CIDVersion + */ + +/** + * @param {Blockstore} blockstore + * @param {Datastore} datastore + * @param {Datastore} pinstore + * @param {MigrationProgressCallback} onProgress + */ +async function pinsToDatastore (blockstore, datastore, pinstore, onProgress) { + if (!await datastore.has(PIN_DS_KEY)) { + return + } + + const mh = await datastore.get(PIN_DS_KEY) + const cid = CID.decode(mh) + const pinRootBuf = await blockstore.get(cid) + const pinRoot = dagPb.decode(pinRootBuf) + let counter = 0 + const pinCount = (await length(pinset.loadSet(blockstore, pinRoot, PinTypes.recursive))) + (await length(pinset.loadSet(blockstore, pinRoot, PinTypes.direct))) + + for await (const cid of pinset.loadSet(blockstore, pinRoot, PinTypes.recursive)) { + counter++ + + /** @type {{ depth: number, version?: CIDVersion, codec?: number }} */ + const pin = { + depth: Infinity + } + + if (cid.version !== 0) { + pin.version = cid.version + } + + if (cid.code !== dagPb.code) { + pin.codec = cid.code + } + + await pinstore.put(cidToKey(cid), cbor.encode(pin)) + + onProgress((counter / pinCount) * 100, `Migrated recursive pin ${cid}`) + } + + for await (const cid of pinset.loadSet(blockstore, pinRoot, PinTypes.direct)) { + counter++ + + /** @type {{ depth: number, version?: CIDVersion, codec?: number }} */ + const pin = { + depth: 0 + } + + if (cid.version !== 0) { + pin.version = cid.version + } + + if (cid.code !== dagPb.code) { + pin.codec = cid.code + } + + await pinstore.put(cidToKey(cid), cbor.encode(pin)) + + onProgress((counter / pinCount) * 100, `Migrated direct pin ${cid}`) + } + + await blockstore.delete(cid) + await datastore.delete(PIN_DS_KEY) +} + +/** + * @param {Blockstore} blockstore + * @param {Datastore} datastore + * @param {Datastore} pinstore + * @param {MigrationProgressCallback} onProgress + */ +async function pinsToDAG (blockstore, datastore, pinstore, onProgress) { + const recursivePins = [] + const directPins = [] + let counter = 0 + const pinCount = await length(pinstore.queryKeys({})) + + for await (const { key, value } of pinstore.query({})) { + counter++ + const pin = cbor.decode(value) + const cid = CID.create( + pin.version || 0, + pin.codec || dagPb.code, + mhd.decode(base32.decode('b' + key.toString().toLowerCase().split('/').pop())) + ) + + if (pin.depth === 0) { + onProgress((counter / pinCount) * 100, `Reverted direct pin ${cid}`) + + directPins.push(cid) + } else { + onProgress((counter / pinCount) * 100, `Reverted recursive pin ${cid}`) + + recursivePins.push(cid) + } + } + + onProgress(100, 'Updating pin root') + const pinRoot = { + Links: [ + await pinset.storeSet(blockstore, PinTypes.direct, directPins), + await pinset.storeSet(blockstore, PinTypes.recursive, recursivePins) + ] + } + const buf = dagPb.encode(pinRoot) + const digest = await sha256.digest(buf) + const cid = CID.createV0(digest) + + await blockstore.put(cid, buf) + await datastore.put(PIN_DS_KEY, cid.bytes) +} + +/** + * @param {import('../../src/types').Backends} backends + * @param {MigrationProgressCallback} onProgress + * @param {*} fn + */ +async function process (backends, onProgress, fn) { + const blockstore = backends.blocks + const datastore = backends.datastore + const pinstore = backends.pins + + await blockstore.open() + await datastore.open() + await pinstore.open() + + try { + await fn(blockstore, datastore, pinstore, onProgress) + } finally { + await pinstore.close() + await datastore.close() + await blockstore.close() + } +} + +/** @type {Migration} */ +module.exports = { + version: 9, + description: 'Migrates pins to datastore', + migrate: (backends, onProgress = () => {}) => { + return process(backends, onProgress, pinsToDatastore) + }, + revert: (backends, onProgress = () => {}) => { + return process(backends, onProgress, pinsToDAG) + } +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/pin-set.js b/packages/ipfs-repo-migrations/migrations/migration-9/pin-set.js new file mode 100644 index 00000000..d3e47449 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/pin-set.js @@ -0,0 +1,280 @@ +'use strict' + +const { CID } = require('multiformats/cid') +const { + ipfs: { + pin: { + Set: PinSet + } + } +} = require('./pin') + +// @ts-ignore +const fnv1a = require('fnv1a') +const varint = require('varint') +const dagPb = require('@ipld/dag-pb') +const { DEFAULT_FANOUT, MAX_ITEMS, EMPTY_KEY } = require('./utils') +const { concat: uint8ArrayConcat } = require('uint8arrays/concat') +const { compare: uint8ArrayCompare } = require('uint8arrays/compare') +const { toString: uint8ArrayToString } = require('uint8arrays/to-string') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') +const { sha256 } = require('multiformats/hashes/sha2') + +/** + * @typedef {import('interface-datastore').Datastore} Datastore + * @typedef {import('interface-blockstore').Blockstore} Blockstore + * @typedef {import('@ipld/dag-pb').PBNode} PBNode + * + * @typedef {object} Pin + * @property {CID} key + * @property {Uint8Array} [data] + */ + +/** + * @param {PBNode} rootNode + */ +function readHeader (rootNode) { + // rootNode.data should be a buffer of the format: + // < varint(headerLength) | header | itemData... > + const rootData = rootNode.Data + + if (!rootData) { + throw new Error('No data present') + } + + const hdrLength = varint.decode(rootData) + const vBytes = varint.decode.bytes + + if (vBytes <= 0) { + throw new Error('Invalid Set header length') + } + + if (vBytes + hdrLength > rootData.length) { + throw new Error('Impossibly large set header length') + } + + const hdrSlice = rootData.slice(vBytes, hdrLength + vBytes) + const header = PinSet.toObject(PinSet.decode(hdrSlice), { + defaults: false, + arrays: true, + longs: Number, + objects: false + }) + + if (header.version !== 1) { + throw new Error(`Unsupported Set version: ${header.version}`) + } + + if (header.fanout > rootNode.Links.length) { + throw new Error('Impossibly large fanout') + } + + return { + header: header, + data: rootData.slice(hdrLength + vBytes) + } +} + +/** + * @param {number} seed + * @param {CID} key + */ +function hash (seed, key) { + const buffer = new Uint8Array(4) + const dataView = new DataView(buffer.buffer) + dataView.setUint32(0, seed, true) + const encodedKey = uint8ArrayFromString(key.toString()) + const data = uint8ArrayConcat([buffer, encodedKey], buffer.byteLength + encodedKey.byteLength) + + return fnv1a(uint8ArrayToString(data)) +} + +/** + * @param {Blockstore} blockstore + * @param {PBNode} node + * @returns {AsyncGenerator} + */ +async function * walkItems (blockstore, node) { + const pbh = readHeader(node) + let idx = 0 + + for (const link of node.Links) { + if (idx < pbh.header.fanout) { + // the first pbh.header.fanout links are fanout bins + // if a fanout bin is not 'empty', dig into and walk its DAGLinks + const linkHash = link.Hash + + if (!EMPTY_KEY.equals(linkHash)) { + // walk the links of this fanout bin + const buf = await blockstore.get(linkHash) + const node = dagPb.decode(buf) + + yield * walkItems(blockstore, node) + } + } else { + // otherwise, the link is a pin + yield link.Hash + } + + idx++ + } +} + +/** + * @param {Blockstore} blockstore + * @param {PBNode} rootNode + * @param {string} name + */ +async function * loadSet (blockstore, rootNode, name) { + const link = rootNode.Links.find(l => l.Name === name) + + if (!link) { + throw new Error('No link found with name ' + name) + } + + const buf = await blockstore.get(link.Hash) + const node = dagPb.decode(buf) + + yield * walkItems(blockstore, node) +} + +/** + * @param {Blockstore} blockstore + * @param {Pin[]} items + */ +function storeItems (blockstore, items) { + return storePins(items, 0) + + /** + * @param {Pin[]} pins + * @param {number} depth + */ + async function storePins (pins, depth) { + const pbHeader = PinSet.encode({ + version: 1, + fanout: DEFAULT_FANOUT, + seed: depth + }).finish() + + const header = varint.encode(pbHeader.length) + const headerBuf = uint8ArrayConcat([header, pbHeader]) + const fanoutLinks = [] + + for (let i = 0; i < DEFAULT_FANOUT; i++) { + fanoutLinks.push({ + Name: '', + Tsize: 1, + Hash: EMPTY_KEY + }) + } + + if (pins.length <= MAX_ITEMS) { + const nodes = pins + .map(item => { + return ({ + link: { + Name: '', + Tsize: 1, + Hash: item.key + }, + data: item.data || new Uint8Array() + }) + }) + // sorting makes any ordering of `pins` produce the same DAGNode + .sort((a, b) => { + return uint8ArrayCompare(a.link.Hash.bytes, b.link.Hash.bytes) + }) + + const rootLinks = fanoutLinks.concat(nodes.map(item => item.link)) + const rootData = uint8ArrayConcat([headerBuf, ...nodes.map(item => item.data)]) + + return { + Data: rootData, + Links: rootLinks + } + } else { + // If the array of pins is > MAX_ITEMS, we: + // - distribute the pins among `DEFAULT_FANOUT` bins + // - create a DAGNode for each bin + // - add each pin as a DAGLink to that bin + // - create a root DAGNode + // - add each bin as a DAGLink + // - send that root DAGNode via callback + // (using go-ipfs' "wasteful but simple" approach for consistency) + // https://github.com/ipfs/go-ipfs/blob/master/pin/set.go#L57 + + /** @type {Pin[][]} */ + const bins = pins.reduce((bins, pin) => { + const n = hash(depth, pin.key) % DEFAULT_FANOUT + // @ts-ignore + bins[n] = n in bins ? bins[n].concat([pin]) : [pin] + return bins + }, []) + + let idx = 0 + for (const bin of bins) { + const child = await storePins(bin, depth + 1) + + await storeChild(child, idx) + + idx++ + } + + return { + Data: headerBuf, + Links: fanoutLinks + } + } + + /** + * @param {PBNode} child + * @param {number} binIdx + */ + async function storeChild (child, binIdx) { + const buf = dagPb.encode(child) + const digest = await sha256.digest(buf) + const cid = CID.createV0(digest) + + await blockstore.put(cid, buf) + + const size = child.Links.reduce((acc, curr) => acc + (curr.Tsize || 0), 0) + buf.length + + fanoutLinks[binIdx] = { + Name: '', + Tsize: size, + Hash: cid + } + } + } +} + +/** + * @param {Blockstore} blockstore + * @param {string} type + * @param {CID[]} cids + */ +async function storeSet (blockstore, type, cids) { + const rootNode = await storeItems(blockstore, cids.map(cid => { + return { + key: cid + } + })) + const buf = dagPb.encode(rootNode) + const digest = await sha256.digest(buf) + const cid = CID.createV0(digest) + + await blockstore.put(cid, buf) + + const size = rootNode.Links.reduce((acc, curr) => acc + curr.Tsize, 0) + buf.length + + return { + Name: type, + Tsize: size, + Hash: cid + } +} + +module.exports = { + loadSet, + storeSet +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/pin.d.ts b/packages/ipfs-repo-migrations/migrations/migration-9/pin.d.ts new file mode 100644 index 00000000..935f21ec --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/pin.d.ts @@ -0,0 +1,79 @@ +import * as $protobuf from "protobufjs"; +/** Namespace ipfs. */ +export namespace ipfs { + + /** Namespace pin. */ + namespace pin { + + /** Properties of a Set. */ + interface ISet { + + /** Set version */ + version?: (number|null); + + /** Set fanout */ + fanout?: (number|null); + + /** Set seed */ + seed?: (number|null); + } + + /** Represents a Set. */ + class Set implements ISet { + + /** + * Constructs a new Set. + * @param [p] Properties to set + */ + constructor(p?: ipfs.pin.ISet); + + /** Set version. */ + public version: number; + + /** Set fanout. */ + public fanout: number; + + /** Set seed. */ + public seed: number; + + /** + * Encodes the specified Set message. Does not implicitly {@link ipfs.pin.Set.verify|verify} messages. + * @param m Set message or plain object to encode + * @param [w] Writer to encode to + * @returns Writer + */ + public static encode(m: ipfs.pin.ISet, w?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Set message from the specified reader or buffer. + * @param r Reader or buffer to decode from + * @param [l] Message length if known beforehand + * @returns Set + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): ipfs.pin.Set; + + /** + * Creates a Set message from a plain object. Also converts values to their respective internal types. + * @param d Plain object + * @returns Set + */ + public static fromObject(d: { [k: string]: any }): ipfs.pin.Set; + + /** + * Creates a plain object from a Set message. Also converts values to other types if specified. + * @param m Set + * @param [o] Conversion options + * @returns Plain object + */ + public static toObject(m: ipfs.pin.Set, o?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Set to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/pin.js b/packages/ipfs-repo-migrations/migrations/migration-9/pin.js new file mode 100644 index 00000000..21b509e9 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/pin.js @@ -0,0 +1,210 @@ +/*eslint-disable*/ +"use strict"; + +var $protobuf = require("protobufjs/minimal"); + +// Common aliases +var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; + +// Exported root namespace +var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +$root.ipfs = (function() { + + /** + * Namespace ipfs. + * @exports ipfs + * @namespace + */ + var ipfs = {}; + + ipfs.pin = (function() { + + /** + * Namespace pin. + * @memberof ipfs + * @namespace + */ + var pin = {}; + + pin.Set = (function() { + + /** + * Properties of a Set. + * @memberof ipfs.pin + * @interface ISet + * @property {number|null} [version] Set version + * @property {number|null} [fanout] Set fanout + * @property {number|null} [seed] Set seed + */ + + /** + * Constructs a new Set. + * @memberof ipfs.pin + * @classdesc Represents a Set. + * @implements ISet + * @constructor + * @param {ipfs.pin.ISet=} [p] Properties to set + */ + function Set(p) { + if (p) + for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) + if (p[ks[i]] != null) + this[ks[i]] = p[ks[i]]; + } + + /** + * Set version. + * @member {number} version + * @memberof ipfs.pin.Set + * @instance + */ + Set.prototype.version = 0; + + /** + * Set fanout. + * @member {number} fanout + * @memberof ipfs.pin.Set + * @instance + */ + Set.prototype.fanout = 0; + + /** + * Set seed. + * @member {number} seed + * @memberof ipfs.pin.Set + * @instance + */ + Set.prototype.seed = 0; + + /** + * Encodes the specified Set message. Does not implicitly {@link ipfs.pin.Set.verify|verify} messages. + * @function encode + * @memberof ipfs.pin.Set + * @static + * @param {ipfs.pin.ISet} m Set message or plain object to encode + * @param {$protobuf.Writer} [w] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Set.encode = function encode(m, w) { + if (!w) + w = $Writer.create(); + if (m.version != null && Object.hasOwnProperty.call(m, "version")) + w.uint32(8).uint32(m.version); + if (m.fanout != null && Object.hasOwnProperty.call(m, "fanout")) + w.uint32(16).uint32(m.fanout); + if (m.seed != null && Object.hasOwnProperty.call(m, "seed")) + w.uint32(29).fixed32(m.seed); + return w; + }; + + /** + * Decodes a Set message from the specified reader or buffer. + * @function decode + * @memberof ipfs.pin.Set + * @static + * @param {$protobuf.Reader|Uint8Array} r Reader or buffer to decode from + * @param {number} [l] Message length if known beforehand + * @returns {ipfs.pin.Set} Set + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Set.decode = function decode(r, l) { + if (!(r instanceof $Reader)) + r = $Reader.create(r); + var c = l === undefined ? r.len : r.pos + l, m = new $root.ipfs.pin.Set(); + while (r.pos < c) { + var t = r.uint32(); + switch (t >>> 3) { + case 1: + m.version = r.uint32(); + break; + case 2: + m.fanout = r.uint32(); + break; + case 3: + m.seed = r.fixed32(); + break; + default: + r.skipType(t & 7); + break; + } + } + return m; + }; + + /** + * Creates a Set message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof ipfs.pin.Set + * @static + * @param {Object.} d Plain object + * @returns {ipfs.pin.Set} Set + */ + Set.fromObject = function fromObject(d) { + if (d instanceof $root.ipfs.pin.Set) + return d; + var m = new $root.ipfs.pin.Set(); + if (d.version != null) { + m.version = d.version >>> 0; + } + if (d.fanout != null) { + m.fanout = d.fanout >>> 0; + } + if (d.seed != null) { + m.seed = d.seed >>> 0; + } + return m; + }; + + /** + * Creates a plain object from a Set message. Also converts values to other types if specified. + * @function toObject + * @memberof ipfs.pin.Set + * @static + * @param {ipfs.pin.Set} m Set + * @param {$protobuf.IConversionOptions} [o] Conversion options + * @returns {Object.} Plain object + */ + Set.toObject = function toObject(m, o) { + if (!o) + o = {}; + var d = {}; + if (o.defaults) { + d.version = 0; + d.fanout = 0; + d.seed = 0; + } + if (m.version != null && m.hasOwnProperty("version")) { + d.version = m.version; + } + if (m.fanout != null && m.hasOwnProperty("fanout")) { + d.fanout = m.fanout; + } + if (m.seed != null && m.hasOwnProperty("seed")) { + d.seed = m.seed; + } + return d; + }; + + /** + * Converts this Set to JSON. + * @function toJSON + * @memberof ipfs.pin.Set + * @instance + * @returns {Object.} JSON object + */ + Set.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Set; + })(); + + return pin; + })(); + + return ipfs; +})(); + +module.exports = $root; diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/pin.proto b/packages/ipfs-repo-migrations/migrations/migration-9/pin.proto new file mode 100644 index 00000000..4e1f33f7 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/pin.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; + +package ipfs.pin; + +option go_package = "pb"; + +message Set { + optional uint32 version = 1; + optional uint32 fanout = 2; + optional fixed32 seed = 3; +} diff --git a/packages/ipfs-repo-migrations/migrations/migration-9/utils.js b/packages/ipfs-repo-migrations/migrations/migration-9/utils.js new file mode 100644 index 00000000..a479ccc0 --- /dev/null +++ b/packages/ipfs-repo-migrations/migrations/migration-9/utils.js @@ -0,0 +1,31 @@ +'use strict' + +const { Key } = require('interface-datastore') +const { base32 } = require('multiformats/bases/base32') +const { CID } = require('multiformats') + +const PIN_DS_KEY = new Key('/local/pins') +const DEFAULT_FANOUT = 256 +const MAX_ITEMS = 8192 +const EMPTY_KEY = CID.parse('QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n') + +const PinTypes = { + direct: 'direct', + recursive: 'recursive' +} + +/** + * @param {import('multiformats').CID} cid + */ +function cidToKey (cid) { + return new Key(`/${base32.encode(cid.multihash.bytes).toUpperCase().substring(1)}`) +} + +module.exports = { + PIN_DS_KEY, + DEFAULT_FANOUT, + MAX_ITEMS, + EMPTY_KEY, + PinTypes, + cidToKey +} diff --git a/packages/ipfs-repo-migrations/package.json b/packages/ipfs-repo-migrations/package.json new file mode 100644 index 00000000..d3dfb1ca --- /dev/null +++ b/packages/ipfs-repo-migrations/package.json @@ -0,0 +1,82 @@ +{ + "name": "ipfs-repo-migrations", + "version": "10.0.0", + "description": "Migration framework for versioning of JS IPFS Repo", + "keywords": [ + "IPFS", + "libp2p", + "migrations" + ], + "homepage": "https://github.com/ipfs/js-ipfs-repo/tree/master/packages/ipfs-repo-migrations", + "bugs": { + "url": "https://github.com/ipfs/js-ipfs-repo/issues/" + }, + "license": "(Apache-2.0 OR MIT)", + "files": [ + "migrations", + "src", + "dist" + ], + "types": "./dist/src/index.d.ts", + "main": "src/index.js", + "browser": { + "datastore-fs": "datastore-level" + }, + "repository": { + "type": "git", + "url": "https://github.com/ipfs/js-ipfs-repo.git" + }, + "scripts": { + "prepare": "run-s prepare:*", + "prepare:proto": "pbjs -t static-module -w commonjs --force-number --no-verify --no-delimited --no-create --no-beautify --no-defaults --lint eslint-disable -o migrations/migration-9/pin.js migrations/migration-9/pin.proto", + "prepare:proto-types": "pbts -o migrations/migration-9/pin.d.ts migrations/migration-9/pin.js", + "prepare:types": "aegir build", + "build": "aegir build --no-bundle", + "test": "aegir test", + "test:node": "aegir test --target node", + "test:browser": "aegir test --target browser", + "lint": "aegir ts -p check && aegir lint", + "release": "aegir release", + "release-minor": "aegir release --type minor", + "release-major": "aegir release --type major" + }, + "dependencies": { + "@ipld/dag-pb": "^2.0.0", + "cborg": "^1.3.1", + "datastore-core": "^6.0.7", + "debug": "^4.1.0", + "fnv1a": "^1.0.1", + "interface-blockstore": "^2.0.2", + "interface-datastore": "^6.0.2", + "it-length": "^1.0.1", + "multiformats": "^9.0.0", + "proper-lockfile": "^4.1.1", + "protobufjs": "^6.10.2", + "uint8arrays": "^3.0.0", + "varint": "^6.0.0" + }, + "devDependencies": { + "@ipld/car": "^3.0.0", + "@types/debug": "^4.1.5", + "@types/rimraf": "^3.0.2", + "@types/varint": "^6.0.0", + "aegir": "^35.0.1", + "assert": "^2.0.0", + "aws-sdk": "^2.884.0", + "blockstore-core": "^1.0.2", + "blockstore-datastore-adapter": "2.0.1", + "datastore-fs": "^6.0.1", + "datastore-level": "^7.0.1", + "datastore-s3": "^8.0.0", + "events": "^3.2.0", + "it-all": "^1.0.2", + "just-safe-set": "^2.1.0", + "level-5": "npm:level@^5.0.0", + "level-6": "npm:level@^6.0.0", + "ncp": "^2.0.0", + "npm-run-all": "^4.1.5", + "rimraf": "^3.0.0", + "sinon": "^11.1.1", + "util": "^0.12.3" + } +} diff --git a/packages/ipfs-repo-migrations/scripts/node-globals.js b/packages/ipfs-repo-migrations/scripts/node-globals.js new file mode 100644 index 00000000..8c4e233b --- /dev/null +++ b/packages/ipfs-repo-migrations/scripts/node-globals.js @@ -0,0 +1,3 @@ +// file: node-globals.js +// @ts-nocheck +export const { Buffer } = require('buffer') diff --git a/packages/ipfs-repo-migrations/src/errors.js b/packages/ipfs-repo-migrations/src/errors.js new file mode 100644 index 00000000..1bf39295 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/errors.js @@ -0,0 +1,90 @@ +'use strict' + +/** + * Exception raised when trying to revert migration that is not possible + * to revert. + */ +class NonReversibleMigrationError extends Error { + /** + * @param {string} message + */ + constructor (message) { + super(message) + this.name = 'NonReversibleMigrationError' + this.code = 'ERR_NON_REVERSIBLE_MIGRATION' + this.message = message + } +} +NonReversibleMigrationError.code = 'ERR_NON_REVERSIBLE_MIGRATION' + +/** + * Exception raised when repo is not initialized. + */ +class NotInitializedRepoError extends Error { + /** + * @param {string} message + */ + constructor (message) { + super(message) + this.name = 'NotInitializedRepoError' + this.code = 'ERR_NOT_INITIALIZED_REPO' + this.message = message + } +} +NotInitializedRepoError.code = 'ERR_NOT_INITIALIZED_REPO' + +/** + * Exception raised when required parameter is not provided. + */ +class RequiredParameterError extends Error { + /** + * @param {string} message + */ + constructor (message) { + super(message) + this.name = 'RequiredParameterError' + this.code = 'ERR_REQUIRED_PARAMETER' + this.message = message + } +} +RequiredParameterError.code = 'ERR_REQUIRED_PARAMETER' + +/** + * Exception raised when value is not valid. + */ +class InvalidValueError extends Error { + /** + * @param {string} message + */ + constructor (message) { + super(message) + this.name = 'InvalidValueError' + this.code = 'ERR_INVALID_VALUE' + this.message = message + } +} +InvalidValueError.code = 'ERR_INVALID_VALUE' + +/** + * Exception raised when config is not passed. + */ +class MissingRepoOptionsError extends Error { + /** + * @param {string} message + */ + constructor (message) { + super(message) + this.name = 'MissingRepoOptionsError' + this.code = 'ERR_MISSING_REPO_OPTIONS' + this.message = message + } +} +MissingRepoOptionsError.code = 'ERR_MISSING_REPO_OPTIONS' + +module.exports = { + NonReversibleMigrationError, + NotInitializedRepoError, + RequiredParameterError, + InvalidValueError, + MissingRepoOptionsError +} diff --git a/packages/ipfs-repo-migrations/src/index.js b/packages/ipfs-repo-migrations/src/index.js new file mode 100644 index 00000000..21d065a9 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/index.js @@ -0,0 +1,271 @@ +/* eslint complexity: ["error", 27] */ +'use strict' + +const defaultMigrations = require('../migrations') +const repoVersion = require('./repo/version') +const errors = require('./errors') +const { wrapBackends } = require('./utils') +const log = require('debug')('ipfs:repo:migrator') + +/** + * @typedef {import('./types').Migration} Migration + * @typedef {import('./types').MigrationOptions} MigrationOptions + * @typedef {import('./types').ProgressCallback} ProgressCallback + * @typedef {import('./types').MigrationProgressCallback} MigrationProgressCallback + */ + +/** + * Returns the version of latest migration. + * If no migrations are present returns 0. + * + * @param {Migration[]} [migrations] - Array of migrations to consider. If undefined, the bundled migrations are used. Mainly for testing purpose. + */ +function getLatestMigrationVersion (migrations) { + migrations = migrations || defaultMigrations + + if (!Array.isArray(migrations) || migrations.length === 0) { + return 0 + } + + return migrations[migrations.length - 1].version +} + +/** + * Main function to execute forward migrations. + * It acquire lock on the provided path before doing any migrations. + * + * Signature of the progress callback is: function(migrationObject: object, currentMigrationNumber: int, totalMigrationsCount: int) + * + * @param {string} path - Path to initialized (!) JS-IPFS repo + * @param {import('./types').Backends} backends + * @param {import('./types').RepoOptions} repoOptions - Options that are passed to migrations, that can use them to correctly construct datastore. Options are same like for IPFSRepo. + * @param {number} toVersion - Version to which the repo should be migrated. + * @param {MigrationOptions} [options] - Options for migration + */ +async function migrate (path, backends, repoOptions, toVersion, { ignoreLock = false, onProgress, isDryRun = false, migrations }) { + migrations = migrations || defaultMigrations + + if (!path) { + throw new errors.RequiredParameterError('Path argument is required!') + } + + if (!repoOptions) { + throw new errors.RequiredParameterError('repoOptions argument is required!') + } + + if (!toVersion) { + throw new errors.RequiredParameterError('toVersion argument is required!') + } + + if (!Number.isInteger(toVersion) || toVersion <= 0) { + throw new errors.InvalidValueError('Version has to be positive integer!') + } + + // make sure we can read pre-level@5 datastores + backends = wrapBackends(backends) + + const currentVersion = await repoVersion.getVersion(backends) + + if (currentVersion === toVersion) { + log('Nothing to migrate.') + return + } + + if (currentVersion > toVersion) { + throw new errors.InvalidValueError(`Current repo's version (${currentVersion}) is higher then toVersion (${toVersion}), you probably wanted to revert it?`) + } + + verifyAvailableMigrations(migrations, currentVersion, toVersion) + + let lock + + if (!isDryRun && !ignoreLock) { + lock = await repoOptions.repoLock.lock(path) + } + + try { + for (const migration of migrations) { + if (toVersion !== undefined && migration.version > toVersion) { + break + } + + if (migration.version <= currentVersion) { + continue + } + + log(`Migrating version ${migration.version}`) + + try { + if (!isDryRun) { + /** @type {MigrationProgressCallback} */ + let progressCallback = () => {} + + if (onProgress) { // eslint-disable-line max-depth + progressCallback = (percent, message) => onProgress(migration.version, percent.toFixed(2), message) + } + + await migration.migrate(backends, progressCallback) + } + } catch (e) { + const lastSuccessfullyMigratedVersion = migration.version - 1 + + log(`An exception was raised during execution of migration. Setting the repo's version to last successfully migrated version: ${lastSuccessfullyMigratedVersion}`) + await repoVersion.setVersion(lastSuccessfullyMigratedVersion, backends) + + throw new Error(`During migration to version ${migration.version} exception was raised: ${e.stack || e.message || e}`) + } + + log(`Migrating to version ${migration.version} finished`) + } + + if (!isDryRun) { + await repoVersion.setVersion(toVersion || getLatestMigrationVersion(migrations), backends) + } + + log('Repo successfully migrated', toVersion !== undefined ? `to version ${toVersion}!` : 'to latest version!') + } finally { + if (!isDryRun && !ignoreLock && lock) { + await lock.close() + } + } +} + +/** + * Main function to execute backward migration (reversion). + * It acquire lock on the provided path before doing any migrations. + * + * Signature of the progress callback is: function(migrationObject: object, currentMigrationNumber: int, totalMigrationsCount: int) + * + * @param {string} path - Path to initialized (!) JS-IPFS repo + * @param {import('./types').Backends} backends + * @param {import('./types').RepoOptions} repoOptions - Options that are passed to migrations, that can use them to correctly construct datastore. Options are same like for IPFSRepo. + * @param {number} toVersion - Version to which the repo will be reverted. + * @param {MigrationOptions} [options] - Options for the reversion + */ +async function revert (path, backends, repoOptions, toVersion, { ignoreLock = false, onProgress, isDryRun = false, migrations }) { + migrations = migrations || defaultMigrations + + if (!path) { + throw new errors.RequiredParameterError('Path argument is required!') + } + + if (!repoOptions) { + throw new errors.RequiredParameterError('repoOptions argument is required!') + } + + if (!toVersion) { + throw new errors.RequiredParameterError('When reverting migrations, you have to specify to which version to revert!') + } + + if (!Number.isInteger(toVersion) || toVersion <= 0) { + throw new errors.InvalidValueError('Version has to be positive integer!') + } + + // make sure we can read pre-level@5 datastores + backends = wrapBackends(backends) + + const currentVersion = await repoVersion.getVersion(backends) + + if (currentVersion === toVersion) { + log('Nothing to revert.') + return + } + + if (currentVersion < toVersion) { + throw new errors.InvalidValueError(`Current repo's version (${currentVersion}) is lower then toVersion (${toVersion}), you probably wanted to migrate it?`) + } + + verifyAvailableMigrations(migrations, toVersion, currentVersion, true) + + let lock + if (!isDryRun && !ignoreLock) { + lock = await repoOptions.repoLock.lock(path) + } + + log(`Reverting from version ${currentVersion} to ${toVersion}`) + + try { + const reversedMigrationArray = migrations.slice().reverse() + + for (const migration of reversedMigrationArray) { + if (migration.version <= toVersion) { + break + } + + if (migration.version > currentVersion) { + continue + } + + log(`Reverting migration version ${migration.version}`) + + try { + if (!isDryRun) { + /** @type {MigrationProgressCallback} */ + let progressCallback = () => {} + + if (onProgress) { // eslint-disable-line max-depth + progressCallback = (percent, message) => onProgress(migration.version, percent.toFixed(2), message) + } + + await migration.revert(backends, progressCallback) + } + } catch (e) { + const lastSuccessfullyRevertedVersion = migration.version + log(`An exception was raised during execution of migration. Setting the repo's version to last successfully reverted version: ${lastSuccessfullyRevertedVersion}`) + await repoVersion.setVersion(lastSuccessfullyRevertedVersion, backends) + + e.message = `During reversion to version ${migration.version} exception was raised: ${e.message}` + throw e + } + + log(`Reverting to version ${migration.version} finished`) + } + + if (!isDryRun) { + await repoVersion.setVersion(toVersion, backends) + } + + log(`All migrations successfully reverted to version ${toVersion}!`) + } finally { + if (!isDryRun && !ignoreLock && lock) { + await lock.close() + } + } +} + +/** + * Function checks if all migrations in given range are available. + * + * @param {Migration[]} migrations + * @param {number} fromVersion + * @param {number} toVersion + * @param {boolean} checkReversibility - Will additionally checks if all the migrations in the range are reversible + */ +function verifyAvailableMigrations (migrations, fromVersion, toVersion, checkReversibility = false) { + let migrationCounter = 0 + for (const migration of migrations) { + if (migration.version > toVersion) { + break + } + + if (migration.version > fromVersion) { + if (checkReversibility && !migration.revert) { + throw new errors.NonReversibleMigrationError(`It is not possible to revert to version ${fromVersion} because migration version ${migration.version} is not reversible. Cancelling reversion.`) + } + + migrationCounter++ + } + } + + if (migrationCounter !== (toVersion - fromVersion)) { + throw new errors.InvalidValueError(`The ipfs-repo-migrations package does not have all migration to migrate from version ${fromVersion} to ${toVersion}`) + } +} + +module.exports = { + getCurrentRepoVersion: repoVersion.getVersion, + getLatestMigrationVersion, + errors, + migrate, + revert +} diff --git a/packages/ipfs-repo-migrations/src/repo/init.js b/packages/ipfs-repo-migrations/src/repo/init.js new file mode 100644 index 00000000..30374ee6 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/repo/init.js @@ -0,0 +1,42 @@ +'use strict' + +const log = require('debug')('ipfs:repo:migrator:repo:init') +const { CONFIG_KEY, VERSION_KEY } = require('../utils') +const { MissingRepoOptionsError } = require('../errors') + +/** + * @param {import('../types').Backends} backends + */ +async function isRepoInitialized (backends) { + if (!backends) { + throw new MissingRepoOptionsError('Please pass repo options when trying to open a repo') + } + + const root = backends.root + + try { + await root.open() + const versionCheck = await root.has(VERSION_KEY) + const configCheck = await root.has(CONFIG_KEY) + if (!versionCheck || !configCheck) { + log(`Version entry present: ${versionCheck}`) + log(`Config entry present: ${configCheck}`) + return false + } + + return true + } catch (e) { + log('While checking if repo is initialized error was thrown: ' + e.message) + return false + } finally { + if (root !== undefined) { + try { + await root.close() + } catch {} + } + } +} + +module.exports = { + isRepoInitialized +} diff --git a/packages/ipfs-repo-migrations/src/repo/version.js b/packages/ipfs-repo-migrations/src/repo/version.js new file mode 100644 index 00000000..9ee56c50 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/repo/version.js @@ -0,0 +1,51 @@ +'use strict' + +const repoInit = require('./init') +const { MissingRepoOptionsError, NotInitializedRepoError } = require('../errors') +const { VERSION_KEY } = require('../utils') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') +const { toString: uint8ArrayToString } = require('uint8arrays/to-string') + +/** + * Function that has responsibility to retrieve version of repo from its root datastore's instance. + * This function needs to be cross-repo-version functional to be able to fetch any version number, + * even in case of change of repo's versioning. + * + * @param {import('../types').Backends} backends + */ +async function getVersion (backends) { + if (!(await repoInit.isRepoInitialized(backends))) { + throw new NotInitializedRepoError('Repo is not initialized!') + } + + const store = backends.root + await store.open() + + try { + return parseInt(uint8ArrayToString(await store.get(VERSION_KEY))) + } finally { + await store.close() + } +} + +/** + * Function for setting a version in cross-repo-version manner. + * + * @param {number} version + * @param {import('../types').Backends} backends + */ +async function setVersion (version, backends) { + if (!backends) { + throw new MissingRepoOptionsError('Please pass repo options when trying to open a repo') + } + + const store = backends.root + await store.open() + await store.put(VERSION_KEY, uint8ArrayFromString(String(version))) + await store.close() +} + +module.exports = { + getVersion, + setVersion +} diff --git a/packages/ipfs-repo-migrations/src/types.d.ts b/packages/ipfs-repo-migrations/src/types.d.ts new file mode 100644 index 00000000..668b2878 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/types.d.ts @@ -0,0 +1,84 @@ +import type { Datastore } from 'interface-datastore' +import type { Blockstore } from 'interface-blockstore' + +export interface ProgressCallback { + (version: number, progress: string, message: string): void +} + +export interface MigrationProgressCallback { + (percent: number, message: string): void +} + +export interface Migration { + version: number + description: string + migrate: (backends: Backends, onProgress: MigrationProgressCallback) => Promise + revert: (backends: Backends, onProgress: MigrationProgressCallback) => Promise +} + +export interface MigrationOptions { + /** + * Won't lock the repo for applying the migrations. Use with caution. + */ + ignoreLock?: boolean + /** + * Allows to simulate the execution of the migrations without any effect + */ + isDryRun?: boolean + /** + * Callback which will be called after each executed migration to report progress + */ + onProgress?: ProgressCallback + /** + * Array of migrations to perform. If undefined, the bundled migrations are used. Mainly for testing purposes. + */ + migrations?: Migration[] +} + +export interface Backends { + root: Datastore + blocks: Blockstore + keys: Datastore + datastore: Datastore + pins: Datastore +} + +export interface LockCloser { + close: () => Promise +} + +export interface RepoLock { + /** + * Sets the lock if one does not already exist. If a lock already exists, should throw an error. + */ + lock: (path: string) => Promise + + /** + * Checks the existence of the lock. + */ + locked: (path: string) => Promise +} + +export interface RepoOptions { + /** + * Controls automatic migrations of repository. (defaults: true) + */ + autoMigrate: boolean + /** + * Callback function to be notified of migration progress + */ + onMigrationProgress: (version: number, percentComplete: string, message: string) => void + + /** + * If multiple processes are accessing the same repo - e.g. via node cluster or browser UI and webworkers + * one instance must be designated the repo owner to hold the lock on shared resources like the datastore. + * + * Set this property to true on one instance only if this is how your application is set up. + */ + repoOwner: boolean + + /** + * A lock implementation that prevents multiple processes accessing the same repo + */ + repoLock: RepoLock +} diff --git a/packages/ipfs-repo-migrations/src/utils.js b/packages/ipfs-repo-migrations/src/utils.js new file mode 100644 index 00000000..c1f7b490 --- /dev/null +++ b/packages/ipfs-repo-migrations/src/utils.js @@ -0,0 +1,148 @@ +'use strict' + +const { Key } = require('interface-datastore/key') +const { Errors } = require('datastore-core') + +/** + * @typedef {import('interface-datastore').Datastore} Datastore + */ + +const CONFIG_KEY = new Key('/config') +const VERSION_KEY = new Key('/version') + +/** + * Level dbs wrap level dbs that wrap level dbs. Find a level-js + * instance in the chain if one exists. + * + * @param {Datastore} store + * @returns {Datastore | undefined} + */ +function findLevelJs (store) { + let db = store + + // @ts-ignore + while (db.db || db.child) { + // @ts-ignore + db = db.db || db.child + + // `Level` is only present in the browser, in node it is LevelDOWN + // @ts-ignore + if (db.type === 'level-js' || db.constructor.name === 'Level') { + return db + } + } +} + +/** + * @param {Key} key + * @param {function (Key): Promise} has + * @param {Datastore} store + * @returns {Promise} + */ +async function hasWithFallback (key, has, store) { + const result = await has(key) + + if (result) { + return result + } + + // Newer versions of level.js changed the key type from Uint8Array|string + // to Uint8Array so fall back to trying Uint8Arrays if we are using level.js + // and the string version of the key did not work + const levelJs = findLevelJs(store) + + if (!levelJs) { + return false + } + + return new Promise((resolve, reject) => { + // drop down to IndexDB API, otherwise level-js will monkey around with the keys/values + // @ts-ignore + const req = levelJs.store('readonly').get(key.toString()) + req.transaction.onabort = () => { + reject(req.transaction.error) + } + req.transaction.oncomplete = () => { + resolve(Boolean(req.result)) + } + }) +} + +/** + * @param {import('interface-datastore').Key} key + * @param {function (Key): Promise} get + * @param {function (Key): Promise} has + * @param {import('interface-datastore').Datastore} store + * @returns {Promise} + */ +async function getWithFallback (key, get, has, store) { + if (await has(key)) { + return get(key) + } + + // Newer versions of level.js changed the key type from Uint8Array|string + // to Uint8Array so fall back to trying Uint8Arrays if we are using level.js + // and the string version of the key did not work + const levelJs = findLevelJs(store) + + if (!levelJs) { + throw Errors.notFoundError() + } + + return new Promise((resolve, reject) => { + // drop down to IndexDB API, otherwise level-js will monkey around with the keys/values + // @ts-ignore + const req = levelJs.store('readonly').get(key.toString()) + req.transaction.onabort = () => { + reject(req.transaction.error) + } + req.transaction.oncomplete = () => { + if (req.result) { + return resolve(req.result) + } + + reject(Errors.notFoundError()) + } + }) +} + +/** + * @param {Datastore} store + */ +function wrapStore (store) { + // necessary since level-js@5 cannot read keys from level-js@4 and earlier + const originalGet = store.get.bind(store) + const originalHas = store.has.bind(store) + /** + * @param {Key} key + */ + store.get = (key) => getWithFallback(key, originalGet, originalHas, store) + /** + * @param {Key} key + */ + store.has = (key) => hasWithFallback(key, originalHas, store) + + return store +} + +/** + * @param {import('./types').Backends} backends + */ +function wrapBackends (backends) { + return { + ...backends, + root: wrapStore(backends.root), + datastore: wrapStore(backends.datastore), + pins: wrapStore(backends.pins), + keys: wrapStore(backends.keys) + } +} + +module.exports = { + wrapBackends, + hasWithFallback, + getWithFallback, + findLevelJs, + CONFIG_KEY, + VERSION_KEY +} diff --git a/packages/ipfs-repo-migrations/test/browser.js b/packages/ipfs-repo-migrations/test/browser.js new file mode 100644 index 00000000..49d01b18 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/browser.js @@ -0,0 +1,150 @@ +/* eslint-env mocha */ +'use strict' + +const { LevelDatastore } = require('datastore-level') +const { S3Datastore } = require('datastore-s3') +const { ShardingDatastore } = require('datastore-core/sharding') +const { NextToLast } = require('datastore-core/shard') +const { BlockstoreDatastoreAdapter } = require('blockstore-datastore-adapter') +const mockS3 = require('./fixtures/mock-s3') +const S3 = require('aws-sdk').S3 +const { createRepo } = require('./fixtures/repo') + +/** + * @typedef {import('../src/types').Backends} Backends + */ + +/** + * @param {*} dir + * @returns {Promise} + */ +async function deleteDb (dir) { + return new Promise((resolve) => { + const req = globalThis.indexedDB.deleteDatabase(dir) + req.onerror = () => { + console.error(`Could not delete ${dir}`) // eslint-disable-line no-console + resolve() + } + req.onsuccess = () => { + resolve() + } + }) +} + +/** + * @type {import('./types').CleanupFunction} + */ +async function cleanup (dir) { + await deleteDb(dir) + await deleteDb('level-js-' + dir) + + for (const type of ['blocks', 'keys', 'datastore', 'pins']) { + await deleteDb(dir + '/' + type) + await deleteDb('level-js-' + dir + '/' + type) + } +} + +const CONFIGURATIONS = [{ + name: 'local', + cleanup, + /** + * @param {string} prefix + * @returns {import('../src/types').Backends} + */ + createBackends: (prefix) => { + return { + root: new LevelDatastore(prefix, { + version: 2 + }), + blocks: new BlockstoreDatastoreAdapter( + new LevelDatastore(`${prefix}/blocks`, { + version: 2 + }) + ), + datastore: new LevelDatastore(`${prefix}/datastore`, { + version: 2 + }), + keys: new LevelDatastore(`${prefix}/keys`, { + version: 2 + }), + pins: new LevelDatastore(`${prefix}/pins`, { + version: 2 + }) + } + } +}, { + name: 'with s3', + cleanup: async () => {}, + /** + * @param {string} prefix + * @returns {import('../src/types').Backends} + */ + createBackends: (prefix) => { + const s3Instance = new S3({ + params: { + Bucket: 'test' + } + }) + mockS3(s3Instance) + + return { + root: new S3Datastore(prefix, { + s3: s3Instance, + createIfMissing: false + }), + blocks: new BlockstoreDatastoreAdapter( + new ShardingDatastore( + new S3Datastore(`${prefix}/blocks`, { + s3: s3Instance, + createIfMissing: false + }), + new NextToLast(2) + ) + ), + datastore: new ShardingDatastore( + new S3Datastore(`${prefix}/datastore`, { + s3: s3Instance, + createIfMissing: false + }), + new NextToLast(2) + ), + keys: new ShardingDatastore( + new S3Datastore(`${prefix}/keys`, { + s3: s3Instance, + createIfMissing: false + }), + new NextToLast(2) + ), + pins: new ShardingDatastore( + new S3Datastore(`${prefix}/pins`, { + s3: s3Instance, + createIfMissing: false + }), + new NextToLast(2) + ) + } + } +}] + +CONFIGURATIONS.forEach(({ name, createBackends, cleanup }) => { + /** @type {import('./types').SetupFunction} */ + const setup = (prefix) => createRepo(createBackends, prefix) + + describe(name, () => { + describe('version tests', () => { + require('./version-test')(setup, cleanup) + }) + + describe('migrations tests', () => { + require('./migrations')(setup, cleanup) + }) + + describe('init tests', () => { + require('./init-test')(setup, cleanup) + }) + + describe('integration tests', () => { + require('./integration-test')(setup, cleanup) + }) + }) +}) diff --git a/packages/ipfs-repo-migrations/test/fixtures/generate-car-files.js b/packages/ipfs-repo-migrations/test/fixtures/generate-car-files.js new file mode 100644 index 00000000..f6ce4842 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/fixtures/generate-car-files.js @@ -0,0 +1,154 @@ +'use strict' + +/* eslint-disable no-console */ + +// nb. must be ipfs@0.48.0 or below +// @ts-expect-error not in package.json +const IPFS = require('ipfs') +const { + CID +} = IPFS +const { Key } = require('interface-datastore') +const PIN_DS_KEY = new Key('/local/pins') +const fs = require('fs') +const { CarWriter } = require('@ipld/car') +const path = require('path') +const { Readable } = require('stream') + +const TO_PIN = 9000 + +const main = async () => { + const ipfs = await IPFS.create({ + profile: 'lowpower' + }) + + const directPins = [] + + for (let i = TO_PIN; i < TO_PIN + 10; i++) { + const data = `hello-${i}` + const { cid } = await ipfs.add(data, { pin: false }) + + await ipfs.pin.add(cid, { + recursive: false + }) + + directPins.push(cid) + } + + console.info('const directPins = [') + console.info(' ', directPins.map(cid => `'${cid}'`).join(',\n ')) + console.info(']') + + const nonDagPbRecursivePins = [] + + for (let i = TO_PIN + 10; i < TO_PIN + 20; i++) { + const data = { derp: `hello-${i}` } + const cid = await ipfs.dag.put(data) + + await ipfs.pin.add(cid, { + recursive: true + }) + + nonDagPbRecursivePins.push(`${cid}`) + } + + console.info('const nonDagPbRecursivePins = [') + console.info(' ', nonDagPbRecursivePins.join(',\n ')) + console.info(']') + + const nonDagPbDirectPins = [] + + for (let i = TO_PIN + 20; i < TO_PIN + 30; i++) { + const data = { derp: `hello-${i}` } + const cid = await ipfs.dag.put(data) + + await ipfs.pin.add(cid, { + recursive: false + }) + + nonDagPbDirectPins.push(`${cid}`) + } + + console.info('const nonDagPbDirectPins = [') + console.info(' ', nonDagPbDirectPins.join(',\n ')) + console.info(']') + + console.info('const pinsets = {') + + await writeCar('basic pinset', true) + + for (let i = 0; i < TO_PIN; i++) { + const data = `hello-${i}` + await ipfs.add(data) + } + + await writeCar('multiple buckets pinset') + + console.info('}') + + await ipfs.stop() + + /** + * @param {string} pinsetName + * @param {boolean} [more] + */ + async function writeCar (pinsetName, more) { + const fileName = `pinset-${pinsetName.replace(/\s/g, '-').replace('-pinset', '')}.car` + + console.info(` '${pinsetName}': {`) + console.info(` car: loadFixture('test/fixtures/${fileName}'),`) + + const buf = await ipfs.libp2p.datastore.get(PIN_DS_KEY) + const cid = CID.decode(buf) + + console.info(` root: CID.parse('${cid}'),`) + + const { writer, out } = await CarWriter.create([cid]) + Readable.from(out).pipe(fs.createWriteStream(path.join(__dirname, fileName))) + + await walk(cid, writer) + + let pins = 0 + + for await (const _ of ipfs.pin.ls()) { // eslint-disable-line no-unused-vars + pins++ + } + + console.info(` pins: ${pins}`) + console.info(` }${more ? ',' : ''}`) + + await writer.close() + } + + /** + * @param {CID} cid + * @param {import('@ipld/car/api').BlockWriter} car + * @param {Record} cids + * @returns + */ + async function walk (cid, car, cids = {}) { + if (cids[cid.toString()]) { + return + } + + cids[cid.toString()] = true + + const block = await ipfs.block.get(cid) + + car.put({ cid, bytes: block.data }) + + const { value: node } = await ipfs.dag.get(cid) + + if (node.Links) { + for (const link of node.Links) { + await walk(link.Hash, car, cids) + } + } + } +} + +main() + .catch(err => { + console.error(err) + process.exit(1) + }) diff --git a/packages/ipfs-repo-migrations/test/fixtures/mock-s3.js b/packages/ipfs-repo-migrations/test/fixtures/mock-s3.js new file mode 100644 index 00000000..1ea8d6b8 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/fixtures/mock-s3.js @@ -0,0 +1,159 @@ +'use strict' + +const { expect } = require('aegir/utils/chai') +const sinon = require('sinon') +const { Buffer } = require('buffer') +const AWS = require('aws-sdk') + +class S3Error extends Error { + /** + * @param {string} message + * @param {number} [code] + */ + constructor (message, code) { + super(message) + this.code = message + this.statusCode = code + } +} + +/** + * @template T + * @param {T} [res] + */ +const s3Resolve = (res) => { + const request = new AWS.Request(new AWS.Service(), 'op') + + sinon.replace(request, 'promise', () => { + return Promise.resolve(res) + }) + + return request +} + +/** + * @template T + * @param {T} err + */ +const s3Reject = (err) => { + const request = new AWS.Request(new AWS.Service(), 'op') + + sinon.replace(request, 'promise', () => { + return Promise.reject(err) + }) + + return request +} + +/** + * Mocks out the s3 calls made by datastore-s3 + * + * @param {import('aws-sdk/clients/s3')} s3 + * @returns {void} + */ +module.exports = function (s3) { + /** @type {Record} */ + const storage = {} + + sinon.replace(s3, 'deleteObject', (params) => { + expect(params).to.have.property('Key').that.is.a('string') + + if (!params) { + throw new Error('No params passed to s3.deleteObject') + } + + if (typeof params === 'function') { + throw new Error('params passed to s3.deleteObject was a function') + } + + if (storage[params.Key]) { + delete storage[params.Key] + return s3Resolve({}) + } + + return s3Reject(new S3Error('NotFound', 404)) + }) + + sinon.replace(s3, 'getObject', (params) => { + expect(params).to.have.property('Key').that.is.a('string') + + if (!params) { + throw new Error('No params passed to s3.getObject') + } + + if (typeof params === 'function') { + throw new Error('params passed to s3.getObject was a function') + } + + if (storage[params.Key]) { + return s3Resolve({ Body: storage[params.Key] }) + } + + return s3Reject(new S3Error('NotFound', 404)) + }) + + sinon.replace(s3, 'headBucket', (params) => { + expect(params).to.have.property('Bucket').that.is.a('string') + + if (!params) { + throw new Error('No params passed to s3.headBucket') + } + + if (typeof params === 'function') { + throw new Error('params passed to s3.headBucket was a function') + } + + return s3Resolve() + }) + + sinon.replace(s3, 'headObject', (params) => { + expect(params).to.have.property('Key').that.is.a('string') + + if (!params) { + throw new Error('No params passed to s3.headObject') + } + + if (typeof params === 'function') { + throw new Error('params passed to s3.headObject was a function') + } + + if (storage[params.Key]) { + return s3Resolve({}) + } + return s3Reject(new S3Error('NotFound', 404)) + }) + + sinon.replace(s3, 'listObjectsV2', (params) => { + expect(params).to.have.property('Prefix').that.is.a('string') + + if (!params) { + throw new Error('No params passed to s3.listObjectsV2') + } + + if (typeof params === 'function') { + throw new Error('params passed to s3.listObjectsV2 was a function') + } + + const results = { + /** @type {({ Key: string })[]} */ + Contents: [] + } + + for (const k in storage) { + if (k.startsWith(`${params.Prefix || ''}`)) { + results.Contents.push({ + Key: k + }) + } + } + + return s3Resolve(results) + }) + + sinon.replace(s3, 'upload', (params) => { + expect(params.Key).to.be.a('string') + expect(params.Body).to.be.instanceof(Buffer) + storage[params.Key] = params.Body + return s3Resolve({}) + }) +} diff --git a/packages/ipfs-repo-migrations/test/fixtures/pinset-basic.car b/packages/ipfs-repo-migrations/test/fixtures/pinset-basic.car new file mode 100644 index 0000000000000000000000000000000000000000..5d94af94e7faaea4ca33f41191aae5a0c0797fb2 GIT binary patch literal 32719 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 aAYB>LI9CE4QA2MSwp@+DJ5tsqN&f~vTnQQg literal 0 HcmV?d00001 diff --git a/packages/ipfs-repo-migrations/test/fixtures/pinset-multiple-buckets.car b/packages/ipfs-repo-migrations/test/fixtures/pinset-multiple-buckets.car new file mode 100644 index 0000000000000000000000000000000000000000..423e65055177e67597bee86915042a54e263fd21 GIT binary patch literal 3651923 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 HpWoUIC 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 UMOfyS^)kUA2#P3-nOx}q0sF!#Qvd(} literal 0 HcmV?d00001 diff --git a/packages/ipfs-repo-migrations/test/fixtures/repo.js b/packages/ipfs-repo-migrations/test/fixtures/repo.js new file mode 100644 index 00000000..b5e71b38 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/fixtures/repo.js @@ -0,0 +1,43 @@ +'use strict' + +const loadFixture = require('aegir/utils/fixtures') +const { CONFIG_KEY, VERSION_KEY } = require('../../src/utils') + +/** + * @typedef {import('../../src/types').Backends} Backends + */ + +/** + * + * @param {(dir: string) => import('../../src/types').Backends} createBackends + * @param {*} prefix + * @returns + */ +async function createRepo (createBackends, prefix) { + const dir = `${prefix ? `${prefix}/` : ''}test-repo-for-${Date.now()}` + const backends = createBackends(dir) + + await backends.root.open() + await backends.root.close() + + return { + dir, + backends + } +} + +/** + * @param {Backends} backends + */ +async function initRepo (backends) { + const store = backends.root + await store.open() + await store.put(VERSION_KEY, loadFixture('test/fixtures/test-repo/version')) + await store.put(CONFIG_KEY, loadFixture('test/fixtures/test-repo/config')) + await store.close() +} + +module.exports = { + createRepo, + initRepo +} diff --git a/packages/ipfs-repo-migrations/test/fixtures/test-repo/config b/packages/ipfs-repo-migrations/test/fixtures/test-repo/config new file mode 100644 index 00000000..5a9765f5 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/fixtures/test-repo/config @@ -0,0 +1,99 @@ +{ + "Identity": { + "PeerID": "QmQJPPKEd1a1zLrsDzmzKMnbkkNNmCziUMsXvvkLbjPg1c", + "PrivKey": "CAASqQkwggSlAgEAAoIBAQC6rWI46zRrseaaQq94Y14LJczstp0boYRr7vzg3jugJOqGhqzD+t88vmelYuyI0bJkoMI8WkfSBT0OYbmwszgzNFvYvZNPvfgzt2qLODU1/3PP0ihYcO42yAoX3KWlExuX1xi/nNaUvMPGF4oMucp6PN2o/A2uAv0jsnAeb8hJM4MNs5aQoI5gby2yxtM9mc78UkdV1MZ00IvOdrU2IViNwTVre/PwjbaR4RPcF40+/E2zVJG/z8wOMnpkKAkIxCSjJcaRcxR1bAfP/cKLbpxrpnQlHgVEBVhIaqkd3i5i1+dG8VgsD5LZPh/hLjldXiSYrNMO70Ksne6sc7nL/3UhAgMBAAECggEBAKqKe5FETz+T5vhGs8doACJvBie7LQxxImj4jE1iuVY0Y41Cu9LO/eKgkE+ncDAOYstLkidQ0wwrfPwGi33CPTWKP95iUpInGvkkN1G4p+QM2+CgPfuOMBIb7hyelzWXnz24ZAOpZN+9E52FI7k8gp3pvRcELfsq/9f8zDECLhewRjZitiY5ewfBKsK5LFKQSRg8DIVIKq4iqi7QMRRwbFDtDLcUHJepXSTRhmhWr5b/23O8OxnHExtjXMFqtBzvaAuZPnw2whr8ujV3W+5PyY+btx6M0k/dDQe2dFSJWm8AKLF8AL+houl2vtnFQ47yeYisWd02BcR91DyF5u6hxYECgYEA8b1UlUgCJ1h4MLTt0HOk+JwccJtyLoofe/y8/i4sMtjUZ4kiyIlEUrmPaE3qcNsUOG5eldz4nfN4AYRG4UQwmMFehpGC5pxH/kW8xwC9iFxDbkrNwJ8T5Jc8EQmFZ9BTXviQ3d5ViO06gtOiAdf2L/ci/qazCR7eowdjvbUso0MCgYEAxbCFZjj0L7+Zuyl6Znv7A1raJUKTGR8J5OsP6lIcRq0EfC6OcoCS6bx7FIbM0gkgGj+F/1l1bonfCcCDv5x4tRZzVUCz2KrDEwo/RCv1Y47ipuusao8fTTlO5tgESl4jAvaD1mfZom9BslO4sk3CxXJyAuMJUCc/8To6HLPclcsCgYEAwcuRknd+2oIPIKT7fcAoAfJMzm2f1PWAFgrgjDkBz+WKKlKDIxcAQf1mnSzRhJXtGOxKQYQ7f4zeqQCdPhxHhT6IBAOFWFDzWkIX+8V5LGci27l2RzSAYyJm0hW68CXPoHRO1r9V/QaJgLYey7GROJS8Zj/HiclInJPg/wXOejcCgYBjiwcg+fy7LldSjwg7IqK6hbzilitLsv1gb5yL+NyUGfrwLOE9dtCDMY0oQNhRypaHoQTwFzOyfWn5lx7AFSISzUM14mas6w9fPwGsahYeE4y9UF55KagxUnIQeyVt7QjkLQ0loRVNXYhPKykNX2p70aznFztRSPJBnXg1i7u/EQKBgQC8iZQF/5vwgVN3FgEugru9DKUOWAXMXWcMENRgQ9kiUNU7cwqszQyOk/zmNXrrIbdzn+4/H4gBNRw+dy0t1D5nG7+AuMn1J9WmRS0NF6eF43ttRRmERxiYwRssBs0JLaQWaobmEqcMNCygm1BCqQrKfmY2oI3HDOukMwgMpfZsSQ==" + }, + "Datastore": { + "Type": "leveldb", + "Path": "/Users/pedroteixeira/.ipfs/datastore", + "StorageMax": "10GB", + "StorageGCWatermark": 90, + "GCPeriod": "1h", + "Params": null, + "NoSync": false, + "HashOnRead": false, + "BloomFilterSize": 0 + }, + "Addresses": { + "Swarm": [ + "/ip4/0.0.0.0/tcp/4001", + "/ip6/::/tcp/4001" + ], + "API": "/ip4/127.0.0.1/tcp/5001", + "Gateway": "/ip4/127.0.0.1/tcp/8080" + }, + "Mounts": { + "IPFS": "/ipfs", + "IPNS": "/ipns", + "FuseAllowOther": false + }, + "Discovery": { + "MDNS": { + "Enabled": true, + "Interval": 10 + } + }, + "Ipns": { + "RepublishPeriod": "", + "RecordLifetime": "", + "ResolveCacheSize": 128 + }, + "Bootstrap": [ + "/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", + "/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z", + "/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM", + "/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm", + "/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu", + "/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64", + "/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd", + "/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3", + "/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx", + "/ip6/2604:a880:1:20::1f9:9001/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z", + "/ip6/2604:a880:1:20::203:d001/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM", + "/ip6/2604:a880:0:1010::23:d001/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm", + "/ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu", + "/ip6/2604:a880:800:10::4a:5001/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64", + "/ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd", + "/ip6/2a03:b0c0:1:d0::e7:1/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3", + "/ip6/2604:a880:1:20::1d9:6001/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx" + ], + "Tour": { + "Last": "" + }, + "Gateway": { + "HTTPHeaders": { + "Access-Control-Allow-Headers": [ + "X-Requested-With", + "Range" + ], + "Access-Control-Allow-Methods": [ + "GET" + ], + "Access-Control-Allow-Origin": [ + "*" + ] + }, + "RootRedirect": "", + "Writable": false, + "PathPrefixes": [] + }, + "SupernodeRouting": { + "Servers": null + }, + "API": { + "HTTPHeaders": null + }, + "Swarm": { + "AddrFilters": null, + "DisableBandwidthMetrics": false, + "DisableNatPortMap": false + }, + "Reprovider": { + "Interval": "12h" + }, + "Experimental": { + "FilestoreEnabled": false, + "ShardingEnabled": false, + "Libp2pStreamMounting": false + } +} \ No newline at end of file diff --git a/packages/ipfs-repo-migrations/test/fixtures/test-repo/version b/packages/ipfs-repo-migrations/test/fixtures/test-repo/version new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/packages/ipfs-repo-migrations/test/fixtures/test-repo/version @@ -0,0 +1 @@ +1 diff --git a/packages/ipfs-repo-migrations/test/index.spec.js b/packages/ipfs-repo-migrations/test/index.spec.js new file mode 100644 index 00000000..6486f306 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/index.spec.js @@ -0,0 +1,533 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const sinon = require('sinon') +const { MemoryBlockstore } = require('blockstore-core/memory') +const { MemoryDatastore } = require('datastore-core') + +const migrator = require('../src/index') +const repoVersion = require('../src/repo/version') +const repoInit = require('../src/repo/init') +const errors = require('../src/errors') + +/** + * @typedef {import('../src/types').Migration} Migration + * @typedef {import('../src/types').MigrationOptions} MigrationOptions + */ + +/** + * @returns {Migration[]} + */ +function createMigrations () { + return [ + { + version: 1, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + }, + { + version: 2, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + }, + { + version: 3, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + }, + { + version: 4, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + } + ] +} + +/** + * @returns {Required} + */ +function createOptions () { + return { + ignoreLock: false, + isDryRun: false, + onProgress: () => {}, + migrations: createMigrations() + } +} + +describe('index.js', () => { + /** + * @type {import('sinon').SinonStub} + */ + let getVersionStub + /** + * @type {import('sinon').SinonStub} + */ + let setVersionStub + /** + * @type {import('sinon').SinonStub} + */ + let lockStub + /** + * @type {import('sinon').SinonStub} + */ + let initStub + /** + * @type {import('sinon').SinonStub} + */ + let lockCloseStub + const repoOptions = { + repoLock: { + locked: () => Promise.resolve(false), + lock: () => Promise.resolve({ + close: () => Promise.resolve() + }) + }, + autoMigrate: true, + onMigrationProgress: () => {}, + repoOwner: true + } + + const backends = { + root: new MemoryDatastore(), + blocks: new MemoryBlockstore(), + datastore: new MemoryDatastore(), + keys: new MemoryDatastore(), + pins: new MemoryDatastore() + } + + beforeEach(() => { + // Reset all stubs + sinon.reset() + + initStub.resolves(true) + lockCloseStub.resolves() + lockStub.resolves({ close: lockCloseStub }) + }) + + before(() => { + getVersionStub = sinon.stub(repoVersion, 'getVersion') + setVersionStub = sinon.stub(repoVersion, 'setVersion') + lockCloseStub = sinon.stub() + lockStub = sinon.stub(repoOptions.repoLock, 'lock') + initStub = sinon.stub(repoInit, 'isRepoInitialized') + }) + + after(() => { + getVersionStub.restore() + setVersionStub.restore() + lockStub.restore() + initStub.restore() + }) + + it('get version of the latest migration', () => { + const migrationsMock = createMigrations() + + expect(migrator.getLatestMigrationVersion(migrationsMock)).to.equal(4) + expect(migrator.getLatestMigrationVersion([])).to.equal(0) + }) + + describe('revert', () => { + it('should error with out path argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.revert(undefined, undefined, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error without backends argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.revert('/some/path', undefined, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error without repo options argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.revert('/some/path', backends, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error without toVersion argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.revert('/some/path', backends, {}, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error with invalid toVersion argument', () => { + const invalidValues = ['eight', '-1', '1', -1] + const options = createOptions() + + return Promise.all( + // @ts-expect-error invalid params + invalidValues.map((value) => expect(migrator.revert('/some/path', backends, repoOptions, value, options)) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code)) + ) + }) + + it('should not revert if current repo version and toVersion matches', async () => { + getVersionStub.returns(2) + const options = createOptions() + + await expect(migrator.revert('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.fulfilled() + + expect(lockStub).to.have.property('called', false) + }) + + it('should not revert if current repo version is lower then toVersion', async () => { + getVersionStub.returns(2) + const options = createOptions() + + await expect(migrator.revert('/some/path', backends, repoOptions, 3, options)) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code) + + expect(lockStub).to.have.property('called', false) + }) + + it('should not allow to reverse migration that is not reversible', () => { + const nonReversibleMigrationsMock = createMigrations() + // @ts-expect-error invalid params + nonReversibleMigrationsMock[2].revert = undefined + const options = { migrations: nonReversibleMigrationsMock } + + getVersionStub.returns(4) + return expect( + migrator.revert('/some/path', backends, repoOptions, 1, options) + ).to.eventually.be.rejectedWith(errors.NonReversibleMigrationError) + .with.property('code', errors.NonReversibleMigrationError.code) + }) + + it('should revert expected migrations', async () => { + const options = createOptions() + getVersionStub.returns(3) + + await expect(migrator.revert('/some/path', backends, repoOptions, 1, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + expect(setVersionStub.calledOnceWith(1, backends)).to.be.true() + + // Checking migrations + expect(options.migrations[3].revert).to.have.property('called', false) + expect(options.migrations[2].revert).to.have.property('calledOnce', true) + expect(options.migrations[1].revert).to.have.property('calledOnce', true) + expect(options.migrations[0].revert).to.have.property('called', false) + }) + + it('should revert one migration as expected', async () => { + const options = createOptions() + getVersionStub.returns(2) + + await expect(migrator.revert('/some/path', backends, repoOptions, 1, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + expect(setVersionStub.calledOnceWith(1, backends)).to.be.true() + + // Checking migrations + expect(options.migrations[3].revert).to.have.property('called', false) + expect(options.migrations[2].revert).to.have.property('called', false) + expect(options.migrations[1].revert).to.have.property('calledOnce', true) + expect(options.migrations[0].revert).to.have.property('called', false) + }) + + it('should reversion with one migration', async () => { + const migrationsMock = [ + { + version: 2, + description: '', + reversible: true, + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + } + ] + const options = { migrations: migrationsMock } + getVersionStub.returns(2) + + await expect(migrator.revert('/some/path', backends, repoOptions, 1, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + expect(setVersionStub.calledOnceWith(1, backends)).to.be.true() + + // Checking migrations + expect(migrationsMock[0].revert).to.have.property('calledOnce', true) + }) + + it('should not have any side-effects when in dry run', async () => { + const options = createOptions() + getVersionStub.returns(4) + options.isDryRun = true + + await expect(migrator.revert('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('called', false) + expect(lockStub).to.have.property('called', false) + expect(setVersionStub).to.have.property('called', false) + + return options.migrations.forEach(({ revert }) => expect(revert).to.have.property('calledOnce', false)) + }) + + it('should not lock repo when ignoreLock is used', async () => { + const options = createOptions() + options.ignoreLock = true + + getVersionStub.returns(4) + + await expect(migrator.revert('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('called', false) + expect(lockStub).to.have.property('called', false) + expect(setVersionStub.calledOnceWith(2, backends)).to.be.true() + + // Checking migrations + expect(options.migrations[3].revert).to.have.property('calledOnce', true) + expect(options.migrations[2].revert).to.have.property('calledOnce', true) + expect(options.migrations[1].revert).to.have.property('called', false) + expect(options.migrations[0].revert).to.have.property('called', false) + }) + + it('should report progress when progress callback is supplied', async () => { + const options = createOptions() + const onProgressStub = sinon.stub() + options.onProgress = onProgressStub + getVersionStub.returns(4) + + options.migrations[2].revert = async (backends, onProgress) => { + onProgress(50, 'hello') + } + + await expect(migrator.revert('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.fulfilled() + + expect(onProgressStub.getCall(0).calledWith(3, '50.00', 'hello')).to.be.true() + }) + + it('should unlock repo when error is thrown', async () => { + getVersionStub.returns(4) + const options = createOptions() + options.migrations[2].revert = sinon.stub().rejects() + + await expect(migrator.revert('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.rejected() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + + // The last successfully reverted migration should be set as repo's version + expect(setVersionStub.calledOnceWith(3, backends)).to.be.true() + }) + }) + + describe('migrate', () => { + it('should error with out path argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.migrate(undefined, undefined, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error with out backends argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.migrate('/some/path', undefined, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error with out repoOptions argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.migrate('/some/path', backends, undefined, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error with out toVersion argument', () => { + const options = createOptions() + + // @ts-expect-error invalid params + return expect(migrator.migrate('/some/path', backends, repoOptions, undefined, options)) + .to.eventually.be.rejectedWith(errors.RequiredParameterError).with.property('code', errors.RequiredParameterError.code) + }) + + it('should error with invalid toVersion argument', () => { + const invalidValues = ['eight', '-1', '1', -1, {}] + + return Promise.all( + // @ts-expect-error invalid params + invalidValues.map((invalidValue) => expect(migrator.migrate('/some/path', backends, repoOptions, invalidValue, createOptions())) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code)) + ) + }) + + it('should verify that all migrations are available', () => { + const options = { + migrations: [ + { + version: 3, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + }, + { + version: 4, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + } + ] + } + + getVersionStub.returns(1) + + return expect(migrator.migrate('/some/path', backends, repoOptions, 3, options)) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code) + }) + + it('should verify that all migrations are available', () => { + const options = { + migrations: [ + { + version: 3, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + }, + { + version: 4, + description: '', + migrate: sinon.stub().resolves(), + revert: sinon.stub().resolves() + } + ] + } + + getVersionStub.returns(3) + + return expect(migrator.migrate('/some/path', backends, repoOptions, 5, options)) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code) + }) + + it('should not migrate if current repo version and toVersion matches', async () => { + getVersionStub.returns(2) + const options = createOptions() + + await expect(migrator.migrate('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.fulfilled() + + expect(lockStub).to.have.property('called', false) + }) + + it('should not migrate if current repo version is higher then toVersion', async () => { + getVersionStub.returns(3) + const options = createOptions() + + await expect(migrator.migrate('/some/path', backends, repoOptions, 2, options)) + .to.eventually.be.rejectedWith(errors.InvalidValueError).with.property('code', errors.InvalidValueError.code) + + expect(lockStub).to.have.property('called', false) + }) + + it('should migrate expected migrations', async () => { + const options = createOptions() + getVersionStub.returns(1) + + await expect(migrator.migrate('/some/path', backends, repoOptions, 3, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + expect(setVersionStub.calledOnceWith(3, backends)).to.be.true() + + // Checking migrations + expect(options.migrations[3].migrate).to.have.property('called', false) + expect(options.migrations[2].migrate).to.have.property('calledOnce', true) + expect(options.migrations[1].migrate).to.have.property('calledOnce', true) + expect(options.migrations[0].migrate).to.have.property('called', false) + }) + + it('should not have any side-effects when in dry run', async () => { + const options = createOptions() + options.isDryRun = true + getVersionStub.returns(2) + + await expect(migrator.migrate('/some/path', backends, repoOptions, 4, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('called', false) + expect(lockStub).to.have.property('called', false) + expect(setVersionStub).to.have.property('called', false) + + return options.migrations.forEach(({ migrate }) => expect(migrate).to.have.property('calledOnce', false)) + }) + + it('should not lock repo when ignoreLock is used', async () => { + const options = createOptions() + options.ignoreLock = true + getVersionStub.returns(2) + + await expect(migrator.migrate('/some/path', backends, repoOptions, 4, options)) + .to.eventually.be.fulfilled() + + expect(lockCloseStub).to.have.property('called', false) + expect(lockStub).to.have.property('called', false) + expect(setVersionStub.calledOnceWith(4, backends)).to.be.true() + + // Checking migrations + expect(options.migrations[3].migrate).to.have.property('calledOnce', true) + expect(options.migrations[2].migrate).to.have.property('calledOnce', true) + expect(options.migrations[1].migrate).to.have.property('called', false) + expect(options.migrations[0].migrate).to.have.property('called', false) + }) + + it('should report progress when progress callback is supplied', async () => { + const options = createOptions() + const onProgressStub = sinon.stub() + options.onProgress = onProgressStub + getVersionStub.returns(2) + + options.migrations[2].migrate = async (backends, onProgress) => { + onProgress(50, 'hello') + } + + await expect(migrator.migrate('/some/path', backends, repoOptions, 4, options)) + .to.eventually.be.fulfilled() + + expect(onProgressStub.getCall(0).calledWith(3, '50.00', 'hello')).to.be.true() + }) + + it('should unlock repo when error is thrown', async () => { + getVersionStub.returns(2) + const options = createOptions() + options.migrations[3].migrate = sinon.stub().rejects() + + await expect(migrator.migrate('/some/path', backends, repoOptions, 4, options)) + .to.eventually.be.rejected() + + expect(lockCloseStub).to.have.property('calledOnce', true) + expect(lockStub).to.have.property('calledOnce', true) + + // The last successfully migrated migration should be set as repo's version + expect(setVersionStub.calledOnceWith(3, backends)).to.be.true() + }) + }) +}) diff --git a/packages/ipfs-repo-migrations/test/init-test.js b/packages/ipfs-repo-migrations/test/init-test.js new file mode 100644 index 00000000..00688c95 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/init-test.js @@ -0,0 +1,57 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const { CONFIG_KEY, VERSION_KEY } = require('../src/utils') +const repoInit = require('../src/repo/init') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') + +/** + * @param {import('./types').SetupFunction} setup + * @param {import('./types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + /** @type {string} */ + let dir + /** @type {import('../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + afterEach(() => + cleanup(dir) + ) + + it('should return true with valid initialized repo', async () => { + const store = backends.root + await store.open() + await store.put(VERSION_KEY, uint8ArrayFromString('7')) + await store.put(CONFIG_KEY, uint8ArrayFromString('config')) + await store.close() + + expect(await repoInit.isRepoInitialized(backends)).to.be.true() + }) + + it('should return false with missing version key', async () => { + const store = backends.root + await store.open() + await store.put(CONFIG_KEY, uint8ArrayFromString('')) + await store.close() + + expect(await repoInit.isRepoInitialized(backends)).to.be.false() + }) + + it('should return false with missing config key', async () => { + const store = backends.root + await store.open() + await store.put(VERSION_KEY, uint8ArrayFromString('')) + await store.close() + + expect(await repoInit.isRepoInitialized(backends)).to.be.false() + }) + + it('should return false if the repo does not exists', async () => { + return expect(await repoInit.isRepoInitialized(backends)).to.be.false() + }) +} diff --git a/packages/ipfs-repo-migrations/test/integration-test.js b/packages/ipfs-repo-migrations/test/integration-test.js new file mode 100644 index 00000000..eca91921 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/integration-test.js @@ -0,0 +1,77 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') + +const migrator = require('../src') +const migrations = require('./test-migrations') +const { VERSION_KEY, CONFIG_KEY } = require('../src/utils') +const { initRepo } = require('./fixtures/repo') + +/** + * @param {import('./types').SetupFunction} setup + * @param {import('./types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + /** @type {string} */ + let dir + /** @type {import('../src/types').Backends} */ + let backends + const repoOptions = { + repoLock: { + locked: () => Promise.resolve(false), + lock: () => Promise.resolve({ + close: () => Promise.resolve() + }) + }, + autoMigrate: true, + onMigrationProgress: () => {}, + repoOwner: true + } + + beforeEach(async () => { + ({ dir, backends } = await setup()) + await initRepo(backends) + }) + + afterEach(() => cleanup(dir)) + + it('migrate forward', async () => { + await migrator.migrate(dir, backends, repoOptions, migrator.getLatestMigrationVersion(migrations), { + migrations: migrations, + onProgress: () => {} + }) + + const store = backends.root + await store.open() + const version = await store.get(VERSION_KEY) + expect(version.toString()).to.be.equal('2') + + const config = await store.get(CONFIG_KEY) + expect(config.toString()).to.include(migrations[0].newApiAddr) + + await store.close() + }) + + it('revert', async () => { + await migrator.migrate(dir, backends, repoOptions, migrator.getLatestMigrationVersion(migrations), { + migrations: migrations, + onProgress: () => {} + }) + + await migrator.revert(dir, backends, repoOptions, 1, { + migrations: migrations, + onProgress: () => {} + }) + + const store = backends.root + await store.open() + const version = await store.get(VERSION_KEY) + expect(version.toString()).to.be.equal('1') + + const config = await store.get(CONFIG_KEY) + expect(config.toString()).to.not.include(migrations[0].newApiAddr) + + await store.close() + }) +} diff --git a/packages/ipfs-repo-migrations/test/migrations/index.js b/packages/ipfs-repo-migrations/test/migrations/index.js new file mode 100644 index 00000000..a6f93555 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/migrations/index.js @@ -0,0 +1,12 @@ +'use strict' + +/** + * @param {import('../types').SetupFunction} setup + * @param {import('../types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + require('./migration-8-test')(setup, cleanup) + require('./migration-9-test')(setup, cleanup) + require('./migration-10-test')(setup, cleanup) + require('./migration-11-test')(setup, cleanup) +} diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js new file mode 100644 index 00000000..1eed1e78 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js @@ -0,0 +1,184 @@ +/* eslint-env mocha */ +/* eslint-disable max-nested-callbacks */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const { CID } = require('multiformats/cid') +const { BaseBlockstore } = require('blockstore-core/base') + +const migration = require('../../migrations/migration-10') +const Key = require('interface-datastore').Key +const { fromString } = require('uint8arrays/from-string') +const { equals } = require('uint8arrays/equals') +// @ts-expect-error no types +const Level5 = require('level-5') +// @ts-expect-error no types +const Level6 = require('level-6') + +/** + * @typedef {import('../../src/types').Backends} Backends + * @typedef {import('interface-datastore').Datastore} Datastore + */ + +/** + * @type {Record} + */ +const keys = { + CIQCKN76QUQUGYCHIKGFE6V6P3GJ2W26YFFPQW6YXV7NFHH3QB2RI3I: fromString('hello'), + CIQKKLBWAIBQZOIS5X7E32LQAL6236OUKZTMHPQSFIXPWXNZHQOV7JQ: fromString('derp') +} + +/** + * @param {Datastore} store + */ +async function bootstrap (store) { + await store.open() + + for (const name of Object.keys(keys)) { + if (store instanceof BaseBlockstore) { + await store.put(CID.parse(`b${name.toLowerCase()}`), keys[name]) + } else { + await store.put(new Key(name), keys[name]) + } + } + + await store.close() +} + +/** + * @param {Datastore} store + */ +async function validate (store) { + await store.open() + + for (const name of Object.keys(keys)) { + if (store instanceof BaseBlockstore) { + const key = CID.parse(`b${name.toLowerCase()}`) + + expect(await store.has(key)).to.be.true(`Could not read key ${name}`) + expect(equals(await store.get(key), keys[name])).to.be.true(`Could not read value for key ${keys[name]}`) + } else { + const key = new Key(`/${name}`) + + await expect(store.has(key)).to.eventually.be.true(`Could not read key ${name}`) + expect(equals(await store.get(key), keys[name])).to.be.true(`Could not read value for key ${keys[name]}`) + } + } + + await store.close() +} + +/** + * @param {Backends} backends + * @param {*} LevelImpl + * @returns {Backends} + */ +function withLevels (backends, LevelImpl) { + const output = { + ...backends + } + + Object.entries(backends) + .forEach(([key, value]) => { + // @ts-ignore it's ok + output[key] = withLevel(value, LevelImpl) + }) + + return output +} + +/** + * @param {Datastore} store + * @param {*} LevelImpl + */ +function withLevel (store, LevelImpl) { + let parent = { + child: store + } + + while (parent.child) { + if (parent.child.constructor.name === 'LevelDatastore') { + // @ts-ignore undocumented properties + parent.child.database = LevelImpl + // @ts-ignore undocumented properties + delete parent.child.db + + return store + } + + // @ts-ignore undocumented properties + parent = parent.child + } + + return store +} + +/** + * @param {import('../types').SetupFunction} setup + * @param {import('../types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + describe('migration 10', function () { + this.timeout(240 * 1000) + /** @type {string} */ + let dir + /** @type {import('../../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + + afterEach(async () => { + await cleanup(dir) + }) + + describe('forwards', () => { + beforeEach(async () => { + for (const backend of Object.values(backends)) { + await bootstrap(withLevel(backend, Level5)) + } + }) + + it('should migrate keys and values forward', async () => { + await migration.migrate(withLevels(backends, Level6), () => {}) + + for (const backend of Object.values(backends)) { + await validate(withLevel(backend, Level6)) + } + }) + }) + + describe('backwards using level@6.x.x', () => { + beforeEach(async () => { + for (const backend of Object.values(backends)) { + await bootstrap(withLevel(backend, Level6)) + } + }) + + it('should migrate keys and values backward', async () => { + await migration.revert(withLevels(backends, Level6), () => {}) + + for (const backend of Object.values(backends)) { + await validate(withLevel(backend, Level5)) + } + }) + }) + + describe('backwards using level@5.x.x', () => { + beforeEach(async () => { + for (const backend of Object.values(backends)) { + await bootstrap(withLevel(backend, Level6)) + } + }) + + it('should migrate keys and values backward', async () => { + await migration.revert(withLevels(backends, Level5), () => {}) + + for (const backend of Object.values(backends)) { + await validate(withLevel(backend, Level5)) + } + }) + }) + }) +} diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js new file mode 100644 index 00000000..f118a026 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js @@ -0,0 +1,75 @@ +/* eslint-env mocha */ +/* eslint-disable max-nested-callbacks */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const { CID } = require('multiformats/cid') +const migration = require('../../migrations/migration-11') +const { Key } = require('interface-datastore') + +const MFS_ROOT_KEY = new Key('/local/filesroot') +const MFS_ROOT = CID.parse('Qmc42sn2WBHYeAShU3nx8mYkhKVq4sRLapawTaGh4XH4iE') + +/** + * @param {import('../types').SetupFunction} setup + * @param {import('../types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + describe('migration 11', function () { + this.timeout(240 * 1000) + /** @type {string} */ + let dir + /** @type {import('../../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + + afterEach(async () => { + await cleanup(dir) + }) + + describe('forwards', () => { + beforeEach(async () => { + await backends.root.open() + await backends.root.put(MFS_ROOT_KEY, MFS_ROOT.bytes) + await backends.root.close() + }) + + it('should migrate MFS root forward', async () => { + await migration.migrate(backends, () => {}) + + await backends.root.open() + await backends.datastore.open() + + await expect(backends.root.has(MFS_ROOT_KEY)).to.eventually.be.false() + await expect(backends.datastore.has(MFS_ROOT_KEY)).to.eventually.be.true() + + await backends.datastore.close() + await backends.root.close() + }) + }) + + describe('backwards', () => { + beforeEach(async () => { + await backends.datastore.open() + await backends.datastore.put(MFS_ROOT_KEY, MFS_ROOT.bytes) + await backends.datastore.close() + }) + + it('should migrate MFS root backward', async () => { + await migration.revert(backends, () => {}) + + await backends.root.open() + await backends.datastore.open() + + await expect(backends.root.has(MFS_ROOT_KEY)).to.eventually.be.true() + await expect(backends.datastore.has(MFS_ROOT_KEY)).to.eventually.be.false() + + await backends.datastore.close() + await backends.root.close() + }) + }) + }) +} diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js new file mode 100644 index 00000000..45c08be6 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js @@ -0,0 +1,160 @@ +/* eslint-env mocha */ +/* eslint-disable max-nested-callbacks */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') + +const migration = require('../../migrations/migration-8') +const Key = require('interface-datastore').Key + +/** + * @typedef {import('../../src/types').Backends} Backends + * @typedef {import('interface-datastore').Datastore} Datastore + */ + +const blocksFixtures = [ + ['AFKREIBFG77IKIKDMBDUFDCSPK7H5TE5LNPMCSXYLPML27WSTT5YA5IUNU', + 'CIQCKN76QUQUGYCHIKGFE6V6P3GJ2W26YFFPQW6YXV7NFHH3QB2RI3I'], + ['AFKREIGKJES3Y4374YQUBLUYHT2R74JHR6VJP6RYXPYO6QB2WXIYQ32764', + 'CIQMUSJFXRZX7ZRBICXJQPHVD7YSPD5KS75DRO7Q55ADVNORRBXV75Y'], + ['AFKREIFFFQ3AEAYMXEJO37SN5FYAF7NN7HKFMZWDXYJCULX3LW4TYHK7UY', + 'CIQKKLBWAIBQZOIS5X7E32LQAL6236OUKZTMHPQSFIXPWXNZHQOV7JQ'], + ['AFKREIFAP4QO4GPFHESNT2X4WYPBOJU2ZKTCZ3LHJTX7TLM4DB2H6TUCL4', + 'CIQKA7ZA5YM6KOJE3HVPZNQ6C4TJVSVGFTWWOTHP7GWZYGDUP5HIEXY'], + ['AFKREIESTIYDYOO2RIFWPQEWS5DC62D2ADDDRPFVQD7K4BSFFYGB6IFUF4', + 'CIQJFGRQHQ45VCQLM7AJNF2GF5UHUAGGHC6LLAH6VYDEKLQMD4QLILY'], + ['AFKREIH3OGADJ2GSATMRCC42P3QEV5AWEDTKQ64Y5EHFHJJYWFUFHQ7FOU', + 'CIQPW4MAGTUNEBGZCEFZU7XAJL2BMIHGVB5ZR2IOKOSTRMLIKPB6K5I'], + ['AFKREIEQYB5HPFOBDE2RBJUW2H67YDY6JFD476HEEJQQTFXGBHN4XF3FTA', + 'CIQJBQD2O6K4CGJVCCTJNUP57QHR4SKHZ74OIITBBGLOMCO3ZOLWLGA'], + ['AFKREIHFQYMZMQHBUTDD7I4MKQ2LTZZNZGOSHI4R2PNV4HSC2ACSOJAWOE', + 'CIQOLBQZSZAODJGGH6RYYVBUXHTS3SM5EORZDU63LYPEFUAFE4SBM4I'], + ['AFKREIGBTJ4X7IP5LEGNFZNUFUOPL4SG4KNZC2COF6DUAS4B3Q2FY6SWUA', + 'CIQMDGTZP6Q72WIM2LS3ILI46XZENYU3SFUE4L4HIBFYDXBULR5FNIA'], + ['AFKREIAZ6G7XZOUM6UDNMXKDFCVNPUCN53FDEWR3NJ4NVZAWYN6I7HKXHI', + 'CIQBT4N7PS5IZ5IG2ZOUGKFK27IE33WKGJNDW2TY3LSBNQ34R6OVOOQ'], + ['AFKREIGIHVSB2NLGZG75SIIPJQ4A6GGOXZXUPVT7YDYHAUC4CDJMALWHUA', + 'CIQMQPLEDU2WNSN73EQQ6TBYB4MM5PTPI7LH7QHQOBIFYEGSYAXMPIA'], + ['AFKREIA6C72VFIB3TWL37LMIMZYY6YKVX72QYMAMLNMOQQHXHDJ3OT5HUY', + 'CIQB4F7VKKQDXHMXX6WYQZTRR5QVLP7VBQYAYW2Y5BAPOOGTW5H2PJQ'], + ['AFKREIES5CPHHXCMMCKT4GF6KB6QNY6IIQKQUPW2T5XV7OB5UERLI5JH2I', + 'CIQJF2E6OPOEYYEVHYML4UD5A3R4QRAVBI7NVH3PL64D3IJCWR2SPUQ'], + ['AFKREIGVTCG43WY2GKD44DHXV4W4XGDT42UKP7FRB6TC6R3CXSDCFHBYHU', + 'CIQNLGENZXNRUMUHZYGPPLZNZOMHHZVIU76LCD5GF5DWFPEGEKODQPI'], + ['AFKREIHDWDCEFGH4DQKJV67UZCMW7OJEE6XEDZDETOJUZJEVTENXQUVYKU', + 'CIQOHMGEIKMPYHAUTL57JSEZN64SIJ5OIHSGJG4TJSSJLGI3PBJLQVI'], + ['AFKREIASB5VPMAOUNYILFUXBD3LRYVOSL4YEFQRFAHSB2ESG46Q6TU6Y5Q', + 'CIQBED3K6YA5I3QQWLJOCHWXDRK5EXZQILBCKAPEDUJENZ5B5HJ5R3A'], + ['AFKREIHS5RDRQ6TIO4QUJHK5DLKWFQEX2SKGBWCVE4SPRGMSJHPJ4CQJNE', + 'CIQPF3CHDB5GQ5ZBISOV2GWVMLAJPVEUMDMFKJZE7CMZESO6TYFAS2I'], + ['AFKREIF2TF6KORYF3E2OSMSMQFW5CAJP6TRVIDP3ELHUTFJH2BENVSDZDE', + 'CIQLVGL4U5DQLWJU5EZEZALN2EAS75HDKQG7WIWPJGKSPUCI3LEHSGI'], + ['AFKREIG5MWZ56SM6LQUCMGCQISWAUCEBBEHPJKZAGIA722CPF3PYG353DI', + 'CIQN2ZNT35EZ4XBIEYMFARFMBIEICCIO6SVSAMQB7VUE6LW7QNX3WGQ'], + ['AFKREICZSSCDSBS7FFQZ55ASQDF3SMV6KLCW3GOFSZVWLYARCI47BGF354', + 'CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y'] +] + +/** + * @param {*} blockstore + * @returns {Datastore} + */ +function unwrap (blockstore) { + if (blockstore.child) { + return unwrap(blockstore.child) + } + + return blockstore +} + +/** + * @param {Backends} backends + * @param {boolean} encoded + */ +async function bootstrapBlocks (backends, encoded) { + const store = backends.blocks + await store.open() + + const datastore = unwrap(store) + + for (const blocksNames of blocksFixtures) { + const name = encoded ? blocksNames[1] : blocksNames[0] + + await datastore.put(new Key(`/${name}`), uint8ArrayFromString('')) + } + + await store.close() +} + +/** + * @param {Backends} backends + * @param {boolean} migrated + */ +async function validateBlocks (backends, migrated) { + const store = backends.blocks + await store.open() + + const datastore = unwrap(store) + + for (const blockNames of blocksFixtures) { + const newName = migrated ? blockNames[1] : blockNames[0] + const oldName = migrated ? blockNames[0] : blockNames[1] + + const oldKey = new Key(`/${oldName}`) + const newKey = new Key(`/${newName}`) + + expect(await datastore.has(oldKey)).to.be.false(`${oldName} was not migrated to ${newName}`) + expect(await datastore.has(newKey)).to.be.true(`${newName} was not removed`) + } + + await store.close() +} + +/** + * @param {import('../types').SetupFunction} setup + * @param {import('../types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + describe('migration 8', function () { + this.timeout(240 * 1000) + /** @type {string} */ + let dir + /** @type {import('../../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + + afterEach(async () => { + await cleanup(dir) + }) + + describe('empty repo', () => { + describe('forwards', () => { + it('should migrate pins forward', async () => { + await migration.migrate(backends, () => {}) + }) + }) + + describe('backwards', () => { + it('should migrate pins backward', async () => { + await migration.revert(backends, () => {}) + }) + }) + }) + + it('should migrate blocks forward', async () => { + await bootstrapBlocks(backends, false) + await migration.migrate(backends, () => {}) + await validateBlocks(backends, true) + }) + + it('should migrate blocks backward', async () => { + await bootstrapBlocks(backends, true) + await migration.revert(backends, () => {}) + await validateBlocks(backends, false) + }) + }) +} diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js new file mode 100644 index 00000000..817ff5d9 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js @@ -0,0 +1,236 @@ +/* eslint-env mocha */ +/* eslint-disable max-nested-callbacks */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const cbor = require('cborg') +const migration = require('../../migrations/migration-9') +const { PIN_DS_KEY } = require('../../migrations/migration-9/utils') +const { CID } = require('multiformats/cid') +const { CarReader } = require('@ipld/car') +const loadFixture = require('aegir/utils/fixtures') +const dagPb = require('@ipld/dag-pb') +const mhd = require('multiformats/hashes/digest') +const { base32 } = require('multiformats/bases/base32') + +/** + * @typedef {import('interface-datastore').Datastore} Datastore + * @typedef {import('interface-blockstore').Blockstore} Blockstore + * @typedef {import('interface-datastore').Key} Key + * @typedef {import('multiformats/cid').CIDVersion} CIDVersion + * @typedef {{ car: Uint8Array, root: CID, pins: number }} Pinset + */ + +/** + * @param {Key} key + * @param {{ version?: CIDVersion, codec?: number }} pin + */ +function pinToCid (key, pin) { + return CID.create( + pin.version || 0, + pin.codec || dagPb.code, + mhd.decode(base32.decode('b' + key.toString().toLowerCase().split('/').pop())) + ) +} + +// the test data is generated by the file /test/fixtures/generate-car-files.js +// nb. you need to `npm install ipfs@0.48.1` or below in a place it can `require` +// it from before running it +/** + * @type {Record} + */ +const pinsets = { + 'basic pinset': { + car: loadFixture('test/fixtures/pinset-basic.car'), + root: CID.parse('QmeKxgcTtiE1XfvwcVf8wc65GgMmZumEtXK6YJKuvf3VYx'), + pins: 31 + }, + 'multiple bucket pinset': { + car: loadFixture('test/fixtures/pinset-multiple-buckets.car'), + root: CID.parse('QmPGd36dodHj1LQtVWK3LcBVkkVWvfXHEwBHnMpN6tu4BD'), + + // we need at least 8192 pins in order to create a new bucket + pins: 9031 + } +} + +const directPins = [ + 'QmTgj3HVGSuCckhJURLbaBuhPgArb36MEkRhvh5A7WkiFR', + 'QmaLHnphKK4dBk9TuRe5uQMLztQgJ7VbAeaMR8LErHGkcH', + 'QmRnkQuzXiZSQ5DtXfkSsMtL6PyKTK1HBqUxcD8zmgQLQi', + 'QmfDfLw7rrzedHn7XUc7q5UNPyekREE1hFZrwDWfCNBqg8', + 'QmdSzyeG1wALG5vaDP75f8QqcZWRcU4EDtkeY9LnB38eP2', + 'QmR2iwMMYNcCJNcC73ku37QD3oeeV98jUdT2c2xTsaMYvR', + 'QmQMQrVxtNN5JsWVDWtpFyUkjbm8sNbSjy364pGQdfgSx2', + 'QmNgWoYcmsqs6uUhFysC7BjfKTbYXWnL3edpLQJSsWdRqF', + 'QmUjoRPzozKhjJyxkJaP1rgnp6Lvp43fCA247kyCZsGrhN', + 'QmciA8jujqBJmCsnUgp9uXwW4HEzhg7vH4oPKBeiJu5cXC' +] + +const nonDagPbRecursivePins = [ + 'bafyreigv7udtoqiouyeelfijgfix42yc44zsqncbmar6jadq7xfs4mgg4e', + 'bafyreif4nfemzpljifoquq5dqjgmddhiv53b66zbr7ul3goeahyhphxyhq', + 'bafyreif2d33ncuaeeb37jnjylbgrgot3acpy5g33rs5rqvbxxmcnei6tua', + 'bafyreig2zauiy4t5ltjwoaf6tjbdnanah4q6qz5ilol3g2bwfrblpcv2bm', + 'bafyreiglffsxrbgxrnlx7wu2n5rsdtd73ih7zf65pormaarrqr26uhczxa', + 'bafyreiboyxf575xniqegisc2okkerinv4gehmlmjrybcfsc4fbnkhn77te', + 'bafyreif7z4hkico2i4kv3q36ix2qb5g4y62q2filnlmqrkzzbkwt3ewtya', + 'bafyreiczsrn43dxizcmwav2gkjbrvngmqcmdywq7nwyb7a3vn5hssudhr4', + 'bafyreiguc2wwt77l63uan4opi6bo6b4uuizbmfhbx3izb5ca7qp2rtp2xi', + 'bafyreihkjb36nob7cezu3m5psjqo46cturnut4fi6x3fj7md4eiefsinsy' +] + +const nonDagPbDirectPins = [ + 'bafyreibuvrik6o3lyantziriciygeb6jbwocvd7kwtozrjo37n6dki5aom', + 'bafyreicn35rsdstjo2574mtympyup2a6rh7tb5pip3seg6s6j6epe7jduu', + 'bafyreiang6jqksnq7ka3vajo3jvxo624nzt2wskn422sdrjl2cbald4ckq', + 'bafyreie3f7gzq4dvdqitq75bxtkocjpfcny5dta3dzg4gi76q6ql3blfrq', + 'bafyreic54zlg7mq5tojnpj73qc5acjyyzz2kxksmtceavb6q4fryeksp6i', + 'bafyreih3zs3htz6qun62ogeqdlf2iyyw3zkfngelfjgrft3bjeeqegxwiq', + 'bafyreigebeyuxa37qu7p2bxpjn7wlf4itkgwfjiqzetraihvhobs6z4fw4', + 'bafyreigpw4hiw2uggape2nkd7dts3x7lpkpczmmfojtzofmodjkjfcikxq', + 'bafyreifumpjckmmnsiqmpfg4vsxgihjb3pwtygdjqiu6ztabswguko52xm', + 'bafyreiamyrx7wjuxyewnjsu6vfj2u4jzqz2tclukgzwuinic6zbukazgci' +] + +/** + * @param {Blockstore} blockstore + * @param {Datastore} datastore + * @param {Pinset} param2 + */ +async function bootstrapBlocks (blockstore, datastore, { car: carBuf, root: expectedRoot }) { + const car = await CarReader.fromBytes(carBuf) + const [actualRoot] = await car.getRoots() + + expect(actualRoot.toString()).to.equal(expectedRoot.toString()) + await blockstore.open() + + for await (const { cid, bytes } of car.blocks()) { + blockstore.put(CID.parse(cid.toString()), new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength)) + } + + await blockstore.close() + + await datastore.open() + await datastore.put(PIN_DS_KEY, actualRoot.multihash.bytes) + await datastore.close() +} + +/** + * @param {Datastore} datastore + * @param {Pinset} pinset + */ +async function assertPinsetRootIsPresent (datastore, pinset) { + await datastore.open() + const buf = await datastore.get(PIN_DS_KEY) + await datastore.close() + const cid = CID.decode(buf) + expect(cid.toString()).to.equal(pinset.root.toString()) +} + +/** + * @param {import('../types').SetupFunction} setup + * @param {import('../types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + describe('migration 9', function () { + this.timeout(1000 * 1000) + /** @type {string} */ + let dir + /** @type {import('../../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + + afterEach(async () => { + await cleanup(dir) + }) + + describe('empty repo', () => { + describe('forwards', () => { + it('should migrate pins forward', async () => { + await migration.migrate(backends, () => {}) + }) + }) + + describe('backwards', () => { + it('should migrate pins backward', async () => { + await migration.revert(backends, () => {}) + }) + }) + }) + + Object.keys(pinsets).forEach(title => { + const pinset = pinsets[title] + + /** @type {Map} */ + const pinned = new Map() + + describe(title, () => { + describe('forwards', () => { + beforeEach(async () => { + await bootstrapBlocks(backends.blocks, backends.datastore, pinset) + await assertPinsetRootIsPresent(backends.datastore, pinset) + }) + + it('should migrate pins forward', async () => { + await migration.migrate(backends, () => {}) + + await backends.pins.open() + let migratedDirect = 0 + let migratedNonDagPBRecursive = 0 + + for await (const { key, value } of backends.pins.query({})) { + pinned.set(key, value) + + const pin = cbor.decode(value) + + const cid = pinToCid(key, pin) + + if (directPins.includes(`${cid}`) || nonDagPbDirectPins.includes(`${cid}`)) { + expect(pin.depth).to.equal(0) + migratedDirect++ + } else { + expect(pin.depth).to.equal(Infinity) + } + + if (nonDagPbRecursivePins.includes(`${cid}`)) { + migratedNonDagPBRecursive++ + } + } + + await backends.pins.close() + + expect(migratedDirect).to.equal(directPins.length + nonDagPbDirectPins.length) + expect(migratedNonDagPBRecursive).to.equal(nonDagPbRecursivePins.length) + expect(pinned).to.have.lengthOf(pinset.pins) + + await backends.datastore.open() + await expect(backends.datastore.has(PIN_DS_KEY)).to.eventually.be.false() + await backends.datastore.close() + }) + }) + + describe('backwards', () => { + beforeEach(async () => { + await backends.pins.open() + + for (const [key, value] of pinned.entries()) { + await backends.pins.put(key, value) + } + + await backends.pins.close() + }) + + it('should migrate pins backward', async () => { + await migration.revert(backends, () => {}) + + await assertPinsetRootIsPresent(backends.datastore, pinset) + }) + }) + }) + }) + }) +} diff --git a/packages/ipfs-repo-migrations/test/node.js b/packages/ipfs-repo-migrations/test/node.js new file mode 100644 index 00000000..fd719468 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/node.js @@ -0,0 +1,130 @@ +/* eslint-env mocha */ +'use strict' + +const os = require('os') +const rimraf = require('rimraf') +const { FsDatastore } = require('datastore-fs') +const { LevelDatastore } = require('datastore-level') +const { S3Datastore } = require('datastore-s3') +const { ShardingDatastore } = require('datastore-core/sharding') +const { NextToLast } = require('datastore-core/shard') +const { BlockstoreDatastoreAdapter } = require('blockstore-datastore-adapter') +const mockS3 = require('./fixtures/mock-s3') +const S3 = require('aws-sdk').S3 +const { createRepo } = require('./fixtures/repo') + +/** + * @param {string} dir + */ +async function cleanup (dir) { + await rimraf.sync(dir) +} + +const CONFIGURATIONS = [{ + name: 'with sharding', + cleanup, + /** + * @param {string} prefix + * @returns {import('../src/types').Backends} + */ + createBackends: (prefix) => { + return { + root: new FsDatastore(prefix), + blocks: new BlockstoreDatastoreAdapter( + new ShardingDatastore( + new FsDatastore(`${prefix}/blocks`, { + extension: '.data' + }), + new NextToLast(2)) + ), + datastore: new LevelDatastore(`${prefix}/datastore`), + keys: new FsDatastore(`${prefix}/keys`), + pins: new LevelDatastore(`${prefix}/pins`) + } + } +}, { + name: 'without sharding', + cleanup, + /** + * @param {string} prefix + * @returns {import('../src/types').Backends} + */ + createBackends: (prefix) => { + return { + root: new FsDatastore(prefix), + blocks: new BlockstoreDatastoreAdapter( + new FsDatastore(`${prefix}/blocks`, { + extension: '.data' + }) + ), + datastore: new LevelDatastore(`${prefix}/datastore`), + keys: new FsDatastore(`${prefix}/keys`), + pins: new LevelDatastore(`${prefix}/pins`) + } + } +}, { + name: 'with s3', + cleanup: async () => {}, + /** + * @param {string} prefix + * @returns {import('../src/types').Backends} + */ + createBackends: (prefix) => { + const s3Instance = new S3({ + params: { + Bucket: 'test' + } + }) + mockS3(s3Instance) + + return { + root: new S3Datastore(prefix, { + s3: s3Instance, + createIfMissing: false + }), + blocks: new BlockstoreDatastoreAdapter( + new ShardingDatastore( + new S3Datastore(`${prefix}/blocks`, { + s3: s3Instance, + createIfMissing: false + }), + new NextToLast(2) + ) + ), + datastore: new ShardingDatastore(new S3Datastore(`${prefix}/datastore`, { + s3: s3Instance, + createIfMissing: false + }), new NextToLast(2)), + keys: new ShardingDatastore(new S3Datastore(`${prefix}/keys`, { + s3: s3Instance, + createIfMissing: false + }), new NextToLast(2)), + pins: new ShardingDatastore(new S3Datastore(`${prefix}/pins`, { + s3: s3Instance, + createIfMissing: false + }), new NextToLast(2)) + } + } +}] + +CONFIGURATIONS.forEach(({ name, createBackends, cleanup }) => { + const setup = () => createRepo(createBackends, os.tmpdir()) + + describe(name, () => { + describe('version tests', () => { + require('./version-test')(setup, cleanup) + }) + + describe('migrations tests', () => { + require('./migrations')(setup, cleanup) + }) + + describe('init tests', () => { + require('./init-test')(setup, cleanup) + }) + + describe('integration tests', () => { + require('./integration-test')(setup, cleanup) + }) + }) +}) diff --git a/packages/ipfs-repo-migrations/test/test-migrations/index.js b/packages/ipfs-repo-migrations/test/test-migrations/index.js new file mode 100644 index 00000000..6676d164 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/test-migrations/index.js @@ -0,0 +1,5 @@ +'use strict' + +module.exports = [ + require('./migration-2') +] diff --git a/packages/ipfs-repo-migrations/test/test-migrations/migration-2/index.js b/packages/ipfs-repo-migrations/test/test-migrations/migration-2/index.js new file mode 100644 index 00000000..e33c48ea --- /dev/null +++ b/packages/ipfs-repo-migrations/test/test-migrations/migration-2/index.js @@ -0,0 +1,126 @@ +'use strict' + +const Key = require('interface-datastore').Key +const _set = require('just-safe-set') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') + +/** + * @typedef {import('../../../src/types').Backends} Backends + * @typedef {import('../../../src/types').MigrationProgressCallback} MigrationProgressCallback + */ + +const CONFIG_KEY = new Key('config') +const NEW_API_ADDRESS = '/ip6/::/tcp/5001' + +/** + * EXAMPLE MIGRATION + * ================= + * + * Shows how to update config values. Migrate: + * 1) Changes 'Addresses.API' to Array with new IPv6 localhost + * 2) Changes 'Gateway.HTTPHeaders.Access-Control-Allow-Origin' to specific origin + */ + +/** + * @param {*} config + */ +function addNewApiAddress (config) { + let apiAddrs = config.Addresses.API + + if (!Array.isArray(apiAddrs)) { + apiAddrs = [apiAddrs] + } + + if (apiAddrs.includes(NEW_API_ADDRESS)) { + return + } + apiAddrs.push(NEW_API_ADDRESS) + config.Addresses.API = apiAddrs + + return config +} + +/** + * @param {*} config + */ +function removeNewApiAddress (config) { + const apiAddrs = config.Addresses.API + + if (!Array.isArray(apiAddrs)) { + return config + } + + if (apiAddrs.length > 2) { + throw new Error('Not possible to revert as Addresses.API has more then 2 address, not sure what to do.') + } + + if (!apiAddrs.includes(NEW_API_ADDRESS)) { + throw new Error('Not possible to revert as Addresses.API has unknown address, not sure what to do.') + } + + _set(config, 'Addresses.API', apiAddrs[0] === NEW_API_ADDRESS ? apiAddrs[1] : apiAddrs[0]) + + return config +} + +/** + * @param {Backends} backends + * @param {MigrationProgressCallback} onProgress + */ +async function migrate (backends, onProgress) { + const store = backends.root + await store.open() + + try { + const rawConfig = await store.get(CONFIG_KEY) + let config = JSON.parse(rawConfig.toString()) + + // Convert Address.API to Array with new IPv6 localhost + config = addNewApiAddress(config) + + // Modify allowed origin + _set(config, 'Gateway.HTTPHeaders.Access-Control-Allow-Origin', 'some.origin.com') + + const buf = uint8ArrayFromString(JSON.stringify(config, null, 2)) + await store.put(CONFIG_KEY, buf) + } finally { + await store.close() + } + + onProgress(100, 'done!') +} + +/** + * @param {Backends} backends + * @param {MigrationProgressCallback} onProgress + */ +async function revert (backends, onProgress) { + const store = backends.root + await store.open() + + try { + const rawConfig = await store.get(CONFIG_KEY) + let config = JSON.parse(rawConfig.toString()) + + // If possible revert to previous value + config = removeNewApiAddress(config) + + // Reset origin + _set(config, 'Gateway.HTTPHeaders.Access-Control-Allow-Origin', '*') + + const buf = uint8ArrayFromString(JSON.stringify(config, null, 2)) + await store.put(CONFIG_KEY, buf) + } finally { + await store.close() + } + + onProgress(100, 'done!') +} + +module.exports = { + version: 2, + description: 'Updates config', + migrate, + revert, + newApiAddr: NEW_API_ADDRESS +} diff --git a/packages/ipfs-repo-migrations/test/types.d.ts b/packages/ipfs-repo-migrations/test/types.d.ts new file mode 100644 index 00000000..16b60ae6 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/types.d.ts @@ -0,0 +1,4 @@ +import { Backends } from '../src/types' + +export interface SetupFunction { (prefix?: string): Promise<{ dir: string, backends: Backends}> } +export interface CleanupFunction { (dir: string): Promise } diff --git a/packages/ipfs-repo-migrations/test/version-test.js b/packages/ipfs-repo-migrations/test/version-test.js new file mode 100644 index 00000000..57364c40 --- /dev/null +++ b/packages/ipfs-repo-migrations/test/version-test.js @@ -0,0 +1,60 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const { VERSION_KEY, CONFIG_KEY } = require('../src/utils') +const version = require('../src/repo/version') +const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') +const errors = require('../src/errors') + +// When new versioning mechanism is introduced in new version don't forget to update +// the range (from/to) of the previous version test's description + +/** + * @param {import('./types').SetupFunction} setup + * @param {import('./types').CleanupFunction} cleanup + */ +module.exports = (setup, cleanup) => { + /** @type {string} */ + let dir + /** @type {import('../src/types').Backends} */ + let backends + + beforeEach(async () => { + ({ dir, backends } = await setup()) + }) + + afterEach(() => cleanup(dir)) + + it('getVersion should fail without any version in repo', async () => { + await expect(version.getVersion(backends)).to.be.eventually.rejectedWith(errors.NotInitializedRepoError) + .with.property('code', errors.NotInitializedRepoError.code) + }) + + describe('version 7 and below', () => { + it('should get version number', async () => { + // Create version file + const store = backends.root + await store.open() + await store.put(CONFIG_KEY, uint8ArrayFromString('some dummy config')) + await store.put(VERSION_KEY, uint8ArrayFromString('7')) + await store.close() + + expect(await version.getVersion(backends)).to.be.equal(7) + }) + + it('should set version number', async () => { + await expect(version.getVersion(backends)).to.be.eventually.rejectedWith(errors.NotInitializedRepoError).with.property('code', errors.NotInitializedRepoError.code) + + // Create version file + const store = backends.root + await store.open() + await store.put(CONFIG_KEY, uint8ArrayFromString('some dummy config')) + await store.put(VERSION_KEY, uint8ArrayFromString('5')) + await store.close() + + await version.setVersion(7, backends) + expect(await version.getVersion(backends)).to.be.equal(7) + }) + }) +} diff --git a/packages/ipfs-repo-migrations/tsconfig.json b/packages/ipfs-repo-migrations/tsconfig.json new file mode 100644 index 00000000..e17e1c7d --- /dev/null +++ b/packages/ipfs-repo-migrations/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "aegir/src/config/tsconfig.aegir.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": [ + "src", + "test", + "migrations" + ], + "exclude": [ + "migrations/migration-9/pin.js", + "migrations/migration-9/pin.d.ts" + ] +} diff --git a/packages/ipfs-repo/LICENSE-APACHE b/packages/ipfs-repo/LICENSE-APACHE new file mode 100644 index 00000000..14478a3b --- /dev/null +++ b/packages/ipfs-repo/LICENSE-APACHE @@ -0,0 +1,5 @@ +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/packages/ipfs-repo/LICENSE-MIT b/packages/ipfs-repo/LICENSE-MIT new file mode 100644 index 00000000..749aa1ec --- /dev/null +++ b/packages/ipfs-repo/LICENSE-MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/ipfs-repo/README.md b/packages/ipfs-repo/README.md index 185a659d..b3f1361e 100644 --- a/packages/ipfs-repo/README.md +++ b/packages/ipfs-repo/README.md @@ -421,7 +421,7 @@ This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/c ## License -[MIT](LICENSE) +[Apache-2.0](LICENSE-APACHE) OR [MIT](LICENSE-MIT) [CID]: https://github.com/multiformats/js-cid [Key]: https://github.com/ipfs/interface-datastore#keys diff --git a/packages/ipfs-repo/package.json b/packages/ipfs-repo/package.json index 8a9e2171..2c9f97dc 100644 --- a/packages/ipfs-repo/package.json +++ b/packages/ipfs-repo/package.json @@ -28,10 +28,7 @@ "lint": "aegir ts -p check && aegir lint", "release": "aegir release", "release-minor": "aegir release --type minor", - "release-major": "aegir release --type major", - "coverage": "aegir test -t node --cov && nyc report --reporter=html", - "dep-check": "aegir dep-check", - "docs": "aegir docs" + "release-major": "aegir release --type major" }, "repository": { "type": "git", @@ -42,11 +39,8 @@ "libp2p", "datastore" ], - "homepage": "https://github.com/ipfs/js-ipfs-repo", - "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - }, + "license": "(Apache-2.0 OR MIT)", + "homepage": "https://github.com/ipfs/js-ipfs-repo/tree/master/packages/ipfs-repo", "devDependencies": { "@ipld/dag-cbor": "^6.0.4", "@types/bytes": "^3.1.0", @@ -55,7 +49,8 @@ "@types/rimraf": "^3.0.0", "aegir": "^35.0.2", "assert": "^2.0.0", - "blockstore-datastore-adapter": "^1.0.0", + "blockstore-core": "^1.0.2", + "blockstore-datastore-adapter": "^2.0.1", "events": "^3.3.0", "ipfs-utils": "^8.1.3", "it-all": "^1.0.2", @@ -64,7 +59,6 @@ "just-range": "^2.1.0", "rimraf": "^3.0.0", "sinon": "^11.1.1", - "tsd": "^0.17.0", "url": "^0.11.0", "util": "^0.12.3" }, @@ -75,8 +69,8 @@ "debug": "^4.1.0", "err-code": "^3.0.1", "eslint-plugin-ava": "^12.0.0", - "interface-blockstore": "^1.0.0", - "interface-datastore": "^5.0.0", + "interface-blockstore": "^2.0.2", + "interface-datastore": "^6.0.2", "ipfs-repo-migrations": "^10.0.0", "it-filter": "^1.0.2", "it-map": "^1.0.5", @@ -99,40 +93,5 @@ "ignorePatterns": [ "!.aegir.js" ] - }, - "license": "MIT", - "contributors": [ - "David Dias ", - "achingbrain ", - "Jacob Heun ", - "dignifiedquire ", - "Hugo Dias ", - "Stephen Whitmore ", - "Adam Uhlíř ", - "Alan Shaw ", - "Vasco Santos ", - "Richard Schneider ", - "Hector Sanjuan ", - "Pau Ramon Revilla ", - "Dmitriy Ryajov ", - "Lars-Magnus Skog ", - "Francisco Baio Dias ", - "Pedro Santos ", - "nginnever ", - "ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ ", - "Andrew Nesbitt ", - "Brian Hoffman ", - "Bryan Stenson ", - "Hannah Howard ", - "Henrique Dias ", - "Jonah Weissman ", - "Jonathan ", - "Justin Chase ", - "Linus Unnebäck ", - "Marcus Bernales ", - "Pedro Teixeira ", - "Richard Littauer ", - "Steef Min ", - "Volker Mische " - ] + } } diff --git a/packages/ipfs-repo/src/gc.js b/packages/ipfs-repo/src/gc.js index a9fad168..d39aa526 100644 --- a/packages/ipfs-repo/src/gc.js +++ b/packages/ipfs-repo/src/gc.js @@ -2,7 +2,7 @@ const { CID } = require('multiformats/cid') const log = require('debug')('ipfs:repo:gc') -const { Errors } = require('interface-datastore') +const Errors = require('datastore-core/errors') const ERR_NOT_FOUND = Errors.notFoundError().code const parallelBatch = require('it-parallel-batch') const { pipe } = require('it-pipe') diff --git a/packages/ipfs-repo/src/types.d.ts b/packages/ipfs-repo/src/types.ts similarity index 100% rename from packages/ipfs-repo/src/types.d.ts rename to packages/ipfs-repo/src/types.ts diff --git a/packages/ipfs-repo/test/blockstore-test.js b/packages/ipfs-repo/test/blockstore-test.js index ad4607c7..144e47cb 100644 --- a/packages/ipfs-repo/test/blockstore-test.js +++ b/packages/ipfs-repo/test/blockstore-test.js @@ -13,7 +13,7 @@ const first = require('it-first') const { fromString: uint8ArrayFromString } = require('uint8arrays/from-string') const { toString: uint8ArrayToString } = require('uint8arrays/to-string') const { equals: uint8ArrayEquals } = require('uint8arrays/equals') -const { BlockstoreAdapter } = require('interface-blockstore') +const { BaseBlockstore } = require('blockstore-core/base') const { sha256 } = require('multiformats/hashes/sha2') const { identity } = require('multiformats/hashes/identity') const raw = require('multiformats/codecs/raw') @@ -204,7 +204,7 @@ module.exports = (repo) => { const digest = await sha256.digest(data) const cid = CID.createV0(digest) - class ExplodingBlockStore extends BlockstoreAdapter { + class ExplodingBlockStore extends BaseBlockstore { /** * * @param {CID} c @@ -324,7 +324,7 @@ module.exports = (repo) => { const digest = await sha256.digest(data) const cid = CID.createV0(digest) - class ExplodingBlockStore extends BlockstoreAdapter { + class ExplodingBlockStore extends BaseBlockstore { /** * @param {CID} c */ diff --git a/packages/ipfs-repo/test/browser.js b/packages/ipfs-repo/test/browser.js index f6c0732f..82faa277 100644 --- a/packages/ipfs-repo/test/browser.js +++ b/packages/ipfs-repo/test/browser.js @@ -4,8 +4,8 @@ const { createRepo } = require('../src') const loadCodec = require('./fixtures/load-codec') -const { MemoryDatastore } = require('interface-datastore') -const { MemoryBlockstore } = require('interface-blockstore') +const { MemoryDatastore } = require('datastore-core/memory') +const { MemoryBlockstore } = require('blockstore-core/memory') async function createTempRepo (options = {}) { const date = Date.now().toString() diff --git a/packages/ipfs-repo/test/fixtures/create-backend.js b/packages/ipfs-repo/test/fixtures/create-backend.js index 7ceec596..474ee351 100644 --- a/packages/ipfs-repo/test/fixtures/create-backend.js +++ b/packages/ipfs-repo/test/fixtures/create-backend.js @@ -1,7 +1,7 @@ 'use strict' -const { MemoryDatastore } = require('interface-datastore') -const BlockstoreDatastoreAdapter = require(('blockstore-datastore-adapter')) +const { MemoryDatastore } = require('datastore-core/memory') +const { BlockstoreDatastoreAdapter } = require('blockstore-datastore-adapter') function createBackend (overrides = {}) { return { diff --git a/packages/ipfs-repo/test/repo-test.js b/packages/ipfs-repo/test/repo-test.js index 59135104..350bb194 100644 --- a/packages/ipfs-repo/test/repo-test.js +++ b/packages/ipfs-repo/test/repo-test.js @@ -7,8 +7,8 @@ const tempDir = require('ipfs-utils/src/temp-dir') const { createRepo } = require('../') const Errors = require('../src/errors') const bytes = require('bytes') -const { Adapter, MemoryDatastore } = require('interface-datastore') -const { MemoryBlockstore } = require('interface-blockstore') +const { BaseDatastore, MemoryDatastore } = require('datastore-core') +const { MemoryBlockstore } = require('blockstore-core') const loadCodec = require('./fixtures/load-codec') const MemoryLock = require('../src/locks/memory') const createBackend = require('./fixtures/create-backend') @@ -198,7 +198,7 @@ module.exports = (repo) => { }) describe('locking', () => { - class ExplodingDatastore extends Adapter { + class ExplodingDatastore extends BaseDatastore { async open () { throw new Error('wat') } diff --git a/packages/ipfs-repo/test/types.test-d.ts b/packages/ipfs-repo/test/types.test-d.ts deleted file mode 100644 index d1edb342..00000000 --- a/packages/ipfs-repo/test/types.test-d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { expectType } from 'tsd' -import type { IPFSRepo } from '../' -import { createRepo } from '../' -import { MemoryDatastore } from 'interface-datastore' -import { MemoryBlockstore } from 'interface-blockstore' - -expectType(createRepo('', async () => ({ - name: '', - code: 0, - encode: () => new Uint8Array(), - decode: () => {} -}), { - root: new MemoryDatastore(), - blocks: new MemoryBlockstore(), - keys: new MemoryDatastore(), - pins: new MemoryDatastore(), - datastore: new MemoryDatastore() -})) From 2676cda7e9baf9c6b3a9c9d48873e0a9da5493f3 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 12:31:34 +0100 Subject: [PATCH 03/24] chore: update gh actions --- .github/workflows/main.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3be35b5c..3d79be90 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,11 +49,11 @@ jobs: fail-fast: true steps: - uses: actions/checkout@v2 + with: + project: ${{ matrix.project }} - run: npm install - run: npm run pretest - run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js - with: - project: ${{ matrix.project }} test-electron-renderer: needs: check runs-on: ubuntu-latest @@ -65,8 +65,9 @@ jobs: fail-fast: true steps: - uses: actions/checkout@v2 + with: + project: ${{ matrix.project }} - run: npm install - run: npm run pretest - run: npx xvfb-maybe aegir test -t electron-renderer --bail -f dist/cjs/browser-test/*js - with: - project: ${{ matrix.project }} + From 5b8f6f41cdc14d60cbc3addd474451e0898e738e Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 12:38:15 +0100 Subject: [PATCH 04/24] chore: update node --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3d79be90..4fdcd099 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,6 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 - run: npm install - run: npm run lint - uses: gozala/typescript-error-reporter-action@v1.0.8 From 686d112a7b29e6f2e4c4c077db3d93d67bfb6536 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 12:46:45 +0100 Subject: [PATCH 05/24] chore: update gh actions --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4fdcd099..2c10219b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,8 +13,8 @@ jobs: steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 - with: - node-version: 16 + with: + node-version: 16 - run: npm install - run: npm run lint - uses: gozala/typescript-error-reporter-action@v1.0.8 From 68e05a04cc92fbaa229cbca3646e5b40b1e25825 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 12:49:30 +0100 Subject: [PATCH 06/24] chore: update gh actions --- packages/ipfs-repo-migrations/package.json | 9 ++++----- packages/ipfs-repo/package.json | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/ipfs-repo-migrations/package.json b/packages/ipfs-repo-migrations/package.json index d3dfb1ca..a70a2f66 100644 --- a/packages/ipfs-repo-migrations/package.json +++ b/packages/ipfs-repo-migrations/package.json @@ -27,11 +27,10 @@ "url": "https://github.com/ipfs/js-ipfs-repo.git" }, "scripts": { - "prepare": "run-s prepare:*", - "prepare:proto": "pbjs -t static-module -w commonjs --force-number --no-verify --no-delimited --no-create --no-beautify --no-defaults --lint eslint-disable -o migrations/migration-9/pin.js migrations/migration-9/pin.proto", - "prepare:proto-types": "pbts -o migrations/migration-9/pin.d.ts migrations/migration-9/pin.js", - "prepare:types": "aegir build", - "build": "aegir build --no-bundle", + "build": "run-s prepare:*", + "build:proto": "pbjs -t static-module -w commonjs --force-number --no-verify --no-delimited --no-create --no-beautify --no-defaults --lint eslint-disable -o migrations/migration-9/pin.js migrations/migration-9/pin.proto", + "build:proto-types": "pbts -o migrations/migration-9/pin.d.ts migrations/migration-9/pin.js", + "build:source": "aegir build", "test": "aegir test", "test:node": "aegir test --target node", "test:browser": "aegir test --target browser", diff --git a/packages/ipfs-repo/package.json b/packages/ipfs-repo/package.json index 2c9f97dc..2ba1520e 100644 --- a/packages/ipfs-repo/package.json +++ b/packages/ipfs-repo/package.json @@ -19,7 +19,6 @@ "./src/default-options.js": "./src/default-options.browser.js" }, "scripts": { - "prepare": "aegir build --no-bundle", "test": "tsd && aegir test", "test:node": "aegir test -t node", "test:browser": "aegir test -t browser", From 0707e4c502848148e57d9c3aac44ca235ac889ec Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:01:45 +0100 Subject: [PATCH 07/24] chore: update gh actions --- .github/workflows/main.yml | 2 +- .gitignore | 2 +- packages/ipfs-repo-migrations/package.json | 6 ++++-- packages/ipfs-repo/package.json | 5 ++++- packages/ipfs-repo/types/just-range/index.d.ts | 3 --- packages/ipfs-repo/types/merge-options/index.d.ts | 2 -- 6 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 packages/ipfs-repo/types/just-range/index.d.ts delete mode 100644 packages/ipfs-repo/types/merge-options/index.d.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2c10219b..6f3dbef2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,9 +16,9 @@ jobs: with: node-version: 16 - run: npm install + - run: npm run build - run: npm run lint - uses: gozala/typescript-error-reporter-action@v1.0.8 - - run: npm run build - run: npm run depcheck test-node: needs: check diff --git a/.gitignore b/.gitignore index 36eff293..b9eda9fb 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,4 @@ build node_modules dist - +types diff --git a/packages/ipfs-repo-migrations/package.json b/packages/ipfs-repo-migrations/package.json index a70a2f66..e6ebf2f0 100644 --- a/packages/ipfs-repo-migrations/package.json +++ b/packages/ipfs-repo-migrations/package.json @@ -27,7 +27,8 @@ "url": "https://github.com/ipfs/js-ipfs-repo.git" }, "scripts": { - "build": "run-s prepare:*", + "clean": "rimraf types dist", + "build": "run-s build:*", "build:proto": "pbjs -t static-module -w commonjs --force-number --no-verify --no-delimited --no-create --no-beautify --no-defaults --lint eslint-disable -o migrations/migration-9/pin.js migrations/migration-9/pin.proto", "build:proto-types": "pbts -o migrations/migration-9/pin.d.ts migrations/migration-9/pin.js", "build:source": "aegir build", @@ -37,7 +38,8 @@ "lint": "aegir ts -p check && aegir lint", "release": "aegir release", "release-minor": "aegir release --type minor", - "release-major": "aegir release --type major" + "release-major": "aegir release --type major", + "depcheck": "aegir dep-check" }, "dependencies": { "@ipld/dag-pb": "^2.0.0", diff --git a/packages/ipfs-repo/package.json b/packages/ipfs-repo/package.json index 2ba1520e..940bf2b5 100644 --- a/packages/ipfs-repo/package.json +++ b/packages/ipfs-repo/package.json @@ -19,6 +19,7 @@ "./src/default-options.js": "./src/default-options.browser.js" }, "scripts": { + "clean": "rimraf types dist", "test": "tsd && aegir test", "test:node": "aegir test -t node", "test:browser": "aegir test -t browser", @@ -27,7 +28,8 @@ "lint": "aegir ts -p check && aegir lint", "release": "aegir release", "release-minor": "aegir release --type minor", - "release-major": "aegir release --type major" + "release-major": "aegir release --type major", + "depcheck": "aegir dep-check" }, "repository": { "type": "git", @@ -65,6 +67,7 @@ "@ipld/dag-pb": "^2.1.0", "bytes": "^3.1.0", "cborg": "^1.3.4", + "datastore-core": "^6.0.7", "debug": "^4.1.0", "err-code": "^3.0.1", "eslint-plugin-ava": "^12.0.0", diff --git a/packages/ipfs-repo/types/just-range/index.d.ts b/packages/ipfs-repo/types/just-range/index.d.ts deleted file mode 100644 index ceb1c6d2..00000000 --- a/packages/ipfs-repo/types/just-range/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare function range (start: any, stop?: any, step?: any): any[] - -export = range diff --git a/packages/ipfs-repo/types/merge-options/index.d.ts b/packages/ipfs-repo/types/merge-options/index.d.ts deleted file mode 100644 index e5c2d769..00000000 --- a/packages/ipfs-repo/types/merge-options/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare function mergeOptions (arg1: T1, arg: T2): Required -export = mergeOptions From 0707656f532858ad3cb52de8d1792b3cc9971765 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:06:15 +0100 Subject: [PATCH 08/24] chore: update gh actions --- .github/workflows/main.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6f3dbef2..0316ce71 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,13 @@ on: jobs: check: runs-on: ubuntu-latest + strategy: + matrix: + matrix: + project: + - packages/ipfs-repo + - packages/ipfs-repo-migrations + fail-fast: true steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 @@ -18,8 +25,10 @@ jobs: - run: npm install - run: npm run build - run: npm run lint - - uses: gozala/typescript-error-reporter-action@v1.0.8 - run: npm run depcheck + - uses: gozala/typescript-error-reporter-action@v1.0.8 + with: + project: ${{ matrix.project }} test-node: needs: check runs-on: ${{ matrix.os }} From b1f0067b8b253534e0c086e3ee68ace7b4429713 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:07:16 +0100 Subject: [PATCH 09/24] chore: update gh actions --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0316ce71..762af0b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,6 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - matrix: project: - packages/ipfs-repo - packages/ipfs-repo-migrations From 6bc8e71370929447cc20e36427a68e0a70f4b029 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:20:23 +0100 Subject: [PATCH 10/24] chore: update gh actions --- .github/workflows/main.yml | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 762af0b6..c95b2095 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,20 +24,17 @@ jobs: - run: npm install - run: npm run build - run: npm run lint - - run: npm run depcheck - - uses: gozala/typescript-error-reporter-action@v1.0.8 - with: - project: ${{ matrix.project }} test-node: needs: check runs-on: ${{ matrix.os }} + name: Test ${{ matrix.project }} node strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] node: [14, 16] project: - - packages/ipfs-repo - - packages/ipfs-repo-migrations + - ipfs-repo + - ipfs-repo-migrations fail-fast: true steps: - uses: actions/checkout@v2 @@ -45,13 +42,11 @@ jobs: with: node-version: ${{ matrix.node }} - run: npm install - - run: npm run test -- -- -- --cov -t node - - uses: codecov/codecov-action@v1 - with: - project: ${{ matrix.project }} + - run: npm run test -- --scope=${{ matrix.project }} -- -- --cov -t node test-electron-main: needs: check runs-on: ubuntu-latest + name: Test ${{ matrix.project }} electron-main strategy: matrix: project: @@ -60,14 +55,13 @@ jobs: fail-fast: true steps: - uses: actions/checkout@v2 - with: - project: ${{ matrix.project }} - run: npm install - run: npm run pretest - run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js test-electron-renderer: needs: check runs-on: ubuntu-latest + name: Test ${{ matrix.project }} electron-renderer strategy: matrix: project: From 6cb4f02dd4379e1c4748c87ffd8e3d182860c032 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:20:35 +0100 Subject: [PATCH 11/24] chore: update gh actions --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c95b2095..ea083a51 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -50,8 +50,8 @@ jobs: strategy: matrix: project: - - packages/ipfs-repo - - packages/ipfs-repo-migrations + - ipfs-repo + - ipfs-repo-migrations fail-fast: true steps: - uses: actions/checkout@v2 @@ -65,8 +65,8 @@ jobs: strategy: matrix: project: - - packages/ipfs-repo - - packages/ipfs-repo-migrations + - ipfs-repo + - ipfs-repo-migrations fail-fast: true steps: - uses: actions/checkout@v2 From b97366dd5ffbb8da70f0081c6cfa440f8b924fa9 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:22:29 +0100 Subject: [PATCH 12/24] chore: update gh actions --- .github/workflows/main.yml | 4 ++-- packages/ipfs-repo/package.json | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ea083a51..cffb7486 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,7 +57,7 @@ jobs: - uses: actions/checkout@v2 - run: npm install - run: npm run pretest - - run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js + - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-main --bail -f dist/cjs/node-test/*js test-electron-renderer: needs: check runs-on: ubuntu-latest @@ -74,5 +74,5 @@ jobs: project: ${{ matrix.project }} - run: npm install - run: npm run pretest - - run: npx xvfb-maybe aegir test -t electron-renderer --bail -f dist/cjs/browser-test/*js + - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-renderer --bail -f dist/cjs/browser-test/*js diff --git a/packages/ipfs-repo/package.json b/packages/ipfs-repo/package.json index 940bf2b5..98b370d0 100644 --- a/packages/ipfs-repo/package.json +++ b/packages/ipfs-repo/package.json @@ -5,9 +5,6 @@ "leadMaintainer": "Alex Potsides ", "main": "src/index.js", "types": "dist/src/index.d.ts", - "tsd": { - "directory": "test" - }, "files": [ "src", "dist" @@ -20,7 +17,7 @@ }, "scripts": { "clean": "rimraf types dist", - "test": "tsd && aegir test", + "test": "aegir test", "test:node": "aegir test -t node", "test:browser": "aegir test -t browser", "test:webworker": "aegir test -t webworker", From 9da203c55992133b9b74f18cdec9f67579c064bb Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:28:35 +0100 Subject: [PATCH 13/24] chore: update gh actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cffb7486..8971b87c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] - node: [14, 16] + node: [16] project: - ipfs-repo - ipfs-repo-migrations From 5af4756f53d6474ee443be94c2f324eb6b208003 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:30:02 +0100 Subject: [PATCH 14/24] chore: update gh actions --- .github/workflows/main.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8971b87c..ba2f491a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,12 +10,6 @@ on: jobs: check: runs-on: ubuntu-latest - strategy: - matrix: - project: - - packages/ipfs-repo - - packages/ipfs-repo-migrations - fail-fast: true steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 From 318e2d1ad906c2a9a07c13a5dba71622b35a8df9 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:36:35 +0100 Subject: [PATCH 15/24] chore: update gh actions --- .github/workflows/main.yml | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ba2f491a..aecbfda9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,6 +18,7 @@ jobs: - run: npm install - run: npm run build - run: npm run lint + - run: npm run depcheck test-node: needs: check runs-on: ${{ matrix.os }} @@ -37,6 +38,40 @@ jobs: node-version: ${{ matrix.node }} - run: npm install - run: npm run test -- --scope=${{ matrix.project }} -- -- --cov -t node + test-chrome: + needs: check + runs-on: ubuntu-latest + name: Test ${{ matrix.project }} browser + strategy: + matrix: + project: + - ipfs-repo + - ipfs-repo-migrations + fail-fast: true + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 + - run: npm install + - run: npm run test -- --scope=${{ matrix.project }} -- --t browser + test-firefox: + needs: check + runs-on: ubuntu-latest + name: Test ${{ matrix.project }} browser + strategy: + matrix: + project: + - ipfs-repo + - ipfs-repo-migrations + fail-fast: true + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 + - run: npm install + - run: npm run test -- --scope=${{ matrix.project }} -- --t browser -- --browser firefox test-electron-main: needs: check runs-on: ubuntu-latest @@ -50,7 +85,6 @@ jobs: steps: - uses: actions/checkout@v2 - run: npm install - - run: npm run pretest - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-main --bail -f dist/cjs/node-test/*js test-electron-renderer: needs: check @@ -67,6 +101,5 @@ jobs: with: project: ${{ matrix.project }} - run: npm install - - run: npm run pretest - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-renderer --bail -f dist/cjs/browser-test/*js From 4b1990598194c4109d33c2c574817c0a617bab74 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:40:17 +0100 Subject: [PATCH 16/24] chore: update gh actions --- .github/workflows/main.yml | 55 +++++++++++--------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index aecbfda9..35a8975a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,15 +38,21 @@ jobs: node-version: ${{ matrix.node }} - run: npm install - run: npm run test -- --scope=${{ matrix.project }} -- -- --cov -t node - test-chrome: + test-browser: needs: check runs-on: ubuntu-latest - name: Test ${{ matrix.project }} browser + name: Test ${{ matrix.project }} ${{ matrix.browser }} ${{ matrix.type }} strategy: matrix: project: - ipfs-repo - ipfs-repo-migrations + browser: + - chrome + - firefox + type: + - browser + - webworker fail-fast: true steps: - uses: actions/checkout@v2 @@ -54,52 +60,21 @@ jobs: with: node-version: 16 - run: npm install - - run: npm run test -- --scope=${{ matrix.project }} -- --t browser - test-firefox: + - run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} -- --browser ${{ matrix.browser }} + test-electron: needs: check runs-on: ubuntu-latest - name: Test ${{ matrix.project }} browser - strategy: - matrix: - project: - - ipfs-repo - - ipfs-repo-migrations - fail-fast: true - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 16 - - run: npm install - - run: npm run test -- --scope=${{ matrix.project }} -- --t browser -- --browser firefox - test-electron-main: - needs: check - runs-on: ubuntu-latest - name: Test ${{ matrix.project }} electron-main + name: Test ${{ matrix.project }} ${{ matrix.type }} strategy: matrix: project: - ipfs-repo - ipfs-repo-migrations + type: + - electron-main + - electron-renderer fail-fast: true steps: - uses: actions/checkout@v2 - run: npm install - - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-main --bail -f dist/cjs/node-test/*js - test-electron-renderer: - needs: check - runs-on: ubuntu-latest - name: Test ${{ matrix.project }} electron-renderer - strategy: - matrix: - project: - - ipfs-repo - - ipfs-repo-migrations - fail-fast: true - steps: - - uses: actions/checkout@v2 - with: - project: ${{ matrix.project }} - - run: npm install - - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t electron-renderer --bail -f dist/cjs/browser-test/*js - + - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail -f dist/cjs/node-test/*js From 8783bef9825e69f2a7fd7f9002dc9632e309fe15 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:40:57 +0100 Subject: [PATCH 17/24] chore: update gh actions --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 35a8975a..d100b3b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -76,5 +76,8 @@ jobs: fail-fast: true steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 16 - run: npm install - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail -f dist/cjs/node-test/*js From 27bc96839c21970cb9e1d953f569ac46a184c993 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:53:53 +0100 Subject: [PATCH 18/24] chore: use xvfb action --- .github/workflows/main.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d100b3b4..2a432e7e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -48,7 +48,7 @@ jobs: - ipfs-repo - ipfs-repo-migrations browser: - - chrome + - chromium - firefox type: - browser @@ -80,4 +80,6 @@ jobs: with: node-version: 16 - run: npm install - - run: npx xvfb-maybe npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail -f dist/cjs/node-test/*js + - uses: GabrielBB/xvfb-action@v1 + with: + run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail -f dist/cjs/node-test/*js From 54fb25d2351f4e74c8cf6045e724085e35079f6a Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 13:59:36 +0100 Subject: [PATCH 19/24] chore: update gh actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2a432e7e..1e1333e4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -82,4 +82,4 @@ jobs: - run: npm install - uses: GabrielBB/xvfb-action@v1 with: - run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail -f dist/cjs/node-test/*js + run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail From f1e25ed4539c77a5fc02820ab18347c3fdbd91ca Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 14:06:52 +0100 Subject: [PATCH 20/24] chore: update gh actions --- .github/workflows/main.yml | 44 +++++++++++----------- packages/ipfs-repo-migrations/package.json | 2 - packages/ipfs-repo/package.json | 3 -- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1e1333e4..1c3d6a55 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -61,25 +61,25 @@ jobs: node-version: 16 - run: npm install - run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} -- --browser ${{ matrix.browser }} - test-electron: - needs: check - runs-on: ubuntu-latest - name: Test ${{ matrix.project }} ${{ matrix.type }} - strategy: - matrix: - project: - - ipfs-repo - - ipfs-repo-migrations - type: - - electron-main - - electron-renderer - fail-fast: true - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 16 - - run: npm install - - uses: GabrielBB/xvfb-action@v1 - with: - run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail + # test-electron: + # needs: check + # runs-on: ubuntu-latest + # name: Test ${{ matrix.project }} ${{ matrix.type }} + # strategy: + # matrix: + # project: + # - ipfs-repo + # - ipfs-repo-migrations + # type: + # - electron-main + # - electron-renderer + # fail-fast: true + # steps: + # - uses: actions/checkout@v2 + # - uses: actions/setup-node@v1 + # with: + # node-version: 16 + # - run: npm install + # - uses: GabrielBB/xvfb-action@v1 + # with: + # run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail diff --git a/packages/ipfs-repo-migrations/package.json b/packages/ipfs-repo-migrations/package.json index e6ebf2f0..f0dff7b2 100644 --- a/packages/ipfs-repo-migrations/package.json +++ b/packages/ipfs-repo-migrations/package.json @@ -33,8 +33,6 @@ "build:proto-types": "pbts -o migrations/migration-9/pin.d.ts migrations/migration-9/pin.js", "build:source": "aegir build", "test": "aegir test", - "test:node": "aegir test --target node", - "test:browser": "aegir test --target browser", "lint": "aegir ts -p check && aegir lint", "release": "aegir release", "release-minor": "aegir release --type minor", diff --git a/packages/ipfs-repo/package.json b/packages/ipfs-repo/package.json index 98b370d0..25a1b82f 100644 --- a/packages/ipfs-repo/package.json +++ b/packages/ipfs-repo/package.json @@ -18,9 +18,6 @@ "scripts": { "clean": "rimraf types dist", "test": "aegir test", - "test:node": "aegir test -t node", - "test:browser": "aegir test -t browser", - "test:webworker": "aegir test -t webworker", "build": "aegir build", "lint": "aegir ts -p check && aegir lint", "release": "aegir release", From 7aafd1d21b736e300d26f5fb0696562c3e734a47 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 14:23:49 +0100 Subject: [PATCH 21/24] chore: update gh actions --- .../ipfs-repo-migrations/test/migrations/migration-10-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js index 1eed1e78..6900d96b 100644 --- a/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js +++ b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js @@ -119,7 +119,7 @@ function withLevel (store, LevelImpl) { */ module.exports = (setup, cleanup) => { describe('migration 10', function () { - this.timeout(240 * 1000) + this.timeout(580 * 1000) /** @type {string} */ let dir /** @type {import('../../src/types').Backends} */ From 20fd7fda2b1d3edcddd504dafc77fc5fa8f5a63f Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 14:51:45 +0100 Subject: [PATCH 22/24] chore: update gh actions --- .github/workflows/main.yml | 48 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1c3d6a55..9df66e7e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,7 +41,7 @@ jobs: test-browser: needs: check runs-on: ubuntu-latest - name: Test ${{ matrix.project }} ${{ matrix.browser }} ${{ matrix.type }} + name: test ${{ matrix.project }} ${{ matrix.browser }} ${{ matrix.type }} strategy: matrix: project: @@ -52,7 +52,7 @@ jobs: - firefox type: - browser - - webworker +# - webworker fail-fast: true steps: - uses: actions/checkout@v2 @@ -61,25 +61,25 @@ jobs: node-version: 16 - run: npm install - run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} -- --browser ${{ matrix.browser }} - # test-electron: - # needs: check - # runs-on: ubuntu-latest - # name: Test ${{ matrix.project }} ${{ matrix.type }} - # strategy: - # matrix: - # project: - # - ipfs-repo - # - ipfs-repo-migrations - # type: - # - electron-main - # - electron-renderer - # fail-fast: true - # steps: - # - uses: actions/checkout@v2 - # - uses: actions/setup-node@v1 - # with: - # node-version: 16 - # - run: npm install - # - uses: GabrielBB/xvfb-action@v1 - # with: - # run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail +# test-electron: +# needs: check +# runs-on: ubuntu-latest +# name: test ${{ matrix.project }} ${{ matrix.type }} +# strategy: +# matrix: +# project: +# - ipfs-repo +# - ipfs-repo-migrations +# type: +# - electron-main +# - electron-renderer +# fail-fast: true +# steps: +# - uses: actions/checkout@v2 +# - uses: actions/setup-node@v1 +# with: +# node-version: 16 +# - run: npm install +# - uses: GabrielBB/xvfb-action@v1 +# with: +# run: npm run test -- --scope=${{ matrix.project }} -- -- -t ${{ matrix.type }} --bail From c8a5bc51b6e125f927d6d4dc868e181348d99867 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 14:52:57 +0100 Subject: [PATCH 23/24] chore: update gh actions --- .github/workflows/main.yml | 2 +- .../ipfs-repo-migrations/test/migrations/migration-10-test.js | 2 +- .../ipfs-repo-migrations/test/migrations/migration-11-test.js | 2 +- .../ipfs-repo-migrations/test/migrations/migration-8-test.js | 2 +- .../ipfs-repo-migrations/test/migrations/migration-9-test.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9df66e7e..c73b2f9d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,7 +52,7 @@ jobs: - firefox type: - browser -# - webworker + - webworker fail-fast: true steps: - uses: actions/checkout@v2 diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js index 6900d96b..391320b8 100644 --- a/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js +++ b/packages/ipfs-repo-migrations/test/migrations/migration-10-test.js @@ -119,7 +119,7 @@ function withLevel (store, LevelImpl) { */ module.exports = (setup, cleanup) => { describe('migration 10', function () { - this.timeout(580 * 1000) + this.timeout(1024 * 1000) /** @type {string} */ let dir /** @type {import('../../src/types').Backends} */ diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js index f118a026..baeff1c7 100644 --- a/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js +++ b/packages/ipfs-repo-migrations/test/migrations/migration-11-test.js @@ -16,7 +16,7 @@ const MFS_ROOT = CID.parse('Qmc42sn2WBHYeAShU3nx8mYkhKVq4sRLapawTaGh4XH4iE') */ module.exports = (setup, cleanup) => { describe('migration 11', function () { - this.timeout(240 * 1000) + this.timeout(1024 * 1000) /** @type {string} */ let dir /** @type {import('../../src/types').Backends} */ diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js index 45c08be6..c816e3ce 100644 --- a/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js +++ b/packages/ipfs-repo-migrations/test/migrations/migration-8-test.js @@ -117,7 +117,7 @@ async function validateBlocks (backends, migrated) { */ module.exports = (setup, cleanup) => { describe('migration 8', function () { - this.timeout(240 * 1000) + this.timeout(1024 * 1000) /** @type {string} */ let dir /** @type {import('../../src/types').Backends} */ diff --git a/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js b/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js index 817ff5d9..b954feac 100644 --- a/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js +++ b/packages/ipfs-repo-migrations/test/migrations/migration-9-test.js @@ -134,7 +134,7 @@ async function assertPinsetRootIsPresent (datastore, pinset) { */ module.exports = (setup, cleanup) => { describe('migration 9', function () { - this.timeout(1000 * 1000) + this.timeout(1024 * 1000) /** @type {string} */ let dir /** @type {import('../../src/types').Backends} */ From 7b4601a192b4ee8918d96a6de54393081b467412 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 9 Sep 2021 16:47:11 +0100 Subject: [PATCH 24/24] chore: update gh actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c73b2f9d..d8867d18 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -46,7 +46,7 @@ jobs: matrix: project: - ipfs-repo - - ipfs-repo-migrations +# - ipfs-repo-migrations browser: - chromium - firefox