blob: a24fbeb72a8ee42b4549b9d806a5bc8be57f360d [file] [log] [blame]
const React = require('react');
const CompLibrary = require('../../core/CompLibrary.js');
const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
const Container = CompLibrary.Container;
const GridBlock = CompLibrary.GridBlock;
const CWD = process.cwd();
const translate = require('../../server/translate.js').translate;
const users = require(`${CWD}/data/users.js`)
const featuredUsers = users.filter(x => x.hasOwnProperty('featured'))
featuredUsers.sort((a, b) => (a.featured > b.featured) ? 1 : -1);
const siteConfig = require(`${CWD}/siteConfig.js`);
function imgUrl(img) {
return siteConfig.baseUrl + 'img/' + img;
}
function docUrl(doc, language) {
return siteConfig.baseUrl + 'docs/' + (language ? language + '/' : '') + doc;
}
function pageUrl(page, language) {
return siteConfig.baseUrl + (language ? language + '/' : '') + page;
}
function githubUrl() {
return siteConfig.githubUrl;
}
class Button extends React.Component {
render() {
return (
<div className="pluginWrapper buttonWrapper">
<a className="button" href={this.props.href} target={this.props.target}>
{this.props.children}
</a>
</div>
);
}
}
Button.defaultProps = {
target: '_self',
};
const SplashContainer = props => (
<div className="homeContainer">
<div className="homeSplashFade" style={{marginTop: '5rem'}}>
<div className="wrapper homeWrapper">{props.children}</div>
</div>
</div>
);
const Logo = props => (
<div className="" style={{width: '500px', alignItems: 'center', margin: 'auto'}}>
<img src={props.img_src} />
</div>
);
const ProjectTitle = props => (
<h2 className="projectTitle" style={{maxWidth:'1024px', margin: 'auto'}}>
<small style={{color: 'black', fontSize: '2.0rem'}}>{siteConfig.projectDescription}</small>
</h2>
);
const PromoSection = props => (
<div className="section promoSection">
<div className="promoRow">
<div className="pluginRowBlock">{props.children}</div>
</div>
</div>
);
class HomeSplash extends React.Component {
render() {
let language = this.props.language || '';
return (
<SplashContainer>
<Logo img_src={imgUrl('pulsar.svg')} />
<div className="inner">
<ProjectTitle />
<PromoSection>
<Button href={docUrl('standalone', language)}>Read the docs</Button>
<Button href={githubUrl()}>GitHub</Button>
</PromoSection>
</div>
</SplashContainer>
);
}
}
const Block = props => (
<Container
padding={['bottom']}
id={props.id}
background={props.background}>
<GridBlock align="center" contents={props.children} layout={props.layout} />
</Container>
);
const features_lang = language => {
return {
row1: [
{
content: 'Easy to deploy, lightweight compute process, developer-friendly APIs, no need to run your own stream processing engine.',
title: `[Pulsar Functions](${docUrl('functions-overview', language)})`,
},
{
content: 'Run in production at Yahoo! scale for over 5 years, with millions of messages per second across millions of topics.',
title: `[Proven in production](${docUrl('concepts-architecture-overview', language)})`,
},
{
content: 'Expand capacity seamlessly to hundreds of nodes.',
title: `[Horizontally scalable](${docUrl('concepts-architecture-overview', language)})`,
}
],
row2: [
{
content: 'Low publish latency (< 5ms) at scale with strong durability guarantees.',
title: `[Low latency with durability](${docUrl('concepts-architecture-overview', language)})`,
},
{
content: 'Configurable replication between data centers across multiple geographic regions.',
title: `[Geo-replication](${docUrl('administration-geo', language)})`,
},
{
content: 'Built from the ground up as a multi-tenant system. Supports isolation, authentication, authorization and quotas.',
title: `[Multi-tenancy](${docUrl('concepts-multi-tenancy', language)})`,
}
],
row3: [
{
content: 'Persistent message storage based on Apache BookKeeper. IO-level isolation between write and read operations.',
title: `[Persistent storage](${docUrl('concepts-architecture-overview#persistent-storage', language)})`,
},
{
content: 'Flexible messaging models with high-level APIs for Java, Go, Python, C++, Node.js, WebSocket and C#.',
title: `[Client libraries](${docUrl('client-libraries', language)})`,
},
{
content: 'REST Admin API for provisioning, administration, tools and monitoring. Can be deployed on bare metal, Kubernetes, Amazon Web Services(AWS), and DataCenter Operating System(DC/OS).',
title: `[Operability](${docUrl('admin-api-overview', language)})`,
}
]
};
};
const KeyFeautresGrid = props => (
<Container
padding={['bottom']}
id={props.id}
background={props.background}>
<GridBlock align="center" contents={props.features.row1} layout="threeColumn" />
<GridBlock align="center" contents={props.features.row2} layout="threeColumn" />
<GridBlock align="center" contents={props.features.row3} layout="threeColumn" />
</Container>
);
const UsersBlock = props => (
<Container
padding={['bottom']}
id={props.id}
background={props.background}>
<p align="center"><small style={{color: 'black', fontSize: '1.7rem'}}><a href="/powered-by">Companies Powered by Pulsar</a></small></p>
</Container>
);
const ApacheBlock = prop => (
<Container>
<div className="Block" style={{textAlign: 'center'}}>
<p>
Apache Pulsar is available under the <a href="https://www.apache.org/licenses">Apache License, version 2.0</a>.
</p>
</div>
</Container>
);
class Index extends React.Component {
render() {
let language = this.props.language || '';
let features = features_lang(language);
return (
<div>
<HomeSplash language={language} />
<div className="mainContainer">
<KeyFeautresGrid features={features} id={'key-features'} />
<UsersBlock id={'users'} />
<ApacheBlock />
</div>
</div>
);
}
}
module.exports = Index;