Skip to content

mikefilonov/restannouncer

Repository files navigation

RESTAnnouncer

Event framework for sending and recieving announcements via HTTP/JSON.

##Installation

Metacello new baseline: #RESTAnnouncer; repository: 'github://mikefilonov/restannouncer'; load.

##Quick start

Starting a recieving server:

server := RATeapotController new.
server newAnnouncer: #first.
server startOn: 8081.

Subscribing on event:

(server announcerAt: #first)
		when: (RASelectorAnnouncement when: #FileUpload) 
		do: [ :a | Transcript show: (a at: #filename) ].

Sending an event to the server via HTTP (different VM):

RARemoteAnnouncer new
  url: 'http://localhost:8081/api/first' asUrl;
  announce: (RASelectorAnnouncement withSelector: #FileUpload andData: {'filename'->'1.txt'} asDictionary)

Event JSON

{
"selector": "SelectorID",
"data": {"param1": "value1", "param2": "value2"}
}

RESTAnnouncer - Automata

The project provides an implementation of automata task manager to allow user running event-driven workflows.

Concider the following example:

"Start event listener"
server := RATeapotController new.
server newAnnouncer: #first.
server startOn: 8081.

"Initialize automata manager"
automata := RAAutomata new.
automata subscribeOn: (server announcerAt: #first).
automata start.

"Task loop"
automata do: [ :task |
	[ |initialEvent|
	initialEvent := task waitEvent: [ :e | e selector = #FileUpload ].
	
	"Create a sub workflow for each uploaded file, don't wait for it to be finished."
	automata do: [ :subtask | |filename|
		filename := initialEvent at: 'filename'. "Any data of the event can be used here"
		Transcript show: 'New file is uploaded: ', filename, '. Waiting for modification'.
		
		"... put some logic here ..."
		
		subtask waitEvent: [ :e | e selector = #FileModified and: [ (e at: 'filename')  = filename ] ]. "Wait for modification of the file"
		Transcript show: 'File modified: ', filename.
		
		"... put some logic here ..."
		
		]
	]	repeat.
].

The event emitter server code:

RARemoteAnnouncer new
  url: 'http://localhost:8081/api/first' asUrl;
  announce: (RASelectorAnnouncement withSelector: #FileUpload andData: {'filename'->'/1.txt'} asDictionary).
  
RARemoteAnnouncer new
  url: 'http://localhost:8081/api/first' asUrl;
  announce: (RASelectorAnnouncement withSelector: #FileModified andData: {'filename'->'/1.txt'} asDictionary)  
  

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published