diff --git a/deploy/nixos/live.nix b/deploy/nixos/live.nix index 44849f5..1f47608 100644 --- a/deploy/nixos/live.nix +++ b/deploy/nixos/live.nix @@ -18,18 +18,54 @@ let bindingsStore = pnpmStore + "/bindings@1.5.0/node_modules"; fileUriStore = pnpmStore + "/file-uri-to-path@1.0.0/node_modules"; + # HAL package (workspace dep, resolved via symlink in pnpm) + halDir = machineDir + "/../../packages/hal"; + # serialport and its transitive native deps (required by @lamassu/hal at runtime) + serialportStore = pnpmStore + "/serialport@12.0.0/node_modules"; + serialportStreamStore = pnpmStore + "/@serialport+stream@12.0.0/node_modules/@serialport"; + serialportBindingsCppStore = pnpmStore + "/@serialport+bindings-cpp@12.0.1/node_modules/@serialport"; + serialportBindingsIfaceStore = pnpmStore + "/@serialport+bindings-interface@1.2.2/node_modules/@serialport"; + serialportBindingMockStore = pnpmStore + "/@serialport+binding-mock@10.2.2/node_modules/@serialport"; + debugStore = pnpmStore + "/debug@4.3.4/node_modules"; + msStore = pnpmStore + "/ms@2.1.2/node_modules"; + nodeAddonApiStore = pnpmStore + "/node-addon-api@7.0.0/node_modules"; + nodeGypBuildStore = pnpmStore + "/node-gyp-build@4.6.0/node_modules"; + lodashEsStore = pnpmStore + "/lodash-es@4.17.23/node_modules"; + atm-app = assert machineDir != "" || throw "MACHINE_DIR env var must be set (use build-iso.sh or: export MACHINE_DIR=/path/to/apps/machine)"; pkgs.runCommand "lamassu-atm-app" { } '' - mkdir -p $out/node_modules + mkdir -p $out/node_modules/@lamassu $out/node_modules/@serialport cp -r ${builtins.path { path = machineDir + "/dist"; name = "dist"; }} $out/dist cp -r ${builtins.path { path = machineDir + "/dist-electron"; name = "dist-electron"; }} $out/dist-electron cp ${builtins.path { path = machineDir + "/package.json"; name = "package.json"; }} $out/package.json + # Native modules required at runtime (not bundled by Vite) # Resolved from pnpm virtual store to get real files (not symlinks) cp -rL ${builtins.path { path = betterSqliteStore + "/better-sqlite3"; name = "better-sqlite3"; }} $out/node_modules/better-sqlite3 cp -rL ${builtins.path { path = bindingsStore + "/bindings"; name = "bindings"; }} $out/node_modules/bindings cp -rL ${builtins.path { path = fileUriStore + "/file-uri-to-path"; name = "file-uri-to-path"; }} $out/node_modules/file-uri-to-path + + # @lamassu/hal (workspace package, dynamically imported for hardware access) + mkdir -p $out/node_modules/@lamassu/hal + cp -rL ${builtins.path { path = halDir + "/dist"; name = "hal-dist"; }}/* $out/node_modules/@lamassu/hal/ + cp ${builtins.path { path = halDir + "/package.json"; name = "hal-package-json"; }} $out/node_modules/@lamassu/hal/package.json + + # serialport and transitive deps (native module chain for RS232 hardware) + cp -rL ${builtins.path { path = serialportStore + "/serialport"; name = "serialport"; }} $out/node_modules/serialport + cp -rL ${builtins.path { path = serialportStreamStore + "/stream"; name = "serialport-stream"; }} $out/node_modules/@serialport/stream + # bindings-cpp: copy only dist/ + prebuilds/ + package.json (build/ has broken symlinks) + mkdir -p $out/node_modules/@serialport/bindings-cpp + cp -rL ${builtins.path { path = serialportBindingsCppStore + "/bindings-cpp/dist"; name = "serialport-bindings-cpp-dist"; }} $out/node_modules/@serialport/bindings-cpp/dist + cp -rL ${builtins.path { path = serialportBindingsCppStore + "/bindings-cpp/prebuilds"; name = "serialport-bindings-cpp-prebuilds"; }} $out/node_modules/@serialport/bindings-cpp/prebuilds + cp ${builtins.path { path = serialportBindingsCppStore + "/bindings-cpp/package.json"; name = "serialport-bindings-cpp-pkg"; }} $out/node_modules/@serialport/bindings-cpp/package.json + cp -rL ${builtins.path { path = serialportBindingsIfaceStore + "/bindings-interface"; name = "serialport-bindings-interface"; }} $out/node_modules/@serialport/bindings-interface + cp -rL ${builtins.path { path = serialportBindingMockStore + "/binding-mock"; name = "serialport-binding-mock"; }} $out/node_modules/@serialport/binding-mock + cp -rL ${builtins.path { path = debugStore + "/debug"; name = "debug"; }} $out/node_modules/debug + cp -rL ${builtins.path { path = msStore + "/ms"; name = "ms"; }} $out/node_modules/ms + cp -rL ${builtins.path { path = nodeAddonApiStore + "/node-addon-api"; name = "node-addon-api"; }} $out/node_modules/node-addon-api + cp -rL ${builtins.path { path = nodeGypBuildStore + "/node-gyp-build"; name = "node-gyp-build"; }} $out/node_modules/node-gyp-build + cp -rL ${builtins.path { path = lodashEsStore + "/lodash-es"; name = "lodash-es"; }} $out/node_modules/lodash-es ''; # .env template with regtest defaults pointing to the dev machine @@ -42,8 +78,8 @@ let VITE_EXTENSION_API_URL=https://lp-ext.atm.aiolabs.dev VITE_APP_ID=6016dadc6c677f131bc82cc0cb780d2b1090b83b8b7d0c972e469010270a4208 VITE_LNDCONNECT_URL=lndconnect://lnd.atm.aiolabs.dev:443?cert=&macaroon=AgEDbG5kAvgBAwoQjLYgcUni_8EKmwpX_vwOWxIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgClsDux9_gPaKUK7PI54y-sTwt5WGmSzrzfKaKamwvK0 - VITE_LAMASSU_MACHINE_MODEL=sintra - VITE_LAMASSU_FIAT_CODE=USD + VITE_LAMASSU_MACHINE_MODEL=douro + VITE_LAMASSU_FIAT_CODE=GTQ ELECTRON_FORCE_PROD=1 DISPLAY=:0 ''; diff --git a/packages/hal/src/dispensers/puloon/index.ts b/packages/hal/src/dispensers/puloon/index.ts index 8f1ff15..63186e9 100644 --- a/packages/hal/src/dispensers/puloon/index.ts +++ b/packages/hal/src/dispensers/puloon/index.ts @@ -47,23 +47,15 @@ export class PuloonDispenser implements BillDispenser { } async dispense(notes: number[]): Promise<{ value: DispenseResult[]; error?: Error }> { - try { - const { bills, error } = await this.device.dispense(notes) + const { bills, error } = await this.device.dispense(notes) - if (error) { - this.close() - ;(error as Error & { name: string; statusCode: number }).name = 'PuloonDispenseError' - ;(error as Error & { statusCode: number }).statusCode = 570 - } - - return { value: bills, error } - } catch (err) { + if (error) { this.close() - const error = err as Error - ;(error as Error & { name: string; statusCode: number }).name = 'PuloonDispenseError' - ;(error as Error & { statusCode: number }).statusCode = 570 - return { value: [], error } + error.name = 'PuloonDispenseError' + console.log('PULOON | dispense error', error) } + + return { value: bills, error } } close(): void {