code: async def send(self, data, id=None, event=None, retry=None):
          
          buffer = io.StringIO()
          if id is not None:
              buffer.write(self.LINE_SEP_EXPR.sub('', 'id: {}'.format(id)))
              buffer.write(self._sep)
  
          if event is not None:
              buffer.write(self.LINE_SEP_EXPR.sub('', 'event: {}'.format(event)))
              buffer.write(self._sep)
  
          for chunk in self.LINE_SEP_EXPR.split(data):
              buffer.write('data: {}'.format(chunk))
              buffer.write(self._sep)
  
          if retry is not None:
              if not isinstance(retry, int):
                  raise TypeError('retry argument must be int')
              buffer.write('retry: {}'.format(retry))
              buffer.write(self._sep)
  
          buffer.write(self._sep)
          await self.write(buffer.getvalue().encode('utf-8'))
docs: Send data using EventSource protocol
  
          :param str data: The data field for the message.
          :param str id: The event ID to set the EventSource object's last
              event ID value to.
          :param str event: The event's type. If this is specified, an event will
              be dispatched on the browser to the listener for the specified
              event name; the web site would use addEventListener() to listen
              for named events. The default event type is "message".
          :param int retry: The reconnection time to use when attempting to send
              the event. [What code handles this?] This must be an integer,
              specifying the reconnection time in milliseconds. If a non-integer
              value is specified, the field is ignored.