File: protocol.bs

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (114 lines) | stat: -rw-r--r-- 2,016 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use core:io;
use util:serialize;

class Request : serializable {
	Response execute(Server server) : abstract;
}

class Response : serializable {}

class AddRequest : extends Request, serializable {
	Str toAdd;

	init(Str toAdd) {
		init { toAdd = toAdd; }
	}

	Response execute(Server server) : override {
		server.data.push(toAdd);
		return Response();
	}
}

class GetRequest : extends Request, serializable {
	Response execute(Server server) : override {
		return GetResponse(server.data);
	}
}

class GetResponse : extends Response, serializable {
	Str[] data;

	init(Str[] data) {
		init { data = data; }
	}
}

class Server {
	Str[] data;

	void run(IStream read, OStream write) {
		ObjIStream input(read);
		ObjOStream output(BufferedOStream(write));

		try {
			do {
				Request request = Request:read(input);
				Response response = request.execute(this);
				response.write(output);
				output.flush();
			}
		} catch (EndOfStream e) {
			// End of stream reached, this is normal.
		} catch (SerializationError e) {
			print("Serialization error: ${e.message}");
		}

		input.close();
		output.close();
	}
}

class Client {
	private ObjIStream input;
	private ObjOStream output;

	init(IStream read, OStream write) {
		init {
			input(read);
			output(BufferedOStream(write));
		}
	}

	Response request(Request request) {
		request.write(output);
		output.flush();
		return Response:read(input);
	}

	void close() {
		input.close();
		output.close();
	}
}

void runClient(IStream read, OStream write) {
	Client client(read, write);

	client.request(AddRequest("a"));
	client.request(AddRequest("b"));

	if (response = client.request(GetRequest()) as GetResponse) {
		print("Final data: ${response.data}");
	} else {
		print("Invalid response.");
	}

	client.close();
}

void protocol() {
	Pipe a;
	Pipe b;
	var server = {
		Server server;
		spawn server.run(a.input, b.output);
	};
	var client = {
		spawn runClient(b.input, a.output);
	};

	// Wait for both to finish.
	server.result();
	client.result();
}