UNPKG

social-butterfly

Version:

Incorporate federated social network protocols easily. Used with Hello, world federated blog.

155 lines (137 loc) 5.22 kB
"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));