In my last post where I added LiveItem syntax to MeshScripts, I said I had some more ideas for MeshScripts. Some of these ideas are very small, some are very big, and some are in between. The reason I’m listing them here is that there’s no way I could get to even a fraction of them (I’d like to move on and explore other areas of Live Mesh), so hopefully they spark your imagination.
Enhancements for existing MeshScripts
These enhancements could be applied to MeshScripts without taking a dependency on the library I wrote.
Chunking and chaining
There is an upper limit on the number of statements the server will process in a single script. It would be nice to implement automatic script chunking and chaining based on a configurable statement batch size. For cross-batch bindings, outputs from one batch can be fed into inputs for the next batch. Special care needs to be taken at CompoundStatement boundaries, especially with ConditionalStatement. This could also be used to implement a progress indicator for large jobs while still preserving most of the performance benefits of batching.
Automatic parallelization option
I’m guessing most people are going to write their scripts using SequenceStatement as their CompoundStatement of choice. It would be cool to have the option of automatically transforming and optimizing scripts by wrapping sections in InterleaveStatements where possible based on analysis of binding dependencies and URLs. This ought to be a feature the user explicitly opts into.
Enhancements to Fluent MeshScripts library
These enhancements are specific to my Fluent MeshScripts library.
Use control flow MeshScript features
Note that ScriptContext’s record-replay model doesn’t need any “programmatic” script control flow features such as ConditionalStatement or the coming-soon LoopStatement. Perhaps there’s an opportunity to add If/Else logic to the SLiveItem syntax. This would require an expression tree visitor to touch up references to script statements since currently you must hard-code the statement ID/Name in the condition.
A switch statement could be added that uses multiple ConditionalStatements under the hood.
A similar sub-ScriptContext scoping solution could be used for generating InterleaveStatement sections.
Until we get a real LoopStatement, a fake Loop statement could be created that unwraps the loop a specified number of times. This could be used for scenarios such as copying the last 10 items from a Twitter feed into a Mesh feed.
Create a helper method that enables single-round-trip Live Folder creation that returns LiveItems.
I haven’t investigated expansions yet, but it seems like there’s an opportunity to take advantage of them in MeshScripts, preferably with helper methods to simplify common scenarios, whatever those might be.
Taking MeshScripts in bold new directions
Here are some wild and crazy ideas that probably won’t come to pass, but wouldn’t they be cool?
Add batching to LiveItems
It would be nice if LiveItems had the option of operating either in batched mode (like my SLiveItem implementation) or real-time mode (as they currently do). Perhaps this could be enabled through a new Batched property on LiveItemAccessOptions. This means LiveItems would be able to speak both AtomPub/FeedSync and MeshScripts.
Escaping the MEWA sandbox
This next one is more of a “see if it’s possible” item than a new thing to implement, but it could open up some interesting new scenarios that would be ripe for additional library development. It would be interesting to see if MEWAs can use MeshScripts to escape the MEWA sandbox, either by calling them as sprocs or as triggers. Of course if this is possible, it’s likely it will be quickly disabled, but who knows, perhaps it’s acceptable. I tried running a simple ReadCollection script from a Silverlight MEWA and got an exception trying to deserialize the result (no public default constructor), so I haven’t pursued it further.
Yahoo Pipes for AtomPub
Yes, building Yahoo Pipes for AtomPub and FeedSync would involve much more than just MeshScripts, but I think MeshScripts could play an important role in its implementation, especially with the forthcoming visual script designer.
This idea first came to me as I was experimenting with pulling in external Atom feeds using MeshScripts (it’s also possible using LiveItems). Most feeds had formatting that broke the script, but a few external Atom feeds magically worked. I thought, wouldn’t it be nice if there were a MeshAtomTidy service that touched up external feeds with the appropriate data to ensure they load nicely into the Mesh?
That would be great for read-only feeds. Wouldn’t it be even nicer if you could map LiveID credentials to external credentials and access other AtomPub APIs such as Google Calendar, Google Spreadsheets, Picasa, and more? It would also be cool if you could write a little bit of glue code or script to wrap an AtomPub API around non-AtomPub APIs such as Twitter. Or even better, just select from a list of pre-existing AtomPub wrappers for popular services.
Next, I’d like to enable automatic synchronization between Mesh feeds and external feeds. It’s not very exciting to send tweets while you’re offline, but offline access to the Google APIs is more compelling. There may be a need for additional transformations and business logic in between which is where the full-featured suite of Yahoo Pipes modules comes in handy.
The closest Microsoft equivalent to Yahoo Pipes is Popfly. It has a similar set of modules and a drag-and-drop design experience. Perhaps there is an opportunity to integrate Popfly mashups with Mesh feeds. It would also be cool if you could package Popfly games as MEWAs that can run on your desktop or on your phone and maybe even sell them through a Live Mesh App Store, but that’s probably enough crazy talk for one blog post. :-)