UNPKG

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
#!/usr/bin/env ts-node "use strict"; /** * 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