social-butterfly
Version:
Incorporate federated social network protocols easily. Used with Hello, world federated blog.
155 lines (137 loc) • 5.22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _url_factory = require("./util/url_factory");
var _react = require("react");
var _crypto = _interopRequireDefault(require("crypto"));
var _server = require("react-dom/server");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = options => async (req, res) => {
const user = await options.getLocalUser(req.query.resource, req);
if (!user) {
return res.sendStatus(404);
}
const [followers, following] = await options.getRemoteFriends(req.query.resource);
res.type('application/rdf+xml');
res.send(`<?xml version='1.0' encoding='UTF-8'?>` + (0, _server.renderToString)( /*#__PURE__*/React.createElement(FOAF, {
req: req,
user: user,
followers: followers,
following: following
})));
};
exports.default = _default;
function FOAF({
followers,
following,
user,
req
}) {
const namespaces = {
xmlns: 'http://xmlns.com/foaf/0.1/',
'xmlns:bio': 'http://purl.org/vocab/bio/0.1/',
'xmlns:foaf': 'http://xmlns.com/foaf/0.1/',
'xmlns:geo': 'http://www.w3.org/2003/01/geo/wgs84_pos#',
'xmlns:rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
'xmlns:rdfs': 'http://www.w3.org/2000/01/rdf-schema#',
'xmlns:sioc': 'http://rdfs.org/sioc/ns#'
};
return /*#__PURE__*/React.createElement(RDF, namespaces, /*#__PURE__*/React.createElement(PersonalProfileDocument, {
user: user
}), /*#__PURE__*/React.createElement(SelfAgent, {
following: following,
user: user,
req: req
}), followers.map(f => /*#__PURE__*/React.createElement(Agent, {
key: f.profile_url,
follower: f,
user: user
})));
}
function PersonalProfileDocument({
user
}) {
const about = {
'rdf:about': ''
};
const resource = {
'rdf:resource': user.url
};
return /*#__PURE__*/React.createElement(XML.PersonalProfileDocument, about, /*#__PURE__*/React.createElement("maker", resource), /*#__PURE__*/React.createElement("primaryTopic", resource));
}
function SelfAgent({
following,
user,
req
}) {
const {
username,
logo
} = user;
const sha1 = _crypto.default.createHash('sha1');
const emailHash = sha1.update(`mailto:${user.email}`).digest('hex');
const about = {
'rdf:about': user.url
};
const acctAbout = {
'rdf:about': `${user.url}#acct`
};
const imgAbout = {
'rdf:about': (0, _url_factory.buildUrl)({
req,
pathname: logo || ''
})
};
const homepageAbout = {
'rdf:resource': (0, _url_factory.buildUrl)({
req,
pathname: '/'
})
};
const resource = {
'rdf:resource': user.url
};
return /*#__PURE__*/React.createElement(XML.Agent, about, /*#__PURE__*/React.createElement(XML.mbox_sha1sum, null, emailHash), /*#__PURE__*/React.createElement("weblog", resource), logo ? /*#__PURE__*/React.createElement(FOAFImg, null, /*#__PURE__*/React.createElement(XML.Image, imgAbout)) : null, /*#__PURE__*/React.createElement("account", null, /*#__PURE__*/React.createElement(XML.OnlineAccount, acctAbout, /*#__PURE__*/React.createElement(XML.accountServiceHomepage, homepageAbout), /*#__PURE__*/React.createElement(XML.accountName, null, username), /*#__PURE__*/React.createElement(XML.accountProfilePage, resource), /*#__PURE__*/React.createElement(SIOCAcctOf, resource), following.map(f => /*#__PURE__*/React.createElement(SIOCFollows, {
key: f.profile_url,
'rdf:resource': `${f.profile_url}#acct`
})))), following.filter(f => f.follower).map(f => /*#__PURE__*/React.createElement("knows", {
key: f.profile_url,
'rdf:resource': `${f.profile_url}`
})));
}
function Agent({
follower,
user
}) {
const agentAbout = {
'rdf:about': follower.profile_url
};
const accountAbout = {
'rdf:about': `${follower.profile_url}#acct`
};
const profileResource = {
'rdf:resource': follower.profile_url
};
const followsResource = {
'rdf:resource': `${user.url}#acct`
};
const resource = {
'rdf:resource': user.url
};
return /*#__PURE__*/React.createElement(XML.Agent, agentAbout, follower ? /*#__PURE__*/React.createElement("knows", resource) : null, /*#__PURE__*/React.createElement("account", null, /*#__PURE__*/React.createElement(XML.OnlineAccount, accountAbout, /*#__PURE__*/React.createElement(XML.accountName, null, follower.username), /*#__PURE__*/React.createElement(XML.accountProfilePage, profileResource), /*#__PURE__*/React.createElement(SIOCAcctOf, profileResource), /*#__PURE__*/React.createElement(SIOCFollows, followsResource))));
}
const createElementFactory = type => p => {
const {
children,
...props
} = p;
return /*#__PURE__*/(0, _react.createElement)(type, props, children);
};
const RDF = createElementFactory('rdf:RDF');
const FOAFImg = createElementFactory('foaf:img');
const SIOCAcctOf = createElementFactory('sioc:account_of');
const SIOCFollows = createElementFactory('sioc:follows');
const XML = {};
['PersonalProfileDocument', 'Agent', 'mbox_sha1sum', 'Image', 'OnlineAccount', 'accountServiceHomepage', 'accountName', 'accountProfilePage'].forEach(type => XML[type] = createElementFactory(type));