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.
Files changed (2) hide show
  1. package/index.ts +69 -14
  2. 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
- body = await request.text();
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
- const ctx: Context = {
456
- params: route.config?.params ? this.validateData(route.config.params, params) : params,
457
- query: route.config?.query ? this.validateData(route.config.query, query) : query,
458
- body: route.config?.body ? this.validateData(route.config.body, body) : body,
459
- headers: route.config?.headers ? this.validateData(route.config.headers, headers) : headers,
460
- path: pathname,
461
- request,
462
- set: {}
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
- this.server.stop();
670
- this.server = null;
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 } {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bxo",
3
3
  "module": "index.ts",
4
- "version": "0.0.5-dev.17",
4
+ "version": "0.0.5-dev.18",
5
5
  "description": "A simple and lightweight web framework for Bun",
6
6
  "type": "module",
7
7
  "devDependencies": {