worker-que 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/DASHBOARD-QUICKSTART.md +278 -0
  2. package/DASHBOARD.md +556 -0
  3. package/LICENSE +21 -0
  4. package/README.md +414 -0
  5. package/SSL-QUICK-REFERENCE.md +225 -0
  6. package/SSL.md +516 -0
  7. package/dist/client.d.ts +11 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +64 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/dashboard/index.d.ts +34 -0
  12. package/dist/dashboard/index.d.ts.map +1 -0
  13. package/dist/dashboard/index.js +164 -0
  14. package/dist/dashboard/index.js.map +1 -0
  15. package/dist/dashboard/service.d.ts +66 -0
  16. package/dist/dashboard/service.d.ts.map +1 -0
  17. package/dist/dashboard/service.js +201 -0
  18. package/dist/dashboard/service.js.map +1 -0
  19. package/dist/dashboard/views.d.ts +3 -0
  20. package/dist/dashboard/views.d.ts.map +1 -0
  21. package/dist/dashboard/views.js +786 -0
  22. package/dist/dashboard/views.js.map +1 -0
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +29 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/job.d.ts +19 -0
  28. package/dist/job.d.ts.map +1 -0
  29. package/dist/job.js +36 -0
  30. package/dist/job.js.map +1 -0
  31. package/dist/sql.d.ts +8 -0
  32. package/dist/sql.d.ts.map +1 -0
  33. package/dist/sql.js +57 -0
  34. package/dist/sql.js.map +1 -0
  35. package/dist/types.d.ts +90 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +3 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +6 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +31 -0
  42. package/dist/utils.js.map +1 -0
  43. package/dist/worker.d.ts +19 -0
  44. package/dist/worker.d.ts.map +1 -0
  45. package/dist/worker.js +99 -0
  46. package/dist/worker.js.map +1 -0
  47. package/migrations/schema.sql +26 -0
  48. package/package.json +105 -0
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DashboardService = void 0;
4
+ exports.createDashboard = createDashboard;
5
+ const express_1 = require("express");
6
+ const service_1 = require("./service");
7
+ Object.defineProperty(exports, "DashboardService", { enumerable: true, get: function () { return service_1.DashboardService; } });
8
+ const views_1 = require("./views");
9
+ /**
10
+ * Creates an Express router with the Que dashboard
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import express from 'express';
15
+ * import { Pool } from 'pg';
16
+ * import { createDashboard } from 'que-ts/dashboard';
17
+ *
18
+ * const app = express();
19
+ * const pool = new Pool({ ... });
20
+ *
21
+ * app.use('/admin/queue', createDashboard(pool, {
22
+ * title: 'My App Queue',
23
+ * auth: (req, res, next) => {
24
+ * // Add your authentication logic
25
+ * return req.isAuthenticated();
26
+ * }
27
+ * }));
28
+ * ```
29
+ */
30
+ function createDashboard(pool, options = {}) {
31
+ const router = (0, express_1.Router)();
32
+ const service = new service_1.DashboardService(pool, options);
33
+ const authMiddleware = options.auth;
34
+ // Authentication middleware wrapper
35
+ const requireAuth = async (req, res, next) => {
36
+ if (authMiddleware) {
37
+ try {
38
+ const allowed = await authMiddleware(req, res, next);
39
+ if (!allowed) {
40
+ res.status(403).json({ error: 'Access denied' });
41
+ return;
42
+ }
43
+ }
44
+ catch (error) {
45
+ res.status(500).json({ error: 'Authentication error' });
46
+ return;
47
+ }
48
+ }
49
+ next();
50
+ };
51
+ // Apply auth to all routes
52
+ router.use(requireAuth);
53
+ // Main dashboard page
54
+ router.get('/', async (req, res) => {
55
+ try {
56
+ const html = (0, views_1.getDashboardHTML)(service.getOptions());
57
+ res.type('html').send(html);
58
+ }
59
+ catch (error) {
60
+ res.status(500).json({ error: 'Failed to load dashboard' });
61
+ }
62
+ });
63
+ // API: Get queue statistics
64
+ router.get('/api/stats', async (req, res) => {
65
+ try {
66
+ const stats = await service.getStats();
67
+ res.json(stats);
68
+ }
69
+ catch (error) {
70
+ console.error('Error fetching stats:', error);
71
+ res.status(500).json({ error: 'Failed to fetch statistics' });
72
+ }
73
+ });
74
+ // API: Get jobs list
75
+ router.get('/api/jobs', async (req, res) => {
76
+ try {
77
+ const { queue, jobClass, status, limit, offset, } = req.query;
78
+ const result = await service.getJobs({
79
+ queue: queue,
80
+ jobClass: jobClass,
81
+ status: status,
82
+ limit: limit ? parseInt(limit) : undefined,
83
+ offset: offset ? parseInt(offset) : undefined,
84
+ });
85
+ res.json(result);
86
+ }
87
+ catch (error) {
88
+ console.error('Error fetching jobs:', error);
89
+ res.status(500).json({ error: 'Failed to fetch jobs' });
90
+ }
91
+ });
92
+ // API: Get single job details
93
+ router.get('/api/jobs/:id', async (req, res) => {
94
+ try {
95
+ const jobId = parseInt(req.params.id);
96
+ const job = await service.getJob(jobId);
97
+ if (!job) {
98
+ res.status(404).json({ error: 'Job not found' });
99
+ return;
100
+ }
101
+ res.json(job);
102
+ }
103
+ catch (error) {
104
+ console.error('Error fetching job:', error);
105
+ res.status(500).json({ error: 'Failed to fetch job' });
106
+ }
107
+ });
108
+ // API: Delete a job
109
+ router.delete('/api/jobs/:id', async (req, res) => {
110
+ try {
111
+ const jobId = parseInt(req.params.id);
112
+ const deleted = await service.deleteJob(jobId);
113
+ if (!deleted) {
114
+ res.status(404).json({ error: 'Job not found' });
115
+ return;
116
+ }
117
+ res.json({ success: true, message: 'Job deleted' });
118
+ }
119
+ catch (error) {
120
+ console.error('Error deleting job:', error);
121
+ res.status(500).json({ error: 'Failed to delete job' });
122
+ }
123
+ });
124
+ // API: Retry a failed job
125
+ router.post('/api/jobs/:id/retry', async (req, res) => {
126
+ try {
127
+ const jobId = parseInt(req.params.id);
128
+ const retried = await service.retryJob(jobId);
129
+ if (!retried) {
130
+ res.status(404).json({ error: 'Job not found' });
131
+ return;
132
+ }
133
+ res.json({ success: true, message: 'Job queued for retry' });
134
+ }
135
+ catch (error) {
136
+ console.error('Error retrying job:', error);
137
+ res.status(500).json({ error: 'Failed to retry job' });
138
+ }
139
+ });
140
+ // API: Get available queues
141
+ router.get('/api/queues', async (req, res) => {
142
+ try {
143
+ const queues = await service.getQueues();
144
+ res.json(queues);
145
+ }
146
+ catch (error) {
147
+ console.error('Error fetching queues:', error);
148
+ res.status(500).json({ error: 'Failed to fetch queues' });
149
+ }
150
+ });
151
+ // API: Get available job classes
152
+ router.get('/api/job-classes', async (req, res) => {
153
+ try {
154
+ const jobClasses = await service.getJobClasses();
155
+ res.json(jobClasses);
156
+ }
157
+ catch (error) {
158
+ console.error('Error fetching job classes:', error);
159
+ res.status(500).json({ error: 'Failed to fetch job classes' });
160
+ }
161
+ });
162
+ return router;
163
+ }
164
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Pool } from 'pg';
2
+ export interface QueueStats {
3
+ total: number;
4
+ scheduled: number;
5
+ ready: number;
6
+ failed: number;
7
+ errorRate: number;
8
+ avgErrorCount: number;
9
+ oldestJob: Date | null;
10
+ newestJob: Date | null;
11
+ totalByQueue: Array<{
12
+ queue: string;
13
+ count: number;
14
+ }>;
15
+ totalByClass: Array<{
16
+ jobClass: string;
17
+ count: number;
18
+ }>;
19
+ recentFailures: Array<{
20
+ id: number;
21
+ jobClass: string;
22
+ queue: string;
23
+ errorCount: number;
24
+ lastError: string;
25
+ runAt: Date;
26
+ }>;
27
+ }
28
+ export interface Job {
29
+ id: number;
30
+ queue: string;
31
+ priority: number;
32
+ runAt: Date;
33
+ jobClass: string;
34
+ args: unknown[];
35
+ errorCount: number;
36
+ lastError?: string;
37
+ }
38
+ export interface DashboardOptions {
39
+ title?: string;
40
+ basePath?: string;
41
+ refreshInterval?: number;
42
+ maxRecentFailures?: number;
43
+ }
44
+ export declare class DashboardService {
45
+ private pool;
46
+ private options;
47
+ constructor(pool: Pool, options?: DashboardOptions);
48
+ getStats(): Promise<QueueStats>;
49
+ getJobs(options?: {
50
+ queue?: string;
51
+ jobClass?: string;
52
+ status?: 'ready' | 'scheduled' | 'failed' | 'all';
53
+ limit?: number;
54
+ offset?: number;
55
+ }): Promise<{
56
+ jobs: Job[];
57
+ total: number;
58
+ }>;
59
+ getJob(jobId: number): Promise<Job | null>;
60
+ deleteJob(jobId: number): Promise<boolean>;
61
+ retryJob(jobId: number): Promise<boolean>;
62
+ getQueues(): Promise<string[]>;
63
+ getJobClasses(): Promise<string[]>;
64
+ getOptions(): Required<DashboardOptions>;
65
+ }
66
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/dashboard/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,cAAc,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,IAAI,CAAC;KACb,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,gBAAqB;IAUhD,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IA2G/B,OAAO,CAAC,OAAO,GAAE;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAC;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoE1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IA2B1C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAczC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9B,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASxC,UAAU,IAAI,QAAQ,CAAC,gBAAgB,CAAC;CAGzC"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DashboardService = void 0;
4
+ class DashboardService {
5
+ constructor(pool, options = {}) {
6
+ this.pool = pool;
7
+ this.options = {
8
+ title: options.title || 'Que Dashboard',
9
+ basePath: options.basePath || '/que',
10
+ refreshInterval: options.refreshInterval || 5000,
11
+ maxRecentFailures: options.maxRecentFailures || 50,
12
+ };
13
+ }
14
+ async getStats() {
15
+ const now = new Date();
16
+ // Get total count
17
+ const totalResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs');
18
+ const total = parseInt(totalResult.rows[0].count);
19
+ // Get scheduled jobs (future run_at)
20
+ const scheduledResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE run_at > $1', [now]);
21
+ const scheduled = parseInt(scheduledResult.rows[0].count);
22
+ // Get ready jobs (past run_at)
23
+ const readyResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE run_at <= $1', [now]);
24
+ const ready = parseInt(readyResult.rows[0].count);
25
+ // Get failed jobs (error_count > 0)
26
+ const failedResult = await this.pool.query('SELECT COUNT(*) as count FROM que_jobs WHERE error_count > 0');
27
+ const failed = parseInt(failedResult.rows[0].count);
28
+ // Calculate error rate
29
+ const errorRate = total > 0 ? (failed / total) * 100 : 0;
30
+ // Get average error count
31
+ const avgErrorResult = await this.pool.query('SELECT AVG(error_count) as avg FROM que_jobs WHERE error_count > 0');
32
+ const avgErrorCount = parseFloat(avgErrorResult.rows[0].avg) || 0;
33
+ // Get oldest and newest jobs
34
+ const oldestResult = await this.pool.query('SELECT run_at FROM que_jobs ORDER BY run_at ASC LIMIT 1');
35
+ const oldestJob = oldestResult.rows[0]?.run_at || null;
36
+ const newestResult = await this.pool.query('SELECT run_at FROM que_jobs ORDER BY run_at DESC LIMIT 1');
37
+ const newestJob = newestResult.rows[0]?.run_at || null;
38
+ // Get jobs by queue
39
+ const byQueueResult = await this.pool.query(`
40
+ SELECT queue, COUNT(*) as count
41
+ FROM que_jobs
42
+ GROUP BY queue
43
+ ORDER BY count DESC
44
+ `);
45
+ const totalByQueue = byQueueResult.rows.map(row => ({
46
+ queue: row.queue || '(default)',
47
+ count: parseInt(row.count),
48
+ }));
49
+ // Get jobs by class
50
+ const byClassResult = await this.pool.query(`
51
+ SELECT job_class, COUNT(*) as count
52
+ FROM que_jobs
53
+ GROUP BY job_class
54
+ ORDER BY count DESC
55
+ LIMIT 20
56
+ `);
57
+ const totalByClass = byClassResult.rows.map(row => ({
58
+ jobClass: row.job_class,
59
+ count: parseInt(row.count),
60
+ }));
61
+ // Get recent failures
62
+ const recentFailuresResult = await this.pool.query(`
63
+ SELECT job_id, job_class, queue, error_count, last_error, run_at
64
+ FROM que_jobs
65
+ WHERE error_count > 0
66
+ ORDER BY run_at DESC
67
+ LIMIT $1
68
+ `, [this.options.maxRecentFailures]);
69
+ const recentFailures = recentFailuresResult.rows.map(row => ({
70
+ id: parseInt(row.job_id),
71
+ jobClass: row.job_class,
72
+ queue: row.queue || '(default)',
73
+ errorCount: row.error_count,
74
+ lastError: row.last_error || '',
75
+ runAt: row.run_at,
76
+ }));
77
+ return {
78
+ total,
79
+ scheduled,
80
+ ready,
81
+ failed,
82
+ errorRate,
83
+ avgErrorCount,
84
+ oldestJob,
85
+ newestJob,
86
+ totalByQueue,
87
+ totalByClass,
88
+ recentFailures,
89
+ };
90
+ }
91
+ async getJobs(options = {}) {
92
+ const { queue, jobClass, status = 'all', limit = 50, offset = 0, } = options;
93
+ const whereConditions = [];
94
+ const params = [];
95
+ let paramIndex = 1;
96
+ if (queue !== undefined) {
97
+ whereConditions.push(`queue = $${paramIndex++}`);
98
+ params.push(queue);
99
+ }
100
+ if (jobClass) {
101
+ whereConditions.push(`job_class = $${paramIndex++}`);
102
+ params.push(jobClass);
103
+ }
104
+ const now = new Date();
105
+ if (status === 'ready') {
106
+ whereConditions.push(`run_at <= $${paramIndex++}`);
107
+ params.push(now);
108
+ }
109
+ else if (status === 'scheduled') {
110
+ whereConditions.push(`run_at > $${paramIndex++}`);
111
+ params.push(now);
112
+ }
113
+ else if (status === 'failed') {
114
+ whereConditions.push('error_count > 0');
115
+ }
116
+ const whereClause = whereConditions.length > 0
117
+ ? `WHERE ${whereConditions.join(' AND ')}`
118
+ : '';
119
+ // Get total count
120
+ const countQuery = `SELECT COUNT(*) as count FROM que_jobs ${whereClause}`;
121
+ const countResult = await this.pool.query(countQuery, params);
122
+ const total = parseInt(countResult.rows[0].count);
123
+ // Get jobs
124
+ params.push(limit, offset);
125
+ const jobsQuery = `
126
+ SELECT job_id, queue, priority, run_at, job_class, args, error_count, last_error
127
+ FROM que_jobs
128
+ ${whereClause}
129
+ ORDER BY priority ASC, run_at ASC, job_id ASC
130
+ LIMIT $${paramIndex++} OFFSET $${paramIndex++}
131
+ `;
132
+ const jobsResult = await this.pool.query(jobsQuery, params);
133
+ const jobs = jobsResult.rows.map(row => ({
134
+ id: parseInt(row.job_id),
135
+ queue: row.queue,
136
+ priority: row.priority,
137
+ runAt: row.run_at,
138
+ jobClass: row.job_class,
139
+ args: row.args,
140
+ errorCount: row.error_count,
141
+ lastError: row.last_error || undefined,
142
+ }));
143
+ return { jobs, total };
144
+ }
145
+ async getJob(jobId) {
146
+ const result = await this.pool.query(`
147
+ SELECT job_id, queue, priority, run_at, job_class, args, error_count, last_error
148
+ FROM que_jobs
149
+ WHERE job_id = $1
150
+ `, [jobId]);
151
+ if (result.rows.length === 0) {
152
+ return null;
153
+ }
154
+ const row = result.rows[0];
155
+ return {
156
+ id: parseInt(row.job_id),
157
+ queue: row.queue,
158
+ priority: row.priority,
159
+ runAt: row.run_at,
160
+ jobClass: row.job_class,
161
+ args: row.args,
162
+ errorCount: row.error_count,
163
+ lastError: row.last_error || undefined,
164
+ };
165
+ }
166
+ async deleteJob(jobId) {
167
+ const result = await this.pool.query('DELETE FROM que_jobs WHERE job_id = $1', [jobId]);
168
+ return (result.rowCount ?? 0) > 0;
169
+ }
170
+ async retryJob(jobId) {
171
+ const result = await this.pool.query(`
172
+ UPDATE que_jobs
173
+ SET error_count = 0,
174
+ last_error = NULL,
175
+ run_at = NOW()
176
+ WHERE job_id = $1
177
+ `, [jobId]);
178
+ return (result.rowCount ?? 0) > 0;
179
+ }
180
+ async getQueues() {
181
+ const result = await this.pool.query(`
182
+ SELECT DISTINCT queue
183
+ FROM que_jobs
184
+ ORDER BY queue
185
+ `);
186
+ return result.rows.map(row => row.queue || '(default)');
187
+ }
188
+ async getJobClasses() {
189
+ const result = await this.pool.query(`
190
+ SELECT DISTINCT job_class
191
+ FROM que_jobs
192
+ ORDER BY job_class
193
+ `);
194
+ return result.rows.map(row => row.job_class);
195
+ }
196
+ getOptions() {
197
+ return this.options;
198
+ }
199
+ }
200
+ exports.DashboardService = DashboardService;
201
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/dashboard/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { DashboardOptions } from './service';
2
+ export declare function getDashboardHTML(options: Required<DashboardOptions>): string;
3
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/dashboard/views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,MAAM,CA6wB5E"}