PHP Classes

File: pipe.go

Recommend this page to a friend!
  Classes of Wolfy-J  >  goridge  >  pipe.go  >  Download  
File: pipe.go
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: goridge
Run Golang code from PHP calling its RPC server
Author: By
Last change:
Date: 3 years ago
Size: 1,783 bytes


Class file image Download
package goridge

import (

// PipeRelay communicate with underlying process using standard streams (STDIN, STDOUT). Attention, use TCP alternative for
// Windows as more reliable option. This relay closes automatically with the process.
type PipeRelay struct {
	// How many bytes to write/read at once.
	BufferSize uint64

	mur sync.Mutex // concurrent read
	in  io.ReadCloser

	muw sync.Mutex // concurrent write
	out io.WriteCloser

// NewPipeRelay creates new pipe based data relay.
func NewPipeRelay(in io.ReadCloser, out io.WriteCloser) *PipeRelay {
	return &PipeRelay{BufferSize: BufferSize, in: in, out: out}

// Send signed (prefixed) data to underlying process.
func (rl *PipeRelay) Send(data []byte, flags byte) (err error) {
	defer rl.muw.Unlock()

	prefix := NewPrefix().WithFlags(flags).WithSize(uint64(len(data)))
	if _, err := rl.out.Write(prefix[:]); err != nil {
		return err

	if _, err := rl.out.Write(data); err != nil {
		return err

	return nil

// Receive data from the underlying process and returns associated prefix or error.
func (rl *PipeRelay) Receive() (data []byte, p Prefix, err error) {
	defer rl.mur.Unlock()

	if _, err :=[:]); err != nil {
		return nil, p, err

	if !p.HasPayload() {
		return nil, p, nil

	data = make([]byte, 0, p.Size())
	leftBytes := p.Size()
	buffer := make([]byte, min(uint64(cap(data)), rl.BufferSize))

	for {
		if n, err :=; err == nil {
			data = append(data, buffer[:n]...)
			leftBytes -= uint64(n)
		} else {
			return nil, p, err

		if leftBytes == 0 {


// Close the connection. Pipes are closed automatically with the underlying process.
func (rl *PipeRelay) Close() error {
	return nil
For more information send a message to info at phpclasses dot org.