{"action":"created","comment":{"url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/comments/25535143","id":25535143,"diff_hunk":"@@ -0,0 +1,172 @@\n+package org.reactivestreamsio.tcp;\n+\n+import org.reactivestreams.Publisher;\n+import org.reactivestreams.Subscriber;\n+import org.reactivestreams.Subscription;\n+\n+/**\n+ * An abstraction for a TCP connection.\n+ *\n+ * <h2>Reading data</h2>\n+ * This connection is a {@link Publisher} and hence one can call {@link Publisher#subscribe(Subscriber)} to start\n+ * reading data from the connection.\n+ *\n+ * <h3>Multiple read subscriptions</h3>\n+ * This connection does <em>not</em> allow multiple subscription to the content and any subscriptions post the first\n+ * subscriber, will receive an error.\n+ *\n+ * <h2>Ignoring data</h2>\n+ *\n+ * Since, this connection does not read any data from the underneath socket, unless someone subscribes, a convenience\n+ * method for ignoring all data on the socket is provided as {@link #ignoreContent()}\n+ *\n+ * <h2>Writing data</h2>\n+ *\n+ * This connection provides two ways of writing data:\n+ * <ul>\n+ <li><i>Single Message:</i> One can write one item at a time, using {@link #write(Object)}</li>\n+ <li><i>Message stream:</i> One can provide a {@link Publisher} of data, using {@link #write(Publisher)}. This\n+ connection will subscribe to such a {@link Publisher} and write all items emitted by that publisher on the connection.\n+ </li>\n+ </ul>\n+ *\n+ * Writing any items using these methods, do <em>not</em> actually write the data on the underneath socket. An explicit\n+ * {@link #flush()} call is required to write the data on the underneath socket.\n+ * One can also use the shorthand {@link #writeAndFlush(Object)} or {@link #writeAndFlush(Publisher)} to write and flush\n+ * the item(s)\n+ *\n+ * <h2>Flush</h2>\n+ *\n+ * In order to optimize the number of system calls to write data on the underneath socket, this connection breaks the\n+ * writing process into two parts, viz., write and flush. A flush call writes all previous writes on this connection on\n+ * the underneath socket.\n+ *\n+ * <h2>Write errors</h2>\n+ *\n+ * Every write call returns a {@link Publisher} that represents the acknowledgment of the write action. If the write\n+ * failed, then the subscriber's {@link Subscriber#onError(Throwable)} method will be called and if it succeeds, then\n+ * subscriber's {@link Subscriber#onComplete()} method will be called\n+ *\n+ * <h2>Flush errors</h2>\n+ *\n+ * Since, a {@link #flush()} is a batch operation encompassing all previous unflushed writes, it will represent the\n+ * result of all those writes. It will fail if any one of the writes fail and it will not be possible to correlate which\n+ * write caused the flush to fail. In order to get granular result per write, one has to subscribe to the\n+ * {@link Publisher} of that particular write.\n+ *\n+ * <h2>Close</h2>\n+ *\n+ * Since, this connection only allows a single subscription, cancelling that subscription\n+ * (via {@link Subscription#cancel()}) closes the connection.\n+ * For cases which ignores content (via {@link #ignoreContent()}), an explicit {@link #close()} is required to be\n+ * invoked for closing this connection.\n+ *\n+ * @param <R> Type of objects read from this connection.\n+ * @param <W> Type of objects written to this connection.\n+ */\n+public interface TcpConnection<R, W> extends Publisher<R> {\n+\n+    /**\n+     * Subscribes to the content stream of this connection.\n+     *\n+     * <h2>Multiple subscriptions</h2>\n+     * This connection only allows a single subscription to the content stream. Any subsequent subscription will result\n+     * in invocation of {@link Subscriber#onError(Throwable)} on that subscriber.\n+     *\n+     * @param subscriber Subscriber for the content.\n+     */\n+    @Override\n+    void subscribe(Subscriber<? super R> subscriber);\n+\n+    /**\n+     * Ignores all content of this connection. This is equivalent to calling {@link #subscribe(Subscriber)} with a\n+     * subscriber that discards all received items.\n+     */\n+    void ignoreContent();\n+\n+    /**\n+     * On subscription of the returned {@link Publisher}, writes the passed {@code msg} on this connection.\n+     * Every subscription will write the same {@code msg} on the connection.\n+     *\n+     * <b>This does not flush the write.</b> Call {@link #flush()} to flush this write.\n+     * @param msg Message to write.\n+     *\n+     * @return A {@link Publisher} representing the result of this write. One has to subscribe to this {@link Publisher}\n+     * to trigger the write. Each subscription will trigger a write of the same message. The subscriber to this\n+     * {@link Publisher} will not complete unless {@link #flush()} is called on this connection.\n+     */\n+    Publisher<Void> write(W msg);","path":"api/src/main/java/org/reactivestreamsio/tcp/TcpConnection.java","position":98,"original_position":98,"commit_id":"8f929968f6daa7b4de30e446aa0987aa7fa1fe7b","original_commit_id":"8f929968f6daa7b4de30e446aa0987aa7fa1fe7b","user":{"login":"danarmak","id":527616,"avatar_url":"https://avatars.githubusercontent.com/u/527616?v=3","gravatar_id":"","url":"https://api.github.com/users/danarmak","html_url":"https://github.com/danarmak","followers_url":"https://api.github.com/users/danarmak/followers","following_url":"https://api.github.com/users/danarmak/following{/other_user}","gists_url":"https://api.github.com/users/danarmak/gists{/gist_id}","starred_url":"https://api.github.com/users/danarmak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danarmak/subscriptions","organizations_url":"https://api.github.com/users/danarmak/orgs","repos_url":"https://api.github.com/users/danarmak/repos","events_url":"https://api.github.com/users/danarmak/events{/privacy}","received_events_url":"https://api.github.com/users/danarmak/received_events","type":"User","site_admin":false},"body":"I understand now: the returned Publisher describes the asynchronous signal that says the write+flush have completed. In other words, it's acting as a Future. \r\n\r\nIs it standard practice in Java RS-based interfaces to use a 0-item or 1-item Publisher as a Future? Or just in standard interfaces which need to be usable by any RS implementation? It just looks overly complex, and possibly more expensive than a Future. ","created_at":"2015-02-27T20:09:57Z","updated_at":"2015-02-27T20:09:57Z","html_url":"https://github.com/reactive-streams/reactive-streams-io/pull/7#discussion_r25535143","pull_request_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7","_links":{"self":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/comments/25535143"},"html":{"href":"https://github.com/reactive-streams/reactive-streams-io/pull/7#discussion_r25535143"},"pull_request":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7"}}},"pull_request":{"url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7","id":30185520,"html_url":"https://github.com/reactive-streams/reactive-streams-io/pull/7","diff_url":"https://github.com/reactive-streams/reactive-streams-io/pull/7.diff","patch_url":"https://github.com/reactive-streams/reactive-streams-io/pull/7.patch","issue_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/7","number":7,"state":"open","locked":false,"title":"TCP client and server Java Bindings (Issue #5)","user":{"login":"NiteshKant","id":820005,"avatar_url":"https://avatars.githubusercontent.com/u/820005?v=3","gravatar_id":"","url":"https://api.github.com/users/NiteshKant","html_url":"https://github.com/NiteshKant","followers_url":"https://api.github.com/users/NiteshKant/followers","following_url":"https://api.github.com/users/NiteshKant/following{/other_user}","gists_url":"https://api.github.com/users/NiteshKant/gists{/gist_id}","starred_url":"https://api.github.com/users/NiteshKant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiteshKant/subscriptions","organizations_url":"https://api.github.com/users/NiteshKant/orgs","repos_url":"https://api.github.com/users/NiteshKant/repos","events_url":"https://api.github.com/users/NiteshKant/events{/privacy}","received_events_url":"https://api.github.com/users/NiteshKant/received_events","type":"User","site_admin":false},"body":"This PR is an attempt to encapsulate how a Java Binding (Issue #5 ) for a TCP client/server look like. This is more of a strawman for discussion on this topic as opposed to something that can be merged.\r\n\r\nI have started with a very basic client and server skeleton and this is no way close to what we at Netflix are pursuing with [RxNetty](github.com/ReactiveX/RxNetty). However, I hope to start introducing higher level concepts like application and network interceptors, complex flush semantics, server pools (as opposed to a single target server in this proposal), etc. if this approach is palatable.\r\n\r\nThe code contains of three classes, viz.,\r\n\r\n#### TcpConnection\r\n\r\nAn abstraction over a network socket, providing RS abstractions for reading and writing data. \r\n\r\n##### Write semantics\r\n\r\nI have proposed similar write semantics as [RxNetty](github.com/ReactiveX/RxNetty) (following the semantics in netty), which breaks down the write into two actions => write and flush. The idea is to be able to batch writes and make a single network call for flushing data on the underneath socket.\r\n\r\nWrites come in two flavors, \r\n\r\n- Write a single item.\r\n- Write a stream of items.\r\n\r\nThe reason for the above is that writing a single item makes the usecase of \"simple\" clients & servers terse. Creation of a `Publisher` otherwise becomes cumbersome in such cases. \r\n\r\n##### Read semantics\r\n\r\n`TcpConnection` extends `Publisher` and hence it can be subscribed to for reading content from the connection.\r\n\r\n###### Multiple subscriptions\r\n\r\nI have proposed that we disallow multiple subscriptions to the content as it would mean that we will have a [Subject](https://github.com/ReactiveX/RxJava/wiki/Subject) that publishes data to multiple subscribers because every subscriber can not read data individually from the socket.\r\n\r\n###### Auto-close\r\n\r\nI have proposed that we close the connection as soon the sole subscriber of the content cancels the subscription. For fire-and-forget cases where the user is not interested in the content, the close will be explicit.\r\n\r\n#### TcpClient\r\n\r\nAn abstraction for TCP based clients. \r\nThis offers a single method for creating new connections. This method returns a `Publisher` of connections and hence can be used to create as many connections as required via `Subscription.request(n)`\r\n\r\n#### TcpServer\r\n\r\nAn abstraction for TCP based servers. \r\nThis provides an abstraction of a `ConnectionHandler` that receives and processes all client connections accepted by this server.","created_at":"2015-02-27T17:42:10Z","updated_at":"2015-02-27T20:09:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5e5a0e143da0cbe73c40b992ee9ff89334247f88","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7/commits","review_comments_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7/comments","review_comment_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/7/comments","statuses_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/statuses/8f929968f6daa7b4de30e446aa0987aa7fa1fe7b","head":{"label":"NiteshKant:master","ref":"master","sha":"8f929968f6daa7b4de30e446aa0987aa7fa1fe7b","user":{"login":"NiteshKant","id":820005,"avatar_url":"https://avatars.githubusercontent.com/u/820005?v=3","gravatar_id":"","url":"https://api.github.com/users/NiteshKant","html_url":"https://github.com/NiteshKant","followers_url":"https://api.github.com/users/NiteshKant/followers","following_url":"https://api.github.com/users/NiteshKant/following{/other_user}","gists_url":"https://api.github.com/users/NiteshKant/gists{/gist_id}","starred_url":"https://api.github.com/users/NiteshKant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiteshKant/subscriptions","organizations_url":"https://api.github.com/users/NiteshKant/orgs","repos_url":"https://api.github.com/users/NiteshKant/repos","events_url":"https://api.github.com/users/NiteshKant/events{/privacy}","received_events_url":"https://api.github.com/users/NiteshKant/received_events","type":"User","site_admin":false},"repo":{"id":31388286,"name":"reactive-streams-io","full_name":"NiteshKant/reactive-streams-io","owner":{"login":"NiteshKant","id":820005,"avatar_url":"https://avatars.githubusercontent.com/u/820005?v=3","gravatar_id":"","url":"https://api.github.com/users/NiteshKant","html_url":"https://github.com/NiteshKant","followers_url":"https://api.github.com/users/NiteshKant/followers","following_url":"https://api.github.com/users/NiteshKant/following{/other_user}","gists_url":"https://api.github.com/users/NiteshKant/gists{/gist_id}","starred_url":"https://api.github.com/users/NiteshKant/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiteshKant/subscriptions","organizations_url":"https://api.github.com/users/NiteshKant/orgs","repos_url":"https://api.github.com/users/NiteshKant/repos","events_url":"https://api.github.com/users/NiteshKant/events{/privacy}","received_events_url":"https://api.github.com/users/NiteshKant/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/NiteshKant/reactive-streams-io","description":"Reactive Streams standardization for network protocols","fork":true,"url":"https://api.github.com/repos/NiteshKant/reactive-streams-io","forks_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/forks","keys_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/teams","hooks_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/hooks","issue_events_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/issues/events{/number}","events_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/events","assignees_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/assignees{/user}","branches_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/branches{/branch}","tags_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/tags","blobs_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/git/refs{/sha}","trees_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/statuses/{sha}","languages_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/languages","stargazers_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/stargazers","contributors_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/contributors","subscribers_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/subscribers","subscription_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/subscription","commits_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/commits{/sha}","git_commits_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/git/commits{/sha}","comments_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/comments{/number}","issue_comment_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/issues/comments{/number}","contents_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/contents/{+path}","compare_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/merges","archive_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/downloads","issues_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/issues{/number}","pulls_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/pulls{/number}","milestones_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/milestones{/number}","notifications_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/labels{/name}","releases_url":"https://api.github.com/repos/NiteshKant/reactive-streams-io/releases{/id}","created_at":"2015-02-26T20:53:46Z","updated_at":"2015-02-27T08:30:47Z","pushed_at":"2015-02-27T08:30:47Z","git_url":"git://github.com/NiteshKant/reactive-streams-io.git","ssh_url":"git@github.com:NiteshKant/reactive-streams-io.git","clone_url":"https://github.com/NiteshKant/reactive-streams-io.git","svn_url":"https://github.com/NiteshKant/reactive-streams-io","homepage":null,"size":0,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"reactive-streams:master","ref":"master","sha":"0a0362ea2296ef8fb138f1300bcc1d933c71952b","user":{"login":"reactive-streams","id":7080130,"avatar_url":"https://avatars.githubusercontent.com/u/7080130?v=3","gravatar_id":"","url":"https://api.github.com/users/reactive-streams","html_url":"https://github.com/reactive-streams","followers_url":"https://api.github.com/users/reactive-streams/followers","following_url":"https://api.github.com/users/reactive-streams/following{/other_user}","gists_url":"https://api.github.com/users/reactive-streams/gists{/gist_id}","starred_url":"https://api.github.com/users/reactive-streams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/reactive-streams/subscriptions","organizations_url":"https://api.github.com/users/reactive-streams/orgs","repos_url":"https://api.github.com/users/reactive-streams/repos","events_url":"https://api.github.com/users/reactive-streams/events{/privacy}","received_events_url":"https://api.github.com/users/reactive-streams/received_events","type":"Organization","site_admin":false},"repo":{"id":31283667,"name":"reactive-streams-io","full_name":"reactive-streams/reactive-streams-io","owner":{"login":"reactive-streams","id":7080130,"avatar_url":"https://avatars.githubusercontent.com/u/7080130?v=3","gravatar_id":"","url":"https://api.github.com/users/reactive-streams","html_url":"https://github.com/reactive-streams","followers_url":"https://api.github.com/users/reactive-streams/followers","following_url":"https://api.github.com/users/reactive-streams/following{/other_user}","gists_url":"https://api.github.com/users/reactive-streams/gists{/gist_id}","starred_url":"https://api.github.com/users/reactive-streams/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/reactive-streams/subscriptions","organizations_url":"https://api.github.com/users/reactive-streams/orgs","repos_url":"https://api.github.com/users/reactive-streams/repos","events_url":"https://api.github.com/users/reactive-streams/events{/privacy}","received_events_url":"https://api.github.com/users/reactive-streams/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/reactive-streams/reactive-streams-io","description":"Reactive Streams Network Protocol","fork":false,"url":"https://api.github.com/repos/reactive-streams/reactive-streams-io","forks_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/forks","keys_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/teams","hooks_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/hooks","issue_events_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/events{/number}","events_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/events","assignees_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/assignees{/user}","branches_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/branches{/branch}","tags_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/tags","blobs_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/git/refs{/sha}","trees_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/statuses/{sha}","languages_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/languages","stargazers_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/stargazers","contributors_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/contributors","subscribers_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/subscribers","subscription_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/subscription","commits_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/commits{/sha}","git_commits_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/git/commits{/sha}","comments_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/comments{/number}","issue_comment_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/comments{/number}","contents_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/contents/{+path}","compare_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/merges","archive_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/downloads","issues_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues{/number}","pulls_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls{/number}","milestones_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/milestones{/number}","notifications_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/labels{/name}","releases_url":"https://api.github.com/repos/reactive-streams/reactive-streams-io/releases{/id}","created_at":"2015-02-24T21:47:12Z","updated_at":"2015-02-27T19:43:54Z","pushed_at":"2015-02-26T20:38:57Z","git_url":"git://github.com/reactive-streams/reactive-streams-io.git","ssh_url":"git@github.com:reactive-streams/reactive-streams-io.git","clone_url":"https://github.com/reactive-streams/reactive-streams-io.git","svn_url":"https://github.com/reactive-streams/reactive-streams-io","homepage":"reactive-streams.io","size":0,"stargazers_count":15,"watchers_count":15,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":7,"forks":4,"open_issues":7,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7"},"html":{"href":"https://github.com/reactive-streams/reactive-streams-io/pull/7"},"issue":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/7"},"comments":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/issues/7/comments"},"review_comments":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7/comments"},"review_comment":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/pulls/7/commits"},"statuses":{"href":"https://api.github.com/repos/reactive-streams/reactive-streams-io/statuses/8f929968f6daa7b4de30e446aa0987aa7fa1fe7b"}}}}