{"id":931,"url":"https://github.com/aojet/Aojet","last_synced_at":"2025-07-30T19:32:57.673Z","repository":{"id":141011380,"uuid":"71051363","full_name":"aojet/Aojet","owner":"aojet","description":"An actor model library for swift.","archived":false,"fork":false,"pushed_at":"2016-10-23T12:15:18.000Z","size":85,"stargazers_count":39,"open_issues_count":2,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-08-14T14:05:12.722Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aojet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2016-10-16T13:16:31.000Z","updated_at":"2024-05-08T04:44:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"85fc7eb9-42f8-4fdc-b934-484aea6af049","html_url":"https://github.com/aojet/Aojet","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aojet%2FAojet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aojet%2FAojet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aojet%2FAojet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aojet%2FAojet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aojet","download_url":"https://codeload.github.com/aojet/Aojet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228178974,"owners_count":17881116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-01-05T20:15:34.906Z","updated_at":"2024-12-04T19:32:15.185Z","avatar_url":"https://github.com/aojet.png","language":"Swift","funding_links":[],"categories":["Concurrency"],"sub_categories":["Linter","Other free courses"],"readme":"# Aojet\n\n[![GitHub license](https://img.shields.io/github/license/aojet/Aojet.svg)](https://raw.githubusercontent.com/aojet/Aojet/master/LICENSE)\n[![GitHub release](https://img.shields.io/github/release/aojet/Aojet.svg)](https://github.com/aojet/Aojet/releases)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/aojet/Aojet)\n\nAojet is an [actor model](https://en.wikipedia.org/wiki/Actor_model) implemetion for swift.\n\n## Features\n\n- [x] Asynchronous, non-blocking and highly performant message-driven programming model\n- [x] Safe as well as efficient messaging\n- [x] Message ordering using Local Synchronization Constraints\n- [x] Fair scheduling\n- [x] Modular and extensible\n- [x] A [promise](https://en.wikipedia.org/wiki/Futures_and_promises) implementation for general usage\n- [ ] Portable(Support iOS and Mac platform currently)\n\n## Requirements\n\n- Swift 3.0\n- iOS 8.0+ or macOS 10.10+\n\n-----\n\n## Installation\n\nAojet is available through [Carthage](https://github.com/Carthage/Carthage).\nAdd this line to your `Cartfile`\n\n```bash\ngithub \"aojet/Aojet\"\n```\n\n-----\n\n## Usage\n\n### Make an Actor\n\nThis is a simple actor implementation:\n\n```swift\n\nclass SomeActor: Actor {\n  override func onReceive(message: Any) throws {\n    switch message {\n    case let m as DoSomething:\n      doSomething(object: m.object)\n    default:\n      try super.onReceive(message: message)\n    }\n  }\n\n  func doSomething(object: Any) { //This should run on the actor thread.\n    print(Thread.current)\n    print(\"Do something with object: \\(object)\")\n    //Do something\n  }\n\n  struct DoSomething {\n    let object: Any\n  }\n\n}\n\n\n```\n\n### Create ActorRef\n\n```swift\n\nlet actorSystem = ActorSystem.system\nactorSystem.traceInterface = ActorTrace() //For internal logging\nlet actor = try actorSystem.actorOf(path: \"testActor\", creator: AnyActorCreator{ () -\u003e Actor in\n  return SomeActor()\n})\n\n\n```\n\n### Send Message to ActorRef\n\n\n```swift\n\nactor.send(message: SomeActor.DoSomething(object: \"An object\")) //Success\nactor.send(message: \"An string\") //Drop\nactor.send(message: SomeActor.DoSomething(object: \"Another object\")) //Success\n\n\n```\n\n### Make an AskableActor\n\n\n```swift\n\nclass SomeActor: AskableActor {\n\n  override func onAsk(message: Any) throws -\u003e Promise\u003cAny\u003e? {\n    switch message {\n    case let m as AskSomething:\n      return askSomething(object: m.object)\n    default:\n      let p = try super.onAsk(message: message)\n      print(\"Promise: \\(p)\")\n      return p\n    }\n  }\n\n  override func onReceive(message: Any) throws {\n    switch message {\n    case let m as DoSomething:\n      doSomething(object: m.object)\n    default:\n      try super.onReceive(message: message)\n    }\n  }\n\n  func doSomething(object: Any) { //This should run on the actor thread.\n    print(Thread.current)\n    print(\"Do something with object: \\(object)\")\n    //Do something\n  }\n\n  func askSomething(object: Any) -\u003e Promise\u003cAny\u003e { //This should run on the actor thread.\n    print(Thread.current)\n    print(\"Ask something with object: \\(object)\")\n\n    return Promise(value: \"A response\")\n  }\n\n  struct DoSomething {\n    let object: Any\n  }\n  \n  struct AskSomething {\n    let object: Any\n  }\n}\n\n\n```\n\n### Make an Ask Request\n\n```swift\n\n let p1: Promise\u003cString\u003e = actor.ask(message: SomeActor.AskSomething(object: \"An object for ask\"))\n p1.then { (res) in\n   print(\"Ask response:\\(res)\")\n }.failure { (error) in\n   print(\"Ask error:\\(error)\")\n }\n  \n```\n\n### Promise Usage\n\nThere are some ways to create a promise:\n\n```swift\n//Define an error for test\nenum TestError: Error {\n  case general(message: String)\n}\n\n//Immediate Promise\nlet p1 = Promise(value: 1)\nlet p2 = Promise\u003cInt\u003e(error: TestError.general(message: \"Test error.\"))\n\n//Async Promise\nlet p3 = Promise\u003cString\u003e { (resolver) in\n  let url = URL(string: \"https://api.ipify.org\")\n  let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in\n    if error != nil {\n      resolver.error(error!)\n    } else if data != nil {\n      let s = String(bytes: data!, encoding: String.Encoding.utf8)\n      print(s)\n      resolver.result(s)\n    } else {\n      resolver.result(nil)\n    }\n  }\n  task.resume()\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faojet%2FAojet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faojet%2FAojet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faojet%2FAojet/lists"}