Speed up web client initialization

This commit is contained in:
Trevor Slocum 2020-07-30 19:28:33 -07:00
parent ac396c0d13
commit 4a085f8662
6 changed files with 102 additions and 81 deletions

View File

@ -1,3 +1,6 @@
0.1.5:
- Speed up web client initialization
0.1.4:
- Remove dependencies cli and testify

9
go.mod
View File

@ -5,12 +5,13 @@ go 1.14
require (
github.com/GeertJohan/go.rice v1.0.0
github.com/daaku/go.zipexe v1.0.1 // indirect
github.com/go-git/go-git/v5 v5.0.0
github.com/go-git/go-git/v5 v5.1.0
github.com/gorilla/mux v1.7.4
github.com/gorilla/websocket v1.4.2
github.com/imdario/mergo v0.3.10 // indirect
github.com/pkg/errors v0.9.1
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 // indirect
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f // indirect
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c // indirect
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect
golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect
gopkg.in/yaml.v2 v2.3.0
)

24
go.sum
View File

@ -9,7 +9,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
github.com/daaku/go.zipexe v1.0.1 h1:wV4zMsDOI2SZ2m7Tdz1Ps96Zrx+TzaK15VbUaGozw0M=
github.com/daaku/go.zipexe v1.0.1/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8=
@ -28,14 +27,17 @@ github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agR
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
github.com/go-git/go-git/v5 v5.0.0 h1:k5RWPm4iJwYtfWoxIJy4wJX9ON7ihPeZZYC1fLYDnpg=
github.com/go-git/go-git/v5 v5.0.0/go.mod h1:oYD8y9kWsGINPFJoLdaScGCN6dlKg23blmClfZwtUVA=
github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc=
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
@ -67,23 +69,21 @@ github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c h1:kISX68E8gSkNYAFRFiDU8rl5RIn1sJYKYb/r2vMLDrU=
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

View File

