diff --git a/src/services/modules/snapshot/snapshot.services.ts b/src/services/modules/snapshot/snapshot.services.ts index 951d9f4..9d63b04 100644 --- a/src/services/modules/snapshot/snapshot.services.ts +++ b/src/services/modules/snapshot/snapshot.services.ts @@ -3,6 +3,7 @@ import type {snapshot_id} from '@icp-sdk/canisters/ic-management'; import {encodeSnapshotId} from '@icp-sdk/canisters/ic-management'; import {Principal} from '@icp-sdk/core/principal'; import {nextArg} from '@junobuild/cli-tools'; +import {red} from 'kleur'; import ora from 'ora'; import { deleteCanisterSnapshot, @@ -19,7 +20,11 @@ import { loadSnapshotAndAssertOverwrite } from './_snapshot.loader.services'; import {downloadExistingSnapshot} from './snapshot.download.services'; -import {uploadExistingSnapshot} from './snapshot.upload.services'; +import { + SnapshotAssertError, + SnapshotFsReadError, + uploadExistingSnapshot +} from './snapshot.upload.services'; export const createSnapshot = async ({ canisterId: cId, @@ -164,12 +169,25 @@ export const uploadSnapshot = async ({ const {snapshotId} = await loadSnapshotAndAssertOverwrite({canisterId, segment}); - await uploadExistingSnapshot({ + const result = await uploadExistingSnapshot({ canisterId, snapshotId, segment, folder }); + + if (result.success) { + return; + } + + const {err} = result; + + if (err instanceof SnapshotFsReadError || err instanceof SnapshotAssertError) { + console.log(red(err.message)); + process.exit(1); + } + + throw err; }; const restoreExistingSnapshot = async ({ diff --git a/src/services/modules/snapshot/snapshot.upload.services.ts b/src/services/modules/snapshot/snapshot.upload.services.ts index 6768d83..aa16119 100644 --- a/src/services/modules/snapshot/snapshot.upload.services.ts +++ b/src/services/modules/snapshot/snapshot.upload.services.ts @@ -4,7 +4,6 @@ import { type snapshot_id, type UploadCanisterSnapshotDataKind } from '@icp-sdk/canisters/ic-management'; -import {red} from 'kleur'; import {lstatSync} from 'node:fs'; import {type FileHandle, open as openFile, readFile} from 'node:fs/promises'; import {join, relative} from 'node:path'; @@ -30,8 +29,8 @@ interface DataChunk { size: number; } -class SnapshotAssertError extends Error {} -class SnapshotFsReadError extends Error {} +export class SnapshotAssertError extends Error {} +export class SnapshotFsReadError extends Error {} export const uploadExistingSnapshot = async ({ segment, @@ -39,7 +38,12 @@ export const uploadExistingSnapshot = async ({ }: UploadSnapshotParams & { segment: AssetKey; folder: string; -}): Promise => { +}): Promise< + | { + success: true; + } + | {success: false; err: unknown} +> => { const spinner = ora('Uploading the snapshot...').start(); try { @@ -55,15 +59,12 @@ export const uploadExistingSnapshot = async ({ console.log( `✅ The snapshot ${snapshotIdText} for your ${displaySegment(segment)} has been uploaded.` ); - } catch (error: unknown) { - spinner.stop(); - if (error instanceof SnapshotFsReadError || error instanceof SnapshotAssertError) { - console.log(red(error.message)); - return; - } + return {success: true}; + } catch (err: unknown) { + spinner.stop(); - throw error; + return {success: false, err}; } };