bxo 0.0.5-dev.17 → 0.0.5-dev.18
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/index.ts +69 -14
- package/package.json +1 -1
package/index.ts
CHANGED
@@ -447,20 +447,50 @@ export default class BXO {
|
|
447
447
|
const formData = await request.formData();
|
448
448
|
body = Object.fromEntries(formData.entries());
|
449
449
|
} else {
|
450
|
-
|
450
|
+
// Try to parse as JSON if it looks like JSON, otherwise treat as text
|
451
|
+
const textBody = await request.text();
|
452
|
+
try {
|
453
|
+
// Check if the text looks like JSON
|
454
|
+
if (textBody.trim().startsWith('{') || textBody.trim().startsWith('[')) {
|
455
|
+
body = JSON.parse(textBody);
|
456
|
+
} else {
|
457
|
+
body = textBody;
|
458
|
+
}
|
459
|
+
} catch {
|
460
|
+
body = textBody;
|
461
|
+
}
|
451
462
|
}
|
452
463
|
}
|
453
464
|
|
454
|
-
// Create context
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
465
|
+
// Create context with validation
|
466
|
+
let ctx: Context;
|
467
|
+
try {
|
468
|
+
// Validate each part separately to get better error messages
|
469
|
+
const validatedParams = route.config?.params ? this.validateData(route.config.params, params) : params;
|
470
|
+
const validatedQuery = route.config?.query ? this.validateData(route.config.query, query) : query;
|
471
|
+
const validatedBody = route.config?.body ? this.validateData(route.config.body, body) : body;
|
472
|
+
const validatedHeaders = route.config?.headers ? this.validateData(route.config.headers, headers) : headers;
|
473
|
+
|
474
|
+
ctx = {
|
475
|
+
params: validatedParams,
|
476
|
+
query: validatedQuery,
|
477
|
+
body: validatedBody,
|
478
|
+
headers: validatedHeaders,
|
479
|
+
path: pathname,
|
480
|
+
request,
|
481
|
+
set: {}
|
482
|
+
};
|
483
|
+
} catch (validationError) {
|
484
|
+
// Validation failed - return error response
|
485
|
+
const errorMessage = validationError instanceof Error ? validationError.message : 'Validation failed';
|
486
|
+
return new Response(JSON.stringify({
|
487
|
+
error: `Validation error: ${errorMessage}`,
|
488
|
+
details: validationError instanceof Error && 'errors' in validationError ? validationError.errors : undefined
|
489
|
+
}), {
|
490
|
+
status: 400,
|
491
|
+
headers: { 'Content-Type': 'application/json' }
|
492
|
+
});
|
493
|
+
}
|
464
494
|
|
465
495
|
try {
|
466
496
|
// Run global onRequest hook
|
@@ -493,6 +523,7 @@ export default class BXO {
|
|
493
523
|
// Validate response against schema if provided
|
494
524
|
if (route.config?.response && !(response instanceof Response)) {
|
495
525
|
try {
|
526
|
+
console.log('response', response);
|
496
527
|
response = this.validateData(route.config.response, response);
|
497
528
|
} catch (validationError) {
|
498
529
|
// Response validation failed
|
@@ -629,6 +660,11 @@ export default class BXO {
|
|
629
660
|
}
|
630
661
|
});
|
631
662
|
|
663
|
+
// Verify server was created successfully
|
664
|
+
if (!this.server) {
|
665
|
+
throw new Error('Failed to create server instance');
|
666
|
+
}
|
667
|
+
|
632
668
|
this.isRunning = true;
|
633
669
|
this.serverPort = port;
|
634
670
|
this.serverHostname = hostname;
|
@@ -666,10 +702,22 @@ export default class BXO {
|
|
666
702
|
}
|
667
703
|
|
668
704
|
if (this.server) {
|
669
|
-
|
670
|
-
|
705
|
+
try {
|
706
|
+
// Try to stop the server gracefully
|
707
|
+
if (typeof this.server.stop === 'function') {
|
708
|
+
this.server.stop();
|
709
|
+
} else {
|
710
|
+
console.warn('⚠️ Server stop method not available');
|
711
|
+
}
|
712
|
+
} catch (stopError) {
|
713
|
+
console.error('❌ Error calling server.stop():', stopError);
|
714
|
+
}
|
715
|
+
|
716
|
+
// Clear the server reference
|
717
|
+
this.server = undefined;
|
671
718
|
}
|
672
719
|
|
720
|
+
// Reset state regardless of server.stop() success
|
673
721
|
this.isRunning = false;
|
674
722
|
this.serverPort = undefined;
|
675
723
|
this.serverHostname = undefined;
|
@@ -679,8 +727,15 @@ export default class BXO {
|
|
679
727
|
await this.hooks.onAfterStop(this);
|
680
728
|
}
|
681
729
|
|
730
|
+
console.log('✅ Server stopped successfully');
|
731
|
+
|
682
732
|
} catch (error) {
|
683
733
|
console.error('❌ Error stopping server:', error);
|
734
|
+
// Even if there's an error, reset the state
|
735
|
+
this.isRunning = false;
|
736
|
+
this.server = undefined;
|
737
|
+
this.serverPort = undefined;
|
738
|
+
this.serverHostname = undefined;
|
684
739
|
throw error;
|
685
740
|
}
|
686
741
|
}
|
@@ -694,7 +749,7 @@ export default class BXO {
|
|
694
749
|
|
695
750
|
// Server status
|
696
751
|
isServerRunning(): boolean {
|
697
|
-
return this.isRunning;
|
752
|
+
return this.isRunning && this.server !== undefined;
|
698
753
|
}
|
699
754
|
|
700
755
|
getServerInfo(): { running: boolean } {
|