{"action":"created","comment":{"url":"https://api.github.com/repos/vertexproject/synapse/pulls/comments/147552481","pull_request_review_id":72669671,"id":147552481,"diff_hunk":"@@ -0,0 +1,389 @@\n+import os\n+import struct\n+import logging\n+import threading\n+import collections\n+\n+import synapse.glob as s_glob\n+import synapse.common as s_common\n+import synapse.eventbus as s_eventbus\n+\n+import synapse.lib.atomic as s_atomic\n+import synapse.lib.config as s_config\n+import synapse.lib.msgpack as s_msgpack\n+import synapse.lib.atomfile as s_atomfile\n+\n+logger = logging.getLogger(__file__)\n+\n+class Fifo(s_config.Config):\n+\n+    def __init__(self, conf, xmit=None):\n+\n+        s_config.Config.__init__(self)\n+        self.setConfOpts(conf)\n+        self.reqConfOpts()\n+\n+        self.maxsize = self.getConfOpt('fifo:file:maxsize')\n+\n+        self.lock = threading.Lock()\n+        self.winds = s_eventbus.BusRef()\n+\n+        self.atoms = s_eventbus.BusRef(ctor=self._brefAtomCtor)\n+        self.onfini(self.atoms.fini)\n+\n+        self.seqs = self._getFifoSeqs()\n+        if not self.seqs:\n+            self.seqs.append(0)\n+\n+        # open our append atom\n+        lseq = self.seqs[-1]\n+        self.atom = self.atoms.gen(lseq)\n+\n+        # our next expected sequence num\n+        self.nseq = lseq + self.atom.size\n+\n+        # open our \"default\" state file\n+        path = self._getPathJoin('default.state')\n+        self.wind = Window(self, path, xmit=xmit)\n+        self.onfini(self.wind.fini)\n+\n+        task = s_glob.sched.loop(2, self.flush)\n+        self.onfini(task.fini)\n+\n+        self._cullAtomBase(self.wind.bseq)\n+\n+    def ack(self, seqn):\n+        '''\n+        Acknowledge (and cull) an item in the sequence.\n+        '''\n+        retn = self.wind.ack(seqn)\n+\n+        if retn:\n+            self._cullAtomBase(self.wind.bseq)\n+\n+        return retn\n+\n+    def _cullAtomBase(self, nseq):\n+\n+        with self.lock:\n+\n+            while self.seqs[0] < nseq:\n+                fseq = self.seqs.pop(0)\n+                path = self._getSeqPath(fseq)\n+                os.unlink(path)\n+\n+    def resync(self, xmit=None):\n+        '''\n+        Re-synchronize this Fifo by sending all window entries.\n+        (optionally specify a new xmit callback)\n+\n+        Args:\n+            xmit (func): The fifo xmit() callback.\n+\n+        Example:\n+\n+            def xmit(qent):\n+                seqn, nseq, item = qent\n+                dostuff()\n+\n+            fifo.resync(xmit=xmit)\n+        '''\n+        return self.wind.resync(xmit=xmit)\n+\n+    def _findFifoAtom(self, nseq):\n+        # if they specify an un-aligned sequence, find the prev\n+        if nseq not in self.seqs:\n+            nseq = [s for s in self.seqs if s <= nseq][-1]\n+\n+        return nseq, self.atoms.gen(nseq)\n+\n+    def _openFifoAtom(self, nseq):\n+        '''\n+        Open and return a new Fifo AtomFile by next sequence.\n+        '''\n+        if nseq not in self.seqs:\n+            return None\n+\n+        return self.atoms.gen(nseq)\n+\n+    def _brefAtomCtor(self, nseq):\n+        path = self._getSeqPath(nseq)\n+        return s_atomfile.openAtomFile(path, memok=False)\n+\n+    def flush(self):\n+        '''\n+        Flush any file buffers associated with this Fifo.\n+        '''\n+        self.wind.flush()\n+        [wind.flush() for wind in self.winds]\n+\n+    def put(self, item):\n+        '''\n+        Put a new item into the Fifo.\n+\n+        Args:\n+            item (obj): The object to serialize into the Fifo.\n+        '''\n+        byts = s_msgpack.en(item)\n+\n+        with self.lock:\n+\n+            seqn = self.nseq\n+\n+            self.atom.writeoff(self.atom.size, byts)\n+            self.nseq += len(byts)\n+\n+            if self.atom.size >= self.maxsize:\n+                self.atom.fini()\n+                self.seqs.append(self.nseq)\n+                self.atom = self.atoms.gen(self.nseq)\n+\n+            qent = (seqn, self.nseq, item)\n+\n+            self.wind._may_put(qent)\n+\n+            # see if any of our readers are caught up...\n+            [wind._may_put(qent) for wind in self.winds.vals()]\n+\n+    def _getPathJoin(self, *names):\n+        dirn = self.getConfOpt('fifo:dir')\n+        return s_common.genpath(dirn, *names)\n+\n+    @staticmethod\n+    @s_config.confdef(name='fifo')\n+    def _getFifoConf():\n+        return (\n+            ('fifo:dir', {'type': 'str', 'req': 1, 'doc': 'Path to the FIFO directory'}),","path":"synapse/lib/fifo.py","position":156,"original_position":156,"commit_id":"d18f0e82b60135c37141486fa512e922126fa8de","original_commit_id":"d6d61baf2245fc3abc8343976d3011d72d70ff2d","user":{"login":"invisig0th","id":2624245,"avatar_url":"https://avatars2.githubusercontent.com/u/2624245?v=4","gravatar_id":"","url":"https://api.github.com/users/invisig0th","html_url":"https://github.com/invisig0th","followers_url":"https://api.github.com/users/invisig0th/followers","following_url":"https://api.github.com/users/invisig0th/following{/other_user}","gists_url":"https://api.github.com/users/invisig0th/gists{/gist_id}","starred_url":"https://api.github.com/users/invisig0th/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/invisig0th/subscriptions","organizations_url":"https://api.github.com/users/invisig0th/orgs","repos_url":"https://api.github.com/users/invisig0th/repos","events_url":"https://api.github.com/users/invisig0th/events{/privacy}","received_events_url":"https://api.github.com/users/invisig0th/received_events","type":"User","site_admin":false},"body":"Actually, this one isn't perf sensitive ( since it's ultimately leading to someone doing a file operation ) so i left it off.","created_at":"2017-10-28T11:37:14Z","updated_at":"2017-10-28T11:37:14Z","html_url":"https://github.com/vertexproject/synapse/pull/480#discussion_r147552481","pull_request_url":"https://api.github.com/repos/vertexproject/synapse/pulls/480","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/comments/147552481"},"html":{"href":"https://github.com/vertexproject/synapse/pull/480#discussion_r147552481"},"pull_request":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/480"}},"in_reply_to_id":146316632},"pull_request":{"url":"https://api.github.com/repos/vertexproject/synapse/pulls/480","id":147939842,"html_url":"https://github.com/vertexproject/synapse/pull/480","diff_url":"https://github.com/vertexproject/synapse/pull/480.diff","patch_url":"https://github.com/vertexproject/synapse/pull/480.patch","issue_url":"https://api.github.com/repos/vertexproject/synapse/issues/480","number":480,"state":"open","locked":false,"title":"durable, fast, persistent, acknowledged, async, push fifos.","user":{"login":"invisig0th","id":2624245,"avatar_url":"https://avatars2.githubusercontent.com/u/2624245?v=4","gravatar_id":"","url":"https://api.github.com/users/invisig0th","html_url":"https://github.com/invisig0th","followers_url":"https://api.github.com/users/invisig0th/followers","following_url":"https://api.github.com/users/invisig0th/following{/other_user}","gists_url":"https://api.github.com/users/invisig0th/gists{/gist_id}","starred_url":"https://api.github.com/users/invisig0th/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/invisig0th/subscriptions","organizations_url":"https://api.github.com/users/invisig0th/orgs","repos_url":"https://api.github.com/users/invisig0th/repos","events_url":"https://api.github.com/users/invisig0th/events{/privacy}","received_events_url":"https://api.github.com/users/invisig0th/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-10-21T11:16:29Z","updated_at":"2017-10-28T11:37:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fa6a9b585a09795b3bae2e561e21852f70f96522","assignee":{"login":"invisig0th","id":2624245,"avatar_url":"https://avatars2.githubusercontent.com/u/2624245?v=4","gravatar_id":"","url":"https://api.github.com/users/invisig0th","html_url":"https://github.com/invisig0th","followers_url":"https://api.github.com/users/invisig0th/followers","following_url":"https://api.github.com/users/invisig0th/following{/other_user}","gists_url":"https://api.github.com/users/invisig0th/gists{/gist_id}","starred_url":"https://api.github.com/users/invisig0th/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/invisig0th/subscriptions","organizations_url":"https://api.github.com/users/invisig0th/orgs","repos_url":"https://api.github.com/users/invisig0th/repos","events_url":"https://api.github.com/users/invisig0th/events{/privacy}","received_events_url":"https://api.github.com/users/invisig0th/received_events","type":"User","site_admin":false},"assignees":[{"login":"invisig0th","id":2624245,"avatar_url":"https://avatars2.githubusercontent.com/u/2624245?v=4","gravatar_id":"","url":"https://api.github.com/users/invisig0th","html_url":"https://github.com/invisig0th","followers_url":"https://api.github.com/users/invisig0th/followers","following_url":"https://api.github.com/users/invisig0th/following{/other_user}","gists_url":"https://api.github.com/users/invisig0th/gists{/gist_id}","starred_url":"https://api.github.com/users/invisig0th/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/invisig0th/subscriptions","organizations_url":"https://api.github.com/users/invisig0th/orgs","repos_url":"https://api.github.com/users/invisig0th/repos","events_url":"https://api.github.com/users/invisig0th/events{/privacy}","received_events_url":"https://api.github.com/users/invisig0th/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":{"url":"https://api.github.com/repos/vertexproject/synapse/milestones/25","html_url":"https://github.com/vertexproject/synapse/milestone/25","labels_url":"https://api.github.com/repos/vertexproject/synapse/milestones/25/labels","id":2862590,"number":25,"title":"v0.0.32","description":"","creator":{"login":"vertexmc","id":25180408,"avatar_url":"https://avatars1.githubusercontent.com/u/25180408?v=4","gravatar_id":"","url":"https://api.github.com/users/vertexmc","html_url":"https://github.com/vertexmc","followers_url":"https://api.github.com/users/vertexmc/followers","following_url":"https://api.github.com/users/vertexmc/following{/other_user}","gists_url":"https://api.github.com/users/vertexmc/gists{/gist_id}","starred_url":"https://api.github.com/users/vertexmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vertexmc/subscriptions","organizations_url":"https://api.github.com/users/vertexmc/orgs","repos_url":"https://api.github.com/users/vertexmc/repos","events_url":"https://api.github.com/users/vertexmc/events{/privacy}","received_events_url":"https://api.github.com/users/vertexmc/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":2,"state":"open","created_at":"2017-10-24T15:20:36Z","updated_at":"2017-10-27T21:26:15Z","due_on":"2017-11-01T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/vertexproject/synapse/pulls/480/commits","review_comments_url":"https://api.github.com/repos/vertexproject/synapse/pulls/480/comments","review_comment_url":"https://api.github.com/repos/vertexproject/synapse/pulls/comments{/number}","comments_url":"https://api.github.com/repos/vertexproject/synapse/issues/480/comments","statuses_url":"https://api.github.com/repos/vertexproject/synapse/statuses/d18f0e82b60135c37141486fa512e922126fa8de","head":{"label":"vertexproject:visi-fifo","ref":"visi-fifo","sha":"d18f0e82b60135c37141486fa512e922126fa8de","user":{"login":"vertexproject","id":21201579,"avatar_url":"https://avatars2.githubusercontent.com/u/21201579?v=4","gravatar_id":"","url":"https://api.github.com/users/vertexproject","html_url":"https://github.com/vertexproject","followers_url":"https://api.github.com/users/vertexproject/followers","following_url":"https://api.github.com/users/vertexproject/following{/other_user}","gists_url":"https://api.github.com/users/vertexproject/gists{/gist_id}","starred_url":"https://api.github.com/users/vertexproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vertexproject/subscriptions","organizations_url":"https://api.github.com/users/vertexproject/orgs","repos_url":"https://api.github.com/users/vertexproject/repos","events_url":"https://api.github.com/users/vertexproject/events{/privacy}","received_events_url":"https://api.github.com/users/vertexproject/received_events","type":"Organization","site_admin":false},"repo":{"id":37228107,"name":"synapse","full_name":"vertexproject/synapse","owner":{"login":"vertexproject","id":21201579,"avatar_url":"https://avatars2.githubusercontent.com/u/21201579?v=4","gravatar_id":"","url":"https://api.github.com/users/vertexproject","html_url":"https://github.com/vertexproject","followers_url":"https://api.github.com/users/vertexproject/followers","following_url":"https://api.github.com/users/vertexproject/following{/other_user}","gists_url":"https://api.github.com/users/vertexproject/gists{/gist_id}","starred_url":"https://api.github.com/users/vertexproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vertexproject/subscriptions","organizations_url":"https://api.github.com/users/vertexproject/orgs","repos_url":"https://api.github.com/users/vertexproject/repos","events_url":"https://api.github.com/users/vertexproject/events{/privacy}","received_events_url":"https://api.github.com/users/vertexproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/vertexproject/synapse","description":"Distributed Key-Value Hypergraph Analysis Framework","fork":false,"url":"https://api.github.com/repos/vertexproject/synapse","forks_url":"https://api.github.com/repos/vertexproject/synapse/forks","keys_url":"https://api.github.com/repos/vertexproject/synapse/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vertexproject/synapse/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vertexproject/synapse/teams","hooks_url":"https://api.github.com/repos/vertexproject/synapse/hooks","issue_events_url":"https://api.github.com/repos/vertexproject/synapse/issues/events{/number}","events_url":"https://api.github.com/repos/vertexproject/synapse/events","assignees_url":"https://api.github.com/repos/vertexproject/synapse/assignees{/user}","branches_url":"https://api.github.com/repos/vertexproject/synapse/branches{/branch}","tags_url":"https://api.github.com/repos/vertexproject/synapse/tags","blobs_url":"https://api.github.com/repos/vertexproject/synapse/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vertexproject/synapse/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vertexproject/synapse/git/refs{/sha}","trees_url":"https://api.github.com/repos/vertexproject/synapse/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vertexproject/synapse/statuses/{sha}","languages_url":"https://api.github.com/repos/vertexproject/synapse/languages","stargazers_url":"https://api.github.com/repos/vertexproject/synapse/stargazers","contributors_url":"https://api.github.com/repos/vertexproject/synapse/contributors","subscribers_url":"https://api.github.com/repos/vertexproject/synapse/subscribers","subscription_url":"https://api.github.com/repos/vertexproject/synapse/subscription","commits_url":"https://api.github.com/repos/vertexproject/synapse/commits{/sha}","git_commits_url":"https://api.github.com/repos/vertexproject/synapse/git/commits{/sha}","comments_url":"https://api.github.com/repos/vertexproject/synapse/comments{/number}","issue_comment_url":"https://api.github.com/repos/vertexproject/synapse/issues/comments{/number}","contents_url":"https://api.github.com/repos/vertexproject/synapse/contents/{+path}","compare_url":"https://api.github.com/repos/vertexproject/synapse/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vertexproject/synapse/merges","archive_url":"https://api.github.com/repos/vertexproject/synapse/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vertexproject/synapse/downloads","issues_url":"https://api.github.com/repos/vertexproject/synapse/issues{/number}","pulls_url":"https://api.github.com/repos/vertexproject/synapse/pulls{/number}","milestones_url":"https://api.github.com/repos/vertexproject/synapse/milestones{/number}","notifications_url":"https://api.github.com/repos/vertexproject/synapse/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vertexproject/synapse/labels{/name}","releases_url":"https://api.github.com/repos/vertexproject/synapse/releases{/id}","deployments_url":"https://api.github.com/repos/vertexproject/synapse/deployments","created_at":"2015-06-10T23:29:41Z","updated_at":"2017-10-04T14:58:25Z","pushed_at":"2017-10-28T11:01:54Z","git_url":"git://github.com/vertexproject/synapse.git","ssh_url":"git@github.com:vertexproject/synapse.git","clone_url":"https://github.com/vertexproject/synapse.git","svn_url":"https://github.com/vertexproject/synapse","homepage":"","size":5029,"stargazers_count":30,"watchers_count":30,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":21,"mirror_url":null,"archived":false,"open_issues_count":67,"forks":21,"open_issues":67,"watchers":30,"default_branch":"master"}},"base":{"label":"vertexproject:master","ref":"master","sha":"fdb0de26372b707225b3955c2d1bd8f9bf56b470","user":{"login":"vertexproject","id":21201579,"avatar_url":"https://avatars2.githubusercontent.com/u/21201579?v=4","gravatar_id":"","url":"https://api.github.com/users/vertexproject","html_url":"https://github.com/vertexproject","followers_url":"https://api.github.com/users/vertexproject/followers","following_url":"https://api.github.com/users/vertexproject/following{/other_user}","gists_url":"https://api.github.com/users/vertexproject/gists{/gist_id}","starred_url":"https://api.github.com/users/vertexproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vertexproject/subscriptions","organizations_url":"https://api.github.com/users/vertexproject/orgs","repos_url":"https://api.github.com/users/vertexproject/repos","events_url":"https://api.github.com/users/vertexproject/events{/privacy}","received_events_url":"https://api.github.com/users/vertexproject/received_events","type":"Organization","site_admin":false},"repo":{"id":37228107,"name":"synapse","full_name":"vertexproject/synapse","owner":{"login":"vertexproject","id":21201579,"avatar_url":"https://avatars2.githubusercontent.com/u/21201579?v=4","gravatar_id":"","url":"https://api.github.com/users/vertexproject","html_url":"https://github.com/vertexproject","followers_url":"https://api.github.com/users/vertexproject/followers","following_url":"https://api.github.com/users/vertexproject/following{/other_user}","gists_url":"https://api.github.com/users/vertexproject/gists{/gist_id}","starred_url":"https://api.github.com/users/vertexproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vertexproject/subscriptions","organizations_url":"https://api.github.com/users/vertexproject/orgs","repos_url":"https://api.github.com/users/vertexproject/repos","events_url":"https://api.github.com/users/vertexproject/events{/privacy}","received_events_url":"https://api.github.com/users/vertexproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/vertexproject/synapse","description":"Distributed Key-Value Hypergraph Analysis Framework","fork":false,"url":"https://api.github.com/repos/vertexproject/synapse","forks_url":"https://api.github.com/repos/vertexproject/synapse/forks","keys_url":"https://api.github.com/repos/vertexproject/synapse/keys{/key_id}","collaborators_url":"https://api.github.com/repos/vertexproject/synapse/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/vertexproject/synapse/teams","hooks_url":"https://api.github.com/repos/vertexproject/synapse/hooks","issue_events_url":"https://api.github.com/repos/vertexproject/synapse/issues/events{/number}","events_url":"https://api.github.com/repos/vertexproject/synapse/events","assignees_url":"https://api.github.com/repos/vertexproject/synapse/assignees{/user}","branches_url":"https://api.github.com/repos/vertexproject/synapse/branches{/branch}","tags_url":"https://api.github.com/repos/vertexproject/synapse/tags","blobs_url":"https://api.github.com/repos/vertexproject/synapse/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/vertexproject/synapse/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/vertexproject/synapse/git/refs{/sha}","trees_url":"https://api.github.com/repos/vertexproject/synapse/git/trees{/sha}","statuses_url":"https://api.github.com/repos/vertexproject/synapse/statuses/{sha}","languages_url":"https://api.github.com/repos/vertexproject/synapse/languages","stargazers_url":"https://api.github.com/repos/vertexproject/synapse/stargazers","contributors_url":"https://api.github.com/repos/vertexproject/synapse/contributors","subscribers_url":"https://api.github.com/repos/vertexproject/synapse/subscribers","subscription_url":"https://api.github.com/repos/vertexproject/synapse/subscription","commits_url":"https://api.github.com/repos/vertexproject/synapse/commits{/sha}","git_commits_url":"https://api.github.com/repos/vertexproject/synapse/git/commits{/sha}","comments_url":"https://api.github.com/repos/vertexproject/synapse/comments{/number}","issue_comment_url":"https://api.github.com/repos/vertexproject/synapse/issues/comments{/number}","contents_url":"https://api.github.com/repos/vertexproject/synapse/contents/{+path}","compare_url":"https://api.github.com/repos/vertexproject/synapse/compare/{base}...{head}","merges_url":"https://api.github.com/repos/vertexproject/synapse/merges","archive_url":"https://api.github.com/repos/vertexproject/synapse/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/vertexproject/synapse/downloads","issues_url":"https://api.github.com/repos/vertexproject/synapse/issues{/number}","pulls_url":"https://api.github.com/repos/vertexproject/synapse/pulls{/number}","milestones_url":"https://api.github.com/repos/vertexproject/synapse/milestones{/number}","notifications_url":"https://api.github.com/repos/vertexproject/synapse/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/vertexproject/synapse/labels{/name}","releases_url":"https://api.github.com/repos/vertexproject/synapse/releases{/id}","deployments_url":"https://api.github.com/repos/vertexproject/synapse/deployments","created_at":"2015-06-10T23:29:41Z","updated_at":"2017-10-04T14:58:25Z","pushed_at":"2017-10-28T11:01:54Z","git_url":"git://github.com/vertexproject/synapse.git","ssh_url":"git@github.com:vertexproject/synapse.git","clone_url":"https://github.com/vertexproject/synapse.git","svn_url":"https://github.com/vertexproject/synapse","homepage":"","size":5029,"stargazers_count":30,"watchers_count":30,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":21,"mirror_url":null,"archived":false,"open_issues_count":67,"forks":21,"open_issues":67,"watchers":30,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/480"},"html":{"href":"https://github.com/vertexproject/synapse/pull/480"},"issue":{"href":"https://api.github.com/repos/vertexproject/synapse/issues/480"},"comments":{"href":"https://api.github.com/repos/vertexproject/synapse/issues/480/comments"},"review_comments":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/480/comments"},"review_comment":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/vertexproject/synapse/pulls/480/commits"},"statuses":{"href":"https://api.github.com/repos/vertexproject/synapse/statuses/d18f0e82b60135c37141486fa512e922126fa8de"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"invisig0th"}}