Docker: moved all docker files to docker/ tree (was conflated with upstream Dockerfile at root + server/Dockerfile). Single container now: caddy (front, serves static + proxies /api /ws) + node backend (internal :4001). Node never exposed. entrypoint.sh runs both. Compose: one service. Blank page root cause: storage adapters had inconsistent module systems. firebase.js = ESM (export). ws.js + memory.js = CJS (module.exports). CRA prod build = ESM strict -> CJS runtime crash, blank root. Dev mode lenient, masked bug. First ws prod build (docker) = first exposure. Never dev/prod split intended; just inconsistency from M2 era. Fix: all adapters ESM. ws.js lazy-loads 'ws' pkg via dynamic import() (Node/jest only; browser uses global WebSocket). index.js static imports. server jest: added babel.config.js (preset-env, node target) to transform ESM for jest. Test: src/tests/StorageEsm.test.js — 4 tests grep all adapters for module.exports / require(). Regression guard catches CJS leak. Verified: docker page renders (root 4534 chars, UI visible). server 24 green, shared 90 green, FE ESM 4 green.
48 lines
1.7 KiB
JavaScript
48 lines
1.7 KiB
JavaScript
// src/storage/index.js — storage factory + SDK re-exports.
|
|
// STORAGE=firebase (default): adapter wraps SDK. STORAGE=ws: backend.
|
|
// App.js imports getStorage() for subscribe; still imports SDK pieces for writes (per-group refactor pending).
|
|
|
|
import { initializeApp } from 'firebase/app';
|
|
import {
|
|
getAuth, signInAnonymously, onAuthStateChanged, signInWithCustomToken,
|
|
} from 'firebase/auth';
|
|
import {
|
|
getFirestore, doc, setDoc, getDoc, getDocs, addDoc, collection,
|
|
onSnapshot, updateDoc, deleteDoc, query, orderBy, limit, writeBatch,
|
|
} from 'firebase/firestore';
|
|
import { initFirebase, createFirebaseStorage } from './firebase';
|
|
import { createWsStorage } from './ws';
|
|
import { createMemoryStorage } from './memory';
|
|
|
|
let storageInstance = null;
|
|
|
|
// Returns adapter instance implementing interface (getDoc/setDoc/subscribeDoc/etc).
|
|
export function getStorage() {
|
|
if (storageInstance) return storageInstance;
|
|
const mode = process.env.REACT_APP_STORAGE || 'firebase';
|
|
if (mode === 'firebase') {
|
|
const ok = initFirebase();
|
|
if (!ok) throw new Error('Firebase config missing. Check REACT_APP_FIREBASE_* env.');
|
|
storageInstance = createFirebaseStorage();
|
|
} else if (mode === 'ws') {
|
|
storageInstance = createWsStorage({
|
|
baseUrl: process.env.REACT_APP_BACKEND_URL || '',
|
|
wsUrl: process.env.REACT_APP_BACKEND_WS || '',
|
|
});
|
|
} else {
|
|
storageInstance = createMemoryStorage();
|
|
}
|
|
return storageInstance;
|
|
}
|
|
|
|
export function getStorageMode() {
|
|
return process.env.REACT_APP_STORAGE || 'firebase';
|
|
}
|
|
|
|
export {
|
|
initializeApp,
|
|
getAuth, signInAnonymously, onAuthStateChanged, signInWithCustomToken,
|
|
getFirestore, doc, setDoc, getDoc, getDocs, addDoc, collection,
|
|
onSnapshot, updateDoc, deleteDoc, query, orderBy, limit, writeBatch,
|
|
};
|