mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-16 19:22:22 +03:00
blog details
This commit is contained in:
parent
00e95562ec
commit
0a351ee845
@ -1,2 +1,9 @@
|
||||
<div class="root">
|
||||
|
||||
<list dataPath="" dataPreview="true" dataType="post"></list>
|
||||
# Log —
|
||||
|
||||
<list dataPath="" dataPreview="true" dataType="post"></list>
|
||||
|
||||
Please direct all questions or inquiries to [urbit@urbit.org](mailto:urbit@urbit.org). You can also subscribe to the [urbit-dev]() mailing list or follow [@urbit_]() on twitter.
|
||||
|
||||
</div>
|
@ -1 +1,10 @@
|
||||
# Post 1
|
||||
<div class="post">
|
||||
|
||||
# Technical demo — Part ii
|
||||
|
||||
<h2 class="sub">2015 07 16</h2>
|
||||
<h2 class="sub">Curtis, Galen, Philip, Anton and Henry</h2>
|
||||
|
||||
<iframe src="https://player.vimeo.com/video/133395510?color=fff&title=0&byline=0&portrait=0" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
|
||||
|
||||
</div>
|
@ -1 +1,10 @@
|
||||
# Post 2
|
||||
<div class="post">
|
||||
|
||||
# Technical demo — Part i
|
||||
|
||||
<h2 class="sub">2015-07-17</h2>
|
||||
<h2 class="sub">Curtis, Galen, Philip, Anton and Henry</h2>
|
||||
|
||||
<iframe src="https://player.vimeo.com/video/133395510?color=fff&title=0&byline=0&portrait=0" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
|
||||
|
||||
</div>
|
249
pub/blog/~2015.7.18.md
Normal file
249
pub/blog/~2015.7.18.md
Normal file
@ -0,0 +1,249 @@
|
||||
<div class="post">
|
||||
|
||||
# Concrete advantages of urbit
|
||||
|
||||
<h2 class="sub">2015-7-18</h2>
|
||||
<h2 class="sub">Philip Monk</h2>
|
||||
|
||||
urbit is a cloud operating system and network designed
|
||||
to replace the traditional Unix stack and permit the creating of
|
||||
a personal cloud computing experience. It consists of an
|
||||
operating system, arvo, written in a purely functional language,
|
||||
hoon, run on a precisely defined virtual machine, nock.
|
||||
Instances of arvo communicate over a P2P network, ames. Unix was
|
||||
designed to solve the problems of the 1970's. Modern web apps
|
||||
require a large set of services and abstractions not provided by
|
||||
Unix. These are generally provided by the deep stack of third
|
||||
party software that every app needs. urbit is a clean-slate
|
||||
layer over the internet, and it provides services and
|
||||
abstractions suitable for the development of modern web services.
|
||||
|
||||
A clean-slate programming platform must provide a series of
|
||||
concrete wins over the current unix/internet platform, and we
|
||||
enumerate some of them here. For technical overviews and
|
||||
motivation, look elsewhere.
|
||||
|
||||
It is very difficult to build useful truly decentralized apps,
|
||||
which is why it's so little done. We contend that a large
|
||||
portion of this difficulty is accidental difficulty rather than
|
||||
essential difficulty. Specifically, it is the result of building
|
||||
these services on an operating system (Unix) and netowrk (TCP/IP)
|
||||
designed and created in the 1970's to solve 1970's problems. A
|
||||
multitude of good ideas have arisen in the last forty years, but
|
||||
none of them were considered when our current software stack was
|
||||
designed.
|
||||
|
||||
Consider a simple chat service built to modern standards. The
|
||||
building blocks it needs are: (1) a browser front end, (2) a
|
||||
protocol for sending and receiving data from the server, (3), a
|
||||
transactional, ACID database (4) mappings from the data
|
||||
structures in memory to the database format, (5) a way to verify
|
||||
identity, and (6) some sort of way to manage reputation and
|
||||
prevent spam.
|
||||
|
||||
Unix itself provides little help to the developer of this
|
||||
service. These problems are solved by mixing and matching a
|
||||
variety of third-party userspace solutions, each of which
|
||||
provides a useful mostly-nonleaky abstraction. Putting together
|
||||
and maintaining this stack is a company-sized problem.
|
||||
|
||||
More perniciously, even when the stack is put together and the
|
||||
service is launched, this is a completely noncomposable,
|
||||
centralized service. None of the parts of this service can be
|
||||
used by other services, and if anyone wants to do something
|
||||
similar, they'll need to wrangle the same type of stack.
|
||||
Additionally, all the data for the app is on the company's
|
||||
servers, so (1) the users have no privacy, (2) a security
|
||||
breach at the company compromises everyone's data at once, and
|
||||
(3) the users are unable to do anything with their data except
|
||||
whatever the service's public interface allows.
|
||||
|
||||
The services and abstractions that Unix provides are far too low
|
||||
level to properly service the modern web. urbit provides much
|
||||
higher level services, and it provides them with decentralized
|
||||
applications in mind.
|
||||
|
||||
Unix itself provides none of these, but there exist userspace
|
||||
components for each. In general, the solutions up to this point
|
||||
have been piecemeal -- a stack component here, a service there,
|
||||
with a generous helping of glue to keep it all together.
|
||||
|
||||
We present urbit as a clean-slate solution to all of these
|
||||
problems. Our thesis is that the best way to solve all these
|
||||
problems is to do so in a coherent, cohesive whole. Rather than
|
||||
a thin OS with a thick stack, we've built a thick OS to provide
|
||||
high-level abstractions and services. By attacking these
|
||||
problems from an OS perspective, we can deal with them
|
||||
thoroughly.
|
||||
|
||||
## Identities.
|
||||
|
||||
Nearly every application needs a concept of identity. For many
|
||||
cloud services, the only reason it needs to know the user's
|
||||
identity is to show them their own data. In a decentralized
|
||||
application, the user has their data on their own server, so
|
||||
this problem goes away completely.
|
||||
|
||||
Many services, though, need a concept of identity that spans the
|
||||
network. unix has usernames, and the internet has domains, but
|
||||
these have nothing to do with each other. Each service ends up
|
||||
having to construct its own notion of identity.
|
||||
|
||||
urbit has cryptographic identity built into the network. An
|
||||
essentially infinite number of anonymous identities may be
|
||||
created, but there are a finite number of paracentrally-issued
|
||||
identities -- 2^32, to be exact. Because of the finite nature of
|
||||
these identities (technically, addresses), they have nonzero
|
||||
value, and thus may have positive default reputation.
|
||||
|
||||
Of course, if there are a finite number of identities, they must
|
||||
be allocated somehow. In urbit, this is accomplished through a
|
||||
simple hierarchy, with 256 top-level identity-issuing
|
||||
authorities, each of which may issue tickets for 255 second-tier
|
||||
urbits, each of which may issue tickets for 65,535 human-sized
|
||||
urbits. Once an identity is issued, it cannot be revoked.
|
||||
Lower-level urbits are independent entities, and the higher-level
|
||||
urbit has no control over them. Even though identities are
|
||||
*issued* paracentrally, the identity system is ultimately
|
||||
decentralized.
|
||||
|
||||
## Transactional events.
|
||||
|
||||
urbit is a functional operating system, which means its state is
|
||||
a deterministic function of its event history. We persist this
|
||||
log before applying any effects, so events are fully
|
||||
transactional. Either they happen or they don't, and we are
|
||||
never left in an inconsistent state when a failure happens
|
||||
mid-event. In the same way that databases guarantee consistency
|
||||
of data storage, urbit guarantees the consistency of its state.
|
||||
urbit is an ACID operating system.
|
||||
|
||||
Thus, urbit is a single-level store. There's no need for a
|
||||
separate step to persist state. There is no need to write out
|
||||
data to a filesystem to get persistence -- you can just leave
|
||||
your data in the structures you use them in. All memory is
|
||||
persistent by default.
|
||||
|
||||
## Global, reactive, typed, revision-controlled filesystem
|
||||
|
||||
urbit's filesystem is typed, so your data structures can be
|
||||
stored directly -- no need to serialize. It's also
|
||||
revision-controlled, so no need to lose file history ever again.
|
||||
Even the revision-control is type-aware, so branching and merging
|
||||
of arbitrary typed data structures works as it should. The
|
||||
filesystem is global, so referring to files on other urbits is
|
||||
easy. It's reactive, so changes on one machine can automatically
|
||||
cause various effects, like recompiling code on other urbits and
|
||||
auto-updating web pages.
|
||||
|
||||
## Type validation and conversion
|
||||
|
||||
urbit has a built-in framework for dealing with typed data
|
||||
intelligently. This framework is used by the networking system
|
||||
to validate typed data from the netowrk. It's used by the
|
||||
filesystem to revision-control typed data. It's used by the web
|
||||
server to convert your data structures to JSON or HTML before
|
||||
sending them to a browser. With the built-in markdown-to-html
|
||||
converter, combined with urbit's filesystem and web server,
|
||||
hosting a blog on urbit can be as simple as keeping a directory
|
||||
of markdown posts.
|
||||
|
||||
The only blanks you need to fill in are the specific conversion
|
||||
functions to and from your application-defined types to more
|
||||
standard ones (like JSON).
|
||||
|
||||
In a centralized system, it's usually the same software sending
|
||||
and receiving data structures over the network. Thus, the
|
||||
protocol is defined in English if you're lucky, else it's defined
|
||||
by the implementation of the serializer and deserializer. In
|
||||
urbit, since types are baked into the system, they are executable
|
||||
specifications and are sent over the network in a consistent way,
|
||||
so that as long as both sides have the same type definitions,
|
||||
they can communicate.
|
||||
|
||||
## Updating code and data structures over time
|
||||
|
||||
Because urbit's filesystem is reactive, even across the network,
|
||||
when an update is made to an app, it is usually pushed to
|
||||
everyone's machines immediately. A commonly-cited benefit to
|
||||
centralized systems is the ability to update everyone's
|
||||
experience at once and without user intervention. urbit allows
|
||||
a similar experience even in decentralized apps. Of course,
|
||||
since the user has control over their own personal cloud server,
|
||||
they may stop listening for code updates if they wish.
|
||||
|
||||
Besides distributing code, there is the problem of updating
|
||||
running apps. In urbit, when the app's code changes we
|
||||
automatically update the running app, saving the state and moving
|
||||
it over to the new version of the app. If the app's data
|
||||
structures have changed, then the programmer must write a state
|
||||
adapter function, which gets automatically run. Thus, urbit
|
||||
provides a sort of automatic hot code swapping with the ability
|
||||
to simultaenously perform a "schema migration".
|
||||
|
||||
## Pulling data from other services
|
||||
|
||||
Since urbit is typed all the way through, communicating with
|
||||
other applications and urbits is straightforward -- it's just
|
||||
passing typed messages back and forth. It's a much more pleasant
|
||||
experience than traditional web APIs. Remember, of course, that
|
||||
the identity problem has already been solved, so it's just a
|
||||
matter of asking for what you want, and the whole conversion
|
||||
happens over a formally-defined protocol (a type really).
|
||||
|
||||
Often, pulling data just means reading it from the filesystem,
|
||||
which, as previously mentioned, is global, revision-controlled,
|
||||
and referentially transparent.
|
||||
|
||||
Overall, a lot less glue is required for apps to communicate. Of
|
||||
course, the most important thing that eases interapp
|
||||
communication is that urbit is a *personal* cloud computer, so
|
||||
all the user's data is usually on their own urbit. No need to ask
|
||||
some other company's servers for data and hope they're willing to
|
||||
give it to you. Decentralization makes some things harder, but
|
||||
it brings its own set of technical advantages.
|
||||
|
||||
## Decentralized ownership and computation.
|
||||
|
||||
Building truly decentralized apps and services is very difficult
|
||||
in Unix, so it's not often attempted. Most cloud services are
|
||||
centralized, with all the data on a single logical node (usually
|
||||
spread across many physical servers). For most social
|
||||
"networks", the networking is between rows in a database, not
|
||||
computers on an actual network.
|
||||
|
||||
urbit eases the creation of decentralized apps. On the modern
|
||||
web, these building blocks are supplied by centralized systems.
|
||||
Verifying identity works by keeping all the identities in a
|
||||
single, centralized database. We avoid validating typed data off
|
||||
the wire by keeping all the data together in the same logical
|
||||
server. We avoid the need for a global namespace by
|
||||
centralization as well. Sane updating happens by keeping all the
|
||||
software on a single set of servers managed by the company. When
|
||||
we really can't get around the need to get data from another
|
||||
service, we bite the bullet and deal with HTTP APIs.
|
||||
|
||||
Since urbit solves all these problems in a decentralized manner,
|
||||
there's no longer near so much accidental difficulty in creating
|
||||
decentralized apps.
|
||||
|
||||
In a world where personal cloud computers host decentralized
|
||||
cloud services, the user finally owns their data. Having all
|
||||
their data in one trusted place allows their apps to mix and
|
||||
match it in hitherto unimagined ways. The privacy and security
|
||||
benefits are immense as well.
|
||||
|
||||
But perhaps greatest of all is the new frontiers this opens up.
|
||||
When Unix was built, a few rudimentary tools were built into the
|
||||
system, and with them programmers have built incredible pieces of
|
||||
software and accomplished things the creators couldn't have
|
||||
dreamed of. Unix provided the best tools the 1970's could offer,
|
||||
and it changed the world.
|
||||
|
||||
Imagine what will happen when the current generation of
|
||||
programmers gets a new set of tools, built to incorporate the
|
||||
last four decades of research and hard-won experience. We
|
||||
believe it will usher in an era of unprecedented increase in the
|
||||
power, privacy, and security available to the end user.
|
||||
|
||||
</div>
|
@ -376,6 +376,17 @@ li:before {
|
||||
.list.posts li.post:before {
|
||||
content: "";
|
||||
}
|
||||
div.root h1 {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
div.root .list .sub {
|
||||
margin-left: 0;
|
||||
margin-right: 0.6rem;
|
||||
}
|
||||
div.root > p {
|
||||
width: 27rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
div.post h1 {
|
||||
font-size: 2.8rem;
|
||||
line-height: 4rem;
|
||||
@ -388,6 +399,9 @@ div.post h2.sub {
|
||||
line-height: 1rem;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
div.post h2 {
|
||||
margin-top: 4rem;
|
||||
}
|
||||
div.post h2.sub {
|
||||
font-size: 0.7rem;
|
||||
font-weight: 400;
|
||||
|
@ -302,6 +302,18 @@ li:before
|
||||
li.post:before
|
||||
content ""
|
||||
|
||||
div.root
|
||||
h1
|
||||
margin-bottom 2rem
|
||||
|
||||
.list .sub
|
||||
margin-left 0
|
||||
margin-right .6rem
|
||||
|
||||
div.root > p
|
||||
width 27rem
|
||||
margin-top 2rem
|
||||
|
||||
div.post
|
||||
h1
|
||||
font-size 2.8rem
|
||||
@ -315,6 +327,9 @@ div.post
|
||||
line-height 1rem
|
||||
letter-spacing 1px
|
||||
|
||||
h2
|
||||
margin-top 4rem
|
||||
|
||||
h2.sub
|
||||
font-size .7rem
|
||||
font-weight 400
|
||||
|
@ -1,4 +1,4 @@
|
||||
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee":[function(require,module,exports){
|
||||
var TreeDispatcher, TreePersistence;
|
||||
|
||||
TreeDispatcher = require('../dispatcher/Dispatcher.coffee');
|
||||
@ -71,7 +71,8 @@ module.exports = {
|
||||
};
|
||||
|
||||
|
||||
},{"../dispatcher/Dispatcher.coffee":8,"../persistence/TreePersistence.coffee":13}],2:[function(require,module,exports){
|
||||
|
||||
},{"../dispatcher/Dispatcher.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/dispatcher/Dispatcher.coffee","../persistence/TreePersistence.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/persistence/TreePersistence.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/AnchorComponent.coffee":[function(require,module,exports){
|
||||
var BodyComponent, TreeActions, TreeStore, a, div, recl, ref;
|
||||
|
||||
BodyComponent = require('./BodyComponent.coffee');
|
||||
@ -310,7 +311,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":14,"./BodyComponent.coffee":3}],3:[function(require,module,exports){
|
||||
|
||||
},{"../actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/stores/TreeStore.coffee","./BodyComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/BodyComponent.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/BodyComponent.coffee":[function(require,module,exports){
|
||||
var TreeActions, TreeStore, div, input, load, recl, ref, textarea;
|
||||
|
||||
TreeStore = require('../stores/TreeStore.coffee');
|
||||
@ -377,7 +379,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":14,"./LoadComponent.coffee":7}],4:[function(require,module,exports){
|
||||
|
||||
},{"../actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/stores/TreeStore.coffee","./LoadComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/LoadComponent.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/CodeMirror.coffee":[function(require,module,exports){
|
||||
var div, recl, ref, textarea;
|
||||
|
||||
recl = React.createClass;
|
||||
@ -400,7 +403,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{}],5:[function(require,module,exports){
|
||||
|
||||
},{}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/KidsComponent.coffee":[function(require,module,exports){
|
||||
var TreeActions, TreeStore, a, div, hr, li, recl, ref, ul;
|
||||
|
||||
TreeStore = require('../stores/TreeStore.coffee');
|
||||
@ -466,7 +470,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":14}],6:[function(require,module,exports){
|
||||
|
||||
},{"../actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/stores/TreeStore.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/ListComponent.coffee":[function(require,module,exports){
|
||||
var TreeActions, TreeStore, a, div, h1, li, load, recl, ref, ul;
|
||||
|
||||
TreeStore = require('../stores/TreeStore.coffee');
|
||||
@ -586,7 +591,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":14,"./LoadComponent.coffee":7}],7:[function(require,module,exports){
|
||||
|
||||
},{"../actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/stores/TreeStore.coffee","./LoadComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/LoadComponent.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/LoadComponent.coffee":[function(require,module,exports){
|
||||
var div, input, recl, ref, textarea;
|
||||
|
||||
recl = React.createClass;
|
||||
@ -623,7 +629,8 @@ module.exports = recl({
|
||||
});
|
||||
|
||||
|
||||
},{}],8:[function(require,module,exports){
|
||||
|
||||
},{}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/dispatcher/Dispatcher.coffee":[function(require,module,exports){
|
||||
var Dispatcher;
|
||||
|
||||
Dispatcher = require('flux').Dispatcher;
|
||||
@ -644,7 +651,8 @@ module.exports = _.extend(new Dispatcher(), {
|
||||
});
|
||||
|
||||
|
||||
},{"flux":10}],9:[function(require,module,exports){
|
||||
|
||||
},{"flux":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/index.js"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/main.coffee":[function(require,module,exports){
|
||||
var rend;
|
||||
|
||||
rend = React.render;
|
||||
@ -814,7 +822,8 @@ $(function() {
|
||||
});
|
||||
|
||||
|
||||
},{"./actions/TreeActions.coffee":1,"./components/AnchorComponent.coffee":2,"./components/BodyComponent.coffee":3,"./components/CodeMirror.coffee":4,"./components/KidsComponent.coffee":5,"./components/ListComponent.coffee":6,"./persistence/TreePersistence.coffee":13}],10:[function(require,module,exports){
|
||||
|
||||
},{"./actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee","./components/AnchorComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/AnchorComponent.coffee","./components/BodyComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/BodyComponent.coffee","./components/CodeMirror.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/CodeMirror.coffee","./components/KidsComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/KidsComponent.coffee","./components/ListComponent.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/components/ListComponent.coffee","./persistence/TreePersistence.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/persistence/TreePersistence.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/index.js":[function(require,module,exports){
|
||||
/**
|
||||
* Copyright (c) 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
@ -826,7 +835,7 @@ $(function() {
|
||||
|
||||
module.exports.Dispatcher = require('./lib/Dispatcher')
|
||||
|
||||
},{"./lib/Dispatcher":11}],11:[function(require,module,exports){
|
||||
},{"./lib/Dispatcher":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/lib/Dispatcher.js"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/lib/Dispatcher.js":[function(require,module,exports){
|
||||
/*
|
||||
* Copyright (c) 2014, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
@ -1078,7 +1087,7 @@ var _prefix = 'ID_';
|
||||
|
||||
module.exports = Dispatcher;
|
||||
|
||||
},{"./invariant":12}],12:[function(require,module,exports){
|
||||
},{"./invariant":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/lib/invariant.js"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/node_modules/flux/lib/invariant.js":[function(require,module,exports){
|
||||
/**
|
||||
* Copyright (c) 2014, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
@ -1133,7 +1142,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) {
|
||||
|
||||
module.exports = invariant;
|
||||
|
||||
},{}],13:[function(require,module,exports){
|
||||
},{}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/persistence/TreePersistence.coffee":[function(require,module,exports){
|
||||
var TreeActions;
|
||||
|
||||
TreeActions = require('../actions/TreeActions.coffee');
|
||||
@ -1154,7 +1163,8 @@ module.exports = {
|
||||
};
|
||||
|
||||
|
||||
},{"../actions/TreeActions.coffee":1}],14:[function(require,module,exports){
|
||||
|
||||
},{"../actions/TreeActions.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/actions/TreeActions.coffee"}],"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/stores/TreeStore.coffee":[function(require,module,exports){
|
||||
var EventEmitter, MessageDispatcher, TreeStore, _cont, _curr, _load, _snip, _tree;
|
||||
|
||||
EventEmitter = require('events').EventEmitter;
|
||||
@ -1394,7 +1404,8 @@ TreeStore.dispatchToken = MessageDispatcher.register(function(payload) {
|
||||
module.exports = TreeStore;
|
||||
|
||||
|
||||
},{"../dispatcher/Dispatcher.coffee":8,"events":15}],15:[function(require,module,exports){
|
||||
|
||||
},{"../dispatcher/Dispatcher.coffee":"/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/dispatcher/Dispatcher.coffee","events":"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/events/events.js"}],"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/events/events.js":[function(require,module,exports){
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@ -1454,8 +1465,10 @@ EventEmitter.prototype.emit = function(type) {
|
||||
er = arguments[1];
|
||||
if (er instanceof Error) {
|
||||
throw er; // Unhandled 'error' event
|
||||
} else {
|
||||
throw TypeError('Uncaught, unspecified "error" event.');
|
||||
}
|
||||
throw TypeError('Uncaught, unspecified "error" event.');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1697,4 +1710,4 @@ function isUndefined(arg) {
|
||||
return arg === void 0;
|
||||
}
|
||||
|
||||
},{}]},{},[9]);
|
||||
},{}]},{},["/Users/galen/src/urbit-dev/urb/zod/pub/tree/src/js/main.coffee"]);
|
||||
|
Loading…
Reference in New Issue
Block a user