D For A Web Developer

Rikki Cattermole via Digitalmars-d digitalmars-d at puremagic.com
Tue Apr 29 21:32:31 PDT 2014


On Wednesday, 30 April 2014 at 04:12:59 UTC, Adam D. Ruppe wrote:
> On Wednesday, 30 April 2014 at 03:20:16 UTC, Rikki Cattermole 
> wrote:
>> We should probably work together on this sort of stuff! As we 
>> seem to have similar ideas
>
> Yea, I wrote my version several years ago (IIRC 2009 or early 
> 2010) and since then D has grown as has my knowledge of it. I 
> kinda want to write a web.d 2.0 that cleans everything up but 
> eh I have a lot of things I want to do and web.d 1.0 works so 
> no big rush.
>
> The 1.0 has a lot of cool stuff though, like it can avoid JS 
> calls by referencing the result of another function in the URL, 
> all pretty transparently. So like if you wrote, in JS:
>
> Foo.add(Foo.add(1,2), 3).get(alert), it should only result in 
> one HTTP request. The proxy object when used as an argument 
> just emits an indirect reference through magic URL params. 
> Kinda cool, though it doesn't go as far as I'd like.
>
>
> Among what I'd like to clean in web.d 2.0:
>
> web.d supports what it calls "ApiObjects", which map to RESTful 
> uris:
>
> class Poo : ApiObject {
>    this(ApiProvider parent, string identifier) {}
>    auto GET() { }
>    auto POST() {} // etc
>    auto bar() {}
> }
>
> If you went to:
>
> /Poo/cool-beans
>
> it would call (new Poo(parent, "cool-beans")).GET(). Then 
> /Poo/a/bar calls new Poo("a").bar and so on.
>
> The problem is this is really reliant on things like the ending 
> slash, and it issues redirects to force it to be there or not 
> be there.
>
> The implementation is also kinda buggy in general, it is 
> supposed to beautifully nest, but it only kinda does. Getting 
> an index of all things also doesn't work quite right, you have 
> to write a separate method for that.
>
> So I'd like to clean all that up and actually design it instead 
> of growing on cool hacks as they come to mind.
>
> Nested ApiProviders don't work exactly right either. They are 
> supposed to do a chain of magic:
>
> class Foo : ApiProvider { auto whatever() {} }
> class Bar : ApiProvider {
>    alias Foo foo;
> }
>
> Then, /foo/whatever does (new Foo((new Bar))).whatever. That 
> part works. The things is each class can also provide a 
> postProcess method to modify the document after it is 
> generated. That's *supposed* hit everything, but sometimes it 
> doesn't, I think it only works two levels deep right now, 
> really hairy implementation.
>
> The other problem is the Javascript generator doesn't really 
> understand nesting. Ideally, nested ApiProviders are made 
> available through dots and nested ApiObjects are workable 
> through JS proxy objects.
>
> This looks like what you managed to do so that's cool.
>
>
> I also need to clean up the reflection generation to make it 
> easier to use and make path info accessible outside just the 
> automatic routing (or the low level Cgi.pathInfo which doesn't 
> tell you where it starts!).
>
> Reflection should be generated once upon startup then reused 
> forever as an immutable object. Currently, reflection is 
> partially regenerated on each request - eek.
>
>
> I also wrote a _register*Processor family fairly recently (like 
> December 2012) that kinda obviates the old postProcess and back 
> in January this year, changed the session to put it all in 
> cookies instead of files. That stuff is awesome, so much better 
> than the old way. Should consider doing them from the ground up 
> now!
>
> (Also, ironically, I was a big pusher for UDAs for web.d... but 
> I barely actually used them after they were made available. I 
> really wanted to put them on parameters tho, otherwise 
> convention over configuration is kinda how i play it LOLOL)
>
>
>
> oh yeah and it could be documented somewhere other than my 
> brain, the sloppy source, and random forum posts so ppl can 
> know about it all. but meh.
>
> All that said, it manages to get the job done for me so I'm not 
> in a huge rush to actually fix any of it.

It does look like web.d was a bit of a precursor to Cmsed 
(unintentionally) strangely enough.
Although I definitely would like to hear more about asynchronous 
javascript instead of my synchronous based code and how I can 
combine it at some point.


More information about the Digitalmars-d mailing list