@sions/firebase-admin-edge
v0.1.0
Published
Cloudflare Workers compatible Firebase Admin SDK using REST APIs
Downloads
52
Maintainers
Readme
Firebase Admin Edge
Cloudflare Workers compatible Firebase Admin SDK using REST APIs and Web Standard APIs.
Features
- ✅ 100% Cloudflare Workers Compatible - Uses only Web Standard APIs
- ✅ Firebase Authentication - User management, token verification, email links
- ✅ Firebase Realtime Database - Read, write, queries, transactions
- ✅ OAuth2 Token Generation - Service account authentication
- ✅ TypeScript First - Full type definitions included
- ✅ Zero Node.js Dependencies - Works in any JavaScript runtime (Workers, Deno, Bun)
- ✅ Firebase Emulator Support - Local development ready
Installation
npm install @sions/firebase-admin-edgeQuick Start
Environment Variables (Automatic)
Set these environment variables and the SDK will auto-configure:
FIREBASE_ADMIN_PROJECT_ID=your-project-id
FIREBASE_ADMIN_CLIENT_EMAIL=your-service-account@project.iam.gserviceaccount.com
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"Then use the SDK directly:
import { getAuth, verifyIdToken } from '@sions/firebase-admin-edge';
// Verify ID token
const decoded = await verifyIdToken(idToken);
console.log(decoded.uid);
// Get user info
const auth = getAuth();
const user = await auth.getUser(decoded.uid);
console.log(user.email);Explicit Initialization
import { initializeApp, getAuth, getDatabase } from '@sions/firebase-admin-edge';
// Initialize once at app startup
initializeApp({
projectId: 'your-project-id',
clientEmail: '[email protected]',
privateKey: process.env.FIREBASE_PRIVATE_KEY!
});
// Use Auth
const auth = getAuth();
const user = await auth.getUser('user-uid');
// Use Database
const db = getDatabase();
const snapshot = await db.ref('/users').get();Usage Examples
Authentication
Verify ID Token
import { verifyIdToken } from '@sions/firebase-admin-edge';
const decoded = await verifyIdToken(idToken);
console.log('User ID:', decoded.uid);
console.log('Email:', decoded.email);User Management
import { getAuth } from '@sions/firebase-admin-edge';
const auth = getAuth();
// Get user by UID
const user = await auth.getUser('user-uid');
// Get user by email
const userByEmail = await auth.getUserByEmail('[email protected]');
// Create new user
const newUser = await auth.createUser({
email: '[email protected]',
password: 'SecurePassword123!',
displayName: 'New User'
});
// Update user
await auth.updateUser('user-uid', {
displayName: 'Updated Name',
photoURL: 'https://example.com/photo.jpg'
});
// Delete user
await auth.deleteUser('user-uid');Email Action Links
import { generatePasswordResetLink, generateEmailVerificationLink } from '@sions/firebase-admin-edge';
// Generate password reset link
const resetLink = await generatePasswordResetLink('[email protected]');
console.log('Reset link:', resetLink);
// Generate email verification link
const verifyLink = await generateEmailVerificationLink('[email protected]');
console.log('Verification link:', verifyLink);Realtime Database
Basic Operations
import { getDatabase } from '@sions/firebase-admin-edge';
const db = getDatabase();
// Read data
const snapshot = await db.ref('/users/user-id').get();
const data = snapshot.val();
// Write data
await db.ref('/users/user-id').set({
name: 'John Doe',
email: '[email protected]'
});
// Update data
await db.ref('/users/user-id').update({
lastLogin: Date.now()
});
// Delete data
await db.ref('/users/user-id/temp').remove();
// Push new child
const newRef = db.ref('/posts').push();
await newRef.set({
title: 'New Post',
content: 'Hello World'
});Queries
const db = getDatabase();
// Order by child
const byAge = await db.ref('/users')
.orderByChild('age')
.get();
// Limit results
const topUsers = await db.ref('/users')
.orderByChild('score')
.limitToLast(10)
.get();
// Range queries
const adults = await db.ref('/users')
.orderByChild('age')
.startAt(18)
.endAt(100)
.get();
// Equal to
const admin = await db.ref('/users')
.orderByChild('role')
.equalTo('admin')
.get();Transactions
const db = getDatabase();
// Atomic counter increment
const result = await db.ref('/counters/visits').transaction((current) => {
return (current || 0) + 1;
});
console.log('New count:', result.snapshot.val());
console.log('Committed:', result.committed);Cloudflare Workers Example
// worker.ts
import { initializeApp, verifyIdToken, getDatabase } from '@sions/firebase-admin-edge';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Initialize with Workers environment variables
initializeApp({
projectId: env.FIREBASE_PROJECT_ID,
clientEmail: env.FIREBASE_CLIENT_EMAIL,
privateKey: env.FIREBASE_PRIVATE_KEY
});
// Verify authorization token
const authHeader = request.headers.get('Authorization');
if (!authHeader?.startsWith('Bearer ')) {
return new Response('Unauthorized', { status: 401 });
}
const idToken = authHeader.substring(7);
const decoded = await verifyIdToken(idToken);
// Access database
const db = getDatabase();
const userData = await db.ref(`/users/${decoded.uid}`).get();
return Response.json({
user: decoded,
data: userData.val()
});
}
};Firebase Emulator Support
import { initializeApp } from '@sions/firebase-admin-edge';
initializeApp({
projectId: 'demo-project',
clientEmail: '[email protected]',
privateKey: '-----BEGIN PRIVATE KEY-----\nfake-key\n-----END PRIVATE KEY-----\n',
authEmulatorHost: '127.0.0.1:9099',
databaseEmulatorHost: '127.0.0.1:9000'
});Or use environment variables:
VITE_USE_FIREBASE_EMULATOR=true
VITE_FIREBASE_AUTH_EMULATOR_HOST=127.0.0.1:9099
VITE_FIREBASE_DATABASE_EMULATOR_HOST=127.0.0.1:9000API Reference
Authentication
getAuth()- Get Auth instanceverifyIdToken(token)- Verify Firebase ID tokengetUser(uid)- Get user by UIDgetUserByEmail(email)- Get user by emailcreateUser(request)- Create new userupdateUser(uid, request)- Update userdeleteUser(uid)- Delete usergeneratePasswordResetLink(email)- Generate password reset linkgenerateEmailVerificationLink(email)- Generate email verification link
Database
getDatabase()- Get Database instanceref(path)- Get reference to pathget()- Read dataset(value)- Write dataupdate(values)- Update dataremove()- Delete datapush()- Generate new child locationtransaction(updateFn)- Atomic transactionorderByChild(path)- Order query by childorderByKey()- Order query by keyorderByValue()- Order query by valuelimitToFirst(limit)- Limit to first NlimitToLast(limit)- Limit to last NstartAt(value)- Range startendAt(value)- Range endequalTo(value)- Equal to value
Configuration
initializeApp(config)- Initialize SDKgetProjectId()- Get project IDisEmulatorMode()- Check if using emulatorgetEnvironmentMode()- Get current mode
Utilities
getAccessToken()- Get OAuth2 access tokenclearTokenCache()- Clear token cacheisTokenExpired(token)- Check if token expiredgeneratePushId()- Generate Firebase push ID
TypeScript Support
Full TypeScript definitions included:
import type {
UserRecord,
DecodedIdToken,
CreateUserRequest,
UpdateUserRequest,
DataSnapshot,
TransactionResult
} from '@sions/firebase-admin-edge';Error Handling
import {
FirebaseError,
FirebaseAuthError,
FirebaseDatabaseError,
isFirebaseError
} from '@sions/firebase-admin-edge';
try {
await auth.getUser('invalid-uid');
} catch (error) {
if (isFirebaseError(error)) {
console.error('Firebase error:', error.code, error.message);
}
}Compatibility
✅ Works In
- Cloudflare Workers
- Deno
- Bun
- Node.js 18+
- Any modern JavaScript runtime with Web Standard APIs
✅ Uses Only
- Web Standard APIs (fetch, Web Crypto API)
joselibrary (Web Crypto-based JWT)- Pure TypeScript/JavaScript
❌ No Dependencies On
- Node.js built-in modules (
fs,path,crypto,http, etc.) - Node.js-specific APIs (
Buffer,process.*) - Native binaries
License
Apache-2.0
Contributing
Contributions welcome! This project maintains 100% Cloudflare Workers compatibility.
Development Guidelines
- Use only Web Standard APIs
- No Node.js built-in modules
- Test with Firebase Emulator
- Maintain TypeScript strict mode
Links
Support
- Create an issue on GitHub for bug reports
- Check existing issues before creating new ones
- Include error messages and runtime environment details
