aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-php-rpc/php/runtime
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-06 02:40:00 +0900
committernsfisis <nsfisis@gmail.com>2026-08-06 02:40:00 +0900
commit90764c477f24e4d67d3e0cae943c33fd2b8ae220 (patch)
tree8274fb1e266d6a14653c2a440cc6831ffda1c6bf /crates/shirabe-php-rpc/php/runtime
parent0e89281dd7f057d3829508b8e6c5d85c3f111c45 (diff)
downloadphp-shirabe-90764c477f24e4d67d3e0cae943c33fd2b8ae220.tar.gz
php-shirabe-90764c477f24e4d67d3e0cae943c33fd2b8ae220.tar.zst
php-shirabe-90764c477f24e4d67d3e0cae943c33fd2b8ae220.zip
feat(plugin): widen the RPC surface to LibraryInstaller-based plugins
An installer that extends LibraryInstaller reaches for the Composer object graph in ways the proxy did not answer: the download manager and the config, the writable repository methods, a React promise as its own return value, and `new Package(...)` from its supports() path. * `Composer::getConfig`/`getDownloadManager` are dispatched, and both classes become generated proxy stubs. Their reads and mutators answer from the Rust entity; the surfaces needing stubs of their own (ConfigSourceInterface, DownloaderInterface) stay explicit errors. * The download manager's futures are driven to completion and handed back as already-settled React promises, since PHP declares a non-nullable PromiseInterface there. A promise a plugin returns is drained the same way: settled yields its value, rejected re-raises, pending is an explicit error. * Proxy stubs now carry the real class's constructor and ask the Rust side to allocate the entity; reviving a stub for an existing entity binds the handle without running it. Classes Rust cannot build name themselves in the error. * The package proxy covers `Package`'s own setters, `CompletePackage`'s metadata, `RootPackage`'s root-only state, and `BasePackage::$id`. Link values and release dates still have no wire image, so the methods carrying them remain explicit errors.
Diffstat (limited to 'crates/shirabe-php-rpc/php/runtime')
-rw-r--r--crates/shirabe-php-rpc/php/runtime/Composer/EventDispatcher/Event.php30
1 files changed, 11 insertions, 19 deletions
diff --git a/crates/shirabe-php-rpc/php/runtime/Composer/EventDispatcher/Event.php b/crates/shirabe-php-rpc/php/runtime/Composer/EventDispatcher/Event.php
index 0d35ac55..e2c63439 100644
--- a/crates/shirabe-php-rpc/php/runtime/Composer/EventDispatcher/Event.php
+++ b/crates/shirabe-php-rpc/php/runtime/Composer/EventDispatcher/Event.php
@@ -4,9 +4,10 @@
// lives in both worlds at once: an instance revived from a Rust handle proxies every call over
// RPC (like a generated stub), while an instance constructed natively — real Composer code in
// this process does `new PreCommandRunEvent(...)`, whose parent constructor lands here — is a
-// faithful in-process port of the real base class. The two modes are told apart by the
-// constructor arguments; `__shirabeRustHandleDescriptor()` returns null in native mode so the
-// wire codec registers the object in the P table instead of treating it as a Rust handle.
+// faithful in-process port of the real base class. Proxy revival binds the handle without
+// running the constructor, so the constructor below is the native mode alone;
+// `__shirabeRustHandleDescriptor()` returns null there so the wire codec registers the object in
+// the P table instead of treating it as a Rust handle.
namespace Composer\EventDispatcher;
@@ -29,29 +30,20 @@ class Event implements \ShirabeRustStub
/** @var bool Whether the event should not be passed to more listeners (native mode) */
private $propagationStopped = false;
- /**
- * Proxy revival passes (int $rhandle, int $epoch); the real class's constructor is
- * (string $name, array $args = [], array $flags = []).
- */
- public function __construct($name = null, $args = [], $flags = [])
+ public function __construct(string $name, array $args = [], array $flags = [])
{
- if (is_int($name) && func_num_args() === 2 && is_int($args)) {
- $this->__rhandle = $name;
- $this->__epoch = $args;
-
- return;
- }
- if (!is_string($name)) {
- throw new \RuntimeException(
- 'Shirabe does not support constructing ' . static::class . ' inside the plugin process without an event name'
- );
- }
$this->__rhandle = null;
$this->name = $name;
$this->args = $args;
$this->flags = $flags;
}
+ public function __shirabeBind(int $rhandle, int $epoch): void
+ {
+ $this->__rhandle = $rhandle;
+ $this->__epoch = $epoch;
+ }
+
public function __destruct()
{
if ($this->__rhandle !== null) {