@almadar/server-hono 0.1.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/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +418 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/debug-router.d.ts +21 -0
- package/dist/lib/debug-router.d.ts.map +1 -0
- package/dist/middleware/auth.d.ts +9 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/error-handler.d.ts +11 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/validation.d.ts +41 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/routes/observability.d.ts +13 -0
- package/dist/routes/observability.d.ts.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +66 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @almadar/server-hono - Hono server infrastructure for Almadar applications
|
|
3
|
+
*
|
|
4
|
+
* Re-exports framework-agnostic utilities from @almadar/server and provides
|
|
5
|
+
* Hono-native middleware replacements for Express-specific code.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
export { errorHandler, notFoundHandler } from './middleware/error-handler.js';
|
|
10
|
+
export { authenticateFirebase } from './middleware/auth.js';
|
|
11
|
+
export { validateBody, validateQuery, validateParams } from './middleware/validation.js';
|
|
12
|
+
export { debugEventsRouter } from './lib/debug-router.js';
|
|
13
|
+
export { observabilityRouter } from './routes/observability.js';
|
|
14
|
+
export type { AppEnv, FirebaseEnv, FullUserEnv, FirebaseVariables, UserContextVariables, UserContext } from './types.js';
|
|
15
|
+
export { AppError, NotFoundError, ValidationError, UnauthorizedError, ForbiddenError, ConflictError } from '@almadar/server';
|
|
16
|
+
export { env } from '@almadar/server';
|
|
17
|
+
export { logger } from '@almadar/server';
|
|
18
|
+
export { EventBus, getServerEventBus, resetServerEventBus, emitEntityEvent, type EventLogEntry, } from '@almadar/server';
|
|
19
|
+
export { DistributedEventBus, InMemoryTransport, RedisTransport, type IEventBusTransport, type TransportMessage, type TransportReceiver, type RedisTransportOptions, } from '@almadar/server';
|
|
20
|
+
export { EventPersistence, InMemoryEventStore, type PersistedEvent, type EventQuery, type EventPersistenceOptions, type IEventStore, } from '@almadar/server';
|
|
21
|
+
export { initializeFirebase, getFirestore, getAuth, admin, db } from '@almadar/server';
|
|
22
|
+
export { setupEventBroadcast, getWebSocketServer, closeWebSocketServer, getConnectedClientCount, } from '@almadar/server';
|
|
23
|
+
export { MockDataService, getMockDataService, resetMockDataService, type FieldSchema, type EntitySchema, } from '@almadar/server';
|
|
24
|
+
export { getDataService, resetDataService, seedMockData, type DataService, type EntitySeedConfig, type PaginationOptions, type PaginatedResult, } from '@almadar/server';
|
|
25
|
+
export { dataService, mockDataService, serverEventBus } from '@almadar/server';
|
|
26
|
+
export { toFirestoreFormat, fromFirestoreFormat, SchemaStore, SnapshotStore, ChangeSetStore, ValidationStore, SchemaProtectionService, } from '@almadar/server';
|
|
27
|
+
export { parseQueryFilters, applyFiltersToQuery, extractPaginationParams, type ParsedFilter, type FirestoreWhereFilterOp, type PaginationParams, } from '@almadar/server';
|
|
28
|
+
export { ServiceDiscovery, InMemoryServiceRegistry, type ServiceRegistration, type ServiceRegistryOptions, type IServiceRegistry, } from '@almadar/server';
|
|
29
|
+
export type { DataServiceActions, DataServiceContract, EventBusActions, EventBusServiceContract, ServiceDiscoveryActions, ServiceDiscoveryContract, ServerServiceContracts, } from '@almadar/server';
|
|
30
|
+
export { getMemoryManager, resetMemoryManager, getSessionManager, resetSessionManager, createServerSkillAgent, } from '@almadar/server';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGhE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG7H,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG/E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
import { env, logger, getAuth, AppError, getServerEventBus, seedMockData } from '@almadar/server';
|
|
2
|
+
export { AppError, ChangeSetStore, ConflictError, DistributedEventBus, EventBus, EventPersistence, ForbiddenError, InMemoryEventStore, InMemoryServiceRegistry, InMemoryTransport, MockDataService, NotFoundError, RedisTransport, SchemaProtectionService, SchemaStore, ServiceDiscovery, SnapshotStore, UnauthorizedError, ValidationError, ValidationStore, admin, applyFiltersToQuery, closeWebSocketServer, createServerSkillAgent, dataService, db, emitEntityEvent, env, extractPaginationParams, fromFirestoreFormat, getAuth, getConnectedClientCount, getDataService, getFirestore, getMemoryManager, getMockDataService, getServerEventBus, getSessionManager, getWebSocketServer, initializeFirebase, logger, mockDataService, parseQueryFilters, resetDataService, resetMemoryManager, resetMockDataService, resetServerEventBus, resetSessionManager, seedMockData, serverEventBus, setupEventBroadcast, toFirestoreFormat } from '@almadar/server';
|
|
3
|
+
import { createMiddleware } from 'hono/factory';
|
|
4
|
+
import { zValidator } from '@hono/zod-validator';
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
|
|
7
|
+
// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js
|
|
8
|
+
var util;
|
|
9
|
+
(function(util2) {
|
|
10
|
+
util2.assertEqual = (_) => {
|
|
11
|
+
};
|
|
12
|
+
function assertIs(_arg) {
|
|
13
|
+
}
|
|
14
|
+
util2.assertIs = assertIs;
|
|
15
|
+
function assertNever(_x) {
|
|
16
|
+
throw new Error();
|
|
17
|
+
}
|
|
18
|
+
util2.assertNever = assertNever;
|
|
19
|
+
util2.arrayToEnum = (items) => {
|
|
20
|
+
const obj = {};
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
obj[item] = item;
|
|
23
|
+
}
|
|
24
|
+
return obj;
|
|
25
|
+
};
|
|
26
|
+
util2.getValidEnumValues = (obj) => {
|
|
27
|
+
const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number");
|
|
28
|
+
const filtered = {};
|
|
29
|
+
for (const k of validKeys) {
|
|
30
|
+
filtered[k] = obj[k];
|
|
31
|
+
}
|
|
32
|
+
return util2.objectValues(filtered);
|
|
33
|
+
};
|
|
34
|
+
util2.objectValues = (obj) => {
|
|
35
|
+
return util2.objectKeys(obj).map(function(e) {
|
|
36
|
+
return obj[e];
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => {
|
|
40
|
+
const keys = [];
|
|
41
|
+
for (const key in object) {
|
|
42
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
43
|
+
keys.push(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return keys;
|
|
47
|
+
};
|
|
48
|
+
util2.find = (arr, checker) => {
|
|
49
|
+
for (const item of arr) {
|
|
50
|
+
if (checker(item))
|
|
51
|
+
return item;
|
|
52
|
+
}
|
|
53
|
+
return void 0;
|
|
54
|
+
};
|
|
55
|
+
util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val;
|
|
56
|
+
function joinValues(array, separator = " | ") {
|
|
57
|
+
return array.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator);
|
|
58
|
+
}
|
|
59
|
+
util2.joinValues = joinValues;
|
|
60
|
+
util2.jsonStringifyReplacer = (_, value) => {
|
|
61
|
+
if (typeof value === "bigint") {
|
|
62
|
+
return value.toString();
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
};
|
|
66
|
+
})(util || (util = {}));
|
|
67
|
+
var objectUtil;
|
|
68
|
+
(function(objectUtil2) {
|
|
69
|
+
objectUtil2.mergeShapes = (first, second) => {
|
|
70
|
+
return {
|
|
71
|
+
...first,
|
|
72
|
+
...second
|
|
73
|
+
// second overwrites first
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
})(objectUtil || (objectUtil = {}));
|
|
77
|
+
util.arrayToEnum([
|
|
78
|
+
"string",
|
|
79
|
+
"nan",
|
|
80
|
+
"number",
|
|
81
|
+
"integer",
|
|
82
|
+
"float",
|
|
83
|
+
"boolean",
|
|
84
|
+
"date",
|
|
85
|
+
"bigint",
|
|
86
|
+
"symbol",
|
|
87
|
+
"function",
|
|
88
|
+
"undefined",
|
|
89
|
+
"null",
|
|
90
|
+
"array",
|
|
91
|
+
"object",
|
|
92
|
+
"unknown",
|
|
93
|
+
"promise",
|
|
94
|
+
"void",
|
|
95
|
+
"never",
|
|
96
|
+
"map",
|
|
97
|
+
"set"
|
|
98
|
+
]);
|
|
99
|
+
|
|
100
|
+
// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js
|
|
101
|
+
util.arrayToEnum([
|
|
102
|
+
"invalid_type",
|
|
103
|
+
"invalid_literal",
|
|
104
|
+
"custom",
|
|
105
|
+
"invalid_union",
|
|
106
|
+
"invalid_union_discriminator",
|
|
107
|
+
"invalid_enum_value",
|
|
108
|
+
"unrecognized_keys",
|
|
109
|
+
"invalid_arguments",
|
|
110
|
+
"invalid_return_type",
|
|
111
|
+
"invalid_date",
|
|
112
|
+
"invalid_string",
|
|
113
|
+
"too_small",
|
|
114
|
+
"too_big",
|
|
115
|
+
"invalid_intersection_types",
|
|
116
|
+
"not_multiple_of",
|
|
117
|
+
"not_finite"
|
|
118
|
+
]);
|
|
119
|
+
var ZodError = class _ZodError extends Error {
|
|
120
|
+
get errors() {
|
|
121
|
+
return this.issues;
|
|
122
|
+
}
|
|
123
|
+
constructor(issues) {
|
|
124
|
+
super();
|
|
125
|
+
this.issues = [];
|
|
126
|
+
this.addIssue = (sub) => {
|
|
127
|
+
this.issues = [...this.issues, sub];
|
|
128
|
+
};
|
|
129
|
+
this.addIssues = (subs = []) => {
|
|
130
|
+
this.issues = [...this.issues, ...subs];
|
|
131
|
+
};
|
|
132
|
+
const actualProto = new.target.prototype;
|
|
133
|
+
if (Object.setPrototypeOf) {
|
|
134
|
+
Object.setPrototypeOf(this, actualProto);
|
|
135
|
+
} else {
|
|
136
|
+
this.__proto__ = actualProto;
|
|
137
|
+
}
|
|
138
|
+
this.name = "ZodError";
|
|
139
|
+
this.issues = issues;
|
|
140
|
+
}
|
|
141
|
+
format(_mapper) {
|
|
142
|
+
const mapper = _mapper || function(issue) {
|
|
143
|
+
return issue.message;
|
|
144
|
+
};
|
|
145
|
+
const fieldErrors = { _errors: [] };
|
|
146
|
+
const processError = (error) => {
|
|
147
|
+
for (const issue of error.issues) {
|
|
148
|
+
if (issue.code === "invalid_union") {
|
|
149
|
+
issue.unionErrors.map(processError);
|
|
150
|
+
} else if (issue.code === "invalid_return_type") {
|
|
151
|
+
processError(issue.returnTypeError);
|
|
152
|
+
} else if (issue.code === "invalid_arguments") {
|
|
153
|
+
processError(issue.argumentsError);
|
|
154
|
+
} else if (issue.path.length === 0) {
|
|
155
|
+
fieldErrors._errors.push(mapper(issue));
|
|
156
|
+
} else {
|
|
157
|
+
let curr = fieldErrors;
|
|
158
|
+
let i = 0;
|
|
159
|
+
while (i < issue.path.length) {
|
|
160
|
+
const el = issue.path[i];
|
|
161
|
+
const terminal = i === issue.path.length - 1;
|
|
162
|
+
if (!terminal) {
|
|
163
|
+
curr[el] = curr[el] || { _errors: [] };
|
|
164
|
+
} else {
|
|
165
|
+
curr[el] = curr[el] || { _errors: [] };
|
|
166
|
+
curr[el]._errors.push(mapper(issue));
|
|
167
|
+
}
|
|
168
|
+
curr = curr[el];
|
|
169
|
+
i++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
processError(this);
|
|
175
|
+
return fieldErrors;
|
|
176
|
+
}
|
|
177
|
+
static assert(value) {
|
|
178
|
+
if (!(value instanceof _ZodError)) {
|
|
179
|
+
throw new Error(`Not a ZodError: ${value}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
toString() {
|
|
183
|
+
return this.message;
|
|
184
|
+
}
|
|
185
|
+
get message() {
|
|
186
|
+
return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);
|
|
187
|
+
}
|
|
188
|
+
get isEmpty() {
|
|
189
|
+
return this.issues.length === 0;
|
|
190
|
+
}
|
|
191
|
+
flatten(mapper = (issue) => issue.message) {
|
|
192
|
+
const fieldErrors = {};
|
|
193
|
+
const formErrors = [];
|
|
194
|
+
for (const sub of this.issues) {
|
|
195
|
+
if (sub.path.length > 0) {
|
|
196
|
+
const firstEl = sub.path[0];
|
|
197
|
+
fieldErrors[firstEl] = fieldErrors[firstEl] || [];
|
|
198
|
+
fieldErrors[firstEl].push(mapper(sub));
|
|
199
|
+
} else {
|
|
200
|
+
formErrors.push(mapper(sub));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { formErrors, fieldErrors };
|
|
204
|
+
}
|
|
205
|
+
get formErrors() {
|
|
206
|
+
return this.flatten();
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
ZodError.create = (issues) => {
|
|
210
|
+
const error = new ZodError(issues);
|
|
211
|
+
return error;
|
|
212
|
+
};
|
|
213
|
+
var errorHandler = (err, c) => {
|
|
214
|
+
logger.error("Error:", { name: err.name, message: err.message, stack: err.stack });
|
|
215
|
+
if (err instanceof ZodError) {
|
|
216
|
+
return c.json(
|
|
217
|
+
{
|
|
218
|
+
success: false,
|
|
219
|
+
error: "Validation failed",
|
|
220
|
+
code: "VALIDATION_ERROR",
|
|
221
|
+
details: err.errors.map((e) => ({ path: e.path.join("."), message: e.message }))
|
|
222
|
+
},
|
|
223
|
+
400
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
if (err instanceof AppError) {
|
|
227
|
+
return c.json(
|
|
228
|
+
{ success: false, error: err.message, code: err.code },
|
|
229
|
+
err.statusCode
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
if (err.name === "FirebaseError" || err.name === "FirestoreError") {
|
|
233
|
+
return c.json({ success: false, error: "Database error", code: "DATABASE_ERROR" }, 500);
|
|
234
|
+
}
|
|
235
|
+
return c.json({ success: false, error: "Internal server error", code: "INTERNAL_ERROR" }, 500);
|
|
236
|
+
};
|
|
237
|
+
var notFoundHandler = (c) => {
|
|
238
|
+
return c.json(
|
|
239
|
+
{
|
|
240
|
+
success: false,
|
|
241
|
+
error: `Route ${c.req.method} ${c.req.path} not found`,
|
|
242
|
+
code: "ROUTE_NOT_FOUND"
|
|
243
|
+
},
|
|
244
|
+
404
|
|
245
|
+
);
|
|
246
|
+
};
|
|
247
|
+
var BEARER_PREFIX = "Bearer ";
|
|
248
|
+
var DEV_USER = {
|
|
249
|
+
uid: "dev-user-001",
|
|
250
|
+
email: "dev@localhost",
|
|
251
|
+
email_verified: true,
|
|
252
|
+
aud: "dev-project",
|
|
253
|
+
auth_time: Math.floor(Date.now() / 1e3),
|
|
254
|
+
exp: Math.floor(Date.now() / 1e3) + 3600,
|
|
255
|
+
iat: Math.floor(Date.now() / 1e3),
|
|
256
|
+
iss: "https://securetoken.google.com/dev-project",
|
|
257
|
+
sub: "dev-user-001",
|
|
258
|
+
firebase: {
|
|
259
|
+
identities: {},
|
|
260
|
+
sign_in_provider: "custom"
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
var authenticateFirebase = createMiddleware(async (c, next) => {
|
|
264
|
+
const authorization = c.req.header("Authorization");
|
|
265
|
+
if (env.NODE_ENV === "development" && (!authorization || !authorization.startsWith(BEARER_PREFIX))) {
|
|
266
|
+
logger.debug("Dev bypass auth");
|
|
267
|
+
c.set("firebaseUser", DEV_USER);
|
|
268
|
+
return await next();
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
if (!authorization || !authorization.startsWith(BEARER_PREFIX)) {
|
|
272
|
+
return c.json({ error: "Authorization header missing or malformed" }, 401);
|
|
273
|
+
}
|
|
274
|
+
const token = authorization.slice(BEARER_PREFIX.length);
|
|
275
|
+
const decodedToken = await getAuth().verifyIdToken(token);
|
|
276
|
+
logger.info(`Auth verified: ${decodedToken.uid}`);
|
|
277
|
+
c.set("firebaseUser", decodedToken);
|
|
278
|
+
await next();
|
|
279
|
+
} catch (error) {
|
|
280
|
+
logger.warn(`Auth failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
281
|
+
return c.json({ error: "Unauthorized" }, 401);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
var validateBody = (schema) => zValidator("json", schema, (result, c) => {
|
|
285
|
+
if (!result.success) {
|
|
286
|
+
return c.json(
|
|
287
|
+
{
|
|
288
|
+
success: false,
|
|
289
|
+
error: "Validation failed",
|
|
290
|
+
code: "VALIDATION_ERROR",
|
|
291
|
+
details: result.error.issues.map((e) => ({ path: e.path.join("."), message: e.message }))
|
|
292
|
+
},
|
|
293
|
+
400
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
var validateQuery = (schema) => zValidator("query", schema, (result, c) => {
|
|
298
|
+
if (!result.success) {
|
|
299
|
+
return c.json(
|
|
300
|
+
{
|
|
301
|
+
success: false,
|
|
302
|
+
error: "Invalid query parameters",
|
|
303
|
+
code: "VALIDATION_ERROR",
|
|
304
|
+
details: result.error.issues.map((e) => ({ path: e.path.join("."), message: e.message }))
|
|
305
|
+
},
|
|
306
|
+
400
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
var validateParams = (schema) => zValidator("param", schema, (result, c) => {
|
|
311
|
+
if (!result.success) {
|
|
312
|
+
return c.json(
|
|
313
|
+
{
|
|
314
|
+
success: false,
|
|
315
|
+
error: "Invalid path parameters",
|
|
316
|
+
code: "VALIDATION_ERROR",
|
|
317
|
+
details: result.error.issues.map((e) => ({ path: e.path.join("."), message: e.message }))
|
|
318
|
+
},
|
|
319
|
+
400
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
function debugEventsRouter() {
|
|
324
|
+
const app2 = new Hono();
|
|
325
|
+
if (process.env.NODE_ENV !== "development") {
|
|
326
|
+
return app2;
|
|
327
|
+
}
|
|
328
|
+
app2.get("/event-log", (c) => {
|
|
329
|
+
const limit = parseInt(String(c.req.query("limit") ?? "50"), 10);
|
|
330
|
+
const events = getServerEventBus().getRecentEvents(limit);
|
|
331
|
+
return c.json({ count: events.length, events });
|
|
332
|
+
});
|
|
333
|
+
app2.delete("/event-log", (c) => {
|
|
334
|
+
getServerEventBus().clearEventLog();
|
|
335
|
+
return c.json({ cleared: true });
|
|
336
|
+
});
|
|
337
|
+
app2.get("/listeners", (c) => {
|
|
338
|
+
const counts = getServerEventBus().getListenerCounts();
|
|
339
|
+
const total = Object.values(counts).reduce((sum, n) => sum + n, 0);
|
|
340
|
+
return c.json({ total, events: counts });
|
|
341
|
+
});
|
|
342
|
+
app2.post("/seed", async (c) => {
|
|
343
|
+
const body = await c.req.json();
|
|
344
|
+
const { entities } = body;
|
|
345
|
+
if (!entities || !Array.isArray(entities)) {
|
|
346
|
+
return c.json({ error: 'Body must have "entities" array' }, 400);
|
|
347
|
+
}
|
|
348
|
+
const configs = entities.map((e) => ({
|
|
349
|
+
name: e.name,
|
|
350
|
+
fields: e.fields,
|
|
351
|
+
seedCount: e.seedCount ?? 5
|
|
352
|
+
}));
|
|
353
|
+
seedMockData(configs);
|
|
354
|
+
const summary = configs.map((cfg) => `${cfg.name}(${String(cfg.seedCount)})`).join(", ");
|
|
355
|
+
return c.json({ seeded: true, summary });
|
|
356
|
+
});
|
|
357
|
+
return app2;
|
|
358
|
+
}
|
|
359
|
+
async function getObservabilityCollector() {
|
|
360
|
+
const mod = await import('@almadar-io/agent');
|
|
361
|
+
return mod.getObservabilityCollector();
|
|
362
|
+
}
|
|
363
|
+
var app = new Hono();
|
|
364
|
+
app.get("/metrics", async (c) => {
|
|
365
|
+
try {
|
|
366
|
+
const collector = await getObservabilityCollector();
|
|
367
|
+
const snapshot = collector.getPerformanceSnapshot();
|
|
368
|
+
return c.json(snapshot);
|
|
369
|
+
} catch (error) {
|
|
370
|
+
console.error("Metrics error:", error);
|
|
371
|
+
return c.json({ error: "Failed to get metrics" }, 500);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
app.get("/health", async (c) => {
|
|
375
|
+
try {
|
|
376
|
+
const collector = await getObservabilityCollector();
|
|
377
|
+
const health = await collector.healthCheck();
|
|
378
|
+
const allHealthy = health.every((h) => h.status === "healthy");
|
|
379
|
+
return c.json(
|
|
380
|
+
{
|
|
381
|
+
status: allHealthy ? "healthy" : "degraded",
|
|
382
|
+
timestamp: Date.now(),
|
|
383
|
+
checks: health
|
|
384
|
+
},
|
|
385
|
+
allHealthy ? 200 : 503
|
|
386
|
+
);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
console.error("Health check error:", error);
|
|
389
|
+
return c.json({ status: "unhealthy", error: "Health check failed" }, 500);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
app.get("/sessions/:threadId/telemetry", async (c) => {
|
|
393
|
+
try {
|
|
394
|
+
const collector = await getObservabilityCollector();
|
|
395
|
+
const telemetry = collector.getSessionTelemetry(c.req.param("threadId"));
|
|
396
|
+
if (!telemetry) {
|
|
397
|
+
return c.json({ error: "Session not found" }, 404);
|
|
398
|
+
}
|
|
399
|
+
return c.json(telemetry);
|
|
400
|
+
} catch (error) {
|
|
401
|
+
console.error("Telemetry error:", error);
|
|
402
|
+
return c.json({ error: "Failed to get telemetry" }, 500);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
app.get("/active-sessions", async (c) => {
|
|
406
|
+
try {
|
|
407
|
+
const collector = await getObservabilityCollector();
|
|
408
|
+
const sessions = collector.getActiveSessions();
|
|
409
|
+
return c.json(sessions);
|
|
410
|
+
} catch (error) {
|
|
411
|
+
console.error("Active sessions error:", error);
|
|
412
|
+
return c.json({ error: "Failed to get active sessions" }, 500);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
export { authenticateFirebase, debugEventsRouter, errorHandler, notFoundHandler, app as observabilityRouter, validateBody, validateParams, validateQuery };
|
|
417
|
+
//# sourceMappingURL=index.js.map
|
|
418
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js","../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js","../src/middleware/error-handler.ts","../src/middleware/auth.ts","../src/middleware/validation.ts","../src/lib/debug-router.ts","../src/routes/observability.ts"],"names":["util","objectUtil","logger","app","Hono"],"mappings":"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","file":"index.js","sourcesContent":["export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import type { ErrorHandler, NotFoundHandler } from 'hono';\nimport { ZodError } from 'zod';\nimport { logger, AppError } from '@almadar/server';\n\n/**\n * Global error handler for Hono applications.\n * Ports the Express errorHandler from @almadar/server.\n */\nexport const errorHandler: ErrorHandler = (err, c) => {\n logger.error('Error:', { name: err.name, message: err.message, stack: err.stack });\n\n // Zod validation errors\n if (err instanceof ZodError) {\n return c.json(\n {\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: err.errors.map((e) => ({ path: e.path.join('.'), message: e.message })),\n },\n 400,\n );\n }\n\n // Custom application errors\n if (err instanceof AppError) {\n return c.json(\n { success: false, error: err.message, code: err.code },\n err.statusCode as 400 | 401 | 403 | 404 | 409 | 500,\n );\n }\n\n // Firebase/Firestore errors\n if (err.name === 'FirebaseError' || err.name === 'FirestoreError') {\n return c.json({ success: false, error: 'Database error', code: 'DATABASE_ERROR' }, 500);\n }\n\n // Unknown errors\n return c.json({ success: false, error: 'Internal server error', code: 'INTERNAL_ERROR' }, 500);\n};\n\n/**\n * 404 handler for unmatched routes.\n */\nexport const notFoundHandler: NotFoundHandler = (c) => {\n return c.json(\n {\n success: false,\n error: `Route ${c.req.method} ${c.req.path} not found`,\n code: 'ROUTE_NOT_FOUND',\n },\n 404,\n );\n};\n","import { createMiddleware } from 'hono/factory';\nimport type { DecodedIdToken } from 'firebase-admin/auth';\nimport { getAuth, env, logger } from '@almadar/server';\nimport type { FirebaseEnv } from '../types.js';\n\nconst BEARER_PREFIX = 'Bearer ';\n\n/** Fake dev user injected when NODE_ENV=development and no auth header is present */\nconst DEV_USER: DecodedIdToken = {\n uid: 'dev-user-001',\n email: 'dev@localhost',\n email_verified: true,\n aud: 'dev-project',\n auth_time: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n iat: Math.floor(Date.now() / 1000),\n iss: 'https://securetoken.google.com/dev-project',\n sub: 'dev-user-001',\n firebase: {\n identities: {},\n sign_in_provider: 'custom',\n },\n};\n\n/**\n * Firebase authentication middleware for Hono.\n * Ports the Express authenticateFirebase from @almadar/server.\n *\n * In development mode, skips auth when no token is present and injects DEV_USER.\n */\nexport const authenticateFirebase = createMiddleware<FirebaseEnv>(async (c, next) => {\n const authorization = c.req.header('Authorization');\n\n // Dev bypass: in development mode, skip auth if no token is provided\n if (env.NODE_ENV === 'development' && (!authorization || !authorization.startsWith(BEARER_PREFIX))) {\n logger.debug('Dev bypass auth');\n c.set('firebaseUser', DEV_USER);\n return await next();\n }\n\n try {\n if (!authorization || !authorization.startsWith(BEARER_PREFIX)) {\n return c.json({ error: 'Authorization header missing or malformed' }, 401);\n }\n\n const token = authorization.slice(BEARER_PREFIX.length);\n const decodedToken = await getAuth().verifyIdToken(token);\n\n logger.info(`Auth verified: ${decodedToken.uid}`);\n c.set('firebaseUser', decodedToken);\n await next();\n } catch (error) {\n logger.warn(`Auth failed: ${error instanceof Error ? error.message : String(error)}`);\n return c.json({ error: 'Unauthorized' }, 401);\n }\n});\n","import { zValidator } from '@hono/zod-validator';\nimport type { ZodObject, ZodRawShape } from 'zod';\n\n/**\n * Validate request JSON body against a Zod schema.\n */\nexport const validateBody = <T extends ZodRawShape>(schema: ZodObject<T>) =>\n zValidator('json', schema, (result, c) => {\n if (!result.success) {\n return c.json(\n {\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: result.error.issues.map((e) => ({ path: e.path.join('.'), message: e.message })),\n },\n 400,\n );\n }\n });\n\n/**\n * Validate request query parameters against a Zod schema.\n */\nexport const validateQuery = <T extends ZodRawShape>(schema: ZodObject<T>) =>\n zValidator('query', schema, (result, c) => {\n if (!result.success) {\n return c.json(\n {\n success: false,\n error: 'Invalid query parameters',\n code: 'VALIDATION_ERROR',\n details: result.error.issues.map((e) => ({ path: e.path.join('.'), message: e.message })),\n },\n 400,\n );\n }\n });\n\n/**\n * Validate request path parameters against a Zod schema.\n */\nexport const validateParams = <T extends ZodRawShape>(schema: ZodObject<T>) =>\n zValidator('param', schema, (result, c) => {\n if (!result.success) {\n return c.json(\n {\n success: false,\n error: 'Invalid path parameters',\n code: 'VALIDATION_ERROR',\n details: result.error.issues.map((e) => ({ path: e.path.join('.'), message: e.message })),\n },\n 400,\n );\n }\n });\n","/**\n * Debug Events Router (Hono)\n *\n * Provides diagnostic endpoints for inspecting the server EventBus.\n * Only active when NODE_ENV=development.\n *\n * Endpoints:\n * GET /event-log - Recent emitted events with listener counts\n * DELETE /event-log - Clear the event log\n * GET /listeners - Registered listener counts per event\n * POST /seed - Seed MockDataService with entity data\n *\n * @packageDocumentation\n */\n\nimport { Hono } from 'hono';\nimport { getServerEventBus, seedMockData, type EntitySeedConfig, type FieldSchema } from '@almadar/server';\n\n/**\n * Creates a Hono router with debug endpoints for the server EventBus.\n * Returns a router with no routes in production.\n */\nexport function debugEventsRouter(): Hono {\n const app = new Hono();\n\n if (process.env.NODE_ENV !== 'development') {\n return app;\n }\n\n app.get('/event-log', (c) => {\n const limit = parseInt(String(c.req.query('limit') ?? '50'), 10);\n const events = getServerEventBus().getRecentEvents(limit);\n return c.json({ count: events.length, events });\n });\n\n app.delete('/event-log', (c) => {\n getServerEventBus().clearEventLog();\n return c.json({ cleared: true });\n });\n\n app.get('/listeners', (c) => {\n const counts = getServerEventBus().getListenerCounts();\n const total = Object.values(counts).reduce((sum, n) => sum + n, 0);\n return c.json({ total, events: counts });\n });\n\n /**\n * POST /seed - Seed MockDataService with entity data from schema.\n *\n * Body: { entities: Array<{ name: string, fields: FieldSchema[], seedCount?: number }> }\n */\n app.post('/seed', async (c) => {\n const body = await c.req.json<{\n entities?: Array<{ name: string; fields: FieldSchema[]; seedCount?: number }>;\n }>();\n\n const { entities } = body;\n\n if (!entities || !Array.isArray(entities)) {\n return c.json({ error: 'Body must have \"entities\" array' }, 400);\n }\n\n const configs: EntitySeedConfig[] = entities.map((e) => ({\n name: e.name,\n fields: e.fields,\n seedCount: e.seedCount ?? 5,\n }));\n\n seedMockData(configs);\n\n const summary = configs.map((cfg) => `${cfg.name}(${String(cfg.seedCount)})`).join(', ');\n return c.json({ seeded: true, summary });\n });\n\n return app;\n}\n","/**\n * Observability Routes (Hono)\n *\n * Provides endpoints for metrics, health checks, and telemetry.\n * Requires @almadar-io/agent as an optional peer dependency.\n *\n * @packageDocumentation\n */\n\nimport { Hono } from 'hono';\n\nasync function getObservabilityCollector() {\n const mod = await import('@almadar-io/agent');\n return mod.getObservabilityCollector();\n}\n\nconst app = new Hono();\n\n/**\n * GET /metrics - Get performance snapshot\n */\napp.get('/metrics', async (c) => {\n try {\n const collector = await getObservabilityCollector();\n const snapshot = collector.getPerformanceSnapshot();\n return c.json(snapshot);\n } catch (error) {\n console.error('Metrics error:', error);\n return c.json({ error: 'Failed to get metrics' }, 500);\n }\n});\n\n/**\n * GET /health - Get health check\n */\napp.get('/health', async (c) => {\n try {\n const collector = await getObservabilityCollector();\n const health = await collector.healthCheck();\n const allHealthy = health.every((h) => h.status === 'healthy');\n\n return c.json(\n {\n status: allHealthy ? 'healthy' : 'degraded',\n timestamp: Date.now(),\n checks: health,\n },\n allHealthy ? 200 : 503,\n );\n } catch (error) {\n console.error('Health check error:', error);\n return c.json({ status: 'unhealthy', error: 'Health check failed' }, 500);\n }\n});\n\n/**\n * GET /sessions/:threadId/telemetry - Get session telemetry\n */\napp.get('/sessions/:threadId/telemetry', async (c) => {\n try {\n const collector = await getObservabilityCollector();\n const telemetry = collector.getSessionTelemetry(c.req.param('threadId'));\n\n if (!telemetry) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return c.json(telemetry);\n } catch (error) {\n console.error('Telemetry error:', error);\n return c.json({ error: 'Failed to get telemetry' }, 500);\n }\n});\n\n/**\n * GET /active-sessions - Get active sessions\n */\napp.get('/active-sessions', async (c) => {\n try {\n const collector = await getObservabilityCollector();\n const sessions = collector.getActiveSessions();\n return c.json(sessions);\n } catch (error) {\n console.error('Active sessions error:', error);\n return c.json({ error: 'Failed to get active sessions' }, 500);\n }\n});\n\nexport { app as observabilityRouter };\nexport default app;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Events Router (Hono)
|
|
3
|
+
*
|
|
4
|
+
* Provides diagnostic endpoints for inspecting the server EventBus.
|
|
5
|
+
* Only active when NODE_ENV=development.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* GET /event-log - Recent emitted events with listener counts
|
|
9
|
+
* DELETE /event-log - Clear the event log
|
|
10
|
+
* GET /listeners - Registered listener counts per event
|
|
11
|
+
* POST /seed - Seed MockDataService with entity data
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import { Hono } from 'hono';
|
|
16
|
+
/**
|
|
17
|
+
* Creates a Hono router with debug endpoints for the server EventBus.
|
|
18
|
+
* Returns a router with no routes in production.
|
|
19
|
+
*/
|
|
20
|
+
export declare function debugEventsRouter(): Hono;
|
|
21
|
+
//# sourceMappingURL=debug-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-router.d.ts","sourceRoot":"","sources":["../../src/lib/debug-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAqDxC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FirebaseEnv } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Firebase authentication middleware for Hono.
|
|
4
|
+
* Ports the Express authenticateFirebase from @almadar/server.
|
|
5
|
+
*
|
|
6
|
+
* In development mode, skips auth when no token is present and injects DEV_USER.
|
|
7
|
+
*/
|
|
8
|
+
export declare const authenticateFirebase: import("hono").MiddlewareHandler<FirebaseEnv, string, {}, Response>;
|
|
9
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqB/C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,qEAyB/B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ErrorHandler, NotFoundHandler } from 'hono';
|
|
2
|
+
/**
|
|
3
|
+
* Global error handler for Hono applications.
|
|
4
|
+
* Ports the Express errorHandler from @almadar/server.
|
|
5
|
+
*/
|
|
6
|
+
export declare const errorHandler: ErrorHandler;
|
|
7
|
+
/**
|
|
8
|
+
* 404 handler for unmatched routes.
|
|
9
|
+
*/
|
|
10
|
+
export declare const notFoundHandler: NotFoundHandler;
|
|
11
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAI1D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,YA+B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,eAS7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ZodObject, ZodRawShape } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Validate request JSON body against a Zod schema.
|
|
4
|
+
*/
|
|
5
|
+
export declare const validateBody: <T extends ZodRawShape>(schema: ZodObject<T>) => import("hono").MiddlewareHandler<import("hono").Env, string, {
|
|
6
|
+
in: (undefined extends (import("zod").baseObjectInputType<T> extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never) ? true : false) extends true ? {
|
|
7
|
+
json?: ((import("zod").baseObjectInputType<T> extends infer T_2 ? { [k in keyof T_2]: T_2[k]; } : never) extends infer T_3 ? T_3 extends (import("zod").baseObjectInputType<T> extends infer T_4 ? { [k in keyof T_4]: T_4[k]; } : never) ? T_3 extends any ? T_3 : { [K2 in keyof T_3]?: any; } : never : never) | undefined;
|
|
8
|
+
} : {
|
|
9
|
+
json: (import("zod").baseObjectInputType<T> extends infer T_5 ? { [k in keyof T_5]: T_5[k]; } : never) extends infer T_6 ? T_6 extends (import("zod").baseObjectInputType<T> extends infer T_7 ? { [k in keyof T_7]: T_7[k]; } : never) ? T_6 extends any ? T_6 : { [K2_1 in keyof T_6]: any; } : never : never;
|
|
10
|
+
};
|
|
11
|
+
out: {
|
|
12
|
+
json: import("zod").objectUtil.addQuestionMarks<import("zod").baseObjectOutputType<T>, any> extends infer T_8 ? { [k_1 in keyof T_8]: T_8[k_1]; } : never;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Validate request query parameters against a Zod schema.
|
|
17
|
+
*/
|
|
18
|
+
export declare const validateQuery: <T extends ZodRawShape>(schema: ZodObject<T>) => import("hono").MiddlewareHandler<import("hono").Env, string, {
|
|
19
|
+
in: (undefined extends (import("zod").baseObjectInputType<T> extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never) ? true : false) extends true ? {
|
|
20
|
+
query?: ((import("zod").baseObjectInputType<T> extends infer T_2 ? { [k in keyof T_2]: T_2[k]; } : never) extends infer T_3 ? T_3 extends (import("zod").baseObjectInputType<T> extends infer T_4 ? { [k in keyof T_4]: T_4[k]; } : never) ? T_3 extends Record<string, string | string[]> ? T_3 : { [K2 in keyof T_3]?: Record<string, string | string[]>[K2] | undefined; } : never : never) | undefined;
|
|
21
|
+
} : {
|
|
22
|
+
query: (import("zod").baseObjectInputType<T> extends infer T_5 ? { [k in keyof T_5]: T_5[k]; } : never) extends infer T_6 ? T_6 extends (import("zod").baseObjectInputType<T> extends infer T_7 ? { [k in keyof T_7]: T_7[k]; } : never) ? T_6 extends Record<string, string | string[]> ? T_6 : { [K2_1 in keyof T_6]: Record<string, string | string[]>[K2_1]; } : never : never;
|
|
23
|
+
};
|
|
24
|
+
out: {
|
|
25
|
+
query: import("zod").objectUtil.addQuestionMarks<import("zod").baseObjectOutputType<T>, any> extends infer T_8 ? { [k_1 in keyof T_8]: T_8[k_1]; } : never;
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate request path parameters against a Zod schema.
|
|
30
|
+
*/
|
|
31
|
+
export declare const validateParams: <T extends ZodRawShape>(schema: ZodObject<T>) => import("hono").MiddlewareHandler<import("hono").Env, string, {
|
|
32
|
+
in: (undefined extends (import("zod").baseObjectInputType<T> extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never) ? true : false) extends true ? {
|
|
33
|
+
param?: ((import("zod").baseObjectInputType<T> extends infer T_2 ? { [k in keyof T_2]: T_2[k]; } : never) extends infer T_3 ? T_3 extends (import("zod").baseObjectInputType<T> extends infer T_4 ? { [k in keyof T_4]: T_4[k]; } : never) ? T_3 extends Record<string, string> ? T_3 : { [K2 in keyof T_3]?: Record<string, string>[K2] | undefined; } : never : never) | undefined;
|
|
34
|
+
} : {
|
|
35
|
+
param: (import("zod").baseObjectInputType<T> extends infer T_5 ? { [k in keyof T_5]: T_5[k]; } : never) extends infer T_6 ? T_6 extends (import("zod").baseObjectInputType<T> extends infer T_7 ? { [k in keyof T_7]: T_7[k]; } : never) ? T_6 extends Record<string, string> ? T_6 : { [K2_1 in keyof T_6]: Record<string, string>[K2_1]; } : never : never;
|
|
36
|
+
};
|
|
37
|
+
out: {
|
|
38
|
+
param: import("zod").objectUtil.addQuestionMarks<import("zod").baseObjectOutputType<T>, any> extends infer T_8 ? { [k_1 in keyof T_8]: T_8[k_1]; } : never;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/middleware/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,WAAW,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC;;;;;;;;;EAapE,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,WAAW,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC;;;;;;;;;EAarE,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,WAAW,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC;;;;;;;;;EAatE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability Routes (Hono)
|
|
3
|
+
*
|
|
4
|
+
* Provides endpoints for metrics, health checks, and telemetry.
|
|
5
|
+
* Requires @almadar-io/agent as an optional peer dependency.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { Hono } from 'hono';
|
|
10
|
+
declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
11
|
+
export { app as observabilityRouter };
|
|
12
|
+
export default app;
|
|
13
|
+
//# sourceMappingURL=observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/routes/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,QAAA,MAAM,GAAG,4EAAa,CAAC;AAwEvB,OAAO,EAAE,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACtC,eAAe,GAAG,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DecodedIdToken } from 'firebase-admin/auth';
|
|
2
|
+
export interface UserContext {
|
|
3
|
+
uid: string;
|
|
4
|
+
email?: string;
|
|
5
|
+
orgId?: string;
|
|
6
|
+
roles: string[];
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
}
|
|
9
|
+
export type FirebaseVariables = {
|
|
10
|
+
firebaseUser: DecodedIdToken;
|
|
11
|
+
};
|
|
12
|
+
export type UserContextVariables = FirebaseVariables & {
|
|
13
|
+
user: UserContext;
|
|
14
|
+
userContext: UserContext;
|
|
15
|
+
};
|
|
16
|
+
export type AppEnv = {
|
|
17
|
+
Variables: FirebaseVariables;
|
|
18
|
+
};
|
|
19
|
+
export type FirebaseEnv = {
|
|
20
|
+
Variables: FirebaseVariables;
|
|
21
|
+
};
|
|
22
|
+
export type FullUserEnv = {
|
|
23
|
+
Variables: UserContextVariables;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,cAAc,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG;IAAE,SAAS,EAAE,oBAAoB,CAAA;CAAE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@almadar/server-hono",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Hono server infrastructure for Almadar applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"registry": "https://registry.npmjs.org",
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@almadar/core": ">=2.8.0",
|
|
24
|
+
"@almadar/server": ">=2.2.0",
|
|
25
|
+
"hono": "^4.7.0"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@hono/zod-validator": ">=0.4.0",
|
|
29
|
+
"@almadar-io/agent": ">=2.0.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"@almadar-io/agent": {
|
|
33
|
+
"optional": true
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@almadar/eslint-plugin": ">=2.3.0",
|
|
38
|
+
"@hono/zod-validator": "^0.4.0",
|
|
39
|
+
"@types/node": "^20.0.0",
|
|
40
|
+
"@typescript-eslint/parser": "8.56.0",
|
|
41
|
+
"eslint": "10.0.0",
|
|
42
|
+
"firebase-admin": "^12.0.0",
|
|
43
|
+
"tsup": "^8.0.0",
|
|
44
|
+
"typescript": "^5.7.0",
|
|
45
|
+
"vitest": "^2.1.0",
|
|
46
|
+
"zod": "^3.24.0"
|
|
47
|
+
},
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/almadar-io/almadar-server-hono.git"
|
|
51
|
+
},
|
|
52
|
+
"license": "BSL-1.1",
|
|
53
|
+
"keywords": [
|
|
54
|
+
"almadar",
|
|
55
|
+
"server",
|
|
56
|
+
"hono",
|
|
57
|
+
"middleware"
|
|
58
|
+
],
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "tsup && tsc -p tsconfig.decl.json",
|
|
61
|
+
"build:watch": "tsup --watch",
|
|
62
|
+
"lint": "eslint src/",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"test": "vitest --run --passWithNoTests"
|
|
65
|
+
}
|
|
66
|
+
}
|