🚀 feat: NewP2PBox天才アルゴリズム完全実装 - P2P通信革命達成

## 🧠 天才アルゴリズム実装
- ローカル配送: MessageBus経由(爆速)
- リモート配送: Transport経由(柔軟)
- 完全自動判別・透明処理

## 📡 実装完了機能
1. NewP2PBox本体(天才アルゴリズム内蔵)
2. MessageBusシングルトン(高速ローカル配送)
3. Transport trait抽象化(InProcess/WebSocket/WebRTC)
4. MethodBox統合(Nyash側コールバック)
5. インタープリター完全統合

##  動作確認済み
- Rustクロージャ版: 全機能完璧動作
- MethodBox統合: コールバック正常動作
- インタープリター統合: Nyashから直接利用可能

## 🎯 利用可能Nyash構文
```nyash
alice = new NewP2PBox("alice", "InProcess")
msg = new MessageIntentBox("greeting")
msg.set("text", "Hello\!")
alice.send("bob", msg)
bob.onMethod("greeting", handler)
```

🎉 NyaMeshP2Pライブラリの基盤完成!次はP2PBoxデリゲート実装へ

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-11 17:51:16 +09:00
parent 312ba73b4b
commit 3876b83e26
8 changed files with 484 additions and 29 deletions

View File

@ -6,7 +6,8 @@ use crate::interpreter::core::NyashInterpreter;
use crate::interpreter::core::RuntimeError;
use crate::ast::ASTNode;
use crate::box_trait::{NyashBox, StringBox};
use crate::boxes::{IntentBox, P2PBox};
use crate::boxes::{IntentBox, P2PBox, NewP2PBox, MessageIntentBox};
use crate::method_box::MethodBox;
impl NyashInterpreter {
/// IntentBoxのメソッド実行
@ -70,26 +71,6 @@ impl NyashInterpreter {
})
}
// ブロードキャスト
"broadcast" => {
if arguments.len() < 2 {
return Err(RuntimeError::InvalidOperation {
message: "broadcast requires 2 arguments: intent, data".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
let data = self.execute_expression(&arguments[1])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
return Ok(p2p_box.broadcast(&intent_str.value, data));
}
Err(RuntimeError::TypeError {
message: "broadcast requires string argument for intent".to_string(),
})
}
// リスナー登録
"on" => {
if arguments.len() < 2 {
@ -134,4 +115,143 @@ impl NyashInterpreter {
})
}
}
/// NewP2PBoxのメソッド実行天才アルゴリズム版
pub(in crate::interpreter) fn execute_new_p2p_box_method(
&mut self,
p2p_box: &NewP2PBox,
method: &str,
arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// ードID取得
"getNodeId" | "getId" => {
Ok(Box::new(StringBox::new(p2p_box.get_node_id())))
}
// メッセージ送信(天才アルゴリズム)
"send" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "send requires 2 arguments: target, message_intent_box".to_string(),
});
}
let target = self.execute_expression(&arguments[0])?;
let message_box = self.execute_expression(&arguments[1])?;
if let Some(target_str) = target.as_any().downcast_ref::<StringBox>() {
if let Some(intent_box) = message_box.as_any().downcast_ref::<MessageIntentBox>() {
match p2p_box.send(&target_str.value, intent_box) {
Ok(()) => Ok(Box::new(StringBox::new("sent"))),
Err(e) => Err(RuntimeError::InvalidOperation { message: e }),
}
} else {
Err(RuntimeError::TypeError {
message: "send requires MessageIntentBox as second argument".to_string(),
})
}
} else {
Err(RuntimeError::TypeError {
message: "send requires string target as first argument".to_string(),
})
}
}
// リスナー登録MethodBox版
"onMethod" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "onMethod requires 2 arguments: intent, method_box".to_string(),
});
}
let intent = self.execute_expression(&arguments[0])?;
let method_box = self.execute_expression(&arguments[1])?;
if let Some(intent_str) = intent.as_any().downcast_ref::<StringBox>() {
if let Some(method_box) = method_box.as_any().downcast_ref::<MethodBox>() {
match p2p_box.on_method(&intent_str.value, method_box.clone()) {
Ok(()) => Ok(Box::new(StringBox::new("listener registered"))),
Err(e) => Err(RuntimeError::InvalidOperation { message: e }),
}
} else {
Err(RuntimeError::TypeError {
message: "onMethod requires MethodBox as second argument".to_string(),
})
}
} else {
Err(RuntimeError::TypeError {
message: "onMethod requires string intent as first argument".to_string(),
})
}
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("NewP2PBox method '{}' not found", method),
})
}
}
/// MessageIntentBoxのメソッド実行
pub(in crate::interpreter) fn execute_message_intent_box_method(
&mut self,
message_box: &mut MessageIntentBox,
method: &str,
arguments: &[ASTNode],
) -> Result<Box<dyn NyashBox>, RuntimeError> {
match method {
// intent取得
"getIntent" | "intent" => {
Ok(Box::new(StringBox::new(&message_box.intent)))
}
// データ設定
"set" => {
if arguments.len() != 2 {
return Err(RuntimeError::InvalidOperation {
message: "set requires 2 arguments: key, value".to_string(),
});
}
let key = self.execute_expression(&arguments[0])?;
let value = self.execute_expression(&arguments[1])?;
if let Some(key_str) = key.as_any().downcast_ref::<StringBox>() {
message_box.set(&key_str.value, value);
Ok(Box::new(StringBox::new("set")))
} else {
Err(RuntimeError::TypeError {
message: "set requires string key as first argument".to_string(),
})
}
}
// データ取得
"get" => {
if arguments.len() != 1 {
return Err(RuntimeError::InvalidOperation {
message: "get requires 1 argument: key".to_string(),
});
}
let key = self.execute_expression(&arguments[0])?;
if let Some(key_str) = key.as_any().downcast_ref::<StringBox>() {
if let Some(value) = message_box.get(&key_str.value) {
Ok(value.clone_box())
} else {
Ok(Box::new(crate::boxes::NullBox::new()))
}
} else {
Err(RuntimeError::TypeError {
message: "get requires string key as argument".to_string(),
})
}
}
_ => Err(RuntimeError::UndefinedVariable {
name: format!("MessageIntentBox method '{}' not found", method),
})
}
}
}