bootifyjs 1.4.0 ā 2.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.
- package/dist/BootifyApp.d.ts +48 -0
- package/dist/BootifyApp.d.ts.map +1 -0
- package/dist/BootifyApp.js +153 -0
- package/dist/BootifyApp.js.map +1 -0
- package/dist/api.d.ts +10 -3
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +54 -37
- package/dist/api.js.map +1 -1
- package/dist/core/decorators.d.ts +27 -1
- package/dist/core/decorators.d.ts.map +1 -1
- package/dist/core/decorators.js +26 -3
- package/dist/core/decorators.js.map +1 -1
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +17 -2
- package/dist/core/router.js.map +1 -1
- package/dist/examples/controllers/todo.controller.d.ts.map +1 -1
- package/dist/examples/controllers/todo.controller.js +16 -0
- package/dist/examples/controllers/todo.controller.js.map +1 -1
- package/dist/examples/enhanced-logger-example.d.ts +2 -0
- package/dist/examples/enhanced-logger-example.d.ts.map +1 -0
- package/dist/examples/enhanced-logger-example.js +143 -0
- package/dist/examples/enhanced-logger-example.js.map +1 -0
- package/dist/examples/index.d.ts +1 -0
- package/dist/examples/index.d.ts.map +1 -1
- package/dist/examples/index.js +117 -51
- package/dist/examples/index.js.map +1 -1
- package/dist/examples/scheduled-jobs-example.d.ts +10 -0
- package/dist/examples/scheduled-jobs-example.d.ts.map +1 -0
- package/dist/examples/scheduled-jobs-example.js +134 -0
- package/dist/examples/scheduled-jobs-example.js.map +1 -0
- package/dist/examples/services/scheduled-tasks.service.d.ts +17 -0
- package/dist/examples/services/scheduled-tasks.service.d.ts.map +1 -0
- package/dist/examples/services/scheduled-tasks.service.js +77 -0
- package/dist/examples/services/scheduled-tasks.service.js.map +1 -0
- package/dist/examples/services/todo.service.d.ts.map +1 -1
- package/dist/examples/services/todo.service.js.map +1 -1
- package/dist/examples/simple-scheduler-test.d.ts +6 -0
- package/dist/examples/simple-scheduler-test.d.ts.map +1 -0
- package/dist/examples/simple-scheduler-test.js +57 -0
- package/dist/examples/simple-scheduler-test.js.map +1 -0
- package/dist/examples/streaming-logger-example.d.ts +2 -0
- package/dist/examples/streaming-logger-example.d.ts.map +1 -0
- package/dist/examples/streaming-logger-example.js +124 -0
- package/dist/examples/streaming-logger-example.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/logging/core/adapters/index.d.ts +2 -0
- package/dist/logging/core/adapters/index.d.ts.map +1 -0
- package/dist/logging/core/adapters/index.js +18 -0
- package/dist/logging/core/adapters/index.js.map +1 -0
- package/dist/logging/core/adapters/pino.adapter.d.ts +32 -0
- package/dist/logging/core/adapters/pino.adapter.d.ts.map +1 -0
- package/dist/logging/core/adapters/pino.adapter.js +82 -0
- package/dist/logging/core/adapters/pino.adapter.js.map +1 -0
- package/dist/logging/core/base-logger.d.ts +44 -0
- package/dist/logging/core/base-logger.d.ts.map +1 -0
- package/dist/logging/core/base-logger.js +147 -0
- package/dist/logging/core/base-logger.js.map +1 -0
- package/dist/logging/core/context-providers/index.d.ts +2 -0
- package/dist/logging/core/context-providers/index.d.ts.map +1 -0
- package/dist/logging/core/context-providers/index.js +18 -0
- package/dist/logging/core/context-providers/index.js.map +1 -0
- package/dist/logging/core/context-providers/request-context.provider.d.ts +5 -0
- package/dist/logging/core/context-providers/request-context.provider.d.ts.map +1 -0
- package/dist/logging/core/context-providers/request-context.provider.js +19 -0
- package/dist/logging/core/context-providers/request-context.provider.js.map +1 -0
- package/dist/logging/core/enhanced-startup-logger.d.ts +48 -0
- package/dist/logging/core/enhanced-startup-logger.d.ts.map +1 -0
- package/dist/logging/core/enhanced-startup-logger.js +537 -0
- package/dist/logging/core/enhanced-startup-logger.js.map +1 -0
- package/dist/logging/core/interfaces.d.ts +75 -0
- package/dist/logging/core/interfaces.d.ts.map +1 -0
- package/dist/logging/core/interfaces.js +9 -0
- package/dist/logging/core/interfaces.js.map +1 -0
- package/dist/logging/core/logger-builder.d.ts +58 -0
- package/dist/logging/core/logger-builder.d.ts.map +1 -0
- package/dist/logging/core/logger-builder.js +121 -0
- package/dist/logging/core/logger-builder.js.map +1 -0
- package/dist/logging/core/startup.logger.d.ts +1 -0
- package/dist/logging/core/startup.logger.d.ts.map +1 -1
- package/dist/logging/core/startup.logger.js +28 -3
- package/dist/logging/core/startup.logger.js.map +1 -1
- package/dist/logging/core/streaming-startup-logger.d.ts +21 -0
- package/dist/logging/core/streaming-startup-logger.d.ts.map +1 -0
- package/dist/logging/core/streaming-startup-logger.js +209 -0
- package/dist/logging/core/streaming-startup-logger.js.map +1 -0
- package/dist/logging/core/transports/console.transport.d.ts +19 -0
- package/dist/logging/core/transports/console.transport.d.ts.map +1 -0
- package/dist/logging/core/transports/console.transport.js +67 -0
- package/dist/logging/core/transports/console.transport.js.map +1 -0
- package/dist/logging/core/transports/index.d.ts +2 -0
- package/dist/logging/core/transports/index.d.ts.map +1 -0
- package/dist/logging/core/transports/index.js +18 -0
- package/dist/logging/core/transports/index.js.map +1 -0
- package/dist/logging/index.d.ts +73 -2
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +115 -16
- package/dist/logging/index.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +2 -2
- package/dist/middleware/auth.middleware.d.ts.map +1 -1
- package/dist/middleware/auth.middleware.js +12 -23
- package/dist/middleware/auth.middleware.js.map +1 -1
- package/dist/middleware/index.d.ts +1 -2
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/scheduling/index.d.ts +25 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +41 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/scheduled.decorator.d.ts +25 -0
- package/dist/scheduling/scheduled.decorator.d.ts.map +1 -0
- package/dist/scheduling/scheduled.decorator.js +52 -0
- package/dist/scheduling/scheduled.decorator.js.map +1 -0
- package/dist/scheduling/scheduler.service.d.ts +39 -0
- package/dist/scheduling/scheduler.service.d.ts.map +1 -0
- package/dist/scheduling/scheduler.service.js +341 -0
- package/dist/scheduling/scheduler.service.js.map +1 -0
- package/dist/scheduling/scheduler.types.d.ts +47 -0
- package/dist/scheduling/scheduler.types.d.ts.map +1 -0
- package/dist/scheduling/scheduler.types.js +6 -0
- package/dist/scheduling/scheduler.types.js.map +1 -0
- package/package.json +16 -1
|
@@ -88,6 +88,11 @@ __decorate([
|
|
|
88
88
|
], TodoController.prototype, "authManager", void 0);
|
|
89
89
|
__decorate([
|
|
90
90
|
(0, decorators_2.Get)('/'),
|
|
91
|
+
(0, decorators_2.Swagger)({
|
|
92
|
+
summary: 'Get all todos',
|
|
93
|
+
description: 'Retrieves a list of all todo items',
|
|
94
|
+
tags: ['Todos'],
|
|
95
|
+
}),
|
|
91
96
|
__metadata("design:type", Function),
|
|
92
97
|
__metadata("design:paramtypes", []),
|
|
93
98
|
__metadata("design:returntype", void 0)
|
|
@@ -95,6 +100,11 @@ __decorate([
|
|
|
95
100
|
__decorate([
|
|
96
101
|
(0, decorators_2.Get)('/:id'),
|
|
97
102
|
(0, decorators_1.Cacheable)({ key: 'todo', ttl: 60 }),
|
|
103
|
+
(0, decorators_2.Swagger)({
|
|
104
|
+
summary: 'Get todo by ID',
|
|
105
|
+
description: 'Retrieves a single todo item by its unique identifier',
|
|
106
|
+
tags: ['Todos'],
|
|
107
|
+
}),
|
|
98
108
|
__param(0, (0, decorators_2.Param)('id')),
|
|
99
109
|
__metadata("design:type", Function),
|
|
100
110
|
__metadata("design:paramtypes", [String]),
|
|
@@ -115,6 +125,12 @@ __decorate([
|
|
|
115
125
|
completed: zod_1.z.boolean(),
|
|
116
126
|
}),
|
|
117
127
|
},
|
|
128
|
+
}),
|
|
129
|
+
(0, decorators_2.Swagger)({
|
|
130
|
+
summary: 'Create a new todo',
|
|
131
|
+
description: 'Creates a new todo item with the provided text',
|
|
132
|
+
tags: ['Todos'],
|
|
133
|
+
operationId: 'createTodo',
|
|
118
134
|
})
|
|
119
135
|
// @UseMiddleware(authorize(['manager']))
|
|
120
136
|
,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo.controller.js","sourceRoot":"","sources":["../../../src/examples/controllers/todo.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6BAAuB;AACvB,qCAAwC;AACxC,uDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"todo.controller.js","sourceRoot":"","sources":["../../../src/examples/controllers/todo.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-logger-example.d.ts","sourceRoot":"","sources":["../../src/examples/enhanced-logger-example.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
40
|
+
require("reflect-metadata");
|
|
41
|
+
const zod_1 = __importDefault(require("zod"));
|
|
42
|
+
const BootifyApp_1 = require("../BootifyApp");
|
|
43
|
+
const health_controller_1 = require("./controllers/health.controller");
|
|
44
|
+
const todo_controller_1 = require("./controllers/todo.controller");
|
|
45
|
+
dotenv_1.default.config();
|
|
46
|
+
// Example: Using Streaming Startup Logger (Spring Boot style)
|
|
47
|
+
const envSchema = zod_1.default.object({
|
|
48
|
+
NODE_ENV: zod_1.default.string().min(1),
|
|
49
|
+
JWT_SECRET: zod_1.default.string().min(1),
|
|
50
|
+
DATABASE_URL: zod_1.default.string().optional(),
|
|
51
|
+
REDIS_URL: zod_1.default.string().optional(),
|
|
52
|
+
});
|
|
53
|
+
// Mock services for demonstration
|
|
54
|
+
const mockDatabase = {
|
|
55
|
+
async connect() {
|
|
56
|
+
// Simulate slow connection
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, 800));
|
|
58
|
+
},
|
|
59
|
+
async query(sql) {
|
|
60
|
+
return [{ result: 1 }];
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
const mockRedis = {
|
|
64
|
+
async connect() {
|
|
65
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
66
|
+
},
|
|
67
|
+
async ping() {
|
|
68
|
+
return 'PONG';
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
async function main() {
|
|
72
|
+
const { app, start, startupLogger, logger } = await (0, BootifyApp_1.createBootify)()
|
|
73
|
+
// Configuration
|
|
74
|
+
.useConfig(envSchema)
|
|
75
|
+
.setPort(8080)
|
|
76
|
+
// Initialize Database with proper logging
|
|
77
|
+
.beforeStart(async () => {
|
|
78
|
+
startupLogger.logComponentStart('PostgreSQL', 'localhost:5432');
|
|
79
|
+
try {
|
|
80
|
+
await mockDatabase.connect();
|
|
81
|
+
startupLogger.logComponentComplete();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
startupLogger.logComponentFailed(error);
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
// Initialize Redis with proper logging
|
|
89
|
+
.beforeStart(async () => {
|
|
90
|
+
startupLogger.logComponentStart('Redis', 'localhost:6379');
|
|
91
|
+
try {
|
|
92
|
+
await mockRedis.connect();
|
|
93
|
+
startupLogger.logComponentComplete();
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
startupLogger.logComponentFailed(error);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
// Register Swagger plugin
|
|
101
|
+
.usePlugin(async (app) => {
|
|
102
|
+
startupLogger.logComponentStart('Swagger');
|
|
103
|
+
const fastifySwagger = await Promise.resolve().then(() => __importStar(require("@fastify/swagger")));
|
|
104
|
+
const fastifySwaggerUI = await Promise.resolve().then(() => __importStar(require("@fastify/swagger-ui")));
|
|
105
|
+
await app.register(fastifySwagger.default, {
|
|
106
|
+
openapi: {
|
|
107
|
+
info: {
|
|
108
|
+
title: "Enhanced Logger Example API",
|
|
109
|
+
description: "Demonstrating the enhanced startup logger",
|
|
110
|
+
version: "1.0.0",
|
|
111
|
+
},
|
|
112
|
+
servers: [{ url: `http://localhost:8080` }],
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
await app.register(fastifySwaggerUI.default, {
|
|
116
|
+
routePrefix: "/api-docs",
|
|
117
|
+
});
|
|
118
|
+
startupLogger.logComponentComplete();
|
|
119
|
+
})
|
|
120
|
+
// Register controllers
|
|
121
|
+
.useControllers([health_controller_1.HealthController, todo_controller_1.TodoController])
|
|
122
|
+
// After start - show helpful info
|
|
123
|
+
.afterStart(async () => {
|
|
124
|
+
logger.info('š Application is ready to accept requests!');
|
|
125
|
+
logger.info('š API Documentation available at /api-docs');
|
|
126
|
+
})
|
|
127
|
+
.build();
|
|
128
|
+
await start();
|
|
129
|
+
}
|
|
130
|
+
// Graceful shutdown
|
|
131
|
+
process.on('SIGTERM', async () => {
|
|
132
|
+
console.log('\nš Shutting down gracefully...');
|
|
133
|
+
process.exit(0);
|
|
134
|
+
});
|
|
135
|
+
process.on('SIGINT', async () => {
|
|
136
|
+
console.log('\nš Shutting down gracefully...');
|
|
137
|
+
process.exit(0);
|
|
138
|
+
});
|
|
139
|
+
main().catch((error) => {
|
|
140
|
+
console.error('ā Failed to start application:', error);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=enhanced-logger-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-logger-example.js","sourceRoot":"","sources":["../../src/examples/enhanced-logger-example.ts"],"names":[],"mappings":"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"}
|
package/dist/examples/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAc1B,OAAO,mCAAmC,CAAC;AAG3C,OAAO,oCAAoC,CAAC"}
|
package/dist/examples/index.js
CHANGED
|
@@ -1,21 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
7
40
|
require("reflect-metadata");
|
|
8
|
-
const
|
|
41
|
+
const zod_1 = __importDefault(require("zod"));
|
|
42
|
+
const basic_usage_1 = require("../auth/examples/basic-usage");
|
|
43
|
+
const BootifyApp_1 = require("../BootifyApp");
|
|
44
|
+
const cache_1 = require("../cache");
|
|
9
45
|
const di_container_1 = require("../core/di-container");
|
|
10
46
|
const health_controller_1 = require("./controllers/health.controller");
|
|
11
47
|
const todo_controller_1 = require("./controllers/todo.controller");
|
|
12
48
|
dotenv_1.default.config();
|
|
13
|
-
// import { bootstrapCache } from '../cache/bootstrap'
|
|
14
|
-
const zod_1 = __importDefault(require("zod"));
|
|
15
|
-
const basic_usage_1 = require("../auth/examples/basic-usage");
|
|
16
|
-
const cache_1 = require("../cache");
|
|
17
49
|
// Import the RedisCacheStore to trigger @Service decorator registration
|
|
18
50
|
require("../cache/stores/redis-cache.store");
|
|
51
|
+
const middleware_1 = require("../middleware");
|
|
52
|
+
// Import scheduled tasks service to register it with DI
|
|
53
|
+
require("./services/scheduled-tasks.service");
|
|
19
54
|
// --- Application Startup ---
|
|
20
55
|
const envSchema = zod_1.default.object({
|
|
21
56
|
NODE_ENV: zod_1.default.string().min(1),
|
|
@@ -51,56 +86,87 @@ const requestLoggingMiddleware = async (request, reply) => {
|
|
|
51
86
|
console.log(`š Request: ${request.method} ${request.url} from ${clientIP} - ${userAgent}`);
|
|
52
87
|
};
|
|
53
88
|
async function main() {
|
|
54
|
-
//
|
|
89
|
+
// Setup JWT authentication
|
|
55
90
|
const { middleware: jwtAuthMiddleware, authManager } = await (0, basic_usage_1.setupJwtAuth)();
|
|
56
91
|
// Register authManager in DI container for controller injection
|
|
57
92
|
di_container_1.container.register("AuthManager", { useFactory: () => authManager });
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
93
|
+
const { app, start } = await (0, BootifyApp_1.createBootify)()
|
|
94
|
+
// Configuration
|
|
95
|
+
.useConfig(envSchema)
|
|
96
|
+
.setPort(8080)
|
|
97
|
+
// Initialize services before start
|
|
98
|
+
.beforeStart(async () => {
|
|
99
|
+
console.log("š§ Initializing services...");
|
|
100
|
+
// Bootstrap cache
|
|
101
|
+
await (0, cache_1.bootstrapCache)();
|
|
102
|
+
console.log("ā
Services initialized");
|
|
103
|
+
})
|
|
104
|
+
// Register Cookie plugin
|
|
105
|
+
.usePlugin(async (app) => {
|
|
106
|
+
const fastifyCookie = await Promise.resolve().then(() => __importStar(require("@fastify/cookie")));
|
|
107
|
+
await app.register(fastifyCookie.default, {
|
|
108
|
+
hook: "onRequest",
|
|
109
|
+
parseOptions: {},
|
|
110
|
+
});
|
|
111
|
+
})
|
|
112
|
+
// Register Swagger
|
|
113
|
+
.usePlugin(async (app) => {
|
|
114
|
+
await app.addHook("onRequest", (0, middleware_1.createContextMiddleware)());
|
|
115
|
+
const fastifySwagger = await Promise.resolve().then(() => __importStar(require("@fastify/swagger")));
|
|
116
|
+
const fastifySwaggerUI = await Promise.resolve().then(() => __importStar(require("@fastify/swagger-ui")));
|
|
117
|
+
await app.register(fastifySwagger.default, {
|
|
118
|
+
openapi: {
|
|
119
|
+
info: {
|
|
120
|
+
title: "Bootify (Fastify) API",
|
|
121
|
+
description: "API documentation",
|
|
122
|
+
version: "1.0.0",
|
|
123
|
+
},
|
|
124
|
+
servers: [{ url: `http://localhost:8080` }],
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
await app.register(fastifySwaggerUI.default, {
|
|
128
|
+
routePrefix: "/api-docs",
|
|
129
|
+
});
|
|
130
|
+
})
|
|
131
|
+
// Register global middlewares in order
|
|
132
|
+
.useMiddlewares([
|
|
133
|
+
corsMiddleware, // 1st: Handle CORS headers
|
|
134
|
+
securityHeadersMiddleware, // 2nd: Add security headers
|
|
135
|
+
requestTimingMiddleware, // 3rd: Start request timing
|
|
136
|
+
requestLoggingMiddleware, // 4th: Log request details
|
|
137
|
+
])
|
|
138
|
+
// Register controllers
|
|
139
|
+
.useControllers([health_controller_1.HealthController, todo_controller_1.TodoController])
|
|
140
|
+
// Register JWT auth routes after app is built
|
|
141
|
+
.beforeStart(async (app) => {
|
|
142
|
+
await (0, basic_usage_1.registerJWTAuthRoutes)(app, authManager, jwtAuthMiddleware);
|
|
143
|
+
})
|
|
144
|
+
// After start hook
|
|
145
|
+
.afterStart(async (app) => {
|
|
146
|
+
console.log("š BootifyJS Example Server started!");
|
|
147
|
+
console.log("š Scheduled jobs are running in the background");
|
|
148
|
+
})
|
|
149
|
+
.build();
|
|
150
|
+
// Add scheduler status endpoint
|
|
151
|
+
app.get('/scheduler/status', async () => {
|
|
152
|
+
const { SchedulerService } = await Promise.resolve().then(() => __importStar(require('../scheduling')));
|
|
153
|
+
const scheduler = di_container_1.container.resolve(SchedulerService);
|
|
154
|
+
return scheduler.getStats();
|
|
155
|
+
});
|
|
156
|
+
// Add manual trigger endpoint
|
|
157
|
+
app.post('/scheduler/trigger/:jobName', async (request, reply) => {
|
|
158
|
+
const { jobName } = request.params;
|
|
159
|
+
try {
|
|
160
|
+
const { SchedulerService } = await Promise.resolve().then(() => __importStar(require('../scheduling')));
|
|
161
|
+
const scheduler = di_container_1.container.resolve(SchedulerService);
|
|
162
|
+
await scheduler.trigger(jobName);
|
|
163
|
+
return { success: true, message: `Job '${jobName}' triggered` };
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
reply.status(404);
|
|
167
|
+
return { success: false, error: error.message };
|
|
168
|
+
}
|
|
77
169
|
});
|
|
78
|
-
await (0, basic_usage_1.registerJWTAuthRoutes)(app, authManager, jwtAuthMiddleware);
|
|
79
|
-
// Setup context middleware with authentication
|
|
80
|
-
// app.addHook('onRequest', createContextMiddleware(authContextExtractor));
|
|
81
|
-
// console.log('All components:', container.getRegisteredComponents())
|
|
82
|
-
// const animal = container.resolve<Animal>('Animal')
|
|
83
|
-
// // console.log(animal)
|
|
84
|
-
// const animalservice: AnimalService = container.resolve<AnimalService>(AnimalService)
|
|
85
|
-
// console.log(animalservice.animal === animalservice.animal1)
|
|
86
|
-
// console.log(animalservice.animal.name)
|
|
87
|
-
// console.log('š BootifyJS Example Server starting...');
|
|
88
|
-
// console.log('š§ Global middlewares enabled: CORS, Security Headers, Request Timing, Request Logging');
|
|
89
|
-
// console.log('š Available endpoints:');
|
|
90
|
-
// console.log(' GET /todos - List all todos (requires authentication)');
|
|
91
|
-
// console.log(' POST /todos - Create a new todo (requires authentication)');
|
|
92
|
-
// console.log(' GET /todos/:id - Get a specific todo (requires authentication)');
|
|
93
|
-
// console.log(' PUT /todos/:id - Update a todo (requires authentication)');
|
|
94
|
-
// console.log(' DELETE /todos/:id - Delete a todo (requires authentication)');
|
|
95
|
-
// console.log(' GET /animals - List all animals');
|
|
96
|
-
// console.log(' POST /animals - Create a new animal');
|
|
97
|
-
// console.log('š Authentication endpoints:');
|
|
98
|
-
// console.log(' POST /auth/login - Login to get JWT token');
|
|
99
|
-
// console.log(' GET /auth/info - Check authentication status');
|
|
100
|
-
// console.log('š” Use @UseMiddleware(authenticate()) decorator for protected routes!');
|
|
101
|
-
// console.log('š Test credentials: admin/admin123, manager/manager123, user/user123');
|
|
102
|
-
// console.log('š CORS enabled for all origins');
|
|
103
|
-
// console.log('š Security headers automatically added to all responses');
|
|
104
170
|
await start();
|
|
105
171
|
}
|
|
106
172
|
main();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA4B;AAE5B,4BAA0B;AAC1B,8CAAoB;AACpB,8DAGsC;AACtC,8CAA8C;AAC9C,oCAA0C;AAE1C,uDAAiD;AACjD,uEAAmE;AACnE,mEAA+D;AAC/D,gBAAM,CAAC,MAAM,EAAE,CAAC;AAChB,wEAAwE;AACxE,6CAA2C;AAC3C,8CAAwD;AACxD,wDAAwD;AACxD,8CAA4C;AAE5C,8BAA8B;AAE9B,MAAM,SAAS,GAAG,aAAC,CAAC,MAAM,CAAC;IACzB,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAC;AAEH,oCAAoC;AACpC,MAAM,cAAc,GAAsB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IACjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,KAAK,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IACjD,KAAK,CAAC,MAAM,CACV,8BAA8B,EAC9B,iCAAiC,CAClC,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,8BAA8B,EAAE,6BAA6B,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAsB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErE,qCAAqC;IACpC,OAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IACtC,OAAe,CAAC,SAAS,GAAG,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,CAAC,GAAG,CACT,4BAA4B,QAAQ,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAC3E,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAsB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAC5E,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,KAAK,CAAC,MAAM,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CACV,2BAA2B,EAC3B,qCAAqC,CACtC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAsB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;IAC7D,OAAO,CAAC,GAAG,CACT,eAAe,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,SAAS,QAAQ,MAAM,SAAS,EAAE,CAC/E,CAAC;AACJ,CAAC,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,2BAA2B;IAC3B,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,0BAAY,GAAE,CAAC;IAE5E,gEAAgE;IAChE,wBAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAErE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,0BAAa,GAAE;QAC1C,gBAAgB;SACf,SAAS,CAAC,SAAS,CAAC;SACpB,OAAO,CAAC,IAAI,CAAC;QAEd,mCAAmC;SAClC,WAAW,CAAC,KAAK,IAAI,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,kBAAkB;QAClB,MAAM,IAAA,sBAAc,GAAE,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC,CAAC;QAEF,yBAAyB;SACxB,SAAS,CAAC,KAAK,EAAE,GAAoB,EAAE,EAAE;QACxC,MAAM,aAAa,GAAG,wDAAa,iBAAiB,GAAC,CAAC;QACtD,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE;YACxC,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;IACL,CAAC,CAAC;QAEF,mBAAmB;SAClB,SAAS,CAAC,KAAK,EAAE,GAAoB,EAAE,EAAE;QACxC,MAAM,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAA,oCAAuB,GAAE,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,wDAAa,kBAAkB,GAAC,CAAC;QACxD,MAAM,gBAAgB,GAAG,wDAAa,qBAAqB,GAAC,CAAC;QAE7D,MAAM,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE;YACzC,OAAO,EAAE;gBACP,IAAI,EAAE;oBACJ,KAAK,EAAE,uBAAuB;oBAC9B,WAAW,EAAE,mBAAmB;oBAChC,OAAO,EAAE,OAAO;iBACjB;gBACD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC;aAC5C;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAC3C,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC;IACL,CAAC,CAAC;QAEF,uCAAuC;SACtC,cAAc,CAAC;QACd,cAAc,EAAe,2BAA2B;QACxD,yBAAyB,EAAI,4BAA4B;QACzD,uBAAuB,EAAM,4BAA4B;QACzD,wBAAwB,EAAK,2BAA2B;KACzD,CAAC;QAEF,uBAAuB;SACtB,cAAc,CAAC,CAAC,oCAAgB,EAAE,gCAAc,CAAC,CAAC;QAEnD,8CAA8C;SAC7C,WAAW,CAAC,KAAK,EAAE,GAAoB,EAAE,EAAE;QAC1C,MAAM,IAAA,mCAAqB,EAAC,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACnE,CAAC,CAAC;QAEF,mBAAmB;SAClB,UAAU,CAAC,KAAK,EAAE,GAAoB,EAAE,EAAE;QACzC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC,CAAC;SAED,KAAK,EAAE,CAAC;IAEX,gCAAgC;IAChC,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAA;QAC1D,MAAM,SAAS,GAAG,wBAAS,CAAC,OAAO,CAA0B,gBAAgB,CAAC,CAAA;QAC9E,OAAQ,SAAiB,CAAC,QAAQ,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,8BAA8B;IAC9B,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAA6B,CAAA;QACzD,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAA;YAC1D,MAAM,SAAS,GAAG,wBAAS,CAAC,OAAO,CAA0B,gBAAgB,CAAC,CAAA;YAC9E,MAAO,SAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,OAAO,aAAa,EAAE,CAAA;QACjE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QACjD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @Scheduled Decorator Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates how to use the @Scheduled decorator for background jobs.
|
|
5
|
+
* Run with: npx ts-node src/examples/scheduled-jobs-example.ts
|
|
6
|
+
*
|
|
7
|
+
* Note: Install node-cron for cron expressions: npm install node-cron
|
|
8
|
+
*/
|
|
9
|
+
import 'reflect-metadata';
|
|
10
|
+
//# sourceMappingURL=scheduled-jobs-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled-jobs-example.d.ts","sourceRoot":"","sources":["../../src/examples/scheduled-jobs-example.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* @Scheduled Decorator Example
|
|
14
|
+
*
|
|
15
|
+
* Demonstrates how to use the @Scheduled decorator for background jobs.
|
|
16
|
+
* Run with: npx ts-node src/examples/scheduled-jobs-example.ts
|
|
17
|
+
*
|
|
18
|
+
* Note: Install node-cron for cron expressions: npm install node-cron
|
|
19
|
+
*/
|
|
20
|
+
require("reflect-metadata");
|
|
21
|
+
const index_1 = require("../index");
|
|
22
|
+
// Example 1: Simple cron-based cleanup job
|
|
23
|
+
let CleanupService = class CleanupService {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.cleanupCount = 0;
|
|
26
|
+
}
|
|
27
|
+
async cleanupTempFiles() {
|
|
28
|
+
this.cleanupCount++;
|
|
29
|
+
console.log(`[CleanupService] Running temp file cleanup #${this.cleanupCount}`);
|
|
30
|
+
// Simulate cleanup work
|
|
31
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
32
|
+
console.log(`[CleanupService] Cleanup complete`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, index_1.Scheduled)('*/10 * * * * *') // Every 10 seconds (for demo)
|
|
37
|
+
,
|
|
38
|
+
__metadata("design:type", Function),
|
|
39
|
+
__metadata("design:paramtypes", []),
|
|
40
|
+
__metadata("design:returntype", Promise)
|
|
41
|
+
], CleanupService.prototype, "cleanupTempFiles", null);
|
|
42
|
+
CleanupService = __decorate([
|
|
43
|
+
(0, index_1.Service)()
|
|
44
|
+
], CleanupService);
|
|
45
|
+
// Example 2: Interval-based health check with overlap prevention
|
|
46
|
+
let HealthCheckService = class HealthCheckService {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.checkCount = 0;
|
|
49
|
+
}
|
|
50
|
+
async performHealthCheck() {
|
|
51
|
+
this.checkCount++;
|
|
52
|
+
console.log(`[HealthCheck] Starting health check #${this.checkCount}`);
|
|
53
|
+
// Simulate a slow health check
|
|
54
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
55
|
+
const status = {
|
|
56
|
+
memory: process.memoryUsage().heapUsed / 1024 / 1024,
|
|
57
|
+
uptime: process.uptime(),
|
|
58
|
+
};
|
|
59
|
+
console.log(`[HealthCheck] Complete - Memory: ${status.memory.toFixed(2)}MB, Uptime: ${status.uptime.toFixed(0)}s`);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, index_1.Scheduled)({ interval: 5000, preventOverlap: true, runOnInit: true }),
|
|
64
|
+
__metadata("design:type", Function),
|
|
65
|
+
__metadata("design:paramtypes", []),
|
|
66
|
+
__metadata("design:returntype", Promise)
|
|
67
|
+
], HealthCheckService.prototype, "performHealthCheck", null);
|
|
68
|
+
HealthCheckService = __decorate([
|
|
69
|
+
(0, index_1.Service)()
|
|
70
|
+
], HealthCheckService);
|
|
71
|
+
// Example 3: Job with retries
|
|
72
|
+
let DataSyncService = class DataSyncService {
|
|
73
|
+
constructor() {
|
|
74
|
+
this.syncAttempts = 0;
|
|
75
|
+
}
|
|
76
|
+
async syncExternalData() {
|
|
77
|
+
this.syncAttempts++;
|
|
78
|
+
console.log(`[DataSync] Syncing external data (attempt total: ${this.syncAttempts})`);
|
|
79
|
+
// Simulate occasional failures
|
|
80
|
+
if (Math.random() < 0.3) {
|
|
81
|
+
throw new Error('External API temporarily unavailable');
|
|
82
|
+
}
|
|
83
|
+
console.log(`[DataSync] Sync successful`);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
__decorate([
|
|
87
|
+
(0, index_1.Scheduled)({
|
|
88
|
+
interval: 15000,
|
|
89
|
+
maxRetries: 2,
|
|
90
|
+
retryDelay: 1000,
|
|
91
|
+
name: 'data-sync'
|
|
92
|
+
}),
|
|
93
|
+
__metadata("design:type", Function),
|
|
94
|
+
__metadata("design:paramtypes", []),
|
|
95
|
+
__metadata("design:returntype", Promise)
|
|
96
|
+
], DataSyncService.prototype, "syncExternalData", null);
|
|
97
|
+
DataSyncService = __decorate([
|
|
98
|
+
(0, index_1.Service)()
|
|
99
|
+
], DataSyncService);
|
|
100
|
+
// Main application
|
|
101
|
+
async function main() {
|
|
102
|
+
console.log('Starting Scheduled Jobs Example...\n');
|
|
103
|
+
// Create and start the app
|
|
104
|
+
const bootify = (0, index_1.createBootify)()
|
|
105
|
+
.setPort(3000)
|
|
106
|
+
.useScheduler(true);
|
|
107
|
+
const { app, start, scheduler } = await bootify.build();
|
|
108
|
+
// Add a simple route to check scheduler status
|
|
109
|
+
app.get('/scheduler/status', async () => {
|
|
110
|
+
return scheduler?.getStats() ?? { error: 'Scheduler not available' };
|
|
111
|
+
});
|
|
112
|
+
// Manual trigger endpoint
|
|
113
|
+
app.post('/scheduler/trigger/:jobName', async (request, reply) => {
|
|
114
|
+
const { jobName } = request.params;
|
|
115
|
+
try {
|
|
116
|
+
await scheduler?.trigger(jobName);
|
|
117
|
+
return { success: true, message: `Job '${jobName}' triggered` };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
reply.status(404);
|
|
121
|
+
return { success: false, error: error.message };
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
await start();
|
|
125
|
+
console.log('\nš Available endpoints:');
|
|
126
|
+
console.log(' GET /scheduler/status - View all job statuses');
|
|
127
|
+
console.log(' POST /scheduler/trigger/:jobName - Manually trigger a job');
|
|
128
|
+
console.log('\nExample job names:');
|
|
129
|
+
console.log(' - CleanupService.cleanupTempFiles');
|
|
130
|
+
console.log(' - HealthCheckService.performHealthCheck');
|
|
131
|
+
console.log(' - DataSyncService.data-sync');
|
|
132
|
+
}
|
|
133
|
+
main().catch(console.error);
|
|
134
|
+
//# sourceMappingURL=scheduled-jobs-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled-jobs-example.js","sourceRoot":"","sources":["../../src/examples/scheduled-jobs-example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class ScheduledTasksService {
|
|
2
|
+
private healthCheckCount;
|
|
3
|
+
private cleanupCount;
|
|
4
|
+
/**
|
|
5
|
+
* Health check - runs every 30 seconds
|
|
6
|
+
*/
|
|
7
|
+
performHealthCheck(): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Cleanup task - runs every 5 minutes with overlap prevention
|
|
10
|
+
*/
|
|
11
|
+
cleanupExpiredData(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Stats reporter - runs every minute
|
|
14
|
+
*/
|
|
15
|
+
reportStats(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=scheduled-tasks.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduled-tasks.service.d.ts","sourceRoot":"","sources":["../../../src/examples/services/scheduled-tasks.service.ts"],"names":[],"mappings":"AAQA,qBACa,qBAAqB;IAC9B,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,YAAY,CAAI;IAExB;;OAEG;IAEG,kBAAkB;IAOxB;;OAEG;IAMG,kBAAkB;IAQxB;;OAEG;IAEG,WAAW;CAGpB"}
|