firestore-queue
Version:
A powerful, scalable queue system built on Google Firestore with time-based indexing, auto-configuration, and connection reuse
163 lines โข 6.57 kB
JavaScript
;
/**
* Super Simple Fire Queue Usage
* Only requires: projectId, serviceAccountPath, and topic name
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.superSimpleExample = superSimpleExample;
exports.evenSimplerExample = evenSimplerExample;
exports.configurationExample = configurationExample;
const simple_setup_1 = require("../utils/simple-setup");
async function superSimpleExample() {
console.log('๐ฅ Fire Queue - Super Simple Usage');
console.log('==================================\n');
// โจ MINIMAL SETUP - Only 3 things needed!
const config = {
projectId: 'your-project-id',
serviceAccountPath: './firebase-service-account.json',
topic: 'my_queue', // This becomes your queue name
// dbId: 'custom-db', // Optional - defaults to "firequeue" (auto-created)
// firestoreInstance: myFirestoreInstance, // Optional - reuse existing connection
};
try {
// 1๏ธโฃ Create and initialize queue (one line!)
console.log('๐ Setting up Fire Queue...');
console.log('๐ Checking/creating "firequeue" database...');
const { enqueue, consume, getMetrics, shutdown } = await (0, simple_setup_1.createReadyQueue)(config);
console.log('โ
Queue ready!\n');
// 2๏ธโฃ Start producing messages (super simple!)
console.log('๐ Adding messages to queue...');
await enqueue('user_signup', {
userId: 'user123',
email: 'john@example.com',
timestamp: Date.now(),
});
await enqueue('send_email', {
to: 'john@example.com',
subject: 'Welcome!',
template: 'welcome',
}, {
priority: 1, // High priority
tags: ['email', 'welcome'],
});
await enqueue('process_payment', {
orderId: 'order456',
amount: 99.99,
currency: 'USD',
}, {
priority: 2,
ttlSeconds: 1800, // 30 minutes to process
});
console.log('โ
Messages added!\n');
// 3๏ธโฃ Start consuming (also super simple!)
console.log('๐ค Starting consumer...');
await consume('my-worker', async (messages) => {
console.log(`๐ฆ Processing ${messages.length} messages:`);
for (const message of messages) {
console.log(` โข ${message.type}: ${JSON.stringify(message.payload)}`);
// Simulate processing
await new Promise(resolve => setTimeout(resolve, 100));
// Auto-acknowledge (handled by wrapper)
await message.ack();
}
});
console.log('โ
Consumer started!\n');
// 4๏ธโฃ Let it run for a bit
console.log('โณ Processing for 30 seconds...');
await new Promise(resolve => setTimeout(resolve, 30000));
// 5๏ธโฃ Check metrics
console.log('\n๐ Queue Metrics:');
const metrics = await getMetrics();
console.log(` Total Messages: ${metrics.totalMessages}`);
console.log(` Pending: ${metrics.pendingMessages}`);
console.log(` Completed: ${metrics.completedMessages}`);
console.log(` Failed: ${metrics.failedMessages}`);
// 6๏ธโฃ Clean shutdown
console.log('\n๐งน Shutting down...');
await shutdown();
console.log('โ
Done!');
}
catch (error) {
console.error('โ Error:', error);
}
}
async function evenSimplerExample() {
console.log('\n๐ Even Simpler with Auto-Consumer');
console.log('===================================\n');
// This creates queue + consumer in one call!
const { enqueue, shutdown } = await (0, simple_setup_1.createQueueWithConsumer)({
projectId: 'your-project-id',
serviceAccountPath: './firebase-service-account.json',
topic: 'simple_queue',
}, 'auto-worker', async (messages) => {
// Just process the messages - ack/nack handled automatically
for (const message of messages) {
console.log(`๐ Auto-processing: ${message.type}`);
if (message.type === 'error_test') {
throw new Error('Simulated error'); // Will auto-nack
}
// Will auto-ack if no error thrown
}
});
// Add some test messages
await enqueue('greeting', { message: 'Hello World!' });
await enqueue('calculation', { x: 5, y: 3, operation: 'add' });
await enqueue('error_test', { this: 'will fail' }); // This will fail and retry
// Let it process
await new Promise(resolve => setTimeout(resolve, 10000));
await shutdown();
console.log('โ
Auto-consumer example done!');
}
async function configurationExample() {
console.log('\nโ๏ธ Configuration Example');
console.log('========================\n');
// Show different configuration options
const configs = [
{
name: 'Default Database',
config: {
projectId: 'my-project',
serviceAccountPath: './firebase-service-account.json',
topic: 'default_queue',
// dbId defaults to "(default)"
},
},
{
name: 'Custom Database',
config: {
projectId: 'my-project',
serviceAccountPath: './firebase-service-account.json',
topic: 'custom_queue',
dbId: 'us-central1', // Custom database
},
},
{
name: 'Different Topic',
config: {
projectId: 'my-project',
serviceAccountPath: './firebase-service-account.json',
topic: 'analytics_events', // Different queue name
},
},
];
for (const { name, config } of configs) {
console.log(`๐ ${name}:`);
console.log(` Project: ${config.projectId}`);
console.log(` Database: ${config.dbId || '(default)'}`);
console.log(` Queue: ${config.topic}`);
console.log(` Collection: ${config.topic}`);
console.log(` Consumer Collection: ${config.topic}_consumers`);
console.log('');
}
}
// Run all examples
async function runAllExamples() {
await superSimpleExample();
await evenSimplerExample();
await configurationExample();
}
if (require.main === module) {
runAllExamples().catch(console.error);
}
//# sourceMappingURL=super-simple-usage.js.map