Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<opml version="2.0">
	<head>
		<title>readme.md</title>
		<dateModified>&lt;%dateModified%></dateModified>
		<expansionState></expansionState>
		<vertScrollState>1</vertScrollState>
		<windowTop>300</windowTop>
		<windowLeft>700</windowLeft>
		<windowBottom>900</windowBottom>
		<windowRight>1500</windowRight>
		</head>
	<body text="readme.md">
		<outline text="### nodeStorage"></outline>
		<outline text=""></outline>
		<outline text="A simple server-side JavaScript storage system using Twitter identity, running in Node.js. "></outline>
		<outline text=""></outline>
		<outline text="#### Overview">
			<outline text="1. Public and private data. "></outline>
			<outline text="3. Store data in local filesystem or on Amazon S3."></outline>
			<outline text="2. User identity through Twitter. "></outline>
			<outline text="4. The back-end of an open source blogging system, with &lt;a href=&quot;http://myword.io/editor/&quot;&gt;MyWord Editor&lt;/a&gt; as the front-end. "></outline>
			<outline text="5. Written by &lt;a href=&quot;http://davewiner.com/&quot;&gt;Dave Winer&lt;/a&gt;, first deployed in June 2014, supports a &lt;a href=&quot;http://scripting.com/2014/07/16/myLatestSoftwareSnacks.html&quot;&gt;small set&lt;/a&gt; of browser-based JavaScript software. Hope to expand to become a community of apps. "></outline>
			</outline>
		<outline text="#### How to set up">
			<outline text="Here's &lt;a href=&quot;http://nodestorage.smallpict.com/2015/08/05/installingNodestorageOnUbuntu.html&quot;&gt;quick guide&lt;/a&gt; to setting up a nodeStorage server on Ubuntu, but probably works on many other Unix systems. It doesn't assume you have Node.js installed or a Git client. It shows you how to set up a connection with Twitter. It stores user data, both public and private, in the filesystem of the Ubuntu machine. "></outline>
			<outline text="It's a good guide for installing on any Unix system, but has been tested on Ubuntu."></outline>
			</outline>
		<outline text="#### Links">
			<outline text="1. There are a lot of &lt;a href=&quot;https://github.com/scripting/1999-project/tree/master/docs&quot;&gt;docs&lt;/a&gt; about nodeStorage on the 1999-project site. "></outline>
			<outline text="2. I wrote a &lt;a href=&quot;http://nodestorage.smallpict.com/2015/01/19/whatIsNodestorage.html&quot;&gt;backgrounder&lt;/a&gt; that explains the philosophy of nodeStorage, what it can be used for and where it's likely to go as it evolves."></outline>
			<outline text="3. 1999.io, my new blogging system, is a nodeStorage app and it has streamlined &lt;a href=&quot;https://github.com/scripting/1999-project/blob/master/docs/setup.md&quot;&gt;setup instructions&lt;/a&gt;. "></outline>
			<outline text="4. A &lt;a href=&quot;http://scripting.com/2015/01/23/nodestorageNow.html&quot;&gt;blog post&lt;/a&gt; provides another perspective."></outline>
			<outline text="5. Andrew Shell wrote a &lt;a href=&quot;https://github.com/scripting/storage/wiki/Installing-Storage-on-a-VPS&quot;&gt;guide&lt;/a&gt; to setting up a new nodeStorage server. "></outline>
			<outline text="6. Marco Fabbri wrote a &lt;a href=&quot;https://github.com/scripting/nodeStorage/wiki/Installing-nodeStorage-on-Heroku&quot;&gt;howto&lt;/a&gt; for Heroku server setup. "></outline>
			<outline text="7. &lt;a href=&quot;http://nodestorage.smallpict.com/2015/08/07/whyUseTwitterForIdentity.html&quot;&gt;Why use Twitter for identity?&lt;/a&gt;"></outline>
			</outline>
		<outline text="#### Demo app #1">
			<outline text="1. A minimal &lt;a href=&quot;http://macwrite.org/&quot;&gt;demo app&lt;/a&gt;. "></outline>
			<outline text="2. The &lt;a href=&quot;https://github.com/scripting/macwrite&quot;&gt;full source&lt;/a&gt; for the demo app is available on GitHub. MIT License."></outline>
			</outline>
		<outline text="#### Demo app #2">
			<outline text="1. &lt;a href=&quot;http://myword.io/editor/&quot;&gt;MyWord Editor&lt;/a&gt; is a simple and &lt;a href=&quot;http://myword.io/users/davewiner/essays/045.html&quot;&gt;beautiful&lt;/a&gt; blogging system. "></outline>
			<outline text="2. It's fully &lt;a href=&quot;https://github.com/scripting/myWordEditor&quot;&gt;open source&lt;/a&gt;, MIT License. "></outline>
			<outline text="3. The back-end is nodeStorage. "></outline>
			</outline>
		<outline text="#### API">
			<outline text="&lt;a href=&quot;https://github.com/scripting/nodeStorage/blob/master/api.js&quot;&gt;api.js&lt;/a&gt; file provides glue for browser-based JavaScript apps. "></outline>
			<outline text="You can also access it in &lt;a href=&quot;http://api.nodestorage.io/api.js&quot;&gt;api.nodestorage.io&lt;/a&gt; and include it from apps if you want. "></outline>
			</outline>
		<outline isComment="true" text="#### Breakage alerts">
			<outline text="Once an API is done, I believe in no-breakage. I think all changes made from the point where it's complete can be done continuously, meaning old versions of the API can continue to be supported. I do not believe in deprecation. "></outline>
			<outline text="However, the API here is not yet frozen, so be on the alert for breakage. But I want to freeze it fairly quickly. Look for this note to disappear. ;-)"></outline>
			</outline>
		<outline isComment="true" text="#### Parameters">
			<outline text="1. twitterConsumerKey -- get this from &lt;a href=&quot;https://apps.twitter.com/&quot;&gt;apps.twitter.com&lt;/a&gt;"></outline>
			<outline text="2. twitterConsumerSecret"></outline>
			<outline text="3. AWS_ACCESS_KEY_ID -- get this from &lt;a href=&quot;http://aws.amazon.com/&quot;&gt;aws.amazon.com&lt;/a&gt;."></outline>
			<outline text="4. AWS_SECRET_ACCESS_KEY"></outline>
			<outline text="5. s3Path -- this is where public data is stored on S3"></outline>
			<outline text="6. s3PrivatePath -- where private data, like prefs, are stored"></outline>
			<outline text="7. myDomain"></outline>
			<outline text="8. longPollTimeoutSecs -- only necessary if your app uses long-polling"></outline>
			<outline text="9. TZ"></outline>
			</outline>
		<outline isComment="true" text="#### Setup">
			<outline text="1. You have to set up an app on apps.twitter.com. The goal is to get the twitterConsumerKey and twitterConsumerSecret values. That's the connection between Twitter and the Storage app."></outline>
			<outline text="2. You need to have the key and secret for AWS. "></outline>
			<outline text="3. There are two S3 paths, one for public content and the other for private stuff, specifically user prefs. It's your responsiblity to set up the private storage so that it cannot be accessed over the web. This is easy because it's the default bucket. And the public content has to be publically accessible. The paths should begin and end with slashes."></outline>
			<outline text="4. myDomain is a domain that's mapped to the server. Its used in creating the OAuth dance with Twitter. It needs to know how to call us back. "></outline>
			<outline text="5. TZ is the timezone the server is running in. I have it set for my server to *America/New_York.*"></outline>
			</outline>
		<outline isComment="true" text="#### Notes">
			<outline text="1. You may see the product referred to in docs and comments as *storage*. That's what it was called while it was in development. It's still a good descriptive name for what the app does."></outline>
			</outline>
		<outline text="#### Updates">
			<outline text="##### v0.9.17 -- 10/2/20 by DW">
				<outline text="nodeStorage becomes a real package.  See &lt;a href=&quot;https://github.com/scripting/nodeStorage/blob/master/package.md&quot;&gt;package.md&lt;/a&gt; in the repo for an explanation and background. "></outline>
				</outline>
			<outline text="##### v0.9.11 - 4/14/20 by DW">
				<outline text="Add new /myfiles call, requires authentication, and returns a zip archive containing the user's files. Only works if the storage is local, not on S3.  "></outline>
				</outline>
			<outline text="##### v0.9.10 - 3/6/20 by DW">
				<outline text="Add new /disconnect call, requires authentication, and removes the user from the screen name cache. The need for this came up in the &lt;a href=&quot;http://scripting.com/2019/03/24.html#a164643&quot;&gt;development&lt;/a&gt; of feedBase. Little Outliner calls this endpoint. "></outline>
				</outline>
			<outline text="##### v0.9.9 - 3/5/20 by DW">
				<outline text="In the /getfilelist call, if it's the local file system, we return extra info about each file: when it was created, modified, its size. No changes for S3 storage. This was used to implement the new File/Open command in &lt;a href=&quot;http://scripting.com/2020/03/04.html#a152838&quot;&gt;Little Outliner&lt;/a&gt;. "></outline>
				</outline>
			<outline text="##### v0.9.7 - 9/19/19 by DW">
				<outline text="If process.env.PORT is set when we launch, use that instead of what's in config.json."></outline>
				</outline>
			<outline text="##### v0.9.5 - 2/27/18 by DW">
				<outline text="New config option -- flUsePortInRedirect. Default true. See this &lt;a href=&quot;http://scripting.com/2018/02/27/152934.html&quot;&gt;post&lt;/a&gt; for an explanation. "></outline>
				</outline>
			<outline text="##### v0.9.4 - 8/15/17 by DW">
				<outline text="Changed to NPM-friendly version numbering. "></outline>
				<outline text="Added a new routine to api.js, nodeStorageApp. It factors out some of the complexity of writing a nodeStorage-able app, based on what we know now, vs what we knew then. ;-)"></outline>
				<outline text="The demo app for the new interface is &lt;a href=&quot;https://github.com/scripting/macwrite&quot;&gt;MacWrite&lt;/a&gt;. "></outline>
				<outline text="All the previous api.js routines work as before, no changes."></outline>
				</outline>
			<outline text="##### v0.95b - 7/20/16 by DW">
				<outline text="Replaced calls to &quot;encode&quot; in encodeURIComponent with handleHttpRequest. This helped resolve an &lt;a href=&quot;#4; Don Park was having on his system. "></outline>
				</outline>
			<outline text="##### v0.95a - 7/17/16 by DW">
				<outline text="A problem showed up in Safari only, on a customized menu, on a site with a custom URL. "></outline>
				<outline text="When we get the HTML of the menu from the server, it redirects from the long URL to the short one, as if we were a user coming in through a web browser."></outline>
				<outline text="This works fine in Chrome, the $.ajax call in the browser just redirects, but not in Safari. A search turns up several Stack Exchange articles that say that Apple believes the HTML 5 spec tells them to work this way. Whatever. "></outline>
				<outline text="So I added support for a new param on a request, noredirect, if it's true, we don't do the redirect, we just return the content of the object requested (the HTML of the menu in this case) without redirecting. "></outline>
				<outline text="Amazingly it worked. ;-)"></outline>
				<outline text="Here's the &lt;a href=&quot;http://lo.1999.io/2016/07/17/0008.html&quot;&gt;page&lt;/a&gt; that illustrated the problem, but I've seen it on other sites before, didn't have the time to chase it down."></outline>
				</outline>
			<outline text="##### v0.94w - 6/25/16 by DW">
				<outline text="New config.json value -- url404page. It points to an HTML page that's returned when a 404 error is generated. "></outline>
				<outline text="Previously we'd return a 500 error where we should have returned 404, and the page we displayed showed the contents of a &lt;a href=&quot;http://scripting.com/2016/06/25/randomJson.png&quot;&gt;JSON struct&lt;/a&gt;. Now It gives you a plain 404 &quot;not found&quot; message, and gives you the opportunity to override the default choice. "></outline>
				<outline text="Here's an &lt;a href=&quot;https://gist.github.com/scripting/11e3df5a975585b166d1b4cb8a5918a9&quot;&gt;example&lt;/a&gt; of a config.json that specified a 404 page. "></outline>
				</outline>
			<outline text="##### v0.93 - 4/3/16 by DW">
				<outline text="Added a call to ping the &quot;community server&quot; when the RSS feed updates in addition to the rssCloud server. See lib/rss.js for details."></outline>
				</outline>
			<outline text="##### v0.92 - 3/26/16 by DW">
				<outline text="Sorry for the lack of update notes. What's been going on has been the development of nodeStorage as a server for 1999.io. "></outline>
				<outline text="At this point the server should be as easy to install as it was previously, after some docs are written, and from here-out I plan to keeop the update notes current with the development work."></outline>
				</outline>
			<outline text="##### v0.79 - 9/9/15 by DW">
				<outline text="In the new chat functionality, when we return from a longpoll, we used to send back the entire chatlog. This is not very efficient, esp over a mobile connection. Now we only send back the new item that caused us to return. See postChatMessage for the change. "></outline>
				</outline>
			<outline text="##### v0.78 - 9/3/15 by DW">
				<outline text="New routines support a basic chat capability."></outline>
				<outline text="Slack-compatible incoming and outgoing webhooks."></outline>
				<outline text="Can be configured to watch for a change to the mod date of storage.js, which causes it to quit (presumably to be relaunched by the OS or forever). Makes installing updates automatic."></outline>
				<outline text="By default, longpolls timeout after 60 seconds, previously it was 20 seconds."></outline>
				<outline text="The everyMinute script now runs at the top of the minute. Previously it was a function of when the app was launched. It also announces itself with the current time and the version of nodeStorage."></outline>
				</outline>
			<outline text="##### v0.77 - 7/29/15 by DW">
				<outline text="We can now store user data in the local file system. Previous versions could only store data in Amazon S3. The changes are documented in &lt;a href=&quot;http://nodestorage.smallpict.com/2015/07/29/nodestorageInTheFilesystem.html&quot;&gt;this post&lt;/a&gt;. "></outline>
				</outline>
			<outline text="##### v0.75 - 7/15/15 by DW">
				<outline text="New functionality to support named outlines. "></outline>
				</outline>
			<outline text="##### v0.74 - 5/20/15 by DW">
				<outline text="Fixed an error in the way whitelists are specified. "></outline>
				</outline>
			<outline text="##### v0.73 - 5/10/15 by DW">
				<outline text="&lt;a href=&quot;http://storage.smallpict.com/2015/05/10/newWayToConfigureNodestorage.html&quot;&gt;A new way&lt;/a&gt; to configure nodeStorage, with a config.json file."></outline>
				</outline>
			<outline text="##### v0.72 - 3/5/15 by DW">
				<outline text="The /getfilelist endpoint now returns an array of objects, one for each file, as before. The objects contain three values, &lt;i&gt;path, whenLastChange&lt;/i&gt; and &lt;i&gt;ctChars.&lt;/i&gt; "></outline>
				<outline text="Previously we were  returning the array that S3 returns to us. The file paths it returns are not easily used by a client. "></outline>
				<outline text="There is a possibility of breakage if you had built on this endpoint, but given its previous state, it's hard to imagine anyone doing that. ;-)"></outline>
				</outline>
			<outline text="##### v0.66 -1/29/15 by DW">
				<outline text="New stats for longpolling, in serverStats.json. &lt;a href=&quot;http://liveblog.co/data/serverStats.json&quot;&gt;Example&lt;/a&gt;. Gives us a way to see how many people are watching resources managed by a nodeStorage server."></outline>
				</outline>
			<outline text="##### v0.65 -1/24/15 by DW">
				<outline text="Added a readout of free memory as the second item in the server log. "></outline>
				<outline text="In this &lt;a href=&quot;http://scripting.com/2015/01/24/freemem.png&quot;&gt;screen shot&lt;/a&gt; the arrow points to the free memory readout. "></outline>
				</outline>
			</outline>
		<outline text="#### Questions, problems">
			<outline text="Please post a note on the &lt;a href=&quot;https://groups.google.com/forum/?fromgroups#!forum/server-snacks&quot;&gt;server-snacks&lt;/a&gt; mail list. "></outline>
			</outline>
		</body>
	</opml>