cli
cli copied to clipboard
Find out how socket.io works in order to edit notes.
I'm trying to figure out how to edit a note directly from the command line, unfortunately I can't delete text successfully. So I leave here what I found, and if someone can make it work, it would be a great addition to this client.
First of all, let's authentificate cf #9. (Idk if it's necessary)
codimd login --email [email protected] password
Then, connecting to the socket.
NOTEID=3_jUrZCYRTOtcEAJG6Oywg
# The socket url
URL=$CODIMD_SERVER/socket.io/?noteId=$NOTEID\&EIO=3\&transport=polling
# get the 'io' token
curl -c /tmp/codimd-cookies.txt \
-b /tmp/codimd-cookies.txt \
$URL\&t=$(python yeast.py) \
&> /dev/null
Then, all messages must be passed to $SERVER/socket.io/?noteId=$NOTEID&EIO=3&transport=polling&t=$(python yeast.py)&sid\=$TOKEN
, TOKEN is the token we just picked up.
To do so:
TOKEN=$(cat /tmp/codimd-cookies.txt | grep io | awk '{print $7}')
curl -b /tmp/codimd-cookies.txt \
$URL\&t\=$(python yeast.py)\&sid\=$TOKEN \
-H "Content-Type: text/plain;charset=UTF-8" \
-d @msg_0
This will send the data from the file msg_0
to the socket.
As an example, on a fresh new note:
#!/bin/bash
SERVER=https://xxxxxxxxxxxxxx
NOTEID=xxxxxxxxxxxxxxxxxxxxxx
URL=$SERVER/socket.io/?noteId=$NOTEID\&EIO=3\&transport=polling
curl -c /tmp/codimd-cookies.txt \
-b /tmp/codimd-cookies.txt \
$URL\&t=$(python yeast.py) \
&> /dev/null
TOKEN=$(cat /tmp/codimd-cookies.txt | grep io | awk '{print $7}')
curl -b /tmp/codimd-cookies.txt \
$URL\&t\=$(python yeast.py)\&sid\=$TOKEN \
-H "Content-Type: text/plain;charset=UTF-8" \
-d @msg_4
With msg_4 containing 61:42["operation",0,["test"],{"ranges":[{"anchor":4,"head":4}]}]
Then, by analyzing the different possible messages I think the format is as follows:
$1:42["operation",$2,["$3",$4],{"ranges":[{"anchor":$5,"head":$5}]}]
- $1 is the len of the message after
:
- $2 is the number of the operation (starts at 0, then must be increased by one at each request)
- $3 is the text that you want to add (optional)
- $4 is the number of chars to remove (optional)
- $5 is the location of the modification
For example:
- Add test to the note
-
61:42["operation",0,["test"],{"ranges":[{"anchor":4,"head":4}]}]
-
- Remove test and replace it by 01234
-
65:42["operation",0,["01234",-4],{"ranges":[{"anchor":5,"head":5}]}]
-
- Remove the last char
-
59:42["operation",0,[4,-1],{"ranges":[{"anchor":4,"head":4}]}]
-
This payloads are working when I'm inspecting the network on my browser, but I can't reproduce it (text deletion) by using curl. Even if the socket returns ok
to me every time.
I hope I can help, if someone can figure out how to do it. This is the last thing before being able to edit notes from codimd-cli.
PS: here you can find the source file
@Fumesover You are might interested in joining the CodiMD community channel to work with us on the new API. Your input would be very welcome :+1:
As the server currently provides and manages the note state anyway, we should find a better way than reimplementing OT in order to update notes.
If it makes it easier @SISheogorath, the CLI only needs a way to update the entire note contents at once (so no need for OT or individual line/diff-based edits).