Skip to content

Commit

Permalink
Merge pull request #494 from intellifactory/cdn
Browse files Browse the repository at this point in the history
Add support for pointing resources to a CDN
  • Loading branch information
Tarmil committed Nov 19, 2015
2 parents 6c92717 + 85102ed commit 7fe951a
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 13 deletions.
6 changes: 5 additions & 1 deletion src/compiler/WebSharper.Core/Metadata.fs
Expand Up @@ -209,7 +209,11 @@ type Type = Re.TypeDefinition
type AssemblyResource(name: Re.AssemblyName) =
interface R.IResource with
member this.Render ctx writer =
let r = ctx.GetAssemblyRendering name
let filename = name.Name + if ctx.DebuggingEnabled then ".js" else ".min.js"
let r =
match R.Rendering.TryGetCdn(ctx, name, filename) with
| Some r -> r
| None -> ctx.GetAssemblyRendering name
r.Emit(writer R.Scripts, R.Js)

let activate resource =
Expand Down
54 changes: 45 additions & 9 deletions src/compiler/WebSharper.Core/Resources.fs
Expand Up @@ -22,6 +22,7 @@ module WebSharper.Core.Resources

open System
open System.IO
open System.Reflection
open System.Web
open System.Web.UI
module R = WebSharper.Core.Reflection
Expand Down Expand Up @@ -79,6 +80,8 @@ let inlineScript (html: HtmlTextWriter) (text: string) =
html.Write(text)
html.RenderEndTag()

let thisAssemblyToken = typeof<Rendering>.Assembly.GetName().GetPublicKeyToken()

type RenderLocation =
| Scripts
| Styles
Expand Down Expand Up @@ -107,6 +110,38 @@ type Rendering with
| Js -> script dHttp html url
| Rendering.Skip -> ()

static member TryGetCdn(ctx: Context, asmName: R.AssemblyName, filename: string) =
match ctx.GetSetting ("WebSharper.CdnFormat." + asmName.Name) with
| Some urlFormat -> Some urlFormat
| None ->
let isStdlib = AssemblyName(asmName.FullName).GetPublicKeyToken() = thisAssemblyToken
if isStdlib &&
(defaultArg (ctx.GetSetting "WebSharper.StdlibUseCdn") "false").ToLowerInvariant() = "true"
then
let def = "//cdn.websharper.com/{assembly}/{version}/{filename}"
Some (defaultArg (ctx.GetSetting "WebSharper.StdlibCdnFormat") def)
else None
|> Option.map (fun urlFormat ->
let asm = Assembly.Load(asmName.FullName)
let ver =
asm.GetCustomAttributes(typeof<AssemblyFileVersionAttribute>, false)
|> Array.tryPick (fun x ->
Some (x :?> AssemblyFileVersionAttribute).Version)
urlFormat
.Replace("{assembly}", asmName.Name)
.Replace("{filename}", filename)
.Replace("{version}", defaultArg ver "latest")
|> RenderLink
)

static member TryGetCdn(ctx: Context, asm: Assembly, filename: string) =
Rendering.TryGetCdn(ctx, R.AssemblyName.FromAssembly asm, filename)

static member GetWebResourceRendering(ctx: Context, t: Type, filename: string) =
match Rendering.TryGetCdn(ctx, t.Assembly, filename) with
| Some r -> r
| None -> ctx.GetWebResourceRendering t filename

type IResource =
abstract member Render : Context -> (RenderLocation -> HtmlTextWriter) -> unit

Expand Down Expand Up @@ -135,17 +170,18 @@ type BaseResource(kind: Kind) =
| Basic spec ->
let self = this.GetType()
let assem = self.Assembly
let aName = assem.GetName().Name
let assemName = assem.GetName()
let aName = assemName.Name
let id = self.FullName
let mt = if spec.EndsWith ".css" then Css else Js
match ctx.GetSetting id with
| Some url -> (RenderLink url).Emit(writer, mt, dHttp)
| None ->
match tryFindWebResource self spec with
| Some e ->
(ctx.GetWebResourceRendering self e).Emit(writer, mt, dHttp)
let r =
match ctx.GetSetting id with
| Some url -> RenderLink url
| None ->
(RenderLink spec).Emit(writer, mt, dHttp)
match tryFindWebResource self spec with
| Some e -> Rendering.GetWebResourceRendering(ctx, self, e)
| None -> RenderLink spec
r.Emit(writer, mt, dHttp)
| Complex (b, xs) ->
let id = this.GetType().FullName
let b = defaultArg (ctx.GetSetting id) b
Expand All @@ -161,5 +197,5 @@ type Runtime() =
member this.Render ctx writer =
let name = if ctx.DebuggingEnabled then "Runtime.js" else "Runtime.min.js"
let t = typeof<WebSharper.Core.JavaScript.Core.Id>
let ren = ctx.GetWebResourceRendering t name
let ren = Rendering.GetWebResourceRendering(ctx, t, name)
ren.Emit(writer, Js, ctx.DefaultToHttp)
5 changes: 4 additions & 1 deletion src/compiler/WebSharper.Core/Resources.fsi
Expand Up @@ -43,9 +43,12 @@ type Rendering =

member Emit : HtmlTextWriter * MediaType * ?defaultToHttp: bool -> unit
member Emit : (RenderLocation -> HtmlTextWriter) * MediaType * ?defaultToHttp: bool -> unit
static member TryGetCdn : ctx: Context * assemblyName: R.AssemblyName * filename: string -> option<Rendering>
static member TryGetCdn : ctx: Context * assembly: System.Reflection.Assembly * filename: string -> option<Rendering>
static member GetWebResourceRendering : ctx: Context * resource: System.Type * filename: string -> Rendering

/// Defines the context in which resources can be rendered.
type Context =
and Context =
{
/// A flag indicating if debugging is enabled or not.
DebuggingEnabled : bool
Expand Down
3 changes: 2 additions & 1 deletion src/stdlib/WebSharper.Main/JavaScript.fs
Expand Up @@ -24,6 +24,7 @@
module WebSharper.JavaScript.JS

module A = WebSharper.Core.Attributes
module R = WebSharper.Core.Reflection
module Re = WebSharper.Core.Resources

type AnimationFrameResource() =
Expand All @@ -32,7 +33,7 @@ type AnimationFrameResource() =
let html = html Re.Scripts
html.WriteLine "<!--[if lte IE 9.0]>"
let name = if ctx.DebuggingEnabled then "AnimFrame.js" else "AnimFrame.min.js"
let ren = ctx.GetWebResourceRendering typeof<AnimationFrameResource> name
let ren = Re.Rendering.GetWebResourceRendering(ctx, typeof<AnimationFrameResource>, name)
ren.Emit(html, Re.Js)
html.WriteLine "<![endif]-->"

Expand Down
2 changes: 1 addition & 1 deletion src/stdlib/WebSharper.Main/Json.fs
Expand Up @@ -31,7 +31,7 @@ type Resource() =
let html = html Re.Scripts
html.WriteLine "<!--[if lte IE 7.0]>"
let name = if ctx.DebuggingEnabled then "Json.js" else "Json.min.js"
let ren = ctx.GetWebResourceRendering typeof<Resource> name
let ren = Re.Rendering.GetWebResourceRendering(ctx, typeof<Resource>, name)
ren.Emit(html, Re.Js)
html.WriteLine "<![endif]-->"

Expand Down

0 comments on commit 7fe951a

Please sign in to comment.