servefiles.jl

Pollen/serve/servefiles.jl is a source file in module Pollen

			
			
			
			
			Base
			.
			
			@
			kwdef
			 
			
			
			struct
			
			 

	
			ServeFiles
			 
			<:
			 

	
			ServerMode
			
			
    
			
			
			port
			::
			Int
			 
			=
			 
			8000
			

			end
			

			

			
			function
			 
			

	
			handle
			(
			server
			,
			 
			
			::

	
			ServeFiles
			,
			 
			
			event
			::

	
			DocUpdated
			)
			
			
    
			

	
			addsource!
			(
			server
			,
			 
			
			event
			.
			
			name
			,
			 
			
			event
			.
			
			doc
			)
			
    
			

	
			addrewrite!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			
    
			

	
			addbuild!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			

			end
			

			

			
			function
			 
			

	
			geteventhandler
			(
			

	
			serve
			::

	
			ServeFiles
			,
			 
			server
			,
			 
			ch
			)
			
			
    
			
			return
			 
			

	
			FileServer
			(
			
			
			server
			.
			
			builder
			.
			
			dir
			,
			
                      
			
			port
			 
			=
			 
			

	
			serve
			.
			
			port
			,
			
                      
			
			allow_cors
			 
			=
			 
			true
			)
			

			end
			

			

			
			function
			 
			

	
			initialize
			(
			
			::

	
			ServeFiles
			,
			 
			server
			)
			
			
    
			
			@
			info
			 
			
			"
			Starting initial build...
			"
			
    
			

	
			fullbuild
			(
			
			server
			.
			
			project
			,
			 
			
			server
			.
			
			builder
			)
			
    
			
			@
			info
			 
			
			"
			Done.
			"
			

			end
			

			

			
			
			Base
			.
			
			@
			kwdef
			 
			
			
			struct
			
			 

	
			ServeFilesLazy
			 
			<:
			 

	
			ServerMode
			
			
    
			
			
			port
			::
			Int
			 
			=
			 
			8000
			

			end
			

			

			
			function
			 
			

	
			initialize
			(
			
			::

	
			ServeFilesLazy
			,
			 
			server
			)
			
			
    
			

	
			build
			(
			
			server
			.
			
			builder
			,
			 
			
			server
			.
			
			project
			)
			

			end
			

			

			
			function
			 
			

	
			handle
			(
			server
			,
			 
			
			::

	
			ServeFilesLazy
			,
			 
			
			event
			::

	
			DocUpdated
			)
			
			
    
			

	
			addsource!
			(
			server
			,
			 
			
			event
			.
			
			name
			,
			 
			
			event
			.
			
			doc
			)
			
    
			
			if
			
			 
			
			event
			.
			
			name
			 
			in
			 
			
			keys
			(
			
			
			server
			.
			
			project
			.
			
			outputs
			)
			
			
        
			

	
			addrewrite!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			
        
			

	
			addbuild!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			
    
			end
			

			end
			

			

			
			function
			 
			

	
			handle
			(
			server
			,
			 
			
			::

	
			ServeFilesLazy
			,
			 
			
			event
			::

	
			DocRequested
			)
			
			
    
			
			if
			
			 
			(
			
			
			event
			.
			
			name
			 
			 
			
			keys
			(
			
			
			server
			.
			
			project
			.
			
			sources
			)
			)
			 
			&&
			
       
			
			!
			(
			
			
			event
			.
			
			name
			 
			 
			
			keys
			(
			
			
			server
			.
			
			project
			.
			
			outputs
			)
			)
			
			
        
			
			@
			info
			 
			
			"
			Building 
			$
			(
			
			event
			.
			
			name
			)
			 for the first time...
			"
			
        
			

	
			addrewrite!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			
        
			

	
			addbuild!
			(
			server
			,
			 
			
			event
			.
			
			name
			)
			
    
			end
			

			end
			

			

			
			function
			 
			

	
			geteventhandler
			(
			

	
			serve
			::

	
			ServeFilesLazy
			,
			 
			server
			,
			 
			ch
			)
			
			
    
			
			builddir
			 
			=
			 
			
			
			server
			.
			
			builder
			.
			
			dir
			
    
			
			return
			 
			

	
			FileServer
			(
			builddir
			,
			
                      
			
			port
			 
			=
			 
			

	
			serve
			.
			
			port
			,
			
                      
			
			allow_cors
			 
			=
			 
			true
			,
			
                      
			
			preprocess_request
			 
			=
			 
			
			req
			 
			->
			 
			
			_lazyservecallback
			(
			req
			,
			 
			ch
			,
			 
			builddir
			,
			
                                                                     
			
			server
			.
			
			project
			)
			)
			

			end
			

			

			
			function
			 
			
			_lazyservecallback
			(
			req
			,
			 
			ch
			,
			 
			builddir
			,
			 
			project
			)
			
			
    
			# TODO FIXME this will break for extensions without exactly 4 characters
			
    
			
			documentid
			 
			=
			 
			
			
			req
			.
			
			target
			[
			
			2
			:
			(
			
			end
			 
			-
			 
			5
			)
			]
			
    
			
			if
			
			 
			
			!
			(
			
			
			endswith
			(
			
			req
			.
			
			target
			,
			 
			
			"
			.html
			"
			)
			 
			||
			 
			
			endswith
			(
			
			req
			.
			
			target
			,
			 
			
			"
			.json
			"
			)
			)
			 
			||
			
       
			
			!
			(
			
			documentid
			 
			in
			 
			
			keys
			(
			
			project
			.
			
			sources
			)
			)
			
			
        
			
			
			
			LiveServer
			.
			
			HTTP
			.
			
			setheader
			(
			req
			,
			 
			
			
			"
			Access-Control-Allow-Origin
			"
			 
			=>
			 
			
			"
			*
			"
			)
			
        
			
			return
			 
			req
			
    
			else
			
			
        
			

	
			buildpath
			 
			=
			 
			
			joinpath
			(
			builddir
			,
			 
			
			
			req
			.
			
			target
			[
			
			2
			:
			end
			]
			)
			
        
			
			try
			
			
            
			
			mkpath
			(
			
			parent
			(

	
			buildpath
			)
			)
			
        
			catch
			
			
			
        
			
			
			end
			
        
			
			touch
			(

	
			buildpath
			)
			
        
			
			sourcepath
			 
			=
			 
			
			Path
			(
			documentid
			)
			  
			# cut off / and .html
			
        
			
			put!
			(
			ch
			,
			 
			

	
			DocRequested
			(
			sourcepath
			)
			)
			
        
			# Give time to build so file server doesn't instantly return a 404
			
        
			
			sleep
			(
			0.05
			)
			
        
			
			return
			 
			req
			
    
			end
			

			end