diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-11-23 17:05:53 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-11-23 17:05:53 +0100 |
| commit | f3b3d4b1a26eba872c32ad95fc112650011b625c (patch) | |
| tree | 483c90b08fb640f9f96b83393f64af9b7e752984 /pharo-mooc/tiny-chat/src/TinyChat-server | |
| parent | bf11813e4fa859a4833cab226c4ea560765d6d77 (diff) | |
| download | book-exercises-f3b3d4b1a26eba872c32ad95fc112650011b625c.tar.gz | |
Add the tiny-chat project from the Pharo MOOC
Diffstat (limited to 'pharo-mooc/tiny-chat/src/TinyChat-server')
3 files changed, 122 insertions, 0 deletions
diff --git a/pharo-mooc/tiny-chat/src/TinyChat-server/TCMessageQueue.class.st b/pharo-mooc/tiny-chat/src/TinyChat-server/TCMessageQueue.class.st new file mode 100644 index 0000000..859c77d --- /dev/null +++ b/pharo-mooc/tiny-chat/src/TinyChat-server/TCMessageQueue.class.st @@ -0,0 +1,46 @@ +Class { + #name : 'TCMessageQueue', + #superclass : 'Object', + #instVars : [ + 'messages' + ], + #category : 'TinyChat-server', + #package : 'TinyChat-server' +} + +{ #category : 'adding' } +TCMessageQueue >> add: aMessage [ + messages add: aMessage +] + +{ #category : 'adding' } +TCMessageQueue >> formattedMessagesFrom: aMessageNumber [ + + ^ String streamContents: [ :formattedMessagesStream | + (self listFrom: aMessageNumber) + do: [ :m | formattedMessagesStream << m printString ] + ] +] + +{ #category : 'initialization' } +TCMessageQueue >> initialize [ + super initialize. + messages := OrderedCollection new +] + +{ #category : 'adding' } +TCMessageQueue >> listFrom: aIndex [ + ^ (aIndex > 0 and: [ aIndex <= messages size ]) + ifTrue: [ messages copyFrom: aIndex to: messages size ] + ifFalse: [ #() ] +] + +{ #category : 'adding' } +TCMessageQueue >> reset [ + messages removeAll +] + +{ #category : 'adding' } +TCMessageQueue >> size [ + ^ messages size +] diff --git a/pharo-mooc/tiny-chat/src/TinyChat-server/TCServer.class.st b/pharo-mooc/tiny-chat/src/TinyChat-server/TCServer.class.st new file mode 100644 index 0000000..cda06a0 --- /dev/null +++ b/pharo-mooc/tiny-chat/src/TinyChat-server/TCServer.class.st @@ -0,0 +1,75 @@ +Class { + #name : 'TCServer', + #superclass : 'Object', + #instVars : [ + 'teapotServer', + 'messagesQueue' + ], + #category : 'TinyChat-server', + #package : 'TinyChat-server' +} + +{ #category : 'initialization' } +TCServer class >> startOn: aPortNumber [ + ^self new + initializePort: aPortNumber; + registerRoutes; + registerErrorHandlers; + yourself +] + +{ #category : 'initialization' } +TCServer class >> stopAll [ + self allInstancesDo: #stop +] + +{ #category : 'initialization' } +TCServer >> addMessage: aRequest [ + messagesQueue add: (TCMessage from: (aRequest at: #sender) text: (aRequest at: #text)). +] + +{ #category : 'initialization' } +TCServer >> initialize [ + super initialize. + messagesQueue := TCMessageQueue new +] + +{ #category : 'initialization' } +TCServer >> initializePort: anInteger [ + teapotServer := Teapot configure: { + #defaultOutput -> #text. + #port -> anInteger. + #debugMode -> true + }. + teapotServer start +] + +{ #category : 'initialization' } +TCServer >> messageCount [ + ^ messagesQueue size +] + +{ #category : 'initialization' } +TCServer >> messagesFrom: request [ + ^ messagesQueue formattedMessagesFrom: (request at: #id) +] + +{ #category : 'initialization' } +TCServer >> registerErrorHandlers [ + teapotServer + exception: KeyNotFound -> (TeaResponse notFound body: 'No such message') +] + +{ #category : 'initialization' } +TCServer >> registerRoutes [ + teapotServer + GET: '/messages/count' -> (Send message: #messageCount to: self); + GET: '/messages/<id:IsInteger>' -> (Send message: #messagesFrom: to: self); + POST: '/messages/add' -> (Send message: #addMessage: to: self) +] + +{ #category : 'initialization' } +TCServer >> stop [ + teapotServer stop. + messagesQueue reset +] diff --git a/pharo-mooc/tiny-chat/src/TinyChat-server/package.st b/pharo-mooc/tiny-chat/src/TinyChat-server/package.st new file mode 100644 index 0000000..9fa4170 --- /dev/null +++ b/pharo-mooc/tiny-chat/src/TinyChat-server/package.st @@ -0,0 +1 @@ +Package { #name : 'TinyChat-server' } |
