@@ -7,12 +7,14 @@ package main
77
88import (
99 "archive/zip"
10+ "context"
1011 "fmt"
1112 "github.com/jessevdk/go-flags"
1213 log "github.com/sirupsen/logrus"
1314 "go.amzn.com/lambda/interop"
1415 "go.amzn.com/lambda/rapidcore"
1516 "io"
17+ "io/fs"
1618 "math"
1719 "net/http"
1820 "os"
@@ -196,6 +198,69 @@ func DownloadCodeArchive(url string) {
196198
197199}
198200
201+ func resetListener (changeChannel <- chan bool , server * CustomInteropServer ) {
202+ for {
203+ _ , more := <- changeChannel
204+ if ! more {
205+ return
206+ }
207+ log .Println ("Resetting environment..." )
208+ _ , err := server .Reset ("HotReload" , 2000 )
209+ if err != nil {
210+ log .Warnln ("Error resetting server: " , err )
211+ }
212+ }
213+
214+ }
215+
216+ func RunHotReloadingListener (server * CustomInteropServer , targetPaths []string , opts * LsOpts , ctx context.Context ) {
217+ if ! opts .HotReloading {
218+ log .Debugln ("Hot reloading disabled." )
219+ return
220+ }
221+ defaultDebouncingDuration := 500 * time .Millisecond
222+ log .Infoln ("Hot reloading enabled, starting filewatcher." , targetPaths )
223+ changeListener , err := NewChangeListener (defaultDebouncingDuration )
224+ if err != nil {
225+ log .Errorln ("Hot reloading disabled due to change listener error." , err )
226+ return
227+ }
228+ defer changeListener .Close ()
229+ go changeListener .Start ()
230+ changeListener .AddTargetPaths (targetPaths )
231+ go resetListener (changeListener .debouncedChannel , server )
232+
233+ <- ctx .Done ()
234+ log .Infoln ("Closing down filewatcher." )
235+
236+ }
237+
238+ func getSubFolders (dirPath string ) []string {
239+ var subfolders []string
240+ err := filepath .WalkDir (dirPath , func (path string , d fs.DirEntry , err error ) error {
241+ if err == nil && d .IsDir () {
242+ subfolders = append (subfolders , path )
243+ }
244+ return err
245+ })
246+ if err != nil {
247+ log .Errorln ("Error listing directory contents: " , err )
248+ return subfolders
249+ }
250+ return subfolders
251+ }
252+
253+ func getSubFoldersInList (prefix string , pathList []string ) (oldFolders []string , newFolders []string ) {
254+ for _ , pathItem := range pathList {
255+ if strings .HasPrefix (pathItem , prefix ) {
256+ oldFolders = append (oldFolders , pathItem )
257+ } else {
258+ newFolders = append (newFolders , pathItem )
259+ }
260+ }
261+ return
262+ }
263+
199264func InitHandler (sandbox Sandbox , functionVersion string , timeout int64 ) (time.Time , time.Time ) {
200265 additionalFunctionEnvironmentVariables := map [string ]string {}
201266
0 commit comments