@ -46,7 +46,7 @@ type Notebook struct {
Repository *git.Repository `json:"-"`
}
func (n *Notebook) getNote(id string) *Note {
func (n *Notebook) getNote(id string, fetchBody bool) *Note {
file := n.File(id)
if file == nil {
return nil
@ -78,9 +78,11 @@ func (n *Notebook) getNote(id string) *Note {
}
note.Label = strings.Title(strings.Replace(note.Label, "-", " ", -1))
note.Body, err = file.Contents()
if err != nil {
return nil
if fetchBody {
note.Body, err = file.Contents()
if err != nil {
return nil
}
}
return note
@ -101,7 +103,7 @@ func (n *Notebook) allNotes() map[string]*Note {
notes := make(map[string]*Note)
err = tree.Files().ForEach(func(f *object.File) error {
noteID := hash(f.Name)
note := n.getNote(noteID)
note := n.getNote(noteID, true)
notes[noteID] = note
return nil
})

58
web.go
View File

@ -85,7 +85,7 @@ func (s *StickSocket) handleRead() {
c.Notebook = notebook
if noteID, ok := c.Data["note"]; ok {
c.Note = notebook.getNote(noteID.(string))
c.Note = notebook.getNote(noteID.(string), true)
}
break
}
@ -104,7 +104,7 @@ func (s *StickSocket) handleRead() {
continue
}
}
if c.Command != "delete" && c.Note != nil {
if c.Command != "fetch" && c.Command != "delete" && c.Note != nil {
if c.Modified != c.Note.ModifiedAt {
s.Write(socketResponse("fail", "modified"))
continue
@ -224,7 +224,7 @@ type StickSocketCommand struct {
type StickSocketHandler func(*StickSocket, *StickSocketCommand) *map[string]interface{}
var (
SocketCommands = map[string]StickSocketHandler{"edit": webEdit, "check": webCheck, "delete": webDelete}
SocketCommands = map[string]StickSocketHandler{"fetch": webFetch,"edit": webEdit, "check": webCheck, "delete": webDelete}
SocketCommandLock sync.Mutex
WebSockets = make(map[int]*StickSocket)
@ -344,30 +344,22 @@ func serveWeb() {
func sendNote(ss *StickSocket, notebookID string, noteID string) {
response := map[string]interface{}{}
response["author"] = ss.Author.Name
response["notebooks"] = map[string]*ServedNotebook{}
response["notebookid"] = notebookID
response["noteid"] = noteID
for _, notebook := range ss.Author.Notebooks {
if notebook.ID != notebookID {
continue
}
notes := make(map[string]*Note)
if noteID != "" {
note := notebook.getNote(noteID)
if note == nil {
return
}
notes[note.ID] = note
} else {
notes = notebook.allNotes()
note := notebook.getNote(noteID, true)
if note == nil {
return
}
snb := &ServedNotebook{Notebook: notebook, Notes: notes}
response["notebooks"].(map[string]*ServedNotebook)[snb.ID] = snb
break
response["note"] = note
}
response["delta"] = true
ss.Write(&response)
}
@ -394,7 +386,7 @@ func sendNotesSince(ss *StickSocket, modified int64) {
err = tree.Files().ForEach(func(f *object.File) error {
noteID := hash(f.Name)
note := notebook.getNote(noteID)
note := notebook.getNote(noteID, false)
if note == nil || note.ModifiedAt < modified {
return nil
}
@ -431,6 +423,11 @@ func sendNotesSince(ss *StickSocket, modified int64) {
ss.Write(&response)
}
// Fetch a note
func webFetch(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
return &map[string]interface{}{"status": "success", "notebookid": c.Notebook.ID, "noteid": c.Note.ID, "note": c.Note}
}
// Edit a note
func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
if stick.Config.Debug {
@ -498,7 +495,7 @@ func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
if data == body {
// TODO: Send unmodified message
sendNotesSince(s, c.Note.ModifiedAt)
sendNote(s, c.Notebook.ID, c.Note.ID)
return socketResponse("success", "")
}
}
@ -538,7 +535,7 @@ func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
CheckError(err)
if c.Note == nil {
c.Note = c.Notebook.getNote(hash(fileName))
c.Note = c.Notebook.getNote(hash(fileName), true)
if c.Note == nil {
return socketResponse("fail", "modified")
}
@ -701,22 +698,9 @@ func updateWebSockets(author *Author, notebookID string, noteID string) {
return
}
for _, notebook := range author.Notebooks {
if notebook.ID != notebookID {
continue
for _, ss := range WebSockets {
if ss.Author.Key == author.Key {
sendNote(ss, notebookID, noteID)
}
note := notebook.getNote(noteID)
if note == nil {
continue
}
for _, ss := range WebSockets {
if ss.Author.Key == author.Key {
sendNote(ss, notebookID, noteID)
}
}
return
}
}

View File

@ -190,35 +190,47 @@ function ConnectStick() {
Pinned = data.pinned;
}
}
if (data.hasOwnProperty("notebooks")) {
var mustRender = false;
nowconnected = true;
if (data.hasOwnProperty("note") || data.hasOwnProperty("notebooks")) {
if (data.hasOwnProperty("note")) {
Notebooks[data["notebookid"]].Notes[data["noteid"]] = data["note"];
if (data.hasOwnProperty("delta")) {
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
Notebooks[nbid].Notes[nid] = data.notebooks[nbid].Notes[nid];
if (Notebooks[data["notebookid"]].Notes[data["noteid"]].ModifiedAt > NotebooksModified) {
NotebooksModified = Notebooks[data["notebookid"]].Notes[data["noteid"]].ModifiedAt; // TODO Not needed?
}
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
}
if (NoteMode === "view" && data["notebookid"] === ViewNotebook && data["noteid"] === ViewNote) {
mustRender = true;
}
} else if (data.hasOwnProperty("notebooks")) {
var mustRender = false;
nowconnected = true;
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
mustRender = true;
if (data.hasOwnProperty("delta")) {
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
Notebooks[nbid].Notes[nid] = data.notebooks[nbid].Notes[nid];
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
}
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
mustRender = true;
}
}
}
}
} else {
Notebooks = data.notebooks;
} else {
Notebooks = data.notebooks;
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
}
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
}
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
mustRender = true;
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
mustRender = true;
}
}
}
}
@ -247,11 +259,25 @@ function ConnectStick() {
if (mustRender) {
render();
}
if (nowconnected) {
connected = true;
}
if (data.hasOwnProperty("delta")) {
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
fetchNote(nbid, nid);
}
}
} else {
for (var nbid in data.notebooks) {
for (var nid in data.notebooks[nbid].Notes) {
fetchNote(nbid, nid);
}
}
}
if (mustNavigate) {
if (ViewNote === "") {
if (history.length > 2) {
@ -289,6 +315,11 @@ function ConnectStick() {
};
}
function fetchNote(notebook, note) {
payload = {command: "fetch", notebook: notebook, note: note};
socket.send(JSON.stringify(payload));
}
function viewNote(notebook, note) {
NoteMode = "view";
ViewNotebook = notebook;